ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++ STL] 템플릿(Template)
    CS/C++ 2020. 8. 5. 16:23

    STL 이 Standard Template Library 의 약자이며 표준 템플릿들의 모음이라는 것을 알게 되었는데 이 템플릿(Template) 이라는 것이 도대체 뭘까요?

     

    '템플릿' 이라는 용어는 PPT 템플릿, 파일 템플릿 등 일상 생활에서도 많이 사용됩니다. 사전적 의미로는 '틀', '주형' 등의 의미로 무언가를 담거나 미리 정해두는 틀이라는 의미를 갖습니다. C++ 에서는 이러한 템플릿을 함수나 클래스를 담는 틀로써 사용합니다.

     

    만약 여러분이 여러 명의 학생들을 가르치는 교수이고 이 학생들의 시험 성적을 분반, 성적 순으로 정렬하여 한 번에 볼 수 있도록 프로그램을 만들고 싶다고 하면 우선적으로 분반별로 학생들을 정렬해야 합니다. 이를 위해서 두 수를 비교하는 함수를 만들어 보도록 하죠.

    int Max(int a, int b){
        return a > b ? a : b;
    }

    이러한 함수를 사용하여 모든 학생들의 분반을 비교하여 분반별로 정렬을 할 수 있습니다. 그 후, 동일한 방법으로 성적을 정렬하려고 할 때 문제가 하나 발생합니다.

     

    "성적은 정수형이 아니라 실수형인데 어떡하지?"

     

    그러면 여기서 기본적인 접근은 새로운 함수를 새로 생성하는 것입니다.

    float Max(float a, float b){
        return a > b ? a : b;
    }

     

    여기까지 봤을 때, 두 개 정도의 함수면 봐줄 수 있을 것 같습니다. 하지만 여기서 데이터 타입이 다른 여러가지 기준을 추가하여 더 세부적인 정렬을 하려면 함수가 계속 추가되게 되고 유지, 보수가 어려운 프로그램이 될 것입니다.

     

    이러한 문제는 템플릿을 사용하면 쉽게 해결될 수 있습니다. 위에서 설명한 템플릿의 사전적 의미처럼 어떤 알고르즘, 즉 기능의 '틀' 만 템플릿으로써 만들어 놓고 실질적인 사용을 할 때의 데이터 형은 컴파일 시 인자에 따라 자동으로 생성되게 하는거죠!

    이렇게 템플릿을 사용하여 만드는 함수를 "함수 템플릿" 이라고 부르는데, 정의하는 방법은 아래와 같습니다.

    template <typename T> function

    함수 선언 부분은 데이터 타입을 T 로 바꾸고 일반 함수의 선언처럼 하시면 됩니다. 그러면 위의 2개의 max 함수를 템플릿을 사용하여 하나의 함수로 만들어 보겠습니다.

    template <typename T>
    T Max(T a, T b){
        return a > b ? a : b;
    }

    int, float 등의 데이터 형이 들어가던 자리를 T라는 임의의 타입으로 두고 템플릿 함수를 만들어 봤습니다. 한 번 테스트를 해볼까요?

    #include <iostream>
    using namespace std;
    
    template <typename T>
    T Max(T a, T b){
        return a > b ? a : b;
    }
    
    int main(){
        int sec1 = 1;
        int sec2 = 2;
        cout<<Max(sec1, sec2)<<endl;
        
        float score1 = 97.5;
        float score2 = 50.8;
        cout<<Max(score1, score2)<<endl;
        return 0;
    }

    결과는 잘 나오는 것 같습니다.

     

    여기서 한 걸음 더 나가서, 만약 두 인자가 데이터 형이 다를 경우의 함수를 만들 수도 있습니다.

    template <typename T1, typename T2>
    T1 multiply(T1 a, T2 b){
        return a * b;
    }

     두 인자를 입력받아서 곱을 출력하는 템플릿 함수이고, 여기서 이 함수의 결과값은 첫 번째 인자의 데이터형을 따라 가게 됩니다.

     

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

    [C++ STL] 리스트(List)  (0) 2020.08.08
Designed by Tistory.