[C++]템플릿
- Language & Solution/C++
- 2017. 4. 11. 15:24
반응형
템플릿은 제너릭 프로그래밍을 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 |
이 글을 공유하기