본문 바로가기
C++

클래스 템플릿!

by 상레알 2009. 2. 18.
클래스 템플릿도 함수 템플릿과 같은 개념으로 접근하면 어려울 것이 없다.  

ex)
#include <iostream>
using std::endl;
using std::cout;

template <typename T>

class Data
{
       T   data;
public:
     Data(T d){
               data=d;
}
void SetData(T d){
       data = d;
}
T Get Data(){
     return data;
}
};

여기서 주의해야될것은 템플릿이라고 해도 다른 자료형 선언이 가능하다는 것이다.
for문을 리려면 int 형 변수가 있어야 하지 않겠는가? 함수가 리턴하지 않으면 void 선언도 해줘야하지 않겟나?
그래서 그렇군.ㅋㅋ

위에서 정의한 클래스 템플릿 기반으로 객체를 생성하는 main 함수 소스

int main(void)
{
 Data<int> d1(0);  
//T 를 int로 간주하고 객체 생성
d1.SetData(10);
Data<char> d2('a');
  // T를 char로 간주하고 객체 생성
cout<<d1.GetData()<<endl;
cout<<d2.GetData()<<endl;
return 0;
}

클래스 템플릿을 기반으로 객체 생성시 결정하고자 하는 자료형을 명시적으로 선언 해줘야 한다!!

왜? 함수 템플릿처럼 객체는 전달 인자를 통해서 자료형을 결정하지 못하는 것일까?

객체 생성 순서를 생각해보자 제일 먼저 진행되는 일이 메모리 공간의 할당이고, 그다음 생성자 호출이다. 생성자가 호출되어야 전달인자를 참조해서 T의자료형을 결정지을 수 있을 텐대, 메모리 공간의 할당이 우선적으로 진행이 된다. 그렇다면 T를 무엇으로 생각하고 메모리 공간을 할당하겠는가? 즉....  메모리 공간을 적절히 할당할 수가 없다는 결론이 나온다. 그래서 명시적으로 T의 자료형을 선언해 주는 것이다.
- 쿨래스 템플릿의 경우 생성자를 통해서 전달되는 인자의 자료형과 결정되어야 할 템플릿의 자료형이 다를 수도 있다. 그래서 자료형을 명시적으로 선언하게 하는 것이다.

클래스 템플릿의 선언과 정의 분리.

template <typename T>
class Data
{
    T data;
public:
    Data(T d);
    void  Set Data (T d);
    T GetData();
};

template<typename T>
Data<T>::Data(T d){
data =d;
}
template <typenaem T>
void Data<T>::SetData(T d)[
data= d;
}
template <typename T>
T Data<T>::GetData(){
return data;
}

-> 자 여기서 멤버 함수의 선언을 보면   Data<T>:: ..... 라고 적혀 있는 것을 볼수 있다. 이것은
T타입에 대해서 템플릿으로 정의되어 있는 클래스 를 의미하는 것이다.
"클래스 템플릿Data" 는  " Data클래스 템플릿" 는 엄연히 구분이 된다.
만약 Data<T>:: .. 로 선언하지 않고 Data:: .. 로 선언을 한다면 Data클래스의 멤버함수를 선언하는것이지
Data 클래스 템플릿을 의 멤버 함수를 정의하는 것이 아니다.
멤버함수를 정의할때 마다 반드시 붙여줘야한다는 것에 주의해야한다.


스택클래스...처럼 자주 사용되는 알고리즘을 템플릿으로 정의해 놓으면 여러모로 유용하다. 실제로 이미 전문가들에 의해서 이러한 일들은 진행되어 왔으면 오늘날에는 표준으로 자리매김하였다. 이러한 템플릿의 모음을 가리켜  STL(standard Template Library)라고 한다. 



템플릿의 원리 이해

템플릿의 원리를 이해하게 되면, 템플릿의 장점 및 단점을 이해할 수 있을 뿐만아니라 ,템플릿에 대한 다양한 문법적 요소를 보다 쉽게 이해 및 추론도 할수 있다.

처음에 공부했었 간단한 함수 템플릿을 보자

template <typename T>
T Add(T a, T b)
{
      return  a+b;
}

위에 정의한 것은 분명히 템플릿이다.... 이 자체는 호출이 가능한 함수가 아니다. 호출이 가능한 함수를 만들기위한 하나의 틀에 불가 하다. 이것은  

int Add(int a, int b)
{
     return a+b;
}

double Add(double a, double b)
{
    return a+b;
}
위 같은것은 함수 템플릿을 기반으로 해서 만들어지는 호출이 가능한 함수들을 템플릿 함수라고 한다.
템플릿을 기반으로 해서 만들어진 함수이기 떄문이다. 또한 템플릿 함수가 생성되는 현상을 가리켜서 " 함수 템플릿의 인스턴스화" 라고 부른다.

클래스 템플릿 또한 마찬가지이다. 클래스 템플릿객체화가 가능한 클래스를 만들기 위한 하나의 틀에 지나지 않는다.
이러한 틀에 의해서 필요로 하는 클래스 (템플릿 클래스)가 만들어지는것이다.

템플릿은 컴파일러에 의해서 적절히 처리가 된다. 탬플릿을 처리해 주는 것은 컴파일러이기 때문에 템플릿 클래스는 선언과 정의를 각각다른 파일에 분리 시켜놓을 수 없다 만약 그렇게 한다면 컴파일 오류를 일으키게된다. 분리된것의 연관관계를 찾아주는 것은 링커가 담당하기 때문이다. 즉 클래스 템플릿은 하나의 파일 내에 선언과 정의가 함께 이써야 한다.

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

C++ 예외 처리  (0) 2009.02.18
use of class template requires template argument list ->컴파일 에러  (0) 2009.02.18
함수 템플릿!!!  (0) 2009.02.17
임시 객체에 대하여....  (0) 2009.02.16
string 클래스 디자인  (0) 2009.02.16
oop 프로젝트 8단계 중...  (0) 2009.02.12
배열의 인덱스 연산자 오버로딩  (0) 2009.02.10
cout / cin / endl 에 대하여...  (0) 2009.02.10
단항 연산자의 오버로딩  (0) 2009.02.09
연산자 오버로딩  (0) 2009.02.06