Program Languege/C/C++

템플릿 - 1

Frozen0113 2013. 3. 19. 21:14

템플릿(Template) - 1

 

템플릿은 사전적인 의미로 형틀, 무언가를 찍어내는 틀을 말한다. 프로그래밍에서도 같은 의미로 무언가를 만들어내는 틀을 말한다.

 

함수 템플릿을 통해 좀 더 자세한 설명을 할텐데 함수 템플릿은 함수를 만들어내는 템플릿을 말한다.

 

Ex>

template <typename T>

T Add(T num1, T num2)

{

     return num1 + num2;

}

 

위의 예시에서 살펴보면 template <typename T> 라는 것이 보이는데 이 문장은 T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다는 의미이다. 그리고 T는 자료형을 결정짓지 않겠다는 의미이다.

 - T대신에 다른 이름을 사용해도 된다. 사용자 정의 함수에서 매개변수의 이름과 같다고 생각하면 된다. Ex> <typename N>

 - template <typename T> 에서 template<class T>로 선언해도 같은 의미이다.

 

위의 예시는 Add라는 함수를 만들어내는 함수 템플릿의 정의이다. Add라는 함수는 두개의 인자를 전달받아 합을 반환하는 함수로 전달받는 인자와 반환하는 타입은 동일하다는 것을 알 수 있다.

 

이를 사용하는 방법은 다음과 같다.

 

Ex>

 

template <typename T>

T Add(T num1, T num2)

{

     return num1 + num2;

}

 

int main(void)

{

    cout << Add<int>(15, 20) << endl;

    cout << Add<double>(10.3, 5.7) << endl;

 

    return 0;

}

 

위의 예시에서 Add<int>(15, 20)를 보면 <int> 이것은 T를 int로 해서 Add함수를 만들어 사용한다는 의미이다. Add<double>의 경우는 T를 double로 하겠다는 의미가 된다.

 

함수의 생성 시기는 컴파일에서 생성되며 자료형 당 하나씩 생성된다. <int>형으로 여러번 호출하더라도 <int>형으로는 하나를 만들어 계속 사용하는 것이다. 그렇기 때문에 컴파일시에 시간이 좀 늘어날 수 있지만 실행 속도에는 상관이 없다.

 

추가로 위에서 호출한 방법 외에 일반 함수를 호출하듯 Add(15, 20); 처럼 호출하여도 전달되는 인자의 자료형을 참조하여 Add<int>(15, 20) 처럼 호출된다.

 

위에 예시의 정의를 함수 템플릿 이라고 한다. 그리고 함수 템플릿을 사용하여 컴파일러가 호출한 자료형마다 만들어낸 함수를 템플릿 함수 라고 한다.

 

둘 이상의 type에 대한 템플릿 정의는 다음과 같다.

 

Ex>

 

template <class T1, class T2>

//template<typename T1, typename T2> 와 같은 의미.

1) void ShowData(double num)

   {

       2) cout << (T1)num  << ", " << (T2)num << endl;

       // cout <<  T1(num) << ", " << T2(num) << endl; 로 써도 같은 의미이다.

    }

 

int main(void)

{

3) ShowData<char, int>(65);

    ShowData<char, double>(68.9);

 

    return 0;

}

 

- 출력 화면

A, 65

D, 68.9

 

1) 반환형와 매개변수의 타입은 사용자 정의 함수처럼 자유롭게 지정할 수 있다. 처음에 든 예시처럼 꼭 T를 사용해야만 하는 것은 아니

    다.

2) num은 double로 받지만 내부에서는 T1의 타입과 T2의 타입대로 형변환해서 사용한다는 의미이다.

3) 이 함수 템플릿의 경우 호출에서는 매개변수의 자료형을 따로 double로 해두었기 때문에 <char, int> 처럼 명시를 해주어야한다.

 

 

 

-출처 : 윤성우 열혈 C++ 프로그래밍