-
[C++ STL] 템플릿(Template)Programming/C++ 2020. 8. 5. 16:23
STL 이 Standard Template Library 의 약자이며 표준 템플릿들의 모음이라는 것을 알게 되었는데 이 템플릿(Template) 이라는 것이 도대체 뭘까요?
'템플릿' 이라는 용어는 PPT 템플릿, 파일 템플릿 등 일상 생활에서도 많이 사용됩니다. 사전적 의미로는 '틀', '주형' 등의 의미로 무언가를 담거나 미리 정해두는 틀이라는 의미를 갖습니다. C++ 에서는 이러한 템플릿을 함수나 클래스를 담는 틀로써 사용합니다.
만약 여러분이 여러 명의 학생들을 가르치는 교수이고 이 학생들의 시험 성적을 분반, 성적 순으로 정렬하여 한 번에 볼 수 있도록 프로그램을 만들고 싶다고 하면 우선적으로 분반별로 학생들을 정렬해야 합니다. 이를 위해서 두 수를 비교하는 함수를 만들어 보도록 하죠.
int Max(int a, int b){ return a > b ? a : b; }
이러한 함수를 사용하여 모든 학생들의 분반을 비교하여 분반별로 정렬을 할 수 있습니다. 그 후, 동일한 방법으로 성적을 정렬하려고 할 때 문제가 하나 발생합니다.
"성적은 정수형이 아니라 실수형인데 어떡하지?"
그러면 여기서 기본적인 접근은 새로운 함수를 새로 생성하는 것입니다.
float Max(float a, float b){ return a > b ? a : b; }
여기까지 봤을 때, 두 개 정도의 함수면 봐줄 수 있을 것 같습니다. 하지만 여기서 데이터 타입이 다른 여러가지 기준을 추가하여 더 세부적인 정렬을 하려면 함수가 계속 추가되게 되고 유지, 보수가 어려운 프로그램이 될 것입니다.
이러한 문제는 템플릿을 사용하면 쉽게 해결될 수 있습니다. 위에서 설명한 템플릿의 사전적 의미처럼 어떤 알고르즘, 즉 기능의 '틀' 만 템플릿으로써 만들어 놓고 실질적인 사용을 할 때의 데이터 형은 컴파일 시 인자에 따라 자동으로 생성되게 하는거죠!
이렇게 템플릿을 사용하여 만드는 함수를 "함수 템플릿" 이라고 부르는데, 정의하는 방법은 아래와 같습니다.
template <typename T> function
함수 선언 부분은 데이터 타입을 T 로 바꾸고 일반 함수의 선언처럼 하시면 됩니다. 그러면 위의 2개의 max 함수를 템플릿을 사용하여 하나의 함수로 만들어 보겠습니다.
template <typename T> T Max(T a, T b){ return a > b ? a : b; }
int, float 등의 데이터 형이 들어가던 자리를 T라는 임의의 타입으로 두고 템플릿 함수를 만들어 봤습니다. 한 번 테스트를 해볼까요?
#include <iostream> using namespace std; template <typename T> T Max(T a, T b){ return a > b ? a : b; } int main(){ int sec1 = 1; int sec2 = 2; cout<<Max(sec1, sec2)<<endl; float score1 = 97.5; float score2 = 50.8; cout<<Max(score1, score2)<<endl; return 0; }
결과는 잘 나오는 것 같습니다.
여기서 한 걸음 더 나가서, 만약 두 인자가 데이터 형이 다를 경우의 함수를 만들 수도 있습니다.
template <typename T1, typename T2> T1 multiply(T1 a, T2 b){ return a * b; }
두 인자를 입력받아서 곱을 출력하는 템플릿 함수이고, 여기서 이 함수의 결과값은 첫 번째 인자의 데이터형을 따라 가게 됩니다.
'Programming > C++' 카테고리의 다른 글
[C++] getline() - 한 줄 입력받기 (0) 2021.06.22 [C++] EOF 입력받기 (0) 2021.06.22 [C++ STL] 리스트(List) (0) 2020.08.08