[C/C++] Template for generic programming

개발 노트 2009. 1. 20. 17:01 posted by 무병장수권력자


Template for generic programming

작성자 : 김문규
최초 작성일 : 2009. 1.20

1. Template 란?
generic programming을 위해 C++에서 제공하는 수단입니다. 이를 위해서는 이외에도 macro, overloading이 있습니다. 하지만, macro는 debugging이 어렵고 overloading은 귀찮기 때문에 가능하다면 template을 추천합니다.
** gereral programming이란, 코드의 재사용성을 높일 수 있도록 효과적으로 소프트웨어를 구현하는 것을 가리킵니다.

2. Function Template (함수 템플릿)
어떤 함수를 일반화한 것을 함수 템플릿이라 하고, 함수 템플릿으로 처리하기 곤란한 경우에 대해서만 따로 구현하는 것을 특수화라고 한다.
** 함수 -> 템플릿 -> 특수화

Template를 선언하는 방법은 아래와 같습니다.
template <typename T1, typename T2 ....>
T function_name(T1 a, T2 b ...)
{
    logic
}
typename 대신에 class를 사용하기도 합니다.

간단한 예를 들어 보겠습니다.
#include <iostream>
#include <cstring>
using namespace std ;
//max returns the maximum of the two elements
template <class T>
T max_(T a, T b)
{
    return a > b ? a : b ;
}
// Specialization of max for char*
template <>
char* max_(char* a, char* b)
{
    return strcmp(a, b) > 0 ? a : b ;
}
int main()
{
    cout << "max(10, 15) = " << max_(10, 15) << endl ;
    cout << "max('k', 's') = " << max_('k', 's') << endl ;
    cout << "max(10.1, 15.2) = " << max_(10.1, 15.2) << endl ;
    cout << "max(\"Aladdin\", \"Jasmine\") = " << max_("Aladdin", "Jasmine") << endl ;
    return 0 ;
}


main 함수에 앞선 3개의 max_는 template function을 그대로 호출하게 되고 마지막 max_는 specialized template function을 호출하게 됩니다.

3. Class Template (클래스 템플릿)
선언의 방법은 유사합니다. class 선언부 상단에 template <typename T> 처럼 일반화 시킬 입력 변수의 종류를 선언하고 기존에 int, double등 타입으로 표시하던 부분을 typename으로 바꾸어 주면 땡!

예를 들면

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

int main()
{
 Data<int> d1(0);
 d1.SetData(10);
 Data<char> d2('a');

 cout<<d1.GetData()<<endl;
 cout<<d2.GetData()<<endl;
 return 0;
}


근데, C++의 경우에는 .hpp 파일과 .cpp 파일을 따로 사용하시는 경우가 더 많지요? 이 경우에는 다음과 같이 하시면 됩니다.
data.hpp

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

data.cpp

template<typename T>
Data<T>::Data(T d)
{
 data = d;
}

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

template<typename T>
T Data<T>::GetData()
{
 return data;
}


4. 마치면서
generic programming은 소프트웨어 개발을 하면서 많이 듣는 표준화, 공용화 측면에서 의미 있어 보입니다. 그래서, 능력과 시간이 된다면 당연히 템플릿을 기반으로 개발해야 하지 않을까 생각합니다. 그런데, 템플릿도 단점은 있습니다.
먼저 사용하기가 쉽지 않아 보입니다.
그리고, 실행 바이너리의 크기가 커집니다.
그래도, 좋다고요? 그럼 사용해 볼까요?

<참조 자료>
http://shinlucky.tistory.com/196
http://www.iis.sinica.edu.tw/~kathy/vcstl/templates.htm
http://kid1412.springnote.com/pages/1449032