C++
템플릿
khon98
2020. 12. 16. 19:35
일반화
- 일반화 프로그래밍(Generic Programming)이 가능한 언어
- 템플릿을 이용해서 일반화 프로그래밍을 사용할 수 있음
템플릿(Template)
- 템플릿이란 매개 변수의 타입에 따라서 함수 및 클래스를 손쉽게 사용할 수 있도록 해줌
- 템플릿은 그 타입 자체가 매개 변수에 의해서 다루어짐
- 템플릿을 사용하면 타입마다 별도의 함수나 클래스를 만들지 않고 다양한 타입에서 동작할 수 있는 단 하나의 객체를 정의할 수 있음
- 결과적으로 소스코드의 재사용성을 극대화할 수 있는 객체 지향 프로그래밍 기법 중 하나
#include <iostream>
#include <string>
#include <stdio.h>
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 = "khon";
string b = "khon01";
change(a, b);
cout << a << ":" << b << endl;
system("pause");
return 0;
}
함수 템플릿(Fuction Template)
- 각각의 자료형에 대해서 처음으로 호출이 될 때 C++ 컴파일러는 해당 타입의 인스턴스를 생성
- 이후에 생성된 하나의 인스턴스는 해당 자료형에 대해서 특수화가 이루어짐
- 이러한 인스턴스는 해당 함수 템플릿에 해당 자료형이 사용될 때마다 호출됨
명시적 특수화(Explicit Specialization)
- C++의 함수 템플릿은 특정한 타입에 대하여 명시적 특수화 기능을 제공
- 이러한 명시적 특수화를 이용하면 특정한 타입에 대해서 특수한 기능을 정의할 수 있음
- 컴파일러는 호출된 함수에 대응하는 특수화된 정의를 발견한 이후에는 해당 정의만을 사용
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
template <typename T> // int형이 아닌경우 수행
void change(T& a, T& b) {
T temp;
temp = a;
a = b;
b = temp;
}
template <> void change<int>(int& a, int& b) { // int형인 경우 수행
cout << "정수형 데이터를 교체.\n";
int temp;
temp = a;
a = b;
b = temp;
}
int main(void) {
int a = 8;
int b = 7;
change(a, b);
cout << a << ":" << b << endl;
system("pause");
return 0;
}
클래스 템플릿(Class Template)
- 클래스를 일반화하기 위해서 클래스 템플릿을 활용할 수 있음
- 클래스 템플릿을 사용하면 자료형에 따라서 다르게 동작하는 클래스 집합을 만들 수 있음
#include <iostream>
#include <string>
#include <stdio.h>
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("khon");
cout << data1.getData() << ":" << data2.getData() << "\n";
system("pause");
return 0;
}
* 디폴트 템플릿 인수
#include <iostream>
#include <string>
#include <stdio.h>
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("khon");
cout << data1.getData() << ":" << data2.getData() << "\n";
system("pause");
return 0;
}