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++의 편의성을 느껴 보도록 하자.

Back

Comments

No comments yet.