본문 바로가기
<개인공부>/[C++]

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

by 사용자 BlockDMask 2017. 7. 11.
반응형
  • 안녕하세요 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++ 을 다 잊고,,, 다시 공부한지 얼마 안되어서 많이 부족합니다. 

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


    반응형

    댓글14

    • 2017.10.06 21:47

      비밀댓글입니다
      답글

    • 굿잡 2019.02.22 19:28

      감사해요 잘알아갑니다~
      답글

    • 망고 2019.03.25 00:31

      하이파이브!
      답글

    • 학생 2019.05.31 15:02

      와..도끼의 온마웨이가 있네요..ㅋㅋㅋㅋㅋㅋㅋ

      답글

    • haha 2019.12.12 18:18

      설명 기똥차게 예시까지 들면서 잘하시네요 사랑합니다.
      답글

    • ㅁㅁ 2020.11.05 10:17

      와..어제 면접에서 c++ 템플릿에대해 설명하라고 했을 때 못해서 찾아봤는데
      이거 진짜 엄청 편리하고 좋은거였네요
      답글

      • 감사합니다.
        면접 좋은 결과 있길 바라겠습니다.

      • ㅁㅁ 2020.11.23 14:58

        면접에 도움되리라 말씀하나 드리자면 C++에서 템플릿은 class를 사용하는 코딩과 상극이라 템플릿을 사용할 일은 거의 없습니다.

        이유 1. 범용성이 좋다라고 말하지만 명시성을 중요시 하는 현재 코딩흐름상 특히 객체지향에서 함수오버로딩도 사용하지 않으려고 이름을 따로 쓰는데 함수오버로딩을 동작원리로 사용하는 템플릿을 제공하는건 어울리지 않습니다.

        2. 사용하고 구현할때 메인에 작성할 경우 아무문제가 없고 자동으로 매칭 되지만. 클래스식 코딩 즉 헤더와 cpp파일을 분리해서 작성할때 템플릿과 그에 관한 구현내용은 전부 헤더파일에 써야합니다(컴파일할때 링크오류관련). 이럴 경우 헤더파일이 의미하는바가 이상해지고(헤더파일에 구현해야하므로) 복잡해지므로 이역시 지양하는 것이 좋습니다.

        그럼 템플릿은 어디에 사용하느냐? c++의 경우는 자료구조의 컨테이너를 사용할때입니다 컨테이너의 경우 어떤 자료가 들어올지 모르므로 이를 미리 맞출 수는 없기 때문에 템플릿으로 제공할 수 밖에 없습니다.

        3줄요약,
        - 템플릿은 함수를 커스터마이징해서 범용적으로 사용할 수 있게하는 문법이다.
        - 하지만 현재 객체지향 프로그램특성상 범용성보다는 명시성을 중요시 하므로 거의 쓰이지 않는다.
        - c++에서 템플릿은 자료구조 컨테이너에서 활용하는게 대부분이다.

    • 지나가는나그네 2021.04.19 23:32

      잘보고 갑니다
      답글