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