일반화 프로그래밍

데이터와 행동을 나누는 것을 기반으로 하며, 객체지향의 다음 세대라고 불러지기도 한다.

템플릿의 사용으로 임의의 타입에 사용할 수 있는 자료구조를 만들수 있다.

내부 구조에 상관없이 임의의 데이터 집합에 적용할 수 있는 일반화된 알고리즘을 제공한다.

 


템플릿

매개변수의 타입에 따라 함수나 클래스를 생성하는 메커니즘을 의미한다.

템플릿은 매개변수의 타입에 따라 달라지므로 여러 타입에서 동작할 수 있는 단 하나의 함수나 클래스를 작성하는 것이 가능하다.

 


함수 템플릿

함수의 일반화된 선언을 의미한다.

임의의 타입으로 작성된 함수에 특정 타입을 매개변수로 전달하면 C++ 컴파일러는 해당 타입에 맞는 함수를 생성한다.

template <typename 타입이름>
함수 원형
{
	함수 본체
}

C++ 컴파일러는 템플릿 정의 내의 typename은 class와 같은 것으로 간주한다.

정의된 함수 템플릿을 호출할 때 매개변수로 int형을 전달하면, 함수의 원형과 본체에서 정의된 타입 이름은 모두 int형으로 바뀐다.

 

명시적 특수화

호출된 함수에 정확히 대응하는 특수화된 정의를 발견하면, 템플릿은 찾지 않고 해당 정의를 사용한다.

template <typename T>
void 함수(T &a, T &b);
template <typename T> void 함수(T &a, T &b);

//명시적 특수화
template <typename T> void 함수<double>(double &, double &) {...};

위 처럼 특수화되면 double형에 대한 동작은 새로 정의한 행동을 동작한다.

 


클래스 템플릿

클래스의 일반화된 선언을 의미하고 동작은 함수 템플릿과 같다.

클래스 템플릿을 사용하면 타입에 따라 다르게 동작하는 클래스 집합을 만들 수 있다.

template <typename 타입 이름>
class 클래스 탬플릿 이름
{
	클래스 멤버의 선언
}

 

함수 템플릿과는 다르게 클래스 탬플릿은 사용하기 위해선 선언시에 타입을 지정해야한다.

클래스 이름<int> A // A는 int의 자료형으로 template가 지정됨
클래스 이름<std::string> B // B는 std::string의 자료형으로 template가 지정됨

 

중첩 클래스 템플릿

클래스 내부에 클래스 템플릿을 선언할 수 있는데, 클래스나 클래스 템플릿 내에 또다른 템플릿을 정의한 것은 멤버 템플릿이다.

이런 멤버 템플릿 중에서도 클래스 템플릿을 중첩 템플릿을 중첩 클래스 템플릿이라고 한다.

중첩 클래스 템플릿은 바깥쪽 클래스의 범위 내에서 클래스 템플릿으로 선언된다.

하지만 정의는 바깥쪽 클래스의 범위 내에서 뿐만이 아니라 범위 밖에서도 선언 가능하다.

 

클래스 템플릿의 특징

  • 하나 이상의 템플릿 인수를 가질 수 있다.
  • 디폴트 템플릿 인수를 명시할 수 있다.
  • 클래스 템플릿을 기초 클래스로 상속할 수 있다.

 

명시적 특수화

함수 템플릿과 마찬가지로 클래스 템플릿도 템플릿 인수에 대해 특수화할 수 있다.

template <> class 클래스 이름<double> {...};

double형에 대한 동작만 변경하는 명시적 특수화.

 

부분 특수화

만약 템플릿 인수가 두 개 이상이고, 그 중 일부에 대해서만 특수화를 해야 할 때는 부분 특수화를 사용할 수 있다.

방법은 아래와 같다.

// 원본
template <typename T1, typename T2>
class X
{...};

// 부분 특수화[T1은 특수화 되지 않는다.]
template <typename T1> class X<T1, double> {...};

// 명시적 특수화
template <> class X<doulbe, double> {...};

'42일기' 카테고리의 다른 글

ft_containers[Red-Black Tree]  (1) 2022.04.29
ft_containers[Map]  (0) 2022.04.26
CPP [캐스팅]  (0) 2022.02.25
CPP [OOP 상속성]  (0) 2022.02.15
MINIRT(1)  (0) 2022.01.12

+ Recent posts