본문 바로가기
Coding Test/C++ 기초

[C++ 기초] 템플릿

by seoyamin 2022. 8. 18.

1. 템플릿

1-1. 템플릿이란 ?

  • 인스턴스를 생성하기 위한 틀은 클래스! 이와 유사하게, 함수나 클래스를 생성하기 위한 틀이 템플릿
  • 이때, 템플릿은 모든 타입을 대변하는 T 타입을 이용해서 선언되는데, 덕분에 T 자리에 어떤 타입이 들어오는지에 따라 다양한 함수, 클래스를 생성할 수 있다.
🔔 제네릭(Generic) 프로그래밍
이처럼 일반화된 틀(템플릿)에 다양한 인자를 전달함으로써 여러가지 함수, 클래스를 만드는 프로그래밍
💥 템플릿 인스턴스화 (구체화)
정의된 템플릿에 구체적인 데이터 타입을 가진 인자를 전달함으로써 실제 함수, 클래스를 생성하는 과정

 

1-2. 템플릿의 종류

(1) 클래스 템플릿

(2) 함수 템플릿

 

1-3. 템플릿 선언 방법

template <typename T>
template <typename T1, typename T2....>

 


2. 함수 템플릿

2-1. 함수 템플릿이란 ?

  • 함수를 만들어내는 틀
  • 함수의 자료형은 미정되어 있음 (T) → 다양한 자료형의 함수 만들 수 있음
  • 함수의 기능은 결정되어 있음

 

2-2. 함수 템플릿 예시

#include<iostream>
using namespace std;

template <typename T>
T Sum(T a1, T a2) {
		return a1 + a2;
}

int main() {
	cout << Sum<int>(1, 2) << endl;          // T : int로 설정된 함수 Sum 호출 (구체화)
	cout << Sum<double>(1.5, 2.5) << endl;   // T : double로 설정된 함수 Sum 호출 (구체화)

	return 0;
}

[참고]

만약, 템플릿을 구체화할 때, <자료형>을 별도로 명시하지 않은 경우에는

컴파일러가 인자의 자료형을 이용해서 T의 자료형을 판단한다.

 

2-3. 함수 템플릿 vs. 템플릿 함수

함수 템플릿 템플릿 함수
T를 이용하여 정의한 템플릿 틀 자체 템플릿 구체화를 통해 T의 자료형이 구체화되면서
컴파일러가 만들어내는 함수
template <typename T>
T Sum(T a1, T a2)  {
            return a1 + a2;
}
int Sum<int>(int a1, int a2)  {
           return a1 + a2;
}

즉, 함수 템플릿으로 템플릿 함수를 만들어낸다 !

 

 

2-4. 템플릿 함수 vs. 일반 함수

일반적으로는 템플릿 함수보다 일반 함수의 우선순위가 더 높다.

Sum(1, 2)가 템플릿 함수 (자료형을 명시 X) 일 수도 있는데, 바로 일반 함수를 호출함

#include<iostream>
using namespace std;

template <typename T>           // 템플릿
T Sum(T a1, T a2) {
		return a1 + a2;
}

int Sum(int a1, int a2) {       // 일반 함수
		return a1 + a2;
}

int main() {
	cout << Sum<int>(1, 2) << endl;          // 템플릿 함수 Sum 호출 
	cout << Sum(1, 2) << endl;               // 일반 함수 Sum 호출

	return 0;
}

 

2-5. 함수 템플릿의 특수화

템플릿에서 특정 타입에 대하여 별도의 템플릿을 정의하는 것

#include<iostream>
using namespace std;

template <typename T>
T Max(T a1, T a2) {
		return a1 > a2 ? a1 : a2;
}

template<>
char *Max<char*> (char *a1, char* a2) {
		return strlen(a1) > strlen(a2) ? a1 : a2;
}

int main() {
	cout << Max<int>(1, 2) << endl;          
	cout << Max("car", "apple") << endl;   

	return 0;
}

 

'Coding Test > C++ 기초' 카테고리의 다른 글

[C++ 기초] 오버로딩  (0) 2022.08.11
[C++ 기초] 상속  (0) 2022.08.03
[C++ 기초] 클래스  (0) 2022.08.03
[C++ 기초] 포인터  (0) 2022.07.20
[C++ 기초] 배열  (0) 2022.07.20