본문 바로가기
연구소👨‍💻/CS연구소

[C++] template <1>

by 신그자체김상범 2024. 9. 7.

template은 어디에 필요한가?

C++을 쓰다보면 파이썬같은 인터프리터 언어에 비해서 빠르고 문법이 패턴화 돼 있어서 좋지만 몇가지 불편한 점들이 있다. 대표적인게 자료형 선언이다.

파이썬은 자료형을 선언할 필요도 없고 함수나 클래스에서도 받아들이지만

C++은 매개변수를 사용할때 어떤 자료형을 쓸 지 선언해줘야한다. 그렇다보니 여러 자료형에 공통적인 함수를 만든다 하더라도 여러번 오버로딩 해야 하는 단점이 있다.

즉 template은 딱딱한 C++의 자료형 선언을 편하게 해주기 위해서 존재한다.

template은 무엇인가?

따라서 template은 제네릭한 (일반적인) 자료형을 의미하는 코드다. 라고 정리할 수 있다

template이 사용되는 곳은 어디인가?

그 목적에 따라서 template은 함수나 class의 위쪽에 미리 선언된다

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

이 함수를 보면 함수의 기능은 단순한 대소비교다. 대소비교는 대부분의 기본 자료형에서 지원하고 기본 자료형이 아닌 경우에도 지원하는 경우가 많다. 이럴때 모든 자료형마다 함수를 만들지 않고 template을 활용할 수 있다.

함수 뿐 만이 아니라 클래스에서도 템플릿을 활용할 수 있다.

template <typename T1, typename T2>
class Pair {
public:
    T1 first;
    T2 second;

    Pair(T1 first, T2 second) : first(first), second(second) {}
};

평소에 사용하는 pair를 생각해보면 다양한 자료형의 조합으로 사용할 수 있다. 따라서 위에서처럼 제네릭한 템플릿을 여러개 선언한다면 다양한 자료형의 조합인 자료구조를 만들 수 있다.

또 반대로 클래스가 특정 자료형을 강제하기 위해선 template에 제네릭 자료형을 쓰지않고 클래스 바로 옆에 쓸 수 있다

template <>
class Pair<char, char> {
public:
    char first;
    char second;

    Pair(char first, char second) : first(first), second(second) {
        // Special behavior for characters (e.g., convert to uppercase)
        this->first = std::toupper(this->first);
        this->second = std::toupper(this->second);
    }
};

다음 코드에서는 Pair 클래스를 char, char 변수로 강제한다 그렇기에 특정 자료형에게 맞는 toupper 같은 메소드를 사용할 수 있다.

그럼 만약 원하는 바가 전체 제네릭도 아니고 아예 한개의 자료형만 해당하는 것도 아닐때는 어떤방식으로 코드를 짜는 것이 효율적일까? 이 내용은 다음번에 다시 적도록한다.