본문 바로가기

프로그래밍 언어/c++

[C++] STL 프로그래밍 (1) - 템플릿

728x90
반응형

STL은 'Standard Template Library'의 약자로, 자주 사용되는 자료구조와 알고리즘을 모은 라이브러리입니다.

vector, map, set등의 자료 구조와 find, search등의 알고리즘이 이에 해당합니다.

 

- Template

 

 

 

STL을 이해하기에 앞서, template의 개념을 먼저 이해해야합니다.

만약 두개의 int 값을 더하는 함수를 작성하려면 아래와 같이 구현할 수 있습니다.

 

#include <iostream>

using namespace std;

int Sum(int a, int b) {
	return a + b;
}

int main() {
	cout << Sum(1, 3);
}

 

 

 

 

그러나 만약 1, 3이 아닌 double, 즉 실수인 1.4와 2.5의 두 값을 더하고 싶다면,

int형을 인자로 받고, int형을 반환하는 위의 함수는 사용할 수 없기 때문에

이미 만들어둔 Sum과 로직이 똑같음에도 불구하고

double형을 인자로 받고, double형을 반환하는 아래와 같은 함수를 하나 더 만들어야합니다.

 

double Sum(double a, double b) {
	return a + b;
}

 

 

 

 

이렇듯 같은 인자 타입이 다르고, 로직이 같은 경우에 사용할 수 있는 것이 템플릿입니다.

아래는 템플릿을 사용해서 Sum을 다시 구현한 것입니다.

 

#include <iostream>

using namespace std;

template <typename T> T Sum(T a, T b) {
	return a + b;
}


int main() {
	cout << Sum(1.5, 1.53);
}

 

 

 

이제는 Sum의 인자로 int, float, double등 서로 다른 인자를 넣어도 잘 동작합니다.

이와 같이 template을 사용해서 만든 함수가 함수 템플릿 입니다.

 

 

 

 

위의 템플릿 함수인 Sum의 인자로 서로 다른 형, 즉 3과 1.05를 전달하면 에러가 납니다.

그 이유는 현재 T로 동일한 형의 인자와 반환형이 넘어가도록 정의했기 때문입니다.

즉, int 형 변수를 인자로 넘겨주었다면 int Sum(int a, int b)가 되는 것이고,

double형 변수를 인자로 넘겨주었다면 double Sum(double a, double b)가 되는 것입니다.

따라서 double Sum(double a, int b)와 같이 혼합하여 사용하고 싶다면 아래와 같이 사용해야합니다.

 

template <typename T1, typename T2> T2 Sum(T1 a, T2 b)

 

 

 

 

클래스 템플릿 사용은 아래와 같이 할 수 있습니다.

 

template<typename T> class 클래스명

 

 

 

 

STL은 C++템플릿을 사용해서 만든 표준 라이브러리이므로,

위의 내용들을 숙지하고 STL을 사용하는 것이 좋습니다.

 

 

 

 

 

728x90
반응형