home..

Cpp07

템플릿을 학습하는 CPP07에 대한 정리

Table of contents

템플릿이란?

템플릿 함수와 클래스는 각 프로그램을 다시 작성할 필요 없이 다양한 데이터 유형에서 동작이 가능하게 해준다. C++에서는 재사용이 가능한 소프트웨어를 개발할 수 있게 하는 함수의 클래스가 있다. 템플릿(template)은 함수와 클래스에서의 유형(type)을 매개변수화하는 기능을 제공한다. 이 기능을 사용하여 컴파일 할 때 컴파일러에 의해 특정한 구체적인 유형으로 대체되도록 할 수 있다.

template<typename T>
T maxValue(T value1, T value2)
{
	if (value1 > value2)
		return value1;
	else
		return value2;
}

int main()
{
	std::cout << ::maxValue(1, 3) << std::endl;
}

템플릿을 사용하는 코드는 이와 같다. 템플릿으로 작성된 함수나 클래스는 template<typename T>라는 구절로 시작하게 되는데, 이를 템플릿 접두어(template prefix)라고 한다. 여기서 T는 형식 매개변수(type parameter)이다. 위 코드는 maxValue(1, 3)을 실행하면 매개변수 유형을 int로 인식하고, T 형식 매개변수를 int로 대체한다. maxValue(string("ABC"), string("DFC"))를 실행하면 T는 string으로 대체된다. 주의할 점은 maxValue("ABC", "DFC")를 사용할 경우, C-문자열로 대체되어 주소값을 비교하게 된다.
종종 템플릿 함수에서 한 개 이상의 매개변수를 사용해야 할 때 <typename T1, typename T2, typename T3>와 같이 괄호 내에서 콤마로 구분하면 된다.

클래스 템플릿이란?

형식 매개변수를 사용한 템플릿 함수가 있다면, 클래스에 대해서도 형식 매개변수를 사용하는 템플릿 클리스(template class)를 정의 할 수 있다. 형식 매개변수는 클래스 내에서 일반적인 유형이 사용되는 곳 어디에서나 사용될 수 있다. 클래스 템플릿에 대한 구문은 기본적으로 함수 템플릿과 같다.
생성자와 함수는 그 자신이 템플릿인 것을 제외하고 보통의 클래스 내에서와 같은 방법으로 정의된다. 다라서 구현에서는 생성자와 함수 헤더 앞에 템플릿 접두어를 놓아야 한다.

템플릿을 헤더에 정의해야 하는 이유?

템플릿은 클래스도 아니고 함수도 아니다. 그저 컴파일러가 사용하는 패턴이다. 컴파일러가 코드를 생성하기 위해선, 컴파일러는 템플릿의 선언 뿐만 아니라 정의를 볼 수 있어야 하며 템플릿을 구성하는 타입 등을 알 수 있어야 한다. 또, 컴파일러는 cpp파일을 컴파일 하는 동안에 모든 cpp 파일의 내용을 기억하고 있지 않는다.
함수들을 컴파일러가 발견할 때가 제각각이 되므로 .cpp파일에 쓸 경우 위험성이 크다. 때문에 헤더파일에 구현하여 컴파일러에게 알려주어야 한다.

aa






© 2023 objectio   •  Powered by Soopr   •  Theme  Moonwalk