C_C++

C++, 클래스 템플릿 class template

고니자니 2024. 11. 18. 10:26
반응형

C++에서 클래스 템플릿은 여러 타입에 대해 동작할 수 있는 일반화된 클래스를 작성할 수 있도록 도와줍니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다. 클래스 템플릿은 아래와 같은 방식으로 선언하고 사용할 수 있습니다.

1. 클래스 템플릿 선언

#include <iostream>
using namespace std;

template <typename T> // 또는 `class T`라고 써도 동일
class MyClass {
private:
    T data; // T 타입의 멤버 변수
public:
    // 생성자
    MyClass(T value) : data(value) {}

    // 데이터 출력
    void printData() {
        cout << "Data: " << data << endl;
    }

    // 데이터 설정
    void setData(T value) {
        data = value;
    }

    // 데이터 반환
    T getData() const {
        return data;
    }
};

 

 

2. 클래스 템플릿 사용

int main() {
    // int 타입으로 MyClass 사용
    MyClass<int> intObj(42);
    intObj.printData(); // 출력: Data: 42

    // double 타입으로 MyClass 사용
    MyClass<double> doubleObj(3.14);
    doubleObj.printData(); // 출력: Data: 3.14

    // string 타입으로 MyClass 사용
    MyClass<string> stringObj("Hello, Templates!");
    stringObj.printData(); // 출력: Data: Hello, Templates!

    return 0;
}

 

3. 클래스 템플릿의 추가적인 기능

(1) 멀티 파라미터 템플릿

template <typename T1, typename T2>
class Pair {
private:
    T1 first;
    T2 second;
public:
    Pair(T1 f, T2 s) : first(f), second(s) {}

    void printPair() {
        cout << "First: " << first << ", Second: " << second << endl;
    }
};

int main() {
    Pair<int, string> p1(1, "One");
    p1.printPair(); // 출력: First: 1, Second: One

    Pair<double, double> p2(3.14, 2.71);
    p2.printPair(); // 출력: First: 3.14, Second: 2.71

    return 0;
}

 

(2) 기본 타입 지정

템플릿의 기본값을 지정할 수도 있습니다.

template <typename T = int>
class DefaultClass {
private:
    T data;
public:
    DefaultClass(T value) : data(value) {}
    void printData() {
        cout << "Data: " << data << endl;
    }
};

int main() {
    DefaultClass<> obj(10); // 기본 타입인 int로 사용
    obj.printData(); // 출력: Data: 10

    DefaultClass<double> obj2(3.14); // 명시적으로 double 지정
    obj2.printData(); // 출력: Data: 3.14

    return 0;
}

 

(3) 특수화 (Template Specialization)

특정 타입에 대해 다른 동작을 정의할 수도 있습니다.

template <typename T>
class SpecialClass {
public:
    void print() {
        cout << "General template" << endl;
    }
};

// 특수화된 버전 (int 타입)
template <>
class SpecialClass<int> {
public:
    void print() {
        cout << "Specialized template for int" << endl;
    }
};

int main() {
    SpecialClass<double> obj1;
    obj1.print(); // 출력: General template

    SpecialClass<int> obj2;
    obj2.print(); // 출력: Specialized template for int

    return 0;
}

 

C++ 클래스 템플릿은 타입에 독립적인 구조를 설계할 때 매우 유용하며, 특히 STL(Standard Template Library)도 이 방식을 기반으로 동작합니다.

 

반응형