Post List

2017/12/17

C++__템플릿(template)

1. 템플릿(template)이란?
 - c++프로그래밍 언어의 한 기능으로, 함수와 클래스가 제너릭 형과 동작 할 수 있게 도와 줍니다.
*제너릭 프로그래밍 : 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍을 말합니다.

2. 템플릿의 종류
 1) 함수 템플릿
  - 여러 다른 자료형에 대하여 같은 역할을 하는 하나의 함수 계열을 하나의 템플릿으로 표현
1
2
3
4
5
template<class T>
void OutputData(T data)
{
    cout << data << endl;
}
cs
   *템플릿 함수 : 컴파일하고 실행할 때 실제로 호출 하는 함수는 템플릿 기반으로 만들어진 함수를 컴파일러가 자동적으로 생성하고 호출 하는 것입니다.
컴파일러가 코드를 자동적으로 생성해 주는 경우는 없었지만, 컴파일 타임에 이런 인스턴스화가 일어납니다. 이렇게 함수 템플릿이 인스턴스화 되어 나온것이 바로 템플릿 함수입니다.
1
2
3
4
5
6
7
int main()
{
    TemplateClass<int> intClass(10);
    // 템플릿 
    OutputData(intClass.GetDate());
cs

 2) 클래스 템플릿
  - 클래스를 템플릿 변수에 따라 생성할 수 있게 하는 기능입니다. 클래스 템플릿은 컨테이너의 용도로 많이 사용된답니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<class T>
class TemplateClass
{
public:
    TemplateClass(T data) {
        m_data = data;
    }
public:
    T GetDate(void) { return m_data; }
private:
    T m_data;
};
int main()
{
    TemplateClass<int> intClass(10);
    TemplateClass<string> stringClass("Template Class Test");
}
cs
위 코드를 보면 int 타입을 받는 클래스가 되기도 하며, string을 받는 클래스가 되기도 합니다.
일반적인 자료형외의 구조체나 클래스 타입을 받는 구조도 가능하답니다.


3. 템플릿 선언시 주의사항
 - 함수 템플릿이 인스턴스화 되어 템플릿 함수가 실제로 호출이 일어나 프로그램을 실행하는 것입니다. 템플릿 함수는 컴파일러가 만드는데, 선언과 정의를 .h와 .cpp에 나눠 선언하게 되면 호출시 에러가 발생합니다. cpp의 정의 부분은 링커가 호출해주므로 문제가 발생하지요.
그래서 클래스 템플릿이나 함수 템플릿을 만들때 헤더에 선언과 정의를 한번에 다 하는 것이 좋습니다.

일반적인 클래스의 경우에는 아무 에러없이 컴파일 실행이 되는 이유는 컴파일->링크 라는 일련의 과정중 컴파일 과정에 그 원인이 있습니다.
- 템플릿의 구체화 시점 -> 컴파일시
- 일반적인 함수는 컴파일시 원형선언만 있으면 됨 -> 링크시 바인딩

템플릿은 컴파일 시점에 구체화가 되어야 하기 때문에, 헤더파일에 모든 정의가 되어있어야 합니다.
A.cpp로 부터 만들어지는 A.o 목적파일은 링크시 바인딩되기 때문에 컴파일러는 멤버함수를 찾을 수 없다는 에러를 냅니다. 멤버함수의 정의는 A.o에 들어있고 컴파일시에는 알수없고, 링크시에 알수있기 때문입니다.