C++

C++) 템플릿(Template)

zzugest1 2025. 1. 15. 23:35

템플릿 : 어떤 자료형이 들어오든 대응할 수 있도록  자료형이 무엇인지 확정해두지 않고   임시 자료형을 선언한 뒤 어떤 작업을 할 것인지 그 형틀을 만들어둔 것

 

template<typename T>

템플릿을 사용하기 위해선, 해당 템플릿을 사용할 내용 바로 앞줄에 "이 바로 뒤에 오는 구문에서는 <> 안에 들어오는 내용을 사용할 것"이라고 정의해야 한다. "이 뒤에 있는 내용들은 T라는 자료형을 이용하는 템플릿이다"라고 알리는 구문.

기본적으로는 바로 다음에 오는 코드 한 줄에만 적용되나, 그 한 줄이 함수나 클래스 등의 블럭을 가진 대상일 경우엔 그 블럭 안에 있는 모든 코드에 적용

 

typename : "이 키워드 뒤에 오는 이름은 다음 템플릿에서 '자료형의 이름'이라고 취급한다"는 뜻이다. 그리고 실제로 사용할 때는 여기에 들어오는 데이터의 자료형을 이하의 코드에 그대로 적용. 실제로 사용할 때 매개 변수인 T의 자리에 int 데이터가 들어올 경우 이하의 모든 T들을 전부 int로 취급, 만약 char였다면 전부 char로 취급한다.

 

#include <iostream>

template <typename T>
T myMax(T a, T b) { 
    return (a > b) ? a : b;
}

int main() {
    int x = 10;
    int y = 20;
    std::cout << "Max of " << x << " and " << y << " is: " << myMax(x, y) << std::endl; 
    return 0;
}

이렇게 템플릿을 이용해 함수를 생성했을 때, main에서 x,y의 자료형을 선언해주면 그대로 사용할 수 있다.

 

 

template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() { return value; }
};

int main() {
    // int 타입의 Box
    Box<int> intBox(42);
    std::cout << "Int Box contains: " << intBox.getValue() << std::endl;

    // double 타입의 Box
    Box<double> doubleBox(3.14);
    std::cout << "Double Box contains: " << doubleBox.getValue() << std::endl;

    // std::string 타입의 Box
    Box<std::string> stringBox("Hello, World!");
    std::cout << "String Box contains: " << stringBox.getValue() << std::endl;

    return 0;
}

클래스를 선언할 때 바로 앞에 이렇게 템플릿을 달아주면 이 템플릿을 이용하는 템플릿 클래스가 된다.

Box<int> intBox(42); 는 int 타입의 Box에 42를 넣는다는 의미로 다른 자료형의 경우도 마찬가지이다.

 

 

만약 템플릿이 사용된 클래스를 템플릿으로서 상속하고자 한다면 다음과 같이 생성할 수 있다.

 

template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() { return value; }
};

// Box 클래스를 상속받는 LittleBox 클래스
template <typename T>
class LittleBox : public Box<T> {
public:
    // 생성자에서 부모 클래스의 생성자를 호출
    LittleBox(T v) : Box<T>(v) {}

    // 추가적인 메서드 예시
    void printValue() {
        std::cout << "LittleBox contains: " << this->getValue() << std::endl;
    }
};

int main() {
    // LittleBox 객체 생성
    LittleBox<int> littleIntBox(10);
    littleIntBox.printValue(); // 출력: LittleBox contains: 10

    LittleBox<double> littleDoubleBox(2.71);
    littleDoubleBox.printValue(); // 출력: LittleBox contains: 2.71

    LittleBox<std::string> littleStringBox("Hello, LittleBox!");
    littleStringBox.printValue(); // 출력: LittleBox contains: Hello, LittleBox!

    return 0;
}

 

 

template <typename T>
class LittleBox : public Box<T>

이렇게 템플릿을 선언해준뒤에 그 템플릿을 적용한 부모 클래스를 상속받는 식으로 이용할 수 있다.

'C++' 카테고리의 다른 글

C++) 포인터와 배열  (0) 2025.01.13
C++) 암시적 멤버 함수  (0) 2025.01.13
C++) 상속  (0) 2025.01.10
C++) 클래스(Class)  (0) 2025.01.08
C++) 동적 할당  (0) 2025.01.06