C++ Template

C++에서 템플릿은 일반적인 데이터 타입이나 함수를 정의할 때 사용되는 메커니즘입니다. 템플릿은 코드의 재사용성을 높이고, 제네릭 프로그래밍을 지원합니다. 함수 템플릿, 클래스 템플릿, 템플릿 특수화 등의 기능을 제공합니다.

함수 템플릿 (Function Templates)

함수 템플릿은 함수를 정의할 때 일반적인 데이터 타입 대신 특정 데이터 타입을 받아들일 수 있도록 하는 것입니다. 함수 템플릿은 template 키워드와 함께 선언됩니다.

#include <iostream>

// 함수 템플릿 선언
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    // 함수 템플릿 사용
    int result1 = add(5, 10);       // int 타입
    double result2 = add(3.5, 2.7); // double 타입

    std::cout << "정수 결과: " << result1 << std::endl;
    std::cout << "실수 결과: " << result2 << std::endl;

    return 0;
}

클래스 템플릿 (Class Templates)

클래스 템플릿은 클래스를 정의할 때 일반적인 데이터 타입 대신 특정 데이터 타입을 받아들일 수 있도록 하는 것입니다. 클래스 템플릿은 template 키워드와 함께 선언됩니다.

#include <iostream>

// 클래스 템플릿 선언
template <typename T>
class Pair {
private:
    T first, second;

public:
    Pair(T a, T b) : first(a), second(b) {}

    T getFirst() const {
        return first;
    }

    T getSecond() const {
        return second;
    }
};

int main() {
    // 클래스 템플릿 사용
    Pair<int> intPair(5, 10);         // int 타입
    Pair<double> doublePair(3.5, 2.7); // double 타입

    std::cout << "첫 번째 값: " << intPair.getFirst() << ", 두 번째 값: " << intPair.getSecond() << std::endl;
    std::cout << "첫 번째 값: " << doublePair.getFirst() << ", 두 번째 값: " << doublePair.getSecond() << std::endl;

    return 0;
}

템플릿 특수화 (Template Specialization)

템플릿 특수화는 특정 데이터 타입에 대해 템플릿의 특수한 동작을 정의하는 기능입니다. 특정한 경우에는 일반적인 템플릿보다 특정한 버전을 사용하도록 할 수 있습니다.

#include <iostream>

// 일반 템플릿
template <typename T>
class Storage {
private:
    T value;

public:
    Storage(T val) : value(val) {}

    void print() {
        std::cout << "일반 템플릿: " << value << std::endl;
    }
};

// 특수화된 템플릿
template <>
class Storage<double> {
private:
    double value;

public:
    Storage(double val) : value(val) {}

    void print() {
        std::cout << "특수화된 템플릿: " << value << std::endl;
    }
};

int main() {
    Storage<int> intStorage(5);
    Storage<double> doubleStorage(3.14);

    intStorage.print();     // 일반 템플릿 사용
    doubleStorage.print();  // 특수화된 템플릿 사용

    return 0;
}

위 예제에서는 Storage 클래스를 일반 템플릿으로 정의하고, double 타입에 대해서는 특수화된 템플릿을 사용하여 동작을 재정의하였습니다.

템플릿은 C++에서 강력하게 사용되는 기능 중 하나이며, 유연성과 재사용성을 높이는 데 큰 기여를 합니다. 다양한 데이터 타입에 대해 동일한 코드를 사용하여 일반적이고 유연한 프로그래밍을 가능하게 합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *