C++에서 템플릿(Template)은 함수나 클래스를 일반화하여 다양한 데이터 타입을 처리할 수 있도록 하는 기능입니다. 이를 통해 중복된 코드를 줄이고 코드의 재사용성을 극대화할 수 있습니다. 함수 템플릿클래스 템플릿은 템플릿의 대표적인 두 가지 형태입니다.

 

1. 템플릿의 필요성

같은 논리를 여러 타입에 대해 반복할 때 유용

일반적으로, 같은 기능을 다른 데이터 타입에 대해 사용하려면 중복된 코드를 작성해야 합니다.

#include <iostream>
using namespace std;

// 정수를 더하는 함수
int addInt(int a, int b) {
    return a + b;
}

// 실수를 더하는 함수
double addDouble(double a, double b) {
    return a + b;
}

int main() {
    cout << "Int: " << addInt(3, 5) << endl;
    cout << "Double: " << addDouble(2.5, 4.3) << endl;
    return 0;
}

 

템플릿을 사용하면 타입에 상관없이 동작하는 하나의 함수로 모든 타입을 처리할 수 있습니다.

 

#include <iostream>
using namespace std;

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

int main() {
    cout << "Int: " << add(3, 5) << endl;       // 정수 더하기
    cout << "Double: " << add(2.5, 4.3) << endl; // 실수 더하기
    return 0;
}

 

 

단, typename 대신 class를 사용해도 동일하게 동작합니다.

 

 

 

클래스 템플릿은 다양한 데이터 타입을 처리할 수 있는 일반화된 클래스를 정의합니다. 이는 스택, 리스트와 같은 자료구조에서 주로 사용됩니다.

 

template <typename T>
class Box {
private:
    T value;

public:
    // 생성자
    Box(T v) : value(v) {}

    // 값 출력 메소드
    void display() {
        cout << "Value: " << value << endl;
    }

    // 값 반환 메소드
    T getValue() {
        return value;
    }
};

// int형 값을 저장하는 Box 객체
Box<int> intBox(100);
intBox.display();  // 출력: Value: 100

// double형 값을 저장하는 Box 객체
Box<double> doubleBox(99.99);
doubleBox.display();  // 출력: Value: 99.99

// string형 값을 저장하는 Box 객체
Box<string> stringBox("Hello, Templates!");
stringBox.display();  // 출력: Value: Hello, Templates!

 

위와 같이 Box 클래스는 템플릿으로 정의되어 다양한 데이터 타입을 받고 클래스를 인스턴스화(Box<int>와같은) 를 할때 데이터타입을 지정하여 타입과 상관없이 동일한 로직이 사용가능합니다.