프로그래밍/cpp

클래스 템플릿에 대한 간단한 정리

콘파냐 2017. 4. 29. 13:46
반응형

앞서 템플릿에 대한 개념을 설명하면서 함수 템플릿에 대해 살펴보았습니다. 


2017/04/18 - [프로그래밍/cpp] - C++ 템플릿(template) 이해하기



이번에는 클래스 템플릿에 대해 살펴볼 것인데 함수 템플릿과의 차이점에 초점을 맞춰서 이해할 필요가 있습니다.


클래스 템플릿을 선언하는 방법은 함수 템플릿의 선언과 차이가 없지만 함수와 클래스의 구조적인 차이점으로 인해 클래스 템플릿을 사용할 때 반드시 타입을 명시해 줘야 합니다. 명시해주는 방법은 함수 템플릿의 구체화 지정과 동일하므로 쉽게 이해할 수 있습니다.


우선 템플릿 선언을 하는 예제를 살펴보겠습니다.


클래스 템플릿의 선언

클래스 템플릿클래스 템플릿


클래스 템플릿 선언에 대한 내용은 굳이 길게 설명할 필요없습니다. 함수 템플릿을 만드는 방식과 동일하기 때문입니다. 단지 클래스라는 점만 달라진 것입니다.


그리고 코드를 보면 앞에서 말한대로 클래스 템플릿 구체화를 위해 타입을 강제로 지정해 주었습니다.

auto obj = MyClass<int>(3):

그런데 컴파일 타임에 3이라는 값에 대한 타입추론이 자동으로 이루어지는 것이 아닌가? 하고 의문을 갖는게 정상일 것입니다. 그럼 굳이 무엇 때문에 <int>라는 타입을 강제로 지정해 주었을까요?


클래스 템플릿 구체화에 대한 이해

(객체생성)인스턴스화가 되기 전(=생성자가 호출되기 전)에  먼저 객체를 위한 메모리가 할당되어야 하는데 메모리 할당을 위해서는 생성자에 전달되는 인수의 타입을 미리 알아야 합니다. (여기서 객체에서 사용되는 타입은 클래스 멤버변수의 타입을 말합니다.) 상식적으로 생각해봐도 멤버변수의 타입을 모르는데 메모리를 얼마나 할당해야 할지 정할 수 없겠죠. 이렇게 클래스의 생성자가 호출되기 전에 객체를 위한 메모리가 할당되어 있어야 합니다.


따라서 다음 코드는 문제가 됩니다.

auto obj = MyClass(3):

위 코드는 명시적 지정없이 생성자를 호출하는 코드입니다.  그런데 앞에서 생성자가가 호출 되기 전에 미리 메모리 공간이 할당되어야 한다고 했습니다. 생성자를 호출하고 있군요. 따라서 명시적 구체화를 통해서 템플릿 클래스를 미리 구체화해 놓을 필요가 있습니다.


뭐 이 뿐만아니라 실제로 템플릿 클래스의 이름은 MyClass<T>가 됩니다. int 타입으로 구체화 하면 클래스 이름이 MyClass<int>가 되는 것이죠.

이런 점은 함수와 구별해서 기억해 두어야 합니다.


이 밖에도 템플릿 클래스의 상속이나 멤버함수(메소드)만 템플릿으로 만들 수도 있습니다.

필요에 따라서 사용할 수는 있겠지만 우선 템플릿을 사용하려고 하는 것보다는 어느정도 이해한 후에 STL에 익숙해 지는 것이 중요하다고 생각합니다. 

반응형