C++ 함수 템플릿과 클래스 템플릿의 이해

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 등 새로운 기능으로 더욱 강력해졌습니다. 이는 복잡한 데이터 구조와 알고리즘을 효율적으로 구현하는 데 중요한 도구입니다.

태그: C++ 템플릿 함수 템플릿 클래스 템플릿 STL 설계 패턴

9월 2일 07:20에 게시됨