함수 템플릿
하나의 클래스를 다양한 자료형에서 사용할 수 있게 만드는 기법이다. 만약 template <typename T>
선언이 없으면 오류.(T가 자료형인지 모르니까). 이후 T가 자료형을 선언해준다.
- Note.
template <typename T>
대신template <class T>
를 이용해도 된다. -> 동일한 의미이다
템플릿 정의는 실제 함수 정의가 아님. 함수 생성은 함수 호출. 즉 T에 대입 되는 변수 타입에 따라 새로운 함수가 생성되는 것임.(템플릿 함수 인스턴스화) 함수는 각 자료형 당 하나씩만 만들어지고, 그에 따라 컴파일 속도는 느려지지만 실행속도는 별개.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <typeinfo>
using namespace std;
// 함수 템플릿(Function Template), 타입 선언
template <typename T>
T get_max(T x, T y)
{
cout << "Type: " << typeid(T).name() << endl; // 타입 정보 출력
if (x > y)
return x;
else
return y;
}
int main()
{
// 정수 버전 get_max
cout << get_max(1, 3) << endl;
// 실수 버전 get_max
cout << get_max(1.2, 3.9) << endl;
return 0;
}
1
2
3
4
Type: i
3
Type: d
3.9
get_max()
에서 변수 타입 선언 안해도 되는이유: 함수 오버로딩
물론 호출 마다 get_max<int>()
처럼 타입 선언해도 상관 X. 명시용
- 함수 템플릿(Function Template) : 함수를 기반으로 만들어진 템플릿
- 템플릿 함수(Template Function) : 템플릿을 기반으로 만들어진 함수
클래스 템플릿
함수 뿐만 아니라 클래스도 가능
템플릿 vs 추상클래스 vs 인터페이스
목적
- 템플릿: 다양한 데이터 타입 또는 다양한 값에 대한 코드를 생성하는 데 사용
- 추상클래스: 하나 이상의 순수 가상 함수 (pure virtual function)를 포함하며, 객체를 직접 생성할 수 없는 클래스. 인터페이스를 정의하고 파생 클래스에서 공통된 동작을 구현
- 인터페이스: 구현 클래스에서 구체적인 동작을 제공