[CPP] 템플릿

C++ 템플릿

cf. Java의 저네릭 프로그래밍 (Generic Programming)

  • 다루고자 하는 데이터의 형(type)과 무관하게 코드를 작성하는 방법
  • 예를 들어, 스택의 주요 코드인 push, pop, isempty는 모두 스택에 집어넣을 데이터의 형과 무관하게 정의할 수 있다.
  • 또 다른 예로, 정렬(sort) 알고리즘은 정수를 정렬하거나, 문자열을 정렬하거나, 키워드에 매치되는 웹 사이트 주소를 정렬하는데에도 모두 동일한 방식으로 정렬할 수 있다.

=> 데이터의 형과 무관하게 코드를 작성하는 방법을 저네릭 프로그래밍이라 하고,
C++에서 저네릭 프로그래밍을 지원하는 방법은 템플릿이라 한다.
템플릿

  •  타입 인자를 받는 코드를 작성하는 방법

주요 내용

  • 함수 템플릿 (함수를 만들어내는 템플릿)
    • swap, sort 예제
  • 클래스 템플릿 (클래스를 만들어내는 템플릿)
    • Pair, PFArrayD, PFArrayDBak 예제
  • C++ 표준 템플릿 라이브러리 (Standard Template Library, STL)
    • vector 템플릿과 basic_string 템플릿
    • 그 외에 어떤 STL을 제공하는지 보조 설명 참고

템플릿 개념은 쉽게 이해되지만 C++ 템플릿 구문을 익힐 필요가 있다. 특히 클래스 템플릿에서 타입인자의 유무를 확인할 것!

 

템플릿

template <class T>
void swap (T& x, T& y) {
 ...  // 생략된 부분 
}

int a, b;
 swap(a, b); // int를 T에 지정한 swap 함수 코드를 컴파일러가 만들어준다.

Money m1, m2;
 swap(m1, m2); // Money를 T에 지정한 swap 함수 코드를 컴파일러가 만들어준다.

[주의] 원칙적으로 타입 인자 T에 모든 타입이 올 수 있지만, swap 함수 템플릿에서 작성한 코드 ( ... 으로 생략된 부분 )에 따라 T에 올 수 있는 타입들이 제한되기도 한다.

swap 함수 템플릿

  •  할당문이 있는 타입이 T에 올 수 있음

sort 함수 템플릿

  • 비교 연산자 <를 사용할 수 있는 타입이 T에 올 수 있음

Pair 클래스 템플릿을 사용하는 addUp 템플릿 함수

  • + 연선자를 사용할 수 있는 타입만을 T에 지정할 수 있음

 

클래스 템플릿과 14장 15장에서 배운 상속, 복사 생성자, 할당 연산자, 소멸자를 조합한 종합상자 같은 예제

  • PFArrayD와 PFArrayDBak 클래스 템플릿 (16장에서 가장 중요한 예제!!!)
  • 템플릿이 아닌 클래스 버전의 코드와 비교해서 살펴볼 것

 

Q. sort 함수 템플릿으로 DayOfYear 객체를 정렬하는 프로그램을 작성하시오.

DayOfYear* days[] = { new DayOfYear(...), new DayOfYear (...), ... };

sort ( days ); // days를 출력해서 정렬 여부를 확인
  •  DayOfYear를 sort의 타입인자 T에 적용하려면 비교 연산자를 이 클래스에
    추가해야 한다.
  • 비교 연산자가 없는 버전의 클래스의 프로그램을 작성하고 컴파일 에러 메시지를
    확인하시오.
  • 비교 연산자를 추가한 버전의 클래스로 프로그램을 완성하고 정렬 결과를
    확인하시오.

 

템플릿의 기원

  • 함수형 언어 프로그래밍언어: Haskell (www.haskell.org)이나 ML
    • 일반 함수보다 템플릿 함수가 더 많아서 이 언어에서는 템플릿 함수이거나 비템플릿 함수이거나 상관없이 모두 일반 함수로 취급한다!
  • Java의 제네릭스 (Java 버전 템플릿)
    • 하나의 코드로 모든 타입인자에 대한 처리를 하는 방식 (Type erasure 방식)
    • C++ 템플릿은 각 타입인자에 대해 다른 버전의 코드를 만들어 처리하는 방식
  • Type expansion 방식
    • C++ 템플릿은 다양한 타입인자를 지정해서 함수 템플릿이나 클래스 템플릿을 사용하면 코드의 크기가 증가하지만 Java 제네릭스는 코드 크기는 변하지 않는다.

 

Leave a Reply

Your email address will not be published. Required fields are marked *