더북(TheBook)

이번에는 클래스 템플릿을 보자.

template <typename T> class Array
{
private:
   T* elements; // 타입 T의 배열
   size_t count; // 배열 원소의 개수
 
public:
  explicit Array(size_t arraySize); // 생성자
  Array(const Array& other); // 복제 생성자
  Array(Array&& other); // 이동 생성자
  virtual ~Array(); // 소멸자
  T& operator[](size_t index); // 첨자 연산자
  const T& operator[](size_t index) const; // 첨자 연산자 - 상수 배열
  Array& operator=(const Array& rhs); // 할당 연산자
  Array& operator=(Array&& rhs); // 이동 할당 연산자
  size_t size() { return count; } // count 변수를 위한 접근자
};

size_t 타입 별칭은 cstddef 헤더에 정의되어 있으며 비부호(unsigned) 정수 타입이다. 이 코드에서는 타입 T를 원소로 갖는 배열을 위한 템플릿을 간단하게 정의했다. 템플릿 정의 Array<T>에 쓰인 ArrayArray<T>를 의미하며, 원한다면 이런 식으로 코드를 작성할 수 있다. 템플릿의 본문 밖에 멤버 함수를 정의할 때는 반드시 Array<T>라고 써야 한다. 할당 연산자를 이용하면 Array<T> 객체 하나를 다른 객체에 할당할 수 있는데, 이는 원래 배열로 할 수 없는 작업이다. 이런 동작을 원하지 않을 때도 operator=() 함수를 템플릿 멤버로 선언해야 한다. 이렇게 하지 않으면 템플릿 인스턴스에 할당 연산자가 필요할 때 컴파일러가 기본 할당 연산자를 public으로 생성해버린다. 할당 연산자 사용을 금지하려면 delete로 지정해야 한다.

Array& operator=(const Array& rhs)=delete; // 할당 연산자 없음
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.