C++ 템플릿은 함수나 클래스를 일반화(generic)하는 C++ 도구입니다. 일반화(generic) 또는 제네릭이라고 부릅니다. 일반화는 함수나 클래스를 일반화시키고, 매개 변수 타입을 직접 지정하여 틀에서 찍어 내듯이 클래스 코드를 생산하는 기법입니다. 

 

 

C++에서 함수 중복(function overloading)을 이용하면 동일한 함수명으로 다양한 타입을 지원할 수 있습니다. 하지만 동일한 코드가 반복되고 정의도 여러 번 구현해야 됩니다. 

 

void myswap(int &a, int &b){
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}

void myswap(double &a, double &b){
	double tmp;
	tmp = a;
	a = b;
	b = tmp;
}

 

위와 같이 2개 myswap 함수는 매개변수로 int 형과 double형만 다를 뿐 실제 구현부는 동일합니다. 매개변수 타입만 다를 경우 일반화가 가능합니다. 

 

아래와 같이 template을 이용하면 중복된 코드를 없이 하나의 함수로 처리가 가능해집니다. 

 

template <class T>
void swap(T& a, T& b) {
	T tmp;
	tmp a;
	a = b;
	b = tmp;
}

 

템플릿의 장점 함수 작성 용이하고 함수 코드 재사용으로 생산성 및 유연성이 높일 수 있습니다.

단점은 컴파일에 따라 템플릿을 지원하지 않는 경우도 있습니다. 템플릿 관련 컴파일 오류 메시지가 부족하여 디버깅이 어려울 수 있습니다. 

 

템플릿을 이용해 제네릭 함수, 클래스를 활용하여 프로그램을 작성하는 것을 제네릭 프로그래밍(generic programing) 또는 일반화 프로그램이라고 합니다.  C++, JAVA, C# 등 다양한 언어에서 제네릭 프로그램을 지원하고 있습니다. 

 

 

// 제네릭 함수
template<class T>
void myswap(T& a, T& b) {
	T tmp;
	tmp = a; 
	a = b;
	b = tmp;
}

void main() {
	int a = 4, b = 5;
	myswap(a, b);
	cout << "a=" << a << "," << "b=" << b << endl;

	double c = 4, d = 5;
	myswap(c, d);
	cout << "c=" << a << "," << "d=" << b << endl;
}
a=5,b=4
c=5,d=4