본문 바로가기

C++

C++ 템플릿(template)

template이란?

함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀.
template은 코드 라인 단계에서 자료형이 정해진다.

 

함수 템플릿

템플릿 선언 방법은

template<typename 변수명>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
class templateTest
{
public:
    template <typename T>
    T Sum(T value1, T value2)
    {
        return value1 + value2;
    }
};
 
void main()
{
    templateTest test;
    test.Sum<int>(1010);
    test.Sum(1010);
}
cs

4행 : 템플릿의 선언

5행 : 반환형과 매개변수의 인자를 템플릿으로 받는다.

14행 : 템플릿의 자료형을 int로 선언하고 10,10의 값을 넘겨주었다.

15행 : 템플릿의 자료형을  정의하지 않았지만 매개변수의 값이 정수형이기 때문에 int형으로 정의된다.

         다만 매개변수 하나는 정수형 하나는 실수형으로 보내면 에러를 출력한다.

 

둘 이상의 템플릿 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
class templateTest
{
public:
    template <typename T1 , typename T2>
    T2 Sum(T1 value1, T2 value2)
    {
        return value1 + value2;
    }
};
 
void main()
{
    templateTest test;
    test.Sum(1010.0f);
}
cs

4행 : 탬플릿을 2개를 지정
5행 : 매개변수 2개를 다른 템플릿으로 받아 오게 정의
13행 : 템플릿이 2개이기 때문에 10은 int 10.0f는 float로 정의되었다.
         템플릿의 개수를 추가하여 위에 문제를 해결할 수 있다.

 

템플릿의 특수화

템플릿을 특수화하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동양식을 적용하기 위해서이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
class templateTest
{
public:
    template <typename T>
    void Sum(T value1, T value2)
    {
        cout << "템플릿입니다." << endl;
    }
    
    template<>
    void Sum(int value1, int value2)
    {
        cout << "int형입니다." << endl;
    }
};
 
void main()
{
    templateTest test;
    test.Sum(10.0f, 10.0f);
    test.Sum(1010);
}
 
cs

4~8행 : 템플릿 함수를 정의
10~15행 : 템플릿 함수를 정의하였으나 템플릿을 사용하지 않음
20행 : 매개변수로 float의 값을 전달해 준다. Sum 함수에 float를 받을 수 있는 매개변수는 템플릿뿐이므로 5행이 실행
21행 : 템플릿의 특수화 매개변수로 int의 값을 전달해 준다. Sum 함수에는 int를 받는 함수가 존재한다.
         이 경우에는 5행이 아닌 11행이 실행횐다.

 

클래스 템플릿

함수를 템플릿으로 정의했듯이 클래스도 템플릿으로 정의 가능하면 이렇게 정의된 템플릿을 가리켜
클래스 템플릿이라고 한다. 이를 기반으로 컴파일러가 만들어 내는 클래스를 가리켜 템플릿 클래스 라고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename T>
class templateTest
{
public:
    templateTest() {}
    templateTest(T value1, T value2) : t1(value1), t2(value2) {}
private:
    T t1;
    T t2;
};
 
void main()
{
    templateTest<int> test(10,10);
    templateTest<float> test(10.0f, 10.0f);
}
 
cs

1~2행 : class를 템플릿으로 지정한다. 이를 가리켜 클래스 템플릿이라고 한다.
14행 : 클래스 템플릿으로 객체로 생성하였다. 이를 가리켜 탬플릿 클래스 라고 한다.

템플릿 클래스도 일반 템플릿 함수처럼 정의하고 사용한다. 다만 템플릿 함수는 자료형을 정의해 주지 않으면 매개변수를 보고 자동으로 정의되었다면 클래스 템플릿은 무조건 정의를 해주어야 한다.

 

템플릿의 상속

템플릿의 상속도 크게 다를 것이 없다. 상속하고 템플릿을 지정해 주기만 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
class templateTest
{
public:
    templateTest() {}
    templateTest(T value1, T value2) : t1(value1), t2(value2) {}
private:
    T t1;
    T t2;
};
 
template<typename T>
class Object : public templateTest<T>
{
 
};
cs

12~13행 : 클래스 탬플릿을 상속받았다. 해당 클래스의 템플릿이 어떻게 되어있는지 선언해 주고
              상속하는 부분에도 명시해 주어야 한다.

 

static과 템플릿 클래스

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
template<typename T>
class templateTest
{
public:
    void Add(T value)
    {
        t1 += value;
        cout << t1 << endl;
    }
private:
    static T t1;
};
 
template<typename T>
T templateTest<T>::t1 = 0;
 
void main()
{
    templateTest<int> test;
    test.Add(10);
    test.Add(20);
    test.Add(30);
 
    templateTest<float> test1;
    test1.Add(20.22f);
}
 
cs

11행 : static변수 생성

19~22행 : 템플릿의 자료형이 int인 객체를 생성후 staitc의 값을 올려주었다.

              staitc은 하나만 존재하는 변수이니 해당 코드를 실행하면 10, 30, 60이 나오게된다.

24~25행: 템플릿의 자료형이 float인 객체를 생성후 static의 값을 올려주었다.

             원래라면 80.22f가 출력되야 하지만 20.22f가 출력외딘다.

             템플릿 클래스의 staitc변수는 같은 자료형을 사용하는 템플릿 클래스끼리만 공유한다는 특징이 존재한다.

             자료형이 달라지면 static 변수는 공유되지 않는다.

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

C++ STL(반복자 iterator)  (0) 2020.09.28
C++ STL(Vector)  (0) 2020.09.28
C++ 함수객체  (0) 2020.09.23
C++ 상속  (0) 2020.09.17
C++ 복사생성자  (0) 2020.09.16