반응형
함수 템플릿
- 함수 하나로 다양한 형식의 데이터를 같은 알고리즘으로 처리할 수 있다.
- 개방 폐쇄 원칙(OCP)을 지키면서 여러가지 용도로 널리 쓸 수 있는 함수를 만드는 방법이다.
- 매개변수의 데이터 형식을 함수를 작성하는 시점이 아닌, 사용(호출)하는 시점에 정할 수 있다.
- 함수 템플릿이 포함된 소스 코드를 컴파일하면 해당 함수에 사용된 데이터 형식으로 함수의 실제 구현체가 만들어진다.
- 모든 데이터 형식에 대응할 수 있는 알고리즘으로 정의해야한다. 그렇지 않으면 컴파일 오류가 발생한다.
- 컴파일러는 함수 템플릿을 호출하는 구문을 만나면 인자로 전달한 값으로 템플릿 매개변수의 데이터 형식을 추론하고, 이 형식으로 완성된 함수를 오브젝트 코드로 만든다. 이 과정을 템플릿의 인스턴스화 라고 한다.
- 템플릿 매개변수의 데이터 형식을 명시해 함수를 호출하면 컴파일러가 데이터 형식을 추론하지 않고 해당 형식으로 변환한 후에 곧바로 인스턴스화한다. 즉 형식 추론은 시간이 많이 소요되는 작업이기 때문에 명시적 호출을 지향한다.
- 특정 데이터 형식만 다른 알고리즘으로 처리하게 할 수 있다. 이를 템플릿 특수화라고 한다. 함수 템플릿은 명시적 특수화, 부분 특수화 중 명시적 특수화만 사용할 수 있다.
- 컴파일러가 함수 호출을 처리할 때는 오버로딩 해석 과정을 거치기 때문에 부분 특수화는 금지시켰다. 즉 오버로딩으로 해결이 가능하기 때문이다.
작업 예시
- 명시적 특수화
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T data_sum(T operand1, T operand2) {
return operand1 + operand2;
}
// 템플릿 타입이 double 일 경우 실행할 함수를 재정의
template <>
double data_sum(double operand1, double operand2) {
return (int)operand1 + (int)operand2;
}
int main() {
int data1 = 3, data2 = 5;
double data3 = 4.5, data4 = 8.9;
string data5 = "Hello, ", data6 = "World!";
cout << "정수형 데이터 합: " << data_sum(data1, data2) << endl;
cout << "실수형 데이터 합: " << data_sum(data3, data4) << endl;
cout << "문자열 데이터 합: " << data_sum(data5, data6) << endl;
return 0;
}
/*
실행 결과
정수형 데이터 합: 8
실수형 데이터 합: 12
문자열 데이터 합: Hello, World!
*/
클래스 템플릿
- 템플릿 매개변수를 활용해 다양한 형식에 대응할 수 있는 범용 클래스를 만드는 방법이다.
- 클래스 템플릿에서는 객체를 생성할 때 템플릿 매개변수의 형식을 명시해주어야 한다.(C++ 17 이후 컴파일러에서는 형식 추론이 가능하지만 컴파일러는 템플릿 매개변수의 형식을 완벽하게 추론해 낼 수 없기 때문에 직접 명시하는 것을 지향한다.)
- 템플릿 매개변수의 일부만 지정할 수 있는 부분 특수화를 이용할 수 있다.
- 클래스 템플릿의 선언과 정의를 별도의 파일로 분리하면 안되며, 한 파일에 있어야 한다. 왜냐하면 템플릿은 컴파일 시점에 인스턴스화 되기 때문에 다른 파일에 있을 경우 링크 오류가 발생한다.
작업 예시
- 부분 특수화
#include <iostream>
using namespace std;
template <typename Type1, typename Type2>
class data_package {
public:
data_package(Type1 first, Type2 second) : first(first), second(second) {}
void print_out_element() {
cout << "첫 번째 요소: " << first <<
", 두 번째 요소: " << second << endl;
}
private:
Type1 first;
Type2 second;
};
// 부분 특수화 첫번째 매개변수는 string으로 고정하고 두번째만 템플릿 매개변수로 사용
template <typename T>
class data_package<string, T> {
public:
data_package(string first, T second) : first(first), second(second) {}
void print_out_element() {
cout << first << "과 함께 입력된" <<
", 두 번째 요소: " << second << endl;
}
private:
string first;
T second;
};
int main() {
data_package<int, double> template_inst1(5, 10.5);
data_package<string, int> template_inst2("문자열", 10);
template_inst1.print_out_element();
template_inst2.print_out_element();
}
반응형
'Programming Language > C++' 카테고리의 다른 글
| 컨테이너와 반복자 (0) | 2025.11.05 |
|---|---|
| 용어 정리 (0) | 2025.11.04 |
| 객체지향 설계 원칙 (0) | 2025.11.03 |
| 다형성을 활용한 디자인 패턴 (0) | 2025.11.03 |
| 프로그래밍 패러다임 (0) | 2025.10.30 |
