본문 바로가기

Archived(CSE Programming)/cpp

Chap 14. 템플릿(Template) 2

Chap 14. 템플릿(Template) 2

14-1. chap 13에서 공부한 내용의 확장

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
template <typename T>
class Point{
private:
    T xpos,ypos;
public:
    Point(T x, T y):xpos(x),ypos(y){}
};
 
template <typename T>
class Array{
private:
    T * arr;
    int len;
public:
    Array(int l):len(l){
        arr = new T[len];
    }
    
    ~Array(){
        delete[] arr;
    }
};
 
// 메인함수
void main(){
    Array<int> intArr(5);
    Array<Point<int>> pointArr(3);
    Array<Point<int>*> pointPtrArr(3);
    typedef Point<int>* POINT_PTR;
    Array<POINT_PTR> pointPtrArr2(3);
}
cs


다음과 같이 템플릿 클래스에 대해서 템플릿 매개변수로 또 다른 템플릿 클래스를 만들어서 넘겨줄 수 있다. 이러한 표현 자체가 가능한 이유는 애초에 템플릿 typename도 class 객체가 가능한데, 템플릿 클래스도 클래스 객체이기에 이러한 표현이 가능한 것이다.


추가적으로 특정 템플릿 클래스의 객체를 인자로 받는 일반 함수도 정의가 가능하며, friend 선언을 활용하여 얼마든지 템플릿 클래스에서도 함수 정의가 가능하다.


14-2. 클래스 템플릿의 특수화


1
2
3
4
5
6
7
8
9
template <>
class Array<int>{
private:
    int * arr;
    int len
public:
    ....
};
 
cs


클래스 탬플릿의 특수화도 함수 템플릿의 특수화의 이유와 방식이 동일하다. 특정 객체의 행동양식을 구분하기 위하여 우리는 특수화를 활용할 수 있는데, 다음과 같이 표현되고 사용된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T1, typename T2>
class DualArray{
private:
    T1 *arr1;
    T2 *arr2;
    int len1,len2;
...
};
 
template <typename T1>
class DualArray<T1,int>{
private:
    T1 *arr1;
    int *arr2;
    int len1,len2;
...
};
cs


추가적으로 template 매개 변수가 2개 이상 사용될 경우 부분특수화라고 해서 하나만 특수화시켜줄 수도 있다.


14-3. 템플릿 인자


1
2
3
4
5
6
7
8
9
10
template <typename T, int len>
class Array{
private:
    T *arr;
public:
    Array(){
        arr = new T[len];
    }    
    ...
};
cs


템플릿 매개변수에 typename T 외에 int형 변수를 인자로 넣어줄 수 있는데, 이렇게 사용되면 생성자와의 차이점으로 또 다른 자료형으로 사용할 수 있다. 따라서 len을 템플릿 인자로 활용해서 초기화할 경우 길이가 다른 배열 간에 연산이 수행되지 않도록(다른 자료형이므로) 처리해줄 수 있는 등 여러가지로 활용이 가능하다. 추가로 템플릿 인자도 default 값이 설정 가능하다.


14-4. 템플릿과 static


static 정적 변수는 한번 선언되면 초기화 후에는 계속 남아있는데 템플릿 내에서도 유효할까? 이에 대한 답은 유효하지만 템플릿 자체가 함수든 클래스든 여러 개를 찍어내므로 찍어져있는 템플릿 클래스, 템플릿 함수 내에서  유효하다. 즉, 템플릿 자체로 놓고 보면 여러 개의 static 변수가 존재하지만 찍어져있는 템플릿 클래스와 템플릿 함수 내에서는 한 개의 static 변수만 존재하게 되는 것이다.