템플릿 - 1
템플릿(Template) - 1
템플릿은 사전적인 의미로 형틀, 무언가를 찍어내는 틀을 말한다. 프로그래밍에서도 같은 의미로 무언가를 만들어내는 틀을 말한다.
함수 템플릿을 통해 좀 더 자세한 설명을 할텐데 함수 템플릿은 함수를 만들어내는 템플릿을 말한다.
Ex>
template <typename T>
T Add(T num1, T num2)
{
return num1 + num2;
}
위의 예시에서 살펴보면 template <typename T> 라는 것이 보이는데 이 문장은 T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다는 의미이다. 그리고 T는 자료형을 결정짓지 않겠다는 의미이다.
- T대신에 다른 이름을 사용해도 된다. 사용자 정의 함수에서 매개변수의 이름과 같다고 생각하면 된다. Ex> <typename N>
- template <typename T> 에서 template<class T>로 선언해도 같은 의미이다.
위의 예시는 Add라는 함수를 만들어내는 함수 템플릿의 정의이다. Add라는 함수는 두개의 인자를 전달받아 합을 반환하는 함수로 전달받는 인자와 반환하는 타입은 동일하다는 것을 알 수 있다.
이를 사용하는 방법은 다음과 같다.
Ex>
template <typename T>
T Add(T num1, T num2)
{
return num1 + num2;
}
int main(void)
{
cout << Add<int>(15, 20) << endl;
cout << Add<double>(10.3, 5.7) << endl;
return 0;
}
위의 예시에서 Add<int>(15, 20)를 보면 <int> 이것은 T를 int로 해서 Add함수를 만들어 사용한다는 의미이다. Add<double>의 경우는 T를 double로 하겠다는 의미가 된다.
함수의 생성 시기는 컴파일에서 생성되며 자료형 당 하나씩 생성된다. <int>형으로 여러번 호출하더라도 <int>형으로는 하나를 만들어 계속 사용하는 것이다. 그렇기 때문에 컴파일시에 시간이 좀 늘어날 수 있지만 실행 속도에는 상관이 없다.
추가로 위에서 호출한 방법 외에 일반 함수를 호출하듯 Add(15, 20); 처럼 호출하여도 전달되는 인자의 자료형을 참조하여 Add<int>(15, 20) 처럼 호출된다.
위에 예시의 정의를 함수 템플릿 이라고 한다. 그리고 함수 템플릿을 사용하여 컴파일러가 호출한 자료형마다 만들어낸 함수를 템플릿 함수 라고 한다.
둘 이상의 type에 대한 템플릿 정의는 다음과 같다.
Ex>
template <class T1, class T2>
//template<typename T1, typename T2> 와 같은 의미.
1) void ShowData(double num)
{
2) cout << (T1)num << ", " << (T2)num << endl;
// cout << T1(num) << ", " << T2(num) << endl; 로 써도 같은 의미이다.
}
int main(void)
{
3) ShowData<char, int>(65);
ShowData<char, double>(68.9);
return 0;
}
- 출력 화면
A, 65
D, 68.9
1) 반환형와 매개변수의 타입은 사용자 정의 함수처럼 자유롭게 지정할 수 있다. 처음에 든 예시처럼 꼭 T를 사용해야만 하는 것은 아니
다.
2) num은 double로 받지만 내부에서는 T1의 타입과 T2의 타입대로 형변환해서 사용한다는 의미이다.
3) 이 함수 템플릿의 경우 호출에서는 매개변수의 자료형을 따로 double로 해두었기 때문에 <char, int> 처럼 명시를 해주어야한다.
-출처 : 윤성우 열혈 C++ 프로그래밍