안녕하세요 BlockDMask 입니다.
오늘은 C++에서 자료형을 마음대로 가지고 놀 수 있는, template (템플릿) 에 대해 알아보겠습니다.
1) 템플릿(Template) 이란.
- 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀.
- 함수 템플릿(Function Template)와 클래스 템플릿(Class Template) 로 나누어집니다.
개인적으로 비유를 들자면 펜중에.. 5색펜 이런거 있잖아요. 펜이 한자루 인데. 여러가지 색(자료형)을 우리가 그때그때 쓸 수 있잖아요.
template는 여러개의 색(자료형)을 모아놓은 하나의 펜 케이스 그때그때 다른 색(자료형)을 눌러서 사용할 수 있다.
일반 자료형들이 [왼쪽] 펜들 이라고 생각한다면 -> [오른쪽]에 있는 펜 통! 이 Template 라고 생각하면 이해가 쏙쏙 ?
(저 비유 잘했죠)
우리는 그때 그떄 필요할때마다. 각 색(int, double, string 등)을 넣어서 쓰면 됩니다.
이 포스트에서는 함수 템플릿에 대해서 알아 보도록 하겠습니다.
클래스 템플릿과, 템플릿 특수화는 [바로가기] 에서 다룹니다.
2) 함수 템플릿(Function Template).
- 함수를 만들어 낼때, 함수의 기능은 명확하지만, 자료형을 모호하게 두는 것.
- 예시1) 함수 sum : 인자 2개를 받아서 더한 값을 return 하는 함수를 예로 들겠습니다.
- C++에서는 다형성의 오버로딩(overloading)특성에 의해 함수이름이 같아도 되므로,
- template 가 없을때는 아래와 같이 각각 인자의 타입을 다르게 해서 만들면 된다.
1 2 3 4 5 6 | int sum(int a, int b){ return a + b; } double sum(double a, double b){ return a + b; } | cs |
하지만 template를 사용하게 되면. 아래와 같이 하나의 함수만 정의하면 된다.
(간편하네..이걸 이제야 알다니)
1 2 3 4 | template <typename T> T sum(T a, T b){ return a + b; } | cs |
- 예시2) 인자를 2개 받을때 두개의 타입이 다른 경우
1 2 3 4 5 6 | template <class T1, class T2> void printAll(T1 a, T2 b){ cout << "T1 : " << a << endl; cout << "T2 : " << b << endl; cout << "T1 + T2 : " << a + b << endl; } | cs |
실제 코딩을 진행 해 보겠습니다.
메인 함수에서 template 함수를 어떤식으로 부르는지 주의깊게 봐 주시길 바랍니다.
예시1) template 예시 전체코드
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 | #include<iostream> #include<string> using namespace std; template <typename T> T sum(T a, T b){ return a + b; } int main(void) { int a=1, b =2; double d1 = 2.2; double d2 = 3.3; string s1 = "Show me "; string s2 = "The Money 6"; cout << "int 합 : " << sum<int>(a, b) << endl; cout << "double 합 : " << sum<double>(d1, d2) << endl; cout << "string 합 : " << sum<string>(s1, s2) << endl; return 0; } | cs |
- template 함수는 호출할때 명확하게 어떤 자료형을 쓸 건지 < > 안에 표시해주는게 좋습니다.
- template로 사용하는 변수가 2개 이상일 경우에는 함수이름 뒤에 <> 안에 명확하게 사용하지 않습니다.
- 그 때에는 컴파일러가 스스로 자료형을 판단합니다.
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> #include <string> using namespace std; template <class T1, class T2> void printAll(T1 a, T2 b){ cout << "T1 : " << a << endl; cout << "T2 : " << b << endl; }; int main(void){ string s1 = "Dok2" ; string s2 = "On my way." ; int num1 = 27; int num2 = 35; double d1 = 3.14; double d2 = 36.5; cout << "[string, string]" << endl; printAll(s1, s2); //printAll<string, string>(s1,s2); cout << "[string, int]" << endl; printAll(s1, num1); //printAll<string, int>(s1,num1); cout << "[int, int]" << endl; printAll(num1, num2); cout << "[int, double]" << endl; printAll(num1, d1); cout << "[double, double]" << endl; printAll(d1, d2); cout << "[double, string]" << endl; printAll(d1, s1); return 0; } | cs |
>> 예시 2의 출력.
+) 예시 2번째 같이 여러 자료형이 섞여 있는 경우가 있을때 혹은, 문자열끼리나 숫자 끼리 인자로 오게 됬을때 특별한 처리를 할수 있을까 ?
--> 함수 템플릿의 특수화 (specialization) 을 통해 가능합니다. (클래스 템플릿과, 템플릿 특수화 [바로가기] )
** template를 선언할 때 <typename T>,<class T> 둘다 사용 가능합니다.
**C++ 을 다 잊고,,, 다시 공부한지 얼마 안되어서 많이 부족합니다.
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] vector container 정리 및 사용법 (41) | 2017.07.20 |
---|---|
[C++] STL 이란. (0) | 2017.07.19 |
[C++] Pair 클래스 정리 및 예제 (vector, sort) (3) | 2017.07.18 |
[C++] 예외처리 (Exception Handling, try catch) (3) | 2017.07.14 |
[C++] template(템플릿)에 관하여 2 (클래스 템플릿, 템플릿 특수화) (0) | 2017.07.12 |
[C++] string 클래스 변환(atoi, c_str()) 등 정리 (5) | 2017.07.11 |
[C++] string 클래스 정리 (0) | 2017.07.10 |
[C++] string 클래스 만들어보기. (0) | 2017.07.10 |