프로그래밍 언어/C & C++ 정리

템플릿 선택적 인스턴스화, 명시적 인스턴스화

뽀또치즈맛 2025. 6. 18. 08:39

컴파일러는 다음과 같은 암묵적인 클래스 탬플릿 인스턴스화 (implicit class template instantiation) 코드를 보면 그 클래스 템플릿에 있는 가상 메서드에 대한 코드를 생성한다.

하지만 virtual로 선언하지 않은 메서드는 코드에서 실제로 호출하는 것만 컴파일 한다.
예를 들어 Grid 클래스 템플릿을 이용하는 코드를 다음과 같이 main() 함수에만 사용한다고 하자.

Grid<int> myIntGrid;
myIntGrid.at(0, 0) = 10;

그러면 컴파일러는 int 버전의 Grid에서 제로 인수 생성자(zero argument constractor = 영인수 생성자), 소멸자, 비 const at() 메서드만 컴파일하고, 복제 생성자나 대입 연산자 등에 대한 코드는 생성하지 않는다.

이를 선택적 인스턴스화라 부른다.

컴파일러는 템플릿 메서드 정의 코드를 발견하면 컴파일하지 않고 문법 검사만 한다.
템플릿 정의만 보고서는 실제로 어떤 타입으로 사용될지 알 수 없기 때문이다.

컴파일러가 템플릿을 인스턴스화하는 코드를 발견하면 주어진 타입에 대한 인스턴스를 생성한다.
예를 들어 Grid<int>라는 문장을 발견하면 Grid 템플릿의 매개변수 T에 int를 대입해서 int 버전의 Grid<int> 라는 문장을 발견하면 Grid 템플릿 매개변수 T에 int를 대입해서 int 버전의 Grid 인스턴스 클래스를 생성한다.

또한 Grid<SpreadsheetCell>처럼 다른 타입에 대한 템플릿 인스턴스화 코드를 발견하면 SpreadsheetCell 타입에 대한 Grid 클래스 인스턴스를 추가로 생성한다.

명시적 템플릿 인스턴스화


그런데 컴파일러 에러가 담긴 클래스 템플릿 메서드를 발견하지 못하고 지나칠 위험이 있다.

클래스 템플릿에 있는 메서드에 구문 오류가 없는지 완벽히 테스트하기 힘들다.

이때 명시적 템플릿 인스턴스화 (explicit template instantiation를 적용하여 virtual 메서드와 비 virtual 메서드 모두에 대해 무조건 코드를 생성하게 만들 수는 있다.

temlate class Grid<int>

이러한 명시적 템플릿 인스턴스화를 적용하면 실제로 사용하지 않는 클래스 템플릿 메서드도 컴파일하기 때문에 구문 오류를 찾는데 도움이 된다.

명시적 템플릿 인스턴스화를 적용할 때 클래스 템플릿을 int와 같은 기본 타입으로 인스턴스화 하지 말고, string과 같은 좀 더 복잡한 타입으로 인스턴스화하는 것이 좋다.