1. C++ 템플릿 기초 및 중요성
C++ 템플릿은 데이터 타입에 구애받지 않는 일반화된 코드 작성에 핵심적인 역할을 합니다. 함수 템플릿과 클래스 템플릿 두 가지 유형으로 구성되며, 이들은 컴파일 시간에 타입을 파라미터화하여 코드 재사용성을 높이는 데 기여합니다.
1.1 함수 템플릿 정의 및 작동 원리
함수 템플릿은 특정 데이터 타입에 의존하지 않고 다양한 타입을 처리할 수 있는 일반적인 함수 구조를 제공합니다. 다음은 두 변수 값을 교환하는 함수 템플릿 예시입니다:
template <class T>
void exchange(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
1.2 타입 추론 메커니즘
컴파일러는 함수 호출 시 인자로부터 자동으로 타입을 추론할 수 있습니다. C++14 이상에서는 명시적 타입 지정 없이도 정확한 타입을 감지할 수 있습니다:
int main() {
int x = 10, y = 20;
exchange(x, y); // 컴파일러가 T를 int로 추론
return 0;
}
2. 함수 템플릿 고급 활용
2.1 특수화 및 디폴트 파라미터
특정 타입에 대한 최적화된 구현을 제공하는 함수 템플릿 특수화 예시:
// 기본 템플릿
template <class T>
void process(T& x) { /* 일반 처리 로직 */ }
// 특수화 버전
template <>
void process<MySpecialType>(MySpecialType& x) { /* 최적화 로직 */ }
디폴트 파라미터 사용 예시:
template <class T, class U = int>
void process(T& t, U u = 0) { /* 처리 로직 */ }
3. 클래스 템플릿 구조 및 활용
3.1 클래스 템플릿 정의 방식
데이터 타입에 의존하지 않는 일반화된 클래스 구조를 생성합니다:
template <class T>
class GenericContainer {
public:
T value;
GenericContainer(T v) : value(v) {}
};
3.2 멤버 함수 템플릿화
클래스 내부에서 멤버 함수를 템플릿화하여 타입 독립적인 동작을 구현:
template <class T>
class Pair {
public:
T first;
T second;
Pair(T f, T s) : first(f), second(s) {}
};
4. 템플릿 응용 사례
4.1 STL에서의 템플릿 활용
표준 템플릿 라이브러리(STL)의 벡터와 정렬 알고리즘 사용 예:
std::vector<int> data = {4, 8, 2, 3, 7, 5};
std::sort(data.begin(), data.end());
for (int val : data) std::cout << val << ' ';
4.2 설계 패턴 통합
전략 패턴과 템플릿의 결합 예시:
template <class T>
class SortingStrategy {
public:
virtual void sort(std::vector<T>&) = 0;
};
class QuickSort : public SortingStrategy<int> {
public:
void sort(std::vector<int>& vec) override {
std::sort(vec.begin(), vec.end());
}
};
5. 템플릿 프로그래밍의 장점
템플릿은 코드 재사용성과 유연성을 극대화하며, C++11 이후에는 가변인수 템플릿과 constexpr 등 새로운 기능으로 더욱 강력해졌습니다. 이는 복잡한 데이터 구조와 알고리즘을 효율적으로 구현하는 데 중요한 도구입니다.