반응형

[C++]템플릿

반응형


템플릿은 제너릭 프로그래밍을 C++에서 구현하기 위해 도입된 개념입니다. template 키워드를 통해 구현하죠. 제너릭 프로그래밍이란 어떤 데이터의 형식에 의존하기 않고 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하여 재사용성을 높일 수 있도록 한 프로그래밍 방식이죠. 


예를 들어보죠.

int add(int x, int y)
{
    return x + y;
}

double add(double x, double y)
{
   return x + y
}
두 수를 더하는 간단한 함수입니다. 하지만 c++에서는 실수와 정수를 표현하는 데이터 타입이 다르기 때문에 만약 각각의 데이터 타입에 맞는 함수를 구현하려면 오버로딩을 통해 각 데이터 타입에 맞는 함수를 다시 작성해야 합니다. 두 개 정도야 좀 불편하더라도 작성하면 괜찮겠지만 이런 경우가 100번 아니 1000번 이상 늘어나서 다시 작성해야 한다면 상당히 코드양도 많아지고 유지 보수도 상당히 어려워 지겠죠. 이 때, 템플릿을 쓰면 이 문제는 금방 해결됩니다.
template<typename T>
T add(T x, T y)
{
	return x + y;
}
템플릿으로 정의한 자료형을 이용하여 두 숫자를 더하는 기능을 구현했습니다. 이 템플릿 자료형은 실수, 정수 어떤 데이터 타입도 받을 수 있죠. 즉, 데이터의 형식에 의존하지 않고 더하는 기능을 구현하는 함수를 만든 겁니다. 제너릭 프로그래밍의 정의와 합치되는 군요.


템플릿은 C++에서 크게 함수 템플릿과 클래스 템플릿으로 구분됩니다.

template<typename T>
template<class T>

엄밀히 말하면 두 코드의 기능은 같습니다. typename을 쓰든 class를 쓰든 상관없죠. 중요한 것은 의미 차이입니다.

#include <iostream>
#include <string>
using namespace std;

template<typename T>
void swapping(T& a, T& b)
{
    T temp = a;
    a = b;
    b= temp;
}

template<class T>
class foo {
public:
    T data;
    foo(T _data) : data(_data) {}
    void show(){
         cout << data  << endl;
    }
};

int main(void)
{
    char ca = 'a', cb = 'b';
    swapping(ca, cb);
    cout << ca << " " << cb << endl;
    int ia = 1, ib = 2;
    swapping(ia, ib);
    cout << ia << " " << ib << endl;

    foo<int> c1(4);
    foo<string> c2("how are you");
    c1.show();
    c2.show();
}
 
결과
b a
2 1
4
how are you
위의 코드를 분석해보면 &연산자는 변수의 주소를 가르킵니다. 그리고 template 변수가 ca와 cb의 주소를 받아서 그 두 변수를 스왑합니다. ia, ib도 마찬가지구요. sapping 함수를 통해 자료형에 상관없이 같은 기능을 수행하는 걸 볼 수 있습니다. 

다음은 foo 클래스를 보실텐데, 클래스 내에서 template 변수로 정의된 T를 쓸 수 있는 것을 볼 수 있습니다. 그리고 이 클래스의 데이터 타입은 foo<int> 혹은 foo<string>의 <>안의 데이터 타입을 명시해 줌으로서 결정되죠. 





반응형

'Language & Solution > C++' 카테고리의 다른 글

[C++] 시간 측정  (0) 2017.04.14
[C++] 표준 출력 정확도 조정  (0) 2017.04.14
[C++] 범위 지정 연산자(::)와 namespace  (0) 2017.04.14
[C++] 표준 입출력  (0) 2017.04.14
Hello world  (0) 2017.04.01

이 글을 공유하기

댓글

Designed by JB FACTORY