[C++] 📂. 템플릿(Template)
1. 템플릿(Template)
형판
이라는 뜻- 함수나 클래스를 찍어내듯이 생산할 수 있도록 일반화(generic)시키는 도구
- 함수 템플릿
- 클래스 템플릿
template<typename T> template<class T> // 둘 중에 하나 사용
2. 함수 템플릿
- 매개 변수 타입만 다른 함수의 경우, 함수중복을 통해 작성할 수 있다.
- 하지만, 프로그램 길이가 길어짐, 실수 가능성, 중복수정 많아짐의 문제가 있다.
// 함수중복을 사용 할 경우,
void Print(int a) { cout << a << endl; }
void Print(float a) { cout << a << endl; }
void Print(char a) { cout << a << endl; }
- 위의 코드를 함수 템플릿을 사용하여 작성
- 타입에 따라 서로 다른 함수가 만들어 진다.
// 함수 템플릿을 사용 할 경우,
template<typename T>
void Print(T a)
{
cout << a << endl;
}
// 여러 타입을 사용 할 경우,
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
cout << a << " " << b << endl;
}
- 장점
- 함수 코드 재사용 가능 (
생산성
↑,유연성
↑)
- 함수 코드 재사용 가능 (
- 단점
- 템플릿이 지원되지 않는 것은 사용 불가능 (
포팅
에 취약) - 템플릿 관련 오류 메시지가 빈약함 (
디버깅
에 취약)
- 템플릿이 지원되지 않는 것은 사용 불가능 (
int main()
{
// input에 대하여 타입을 추론을 하여 함수가 생성
Print(10); // Print<int>(10);
Print(10.0f); // Print<float>(10.0f);
Print('l'); // Print<char>('l');
// 함수의 타입을 명시적으로 선언
Print<float>(20); // Print<float>(20);
return 0;
}
클래스를 사용 할 경우
class Knight
{
public:
int hp = 10;
};
int main()
{
Knight k;
Print(k); // Error!
}
- Knight클래스를 cout하는데에 정의된 함수가 없기 때문에 에러가 난다.
// Knight 출력 함수 ostream& operator << (ostream& os, const Knight& k) { os << k.hp; return os; }
템플릿 특수화
- 특정 타입에 예외적인 규칙을 적용하고 싶을 때 사용
template<> void Print(Knight a) { cout << "Knight 입니다. " << endl; cout << a << endl; }
4. 클래스 템플릿
template<typename T, int SIZE=10>
class RandomBox
{
public:
T GetRandomData()
{
int idx = rand() % SIZE;
return data[idx];
}
public:
T data[SIZE];
}
int main()
{
srand(static_cast<unsigned int>(time(nullptr)))l
RandomBox<int, 10> rb1;
RandomBox<int, 20> rb2;
rb1 = rb2 // Error! rb1과 rb2는 완전히 다른 클래스 이다.
return 0;
}
템플릿 특수화
template<int SIZE>
class RandomBox<double, SIZE>
{
// ... 생략
}
댓글남기기