템플릿을 이용하면 일반화 프로그래밍이 가능해진다. 즉, 프로그래밍에서 일반화란 서로다른 데이터 타입들 간의 공통적인 성질을 뽑아 하나로 묶는 것을 말한다.
여러가지의 데이터 타입들은 공통의 성질로 묶이게 되었으니 불필요한 중복이 없어지고 쉽게 구조화 되어 이해하기가 쉬워지는 장점이 있다.
아래의 간단한 예를 보면
Calculator라는 클래스 템플릿이 사칙연산을 일반화 하였고 각각의 타입들이 사칙연산이라는 일반화의 틀(Template)에 묶인다.
template <typename T> class Calculator { public: Calculator(){}
T add(T a, T b) { return a+b; } T sub(T a, T b) { return a-b; } T div(T a, T b) { return b>0 ? a/b : -1; } T mul(T a, T b) { return a*b; } }; int main(void){ Calculator<int> intCal; //템플릿을 이용해 int형을 사용하는 템플릿 클래스 생성 Calculator<float> floatCal;//템플릿을 이용해 float형을 사용하는 템플릿 클래스 생성 Calculator<long long int> longCal;//... Calculator<double> doubleCal;//... |
위와 같이 템플릿을 사용하여 코드를 작성하면 컴파일러가 다음과 같이 각 타입들에 대해서 모든 코드를 생성해 낸다.
템플릿을 사용해서 인스턴스화 하면 템플릿 클래스(또는 함수)가 생성되는데 이는 컴파일 타임에 진행된다.
용어가 헷갈릴 수도 있지만 "클래스 템플릿"은 "템플릿 클래스"들(코드)를 만들어 내기 위한 틀로 이해하면 된다.(함수 템플릿과 템플릿 함수도 마찬가지)
템플릿의 또다른 특징은 암시적 인터페이스와 컴파일 타임 다형성이다.
템플릿은 어떠한 타입이 들어올지 모르기 때문에 템플릿을 사용하는 코드 (ex Calculator<int> intCal;) 컴파일 타임에 인스턴스화를 통해 호출되는 함수가 달라진다.
즉 컴파일을 하면서 Calculator 클래스 템플릿에 T가 int형으로 들어간다는 것을 알게된다. 따라서 이를 컴파일 타임 다형성이라고 한다.
그래서 템플릿을 사용하는 매개변수가 암시적 인터페이스를 충족하지 못하면 컴파일타임에 에러가 발생한다.
암시적 인터페이스란 간단히 말해서 아래의 함수템플릿을 사용하는 데이터 타입이라면 반드시 show()라는 메소드를 가지고 있어야 한다는 암시적인 약속을 의미한다.
template <typename T>
void templateTester(T& t) {
t->show();
}
'C and C++' 카테고리의 다른 글
[C++] 복사 생성자와 복사 대입연산자의 차이점 (2) | 2019.01.13 |
---|---|
[C++] new 연산자 예외처리 (0) | 2018.12.02 |
[C++] 상속에 대해 (0) | 2018.09.01 |
[C++] 상속받은 비가상 함수를 재정의(override)하면 안된다. (0) | 2018.08.19 |
[C++] NVI (non-virtual interface) idiom 비가상 인터페이스에 대해 (0) | 2018.08.11 |