본문 바로가기
스터디/C++

[ C++ ] 클래스 템플릿 ( Class Template )

by 알 수 없는 사용자 2019. 11. 30.

앞서 포스팅에 함수 템플릿을 설명하였다.

클래스 템플릿( Class Template )은 함수 템플릿처럼 클래스를 만들어 내는 도구이다.

 

그럼 점에 대한 클래스 템플릿을 만들어보자.

 

컴파일러는 24행의 Dot<int> dot1(1, 2); 를 보고

Dot<int> 템플릿 클래스를 생성하고, 25행의 Dot<double> dot2(1.5, 2.5); 를 보고

Dot<doube> 템플릿 클래스를 생성한다.

 

* 여기서 주의해야 할 점은, 템플릿 클래스는 템플릿 함수와 다르게 객체를 생성할 때 <int>, <double>과 같은 자료형 정보가 반드시 표기되어야한다.

 

클래스 템플릿도 멤버함수를 클래스 외부에 정의하는 것이 가능하다. 위의 코드를 조금 수정해보겠다.

 

 

점의 x, y 좌표 값을 더하는 Adder 함수를 추가하였다. 

 

멤버함수를 클래스 외부에 정의할 때도 template<typename T>를 반드시 기입해야한다. ( 혹은 template<class T> )

그렇지 않으면 컴파일러가 T가 뭐냐면서 에러를 뱉는다.

 

생성자도 클래스 외부에 정의하면 다음과 같다.

 

클래스 템플릿을 구현할 때는 파일을 나눌 때에 고려할 사항이 있습니다.

위의 코드처럼 클래스 템플릿의 선언부분헤더파일로 나누고 클래스 정의부분소스파일로 따로 저장하게되면 메인함수에서 클래스 템플릿의 선언부분만 include해야 할 것이 아니라, 클래스 템플릿의 정의까지 include 해야합니다. 그 이유는 메인에서 컴파일러가 클래스 템플릿을 만나서 템플릿 클래스 객체를 생성하는 시점에서 헤더파일의 정보뿐만 아니라 소스파일에 담긴 정보까지 있어야 템플릿 클래스를 생성할 수 있기 때문입니다.

 

여기서 이상한 점은 메인.cpp를 컴파일 할 때 클래스 템플릿.cpp도 함께 컴파일을 하는 것은 맞다.

 

하지만 파일단위 컴파일원칙에 의해서 메인.cpp를 컴파일 하면서 클래스 템플릿.cpp의 내용을 참조하지 않기 때문에 컴파일 에러가 발생한다.

 

즉, 템플릿의 경우에는 템플릿의 모든 정보를 소스파일에 전달해야 한다.