C++ 은 일반화 프로그래밍(Generic Programming)이 가능한 언어이다. 따라서 템플릿(Template)을 이용해 일반화 프로그래밍을 사용할 수 있다.
템플릿이란 매개변수의 타입에 따라서 별도의 함수 및 클래스를 만들지 않고 다양한 타입에서 동작하는 단 하나의 객체를 정의할 수 있다. 소스코드의 재사용성을 극대화한다.
함수 템플릿(Function Template)이 각각의 자료형에 대해 처음으로 호출이 될 때 C++ 컴파일러는 해당 타입의 인스턴스를 생성한다. 이후 생성된 하나의 인스턴스는 해당 자료형에 대해 특수화가 이루어진다. 이러한 인스턴스는 해당 함수 템플릿에 해당 자료형이 사용될 때마다 호출된다.
#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");
}
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) {
int a = 7;
int b = 5;
change(a, b);
cout << a << ":" << b << endl;
system("pause");
}
C++은 클래스를 일반화하기 위해 클래스 템플리(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");
}
#include<iostream>
#include<string>
using namespace std;
template<typename T = 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);
Data<string> data2("나동빈");
cout << data1.getData() << ":" << data2.getData() << "\n";
system("pause");
}