본문 바로가기

CS/C++

[C++]템플릿(template)

728x90

1. 템플릿

템플릿은 함수나 클래스의 형틀입니다. 형틀에는 다양한 자료형을 넣고 사용할 수 있습니다. 필요에 따라 원하는 함수나 클래스로 템플릿을 이용해 찍어낼 수 있습니다.


2. 함수 템플릿

두개의 수를 비교하여 큰값을 얻는 함수를 만든다고 가정합시다. 그런 함수는 아래와 같게 됩니다.

1
2
3
4
5
6
7
int intMax(int a,int b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}
cs

위 함수는 int형만 비교할 수 있기 때문에 double형을 위한 함수도 생성합니다.
1
2
3
4
5
6
7
8
double doubleMax(double a,double b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}
 
cs


생각해보니 c++에선 자료형이 매우 많아서 각 자료형마다 비교하는 함수를 만들어 줘야합니다. 이렇게 되면 하루종일 비교함수만 만들게 될 것입니다.

이러한 작업을 줄이기 위해 template을 사용합니다.

template을 사용 하면 아래와 같이 하나의 함수만으로 모든 자료형을 비교할 수 있습니다.

1
2
3
4
5
6
7
8
template<typename T>
T max(T& a,T& b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}
cs

template<typename T>를 이용하여 해당 함수를 템플릿으로 정의합니다. 템플릿함수에서 쓰일 자료형은 <Typename T>로 인해 T라는 자료형이 되게됩니다. 인자를 받을 때 T의 참조자(reference)를 이용합니다.
typename을 class로 하여 <class T>로 사용해도 됩니다.
위 함수를 이용하여 큰값을 출력하는 코드를 작성해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
template<typename T>
T max(T& a,T& b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}
 
int main(int argc, char** argv) {
    int i1 = -101, i2 = 2016;
    cout << max(i1,i2) << endl;
    
    double d1 = 3.14, d2 = 3.141516;
    cout << max(d1,d2) << endl;
    
    return 0;
}
cs

출력결과

2016

3.14152 



3. 클래스 템플릿(Class 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
26
27
28
29
#include <iostream>
using namespace std;
template <typename T1=inttypename T2=double> //initial type
class A{
private:
    T1 value1;
    T2 value2;
public:
    A(const T1& v1, const T2& v2){
        value1 = v1;
        value2 = v2;
    }
    const T1& GetFirstValue() const{
        return value1;
    }
    const T2& GetSecondValue() const{
        return value2;
    }
};
int main(int argc, char** argv) {
    A<> myA(20,10.09);
    cout << myA.GetFirstValue() << endl;
    cout << myA.GetSecondValue() << endl;
    
    A<stringstring> mymyA("22", "Learn template, love C++");
    cout << mymyA.GetFirstValue() << endl;
    cout << mymyA.GetSecondValue() << endl;
    return 0;
}
cs

출력결과

20

10.09

22

Learn template, love C++


typename에 초기형을 선언하여, 만약 클래스 선언시에 형을 선언하지 않았다면 초기형으로 자료형을 설정할 수도 있습니다.

'CS > C++' 카테고리의 다른 글

[C++]다형성(Polymorphism)  (0) 2016.06.07
[C++]복사생성자(Copy Constructor)  (0) 2016.06.07
[C++]상속 접근 지시자  (0) 2016.06.07
[C++] 다중상속(Multiple inheritance)  (0) 2016.06.07