<개인공부>/[C++]

[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿)

BlockDMask 2017. 7. 11. 14:24
반응형
  • 안녕하세요 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 함수는 호출할때 명확하게 어떤 자료형을 쓸 건지 < > 안에 표시해주는게 좋습니다.

    >> 예시1의 출력


    예시2) 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++ 을 다 잊고,,, 다시 공부한지 얼마 안되어서 많이 부족합니다. 

    최대한 아는선에서 & 공부한선에서 & 조사하고 & 직접 해 본 다음에 작성 하도록하겠습니다.
    혹, 잘못 게시하거나 제가 잘못 이해하고 있는 부분이 있다면 따끔한 지적 부탁드리겠습니다. 


    반응형