* 정의

 

템플릿(template)는 주형, 본뜨는 공구라는 뜻을 가지고 있다.

C++에서는 이와 비슷하게 원하는 타입에 따라서 그 타입에 맞게 코드를 생성시켜주는 도구를 의미한다.

데이터 타입을 매개변수로 전달하면 서로 다른 데이터 유형에 대해 동일한 코드를 작성할 필요가 없어진다.

 

 

* 사용 이유

 

함수나 클래스를 처음부터 다시 작성하지 않고 다른 데이터 유형에 따라 생성되도록 해주기 때문에 프로그래밍이 편리하다. 예를 들어 특정 타입의 데이터를 정렬하는 sort라는 함수가 있다고 가정했을 때 각 타입에 대해 여러 함수를 오버로딩하는 것보다 매개변수를 템플릿 타입으로 결정하게 되면 훨씬 관리하기 편하고 오류를 줄일 수 있다.

 

방금 제시한 예시에서와 같이 템플릿은 주로 일반화 프로그래밍(generic programming)에 사용된다. 간단히 일반화된 클래스나 함수를 작성하기 위한 방법으로 사용된다고 할 수 있다.

 

일반화 프로그래밍에 대한 정의는 다음과 같이 할 수 있다.

  • 일반화 유형이 다양한 데이터 타입에 대해 작동하는 알고리즘의 매개 변수로 사용되는 프로그래밍 접근 방식이다.
  • 데이터 형식에 의존하지 않고 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식이다.

 

하지만 템플릿의 단점도 존재하는데 단점을 고려해서 상황에 적절한 판단 하에 템플릿을 사용해야 한다. 템플릿의 단점은 다음과 같다.

  • 많은 컴파일러는 템플릿 중첩을 지원하지 않는다.
  • 템플릿을 사용하면 모든 코드가 추상화되지 않고 노출된다.
  • 일부 컴파일러는 템플릿에 대한 지원을 많이 하지 않는다.
  • 템플릿 코드에서 오류가 감지되면 판단하기 어려운 오류 메시지가 표시된다.
  • 템플릿으로 개발하는 것이 어려울 수 있다.

 

* 동작 방식

 

- 기본 동작 방식

 

템플릿은 컴파일 타임에 확장(결정)된다는 점에서 템플릿과 공통점을 지닌다. 하지만 매크로와는 다르게 컴파일러가 템플릿을 확장(결정)하기 컴파일러가 타입에 대한 체크를 한다는 점이다. 

 

처음 소스 코드에는 함수/클래스 템플릿만 포함하고 있지만 컴파일된 코드에서는 여러 가지 같은 함수/클래스들로 확장된다.

 

- 종류

 

템플릿은 다음과 같이 크게 두 타입으로 나타난다.

  • 함수 템플릿
  • 클래스 템플릿

 

 

 

- 함수 템플릿

 

함수 템플릿은 단일 함수에 대한 템플릿을 의미하며 이는 여러 데이터 타입과 함께 동작한다. 예를 들어 sort, max, min과 같은 함수 템플릿이 여기에 속한다.

template <typename T> T FunctionName(T a, T b)
{
    // ...
}

보통 다음과 같이 정의된다. T를 함수의 반환형이나 매개변수, 함수바디 등에서 활용할 수 있다. type에는 함수에서 사용 될 데이터 타입이 들어간다.

 

 

- 클래스 템플릿

 

클래스 템플릿도 함수 템플릿과 비슷하게 동작한다. 클래스 템플릿은 클래스가 데이터 타입에 관계 없는 것들을 정의할 때 유용하다.

 

예를 들어 컨테이너 클래스의 경우 내부 동작방식은 동일하지만 안에 들어가는 개체의 타입만 다르기 때문에 클래스 템플릿을 활용하면 매우 효율적이다.

template <typename T> 
class Array 
{
public:
	Array(T arr[], int s)
	{
		ptr = new T[s];
		size = s;
		for (int i = 0; i < size; i++)
		{
			ptr[i] = arr[i];
		}
	}

	void print()
	{
		for (int i = 0; i < size; i++)
		{
			cout << " " << *(ptr + i);
		}
		cout << endl;
	}

private:
	T* ptr;
	int size;
};

 

 

- 템플릿 특수화(Template Specialization)

 

템플릿 특수화는 특수한 경우에 대해서 코드를 다르게 작성하여 다른 동작을 수행할 수 있게 만들어주는 기능이다. 특정 유형에 대해서 다른 동작 방식을 정의함으로써 템플릿을 통해 수행될 수 있게 지원할 수 있다. 특수화 버전은 해당 타입의 함수를 호출했을 때 일반적인 템플릿 정의보다 우선 시되어 먼저 체크하게 된다.

//A generic sort function
template<typename T>
{
    //code to implement quick sort
}

//Template specilization:A function
//specialized for char data type
template<>
void sort<char>(char arr[],int size)
{
    //code to impletement counting sort
}

 

 

* 함수 오버로딩 vs 함수 템플릿

 

함수 오버로딩 함수 템플릿
@ 객체 지향 프로그래밍에서 다형성 특성에 속한다.
@ 여러 함수가 비슷한 동작을 수행할 때 사용된다.

@ 함수 오버로딩은 다양한 수의 인수를 취할 수 있다.
@ 여러 함수가 동일한 작업을 수행하지만 데이터 타입만 다르게 정의해야할 때 사용된다.

@ 템플릿은 다양한 인수를 취하지 못한다.

 

'C++' 카테고리의 다른 글

가변인자 템플릿(Variadic Template) 예시  (0) 2022.05.23
가변인자 템플릿(Variadic Template)  (0) 2022.05.23
람다(Lambda)  (0) 2022.04.11
완벽 전달(Perfect forwarding)의 실패  (0) 2022.03.31
참조 축약  (0) 2022.03.31

+ Recent posts