템플릿

Dohun Lee·2025년 8월 11일

C/C++

목록 보기
24/34

C++의 템플릿 문법

템플릿은 C++에 존재하는 특수 문법이다. 템플릿을 이용하면 타입에 구해받지 않는 함수와 클래스를 정의 할 수 있다. 이러한 특수성으로 인해 로직은 같고 타입만 다른 함수를 재작성 할 필요가 없어진다.

템플릿 정의는 함수 혹은 클래스 위에 template를 표시하여서 구현 할 수 있다. 여기서 T는 템플릿 타입을 표시하는 이름으로, T가 아닌 다른 이름으로 정의해도 된다.

템플릿 인자는 하나 이상으로도 정의 할 수있다. template<typename T1, typename T2>이렇게 두개의 템플릿 인자를 받을 수도 있다.

템플릿 인자는 컴파일러가 컴파일 타임에 암시적으로 추론해준다. 이는 템플릿 문법의 장점인 타입 안정성을 구현하는데 도움을 준다. 왜냐하면 타입을 런타임이 아닌 컴파일 타임에 추론하기 때문에 타입 에러를 컴파일 타임에 잡을수 있기 때문이다.

함수 템플릿

함수 템플릿을 구현하는 방법은 다음과 같다.

template<typename T>
T Add(T a, T b){
    return a + b;
}

위 함수는 타입이 T인 인자를 더해서 반환하는 템플릿 함수이다. 타입 T는 함수를 호출 할 때, 어떤 타입의 인자를 넣느냐에 따라 다른 타입이 적용된다. 템플릿 인자는 반환값, 인자값 모두에 사용 가능하다.

또한 특정한 타입에 대해서만 다른 동작을 실행 하고 싶을때, 템플릿의 명시적 특수화라는 방법을 사용 할 수 있다.

template<typename T>
T Add(T a, T b){
    return a + b;
}

template<>
int Add(int a, int b){
    cout << "Int Type!" << endl;
    return a + b;
}

위의 예시처럼 구현하면, 타입이 int인 경우에만 해당 함수로 실행된다.

템플릿 클래스

클래스 또한 템플릿 문법을 적용하여 가변 타입 클래스를 구현 할 수 있다. 주로 이러한 클래스 템플릿은 STL 클래스에서 사용되었다.

template<typename T>
class MyClass{
    T Someting(){
        return _val;
    }
public:
    T _val;
}

MyClass<int> myClassInt;

위와 같이 클래스 정의 위에 템플릿을 정의하면, 클래스 내부에서 사용가능하다. 또한 클래스 템플릿은 객체를 생성할때, <>를 통해 템플릿 인자의 타입을 지정해 주어야 한다.

template<typename T1, typename T2>
class MyClass{
    T1 Someting(){
        return _val;
    }
public:
    T1 _val;
    T2 _val2;
}

MyClass<int, double> myClassInt;

클래스 템플릿 또한 위와 같이 여러개의 템플릿 인자를 가질 수 있는데, 이때는 <>사이에 템플릿 인자의 타입을 순서대로 표시해주면 된다.

클래스 템플릿의 인자

클래스 템플릿에는 typename 말고도 다른 인자를 넣을 수 있는데, 함수 인자 처럼 해당 인자를 통해 값을 받아올수 있다.

template<typename T, int VAL>
class MyClass{
    T Someting(){
        return _val + VAL;
    }
public:
    T _val;
}

MyClass<int, 10> myClassInt;
MyClass<double, 2> myClassdouble;

위 예시 처럼 템플릿 인자에 int 타입의 인자를 넣어서 템플릿 인자 지정시에 값을 넣어주고 있다. 함수의 인자 같이 <> 사이에 typename이 들어가게 되면 타입을 넣고, 다른 타입 int, float 와 같은게 들어가면 값을 넣으면 된다.

템플릿 클래스는 템플릿 인자가 달라지면 완전히 다른 클래스로 취급 된다는 점을 주의해야한다. 즉, myClassInt = myClassdouble와 같은 문법은 오류가 발생한다.

클래스 템플릿의 명시적 특수화

클래스 템플릿 또한 명시적으로 특정 타입에 대한 구현을 따로 해줄수 있다.

template<int SIZE>
class MyClass<double, SIZE>{ // -> 이렇게 명시적으로 템플릿 인자를 넣어주어야 한다.
    T Someting(){

    }
}

클래스 템플릿을 명시적으로 특수화 하려면 위와같이 클래스를 새로 정의해서 클래스의 이름 옆에 명시적으로 인자를 지정해 주어야한다.

profile
미국 공대생

0개의 댓글