템플릿(Template) 프로그래밍

템플릿이란?

  • Java 와 C# 에서의 제네릭(generic) 메서드 / 클래스와 비슷

  • STL 컨테이너 또한 템플릿

  • 덕분에 코드를 자료형마다 중복으로 작성하지 않아도 됨 -> 사용되는 자료형으로 컴파일 시 자동으로 넣어준다!

템플릿은 어떻게 동작할까?

  • 템플릿을 인스턴스화할 때마다, 컴파일러가 내부적으로 코드를 생성해준다!

이것은 무엇을 의미할까?

  • 템플릿에 넣는 자료형 가짓수에 비례해서 exe 파일 크기 증가 -> exe 파일 크기가 증가 함에 따라 컴파일 시간도 증가하는데, 과연 c++ 를 쓰는 업계에서 그래도 될까?

  • 컴파일 에러를 검출할 수 있다.

  • 템플릿 사용을 통해서 다형성을 부여할 수 있다.

함수 템플릿

  • 코드를 자료형마다 중복으로 작성하지 않는 대표적인 예제이다.

  • 다음의 코드에서 개체+ 연산 시, 클래스에서 + 연산자를 오버로딩하지 않는다면, 컴파일 에러가 발생한다.

  • 함수 템플릿을 호출할 때 타입을 생략 가능하다! -> Math 함수가 그렇게 작동한다! (내부적으로 static 으로 선언되어 있다)

클래스 템플릿

클래스 내부의 배열의 크기를 초기화하는 팁

  • 다음과 같이 클래스 내부에 크기가 정해져 있는 배열을 선언할 때 상수를 사용하는 방법은 다음과 같다.

    • #define MAX_VALUE 3 -> 전역적으로 사용할 수 있기에 사용하지 않는다.. (이게 단점?)

    • const int MAX_VALUE = 3; -> 해당 클래스를 사용하는 cpp 파일마다 4바이트를 사용해야한다..

    • static const int MAX_VALUE = 3; -> 불필요한 4바이트를 사용해야 한다. ( const int 보다는 낫다) -> 하지만 요즘에는 컴파일러가 좋아져서 static const variable 들은 거의 무조건 inline 을 하는 편이다.

    • enum { MAX = 3}; -> enum 은 그냥 상수의 이름을 붙이는 방법이다! -> 불필요한 4바이트를 사용하지 않아도 된다! (좋은 방법)

  • 클래스 템플릿을 사용해 아래 코드를 컴파일 해보면 다음과 같은 오류를 보게 된다.

  • 그 이유는 다음과 같다.

    • 컴파일러가 "Main.cpp" 을 컴파일 할 때, " MyArray.cpp" 를 못찾는다. -> "MyArray.h" 를 통해서 오직 MyArray 클래스 선언만 볼 수 있다.

    • 따라서, 컴파일러가 MyArray<int> 를 만들어 줄 수 없다. -> 인라인 함수에서도 동일한 문제를 발견할 수 있다.. (구현체를 모두 헤더파일로 옮겼었다)

  • 해결책은 구현을 모두 헤더 파일로 옮겨야 한다.

  • 하지만 헤더 파일에 코드가 많아지는 것은 다음의 단점이 따라온다.

    • 실행 파일의 크기가 커진다..

    • 헤더 파일의 변경이 있을 시 사용하는 모든 파일을 다시 컴파일 해야 하므로, 컴파일 시간이 길어진다.

  • 함수형 템플릿에서는 타입을 생략할 수 있었지만, 클래스 템플릿은 반드시 타입을 넣어주어야 한다! -> 함수형 템플릿은 매개변수를 통해서 타입을 추측이 가능하다.

템플릿 매개변수가 2개인 경우

  • template 매개변수를 2개를 받을 수 있다!

괜찮은 트릭!

  • 템플릿 매개변수를 통해서 외부에서 클래스 내부에 배열의 크기를 받을 수 있다.

template 매개변수를 2개 받는 예시

Last updated