더북(TheBook)

컴파일러는 클래스 템플릿을 템플릿이 생성한 타입을 갖는 객체로 인스턴스화한다. 다음 코드를 보자.

Array<int> data {40};

클래스 템플릿 타입 매개변수는 기본 인수가 아니면 인수를 항상 써야 한다. 이 코드가 컴파일될 때 세 가지 처리가 일어난다. 먼저 Array<int> 클래스를 위한 정의가 생성되고, 그에 따른 타입이 식별된다. 이어서 생성자 정의가 생성된다. 생성자는 객체를 생성할 때 반드시 호출되기 때문이다. 마지막으로 소멸자가 생성된다. 소멸자는 객체를 정리할 때 필요하기 때문이다. 컴파일러가 data 객체를 생성하고 정리할 때 필요한 것은 이게 전부이므로 템플릿에서 당장 생성해야 하는 코드도 이것뿐이다. 클래스 정의는 템플릿 정의에서 Tint로 바꿔서 생성하면 되지만, 한 가지 미묘한 지점이 남아 있다. 컴파일러는 프로그램이 사용하는 멤버 함수를 컴파일만 할 뿐이므로 템플릿 매개변수의 인수를 바꾼 클래스 전체가 반드시 필요한 것은 아니다. data 객체의 정의만 본다면 클래스는 다음과 같이 정의된다.

class Array<int> {
private:
  int* elements; size_t count;
public:
  explicit Array(size_t arraySize);
  virtual ~Array();
};

여기서 볼 수 있는 멤버 함수는 생성자와 소멸자뿐이다. 컴파일러는 객체 생성에 필요 없는 나머지 부분은 인스턴스로 생성하지 않으며 프로그램에서 필요 없는 템플릿 부분도 포함하지 않는다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.