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 같은 메소드를 사용할 수 있다.
그럼 만약 원하는 바가 전체 제네릭도 아니고 아예 한개의 자료형만 해당하는 것도 아닐때는 어떤방식으로 코드를 짜는 것이 효율적일까? 이 내용은 다음번에 다시 적도록한다.
'CS연구소👨💻' 카테고리의 다른 글
EC2-NGINX-도커-젠킨스 설정 (0) | 2024.11.06 |
---|---|
[C++] 스레드 Lock (1) | 2024.09.22 |
[C++] 입출력 스트림 (0) | 2024.07.08 |
[C++] 예외 처리 (0) | 2024.06.26 |
[C++] 다형성과 오버로딩, 오버라이딩 (0) | 2024.06.22 |