C++에서는 템플릿(template)을 제공한다.
템플릿(template)은 형판, 견본, 본보기라는 뜻으로 C++에서도 함수나 클래스를 정의할 때 타입에 대한 틀을 제공해준다.
함수나 클래스에서 각 타입에 대한 정의를 일일이 작성하지 않고 템플릿을 사용함으로써 코드에 효율성을 준다.
변수 타입만 다른 함수에 대해 템플릿을 사용하면 타입을 미리 지정해주지 않아도 사용시에 컴파일러가 그 타입에 대한 정의를 오버로딩 해준다.
템플릿을 사용하지 않으면 코드가 매우 비효율적이 된다.
예를들어 다음을 생각해보자.
void swapValues(int& value1, int& value2) { int temp; temp = value1; value1 = value2; value2 = temp; }
위와같은 int형 변수의 자리를 바꿔주는 함수를 구현하였다. 그런데 char형 변수와 float형 변수등등 다른형의 변수도 사용하고 싶다면 아래와 같이 각 변수에 대해 함수를 오버로딩해주어야 한다.
void swapValues(char& value1, char& value2) { char temp; temp = value1; value1 = value2; value2 = temp; } void swapValues(float& value1, float& value2) { float temp; temp = value1; value1 = value2; value2 = temp; }
위와같이 오버로딩을 해주면 거의 유사한 코드가 반복되어 코드가 복잡해지고 매우 비효율적이된다.
그래서 사용하는것이 바로 템플릿(template)이다.
※ 템플릿을 사용하면 컴파일러는 각 타입에 대한 정의를 미리 만들지 않는다. 각 타입이 사용되면 그 때 컴파일러는
해당 타입에 해당하는 정의를 만들어 낸다. 예를들어 swapValue를 템플릿으로 구현하였다고 하면 처음에는 각 타입에
대한 정의를 만들지 않고 있다가 int형 변수를 사용하는 swap(3,5)을 사용하면 컴파일러가 swapValue(int,int)인 정의를
오버로딩한다.
템플릿의 사용
템플릿의 사용법은 간단하다. 템플릿을 사용하는 함수 선언이나 클래스 선언위에
template <class T> 를 붙이고 사용할 변수 대신에 T를 사용해주면 된다. 여기서 T부분은 템플릿의 이름이므로
T대신에 다른 이름을 사용해도 된다.
template <class T> void swapValues(T& value1, T& value2) { T temp; temp = value1; value1 = value2; value2 = temp; } int main() { int intA = 3 , intB = 5; double dA = 3.0, dB = 5.0; //사용 - 일반 함수와 똑같이 사용한다. swapValue(intA,intB); - int형 swapValue(dA,dB); - double형 return 0; }
클래스에서도 템플릿을 사용할 수 있다. 템플릿을 사용하는 클래스 선언위에 똑같이 template<class T>를 붙여주고
클래스에서 템플릿을 사용하는 각 멤버함수의 정의 위에 template<class T>를 붙여주면 된다. 이때 ::앞의 클래스 이름에는
클래스명에 <T>를 붙여준다. 클래스명<T>::함수명()
클래스를 사용할때는 클래스명에 <타입명>을 붙여준다.
template <class T> class MyClass { public: MyClass(){ myValue = 0;} MyClass(T value); void func1(T value); T func2(); private: T myValue; }; template <class T> MyClass<T>::MyClass(T value) { myValue = value; } template <class T> void MyClass<T>::func1(T value) { myValue = value; } template <class T> T MyClass<T>::func2(){ return myValue; } int main() { MyClass<int> myclass1; MyClass<double> myclass2(3.5); myclass1.func1(3); cout<<"myclass1 : "<<myclass1.func2()<<endl; cout<<"myclass2 : "<<myclass2.func2()<<endl; return 0; }
※ 주의사항
대부분의 컴파일러에서 템플릿의 선언과 정의를 따로따로 컴파일하도록 구현되어 있지 않다고 한다. 그래서 템플릿 선언과
정의를 같은 파일에 두도록 하자.
템플릿을 하나의 함수에 여러개를 사용할 수 있다.
template<class T1, class T2>
'Language, IDE > C, C++' 카테고리의 다른 글
[C++ STL] 벡터(vector) (1) | 2013.07.07 |
---|---|
[C++] 예외 처리 (Exception) (0) | 2013.07.06 |
[C++] 상속 (inheritance) (0) | 2013.07.04 |
[C++] 파일 입출력 (0) | 2013.07.03 |
[C++] getline 함수 (0) | 2013.07.03 |