본문 바로가기

Language, IDE/C, C++

[C++] 템플릿(template)

반응형

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