Template 문법에 대해 알아보자.
by
gg582 · 2026-06-29 05:50:53 · 28 views
발췌 코드
// 템플릿 첫 활용
#include <iostream>
#include <string>
template <typename T>
class Vector {
T* data;
int capacity;
int length;
public:
// 생성자
Vector(int n = 1) : data(new T[n]), capacity(n), length(0) {}
// 맨 뒤에 새로운 원소를 추가한다.
void push_back(T s) {
if (capacity <= length) {
T* temp = new T[capacity * 2];
for (int i = 0; i < length; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
capacity *= 2;
}
data[length] = s;
length++;
}
// 임의의 위치의 원소에 접근한다.
T operator[](int i) { return data[i]; }
// x 번째 위치한 원소를 제거한다.
void remove(int x) {
for (int i = x + 1; i < length; i++) {
data[i - 1] = data[i];
}
length--;
}
// 현재 벡터의 크기를 구한다.
int size() { return length; }
~Vector() {
if (data) {
delete[] data;
}
}
};
int main() {
// int 를 보관하는 벡터를 만든다.
Vector<int> int_vec;
int_vec.push_back(3);
int_vec.push_back(2);
std::cout << "-------- int vector ----------" << std::endl;
std::cout << "첫번째 원소 : " << int_vec[0] << std::endl;
std::cout << "두번째 원소 : " << int_vec[1] << std::endl;
Vector<std::string> str_vec;
str_vec.push_back("hello");
str_vec.push_back("world");
std::cout << "-------- std::string vector -------" << std::endl;
std::cout << "첫번째 원소 : " << str_vec[0] << std::endl;
std::cout << "두번째 원소 : " << str_vec[1] << std::endl;
}
C/C++는 가독성이 매우 좋기 때문에, 일단 코드부터 냅다 보면 최신 기능을 바로 이해할 수 있다.
핵심은 클래스가 아래의 것을 가지기 때문에, 타입 비종속적인 템플릿을 생성해 찍어 낸다는 점이다.
template <typename T>
이런 템플릿을 만들 때 중요한 생성자와 소멸자이다.
생성자
Vector(int n = 1) : data(new T[n]), capacity(n), length(0) {}
소멸자
~Vector() {
if (data) {
delete[] data;
}
}
그러나 이 예제의 경우에는 벡터 생성이라는 주제가 끼어들어 템플릿만의 특성을 알기 어렵다.
가장 최소한의 형태로는, 템플릿 클래스가 아닌 템플릿 함수가 생성자, 소멸자 등이 끼지 않기 때문에 시각적으로 더 낫다.
template <typename T>
T Max(T a, T b) {
return (a > b) ? a : b;
}
이 경우, Max 함수에 double을 넣으면 double 반환, long long을 넣으면 long long을 반환하게 된다.
즉, 기본적인 패턴을 한국어에 맞게 풀면
틀 <자료형의 이름 ㄱ>
ㄱ 최댓값(ㄱ 변수1, ㄱ 변수2) {
반환 (변수1 > 변수 2) 가 충족되는가? 그렇다면 변수 1로: 아니면 변수 2로;
}
이런 형태가 된다. 어딘가 사무적인 느낌도 들고, C++가 인간 친화성이 꽤 높은 언어라는 생각을 지울 수 없다.
이 함수의 맹점은 항상 타입들이 비교 가능한 자료형일 것을 가정하는 것, 또한 템플릿 내의 <typename T> 제네릭이 어떤 암묵적 형변환을 하는지 프로그래머가 모두 머릿속에 두어야 하기 때문이다. 아쉽게도, 나를 포함한 많은 프로그래머들은 그다지 머리가 좋지 않아서 컴퓨터의 작동 원리를 꿰고 있지 않다.
따라서, 이러한 문제를 C++에 대입하여 규칙에 어긋난 표현들을 컴파일 타임에 잡아서 불호령을 치는 것이 '컨셉트'이다.
다음 시간에는 이러한 유용한 개념을 통해 최신 C++의 편의성을 느껴 보도록 하자.