Template

일반화(Generic Programming)
C++은 일반화 프로그램잉(Generic Programming)이 가능한 언어로 C++에서는 Template을 이용해서
일반화 프로그래밍을 사용할 수 있다.
템플릿(Template)
매개변수의 타입에 따라서 함수 및 클래스를 손쉽게 사용할 수 있도록 해준다.

템플릿은 타입 그 차체가 매개변수에 의해서 다루어진다.
템플릿을 사용하면 타입마다 별도의 함수나 클래스를 만들지 않고, 다양한 타입에서
동작할 수 있는 단 하나의 객체를 정의할 수 있다.

소스코드의 재사용성을 극대화할 수 있는 객체 지향 프로그래밍 기법 중 하나이다.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
void change(T& a, T& b){
T temp;
temp=a;
a=b;
b=temp;
}
int main(void){
string a="";
string b="";
change(a,b);
cout<<a<<":"<<b<<endl;
system("pause");
return 0;
}
함수 템플릿(Function Template)
각각의 자료형에 대하여 처음으로 호출이 될때, C++ 컴파일러는 해당 타입의 인스턴스를 생성
이후 생성된 하나의 인스턴스는 해당 자료형에 대하여 특수화가 이루어짐.
이러한 인스턴스는 해당 함수 템플릿에 해당 자료형이 사용될 때마다 호출된다.
명시적 특수화
C++의 함수 템플릿은 특정한 타입에 대하여 명시적 특수화(Explicit Specialization) 기능을 제공한다.
특정한 타입에 대하여 특수한 기능을 정의할 수 있다.

컴파일러는 호출된 함수에 대응하는 특수화된 정의를 발견한 이후에는 해당 정의만을 사용
#include <iostream>
#include <string>
using namespace std;
template <typename T>
void change(T& a, T& b){
T temp;
temp=a;
a=b;
b=temp;
}
template<> void change<int>(int& a, int& b){
cout<<" .\n";
int temp;
temp=a;
a=b;
b=temp;
}
int main(void){
string a="";
string b="";
change(a,b);
cout<<a<<":"<<b<<endl;
int c=7;
int d=5;
change(c,d);
cout<<c<<":"<<d<<endl;
system("pause");
return 0;
}
클래스 템플릿(Class Template)
클래스 템플릿을 사용하면 자료형에 따라서 다르게 동작하는 클래스 집합을 만들 수 있다.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Data{
private:
T data;
public:
Data(T data):data(data){}
void setData(T data){ this->data=data; }
T getData(){ return data;}
};
int main(void){
Data<int> data1(1);
Data<string> data2("");
cout<<data1.getData()<<":"<<data2.getData()<<'\n';
system("pause");
return 0;
}
디폴트 템플릿 인수
#include <iostream>
#include <string>
using namespace std;
template <typename T = int> //default int
class Data{
private:
T data;
public:
Data(T data):data(data){}
void setData(T data){ this->data=data; }
T getData(){ return data;}
};
int main(void){
Data<> data1(1); // default 릿
Data<string> data2("");
cout<<data1.getData()<<":"<<data2.getData()<<'\n';
system("pause");
return 0;
}
템플릿(Template) 문법을 사용하면 일반화(Generalization)을 진행할 수 있다.