수업기록

Template 템플릿

템플릿의 두드등장 템플릿은 컴파일 타임에 작동하지만, 매크로와 달리 오류를 확인해줄 수 있다. (왜냐면 컴파일러가 함수를 만들어주니까, 매크로와 달리 컴파일러의 검수가 진행된다)

그렇기에 템플릿은 속도가 빠르지만, 실행할 때마다 생성해주기 때문에 실행 파일이 커질 수 있다. (만약 여러 자료형을 여러개 만들면 다 각자의 함수를 만들어주니까.)

템플릿은 형틀과 같은 기능을 지원한다. (클래스 / 함수를 찍어내는 틀) 즉, 기능은 결정되어 있지만 자료형은 결정되어 있지 않은 상태, 모든 자료형에 해당하는 함수나 클래스를 생성하기 위한 도구를 만드는 문법.

템플릿의 종류

  1. 함수 템플릿 : 함수를 생성하기 위한 틀
  2. 템플릿 함수 : “함수 템플릿”으로 생성한 함수.
  3. 클래스 템플릿 : 클래스를 생성하기 위한 틀

함수 템플릿의 예제 :: 단항 템플릿

template<typename T>
T Add(T Dst, T Src){
	return Dst + Src;
}
Add<int>(101.3,20.2); //꺽쇠 안에 명시적인 자료형 선언

함수를 호출한다고는 하긴 하지만, 메타 프로그래밍을 통해서 컴파일러가 함수를 생성하고 메모리에 저장하고 사용하게 된다.

템플릿의 특수화 : 특정 자료형에 한하여 기능을 개별적으로 구현해주는 문법

template<>
const char* Add(const char* Dst, const char* Src){
	return Dst + Src; // 문자열용 덧셈으로 가정
}

템플릿의 특수화 조건

  1. 원본 템플릿이 존재해야 한다.
  2. 원본 템플릿보다 코드 상 위에 존재하면 안된다 (원본이 먼저 선언되어야 함)

특수화가 진행된 템플릿 함수에 한하여 const 오버로딩이 지원한다.


함수 템플릿의 예제 :: 다항 템플릿

template<typename T1, typename T2, typename T3>
T3 Add(T1 Dst, T2 Src){
	return Dst + Src;
}

static 키워드와 함수 템플릿

template<typename T>
T Fuc(T num){
	static T sum = 0;
	sum += 0;
	return sum;
}

이런 경우에는 static 변수 안에 매개변수의 자료형에 따라 따로 메모리를 할당할 수 있다. 그러니까 int sum과 float sum이 구분되어서 메모리에 할당된다는 이야기.


클래스 템플릿

template<typename T>
class CObj{
public :
	CObj();
	~CObj();
public :
	T Add(T Dst, T Src);

private:
	T m_X, m_Y;
}

클래스 템플릿의 특수화

template<>
class CObj{
public :
	CObj();
	~CObj();
public :
	const char* Add(const char* Dst, const char* Src);

private:
	const char* m_X, m_Y;
}

클래스 템플릿의 부분 특수화

//원본 템플릿
template <typename A, typename B>
class InstanceTemplate
{
public:
	void Add(A a, B b) {
		std::cout << a + b<<std::endl;
	}
};

부분 특수화 템플릿 1

template <>
class InstanceTemplate<int, char *>{};

부분 특수화 템플릿 2

template <typename T>
class InstanceTemplate<T, char *>{};

주의 선언을 하고 몸체를 밖에 구현하게 된다면( 혹은 C++ 파일에 ) 문제가 생기게 된다. 왜냐면 클래스 템플릿이기 때문에 아직 클래스가 아닌데 클래스 쓰듯이 사용하면 안된다.

그래서 밖에 구현하고 싶다면 아래와 같이 사용해야 한다.

template<typename T>
CObj<T>::CObj();

꽤나 번거로운 작업이기 때문에 보통은 헤더 파일 안에 템플릿을 구현하는 경우가 많다. 헤더 파일에 넣게 된다는 것은 공개된다는 뜻과 동일하기 때문에 이 부분도 주의하며 사용해야 한다.


static 키워드와 클래스 템플릿 static 키워드와 함수 템플릿 관계와 동일하게 작동함. 템플릿 클래스 안에 있는 클래스 변수(static 변수)는 다른 자료형 별로 생성되고, 같은 자료형 끼리는 메모리 공간을 공유한다.


클래스 템플릿의 상속

template<typename T>
class CPlayer : CObj<T>{}

위와 같이 진행해야 함.


STL (Standard Template Library)

C++이 표준으로 사용하는 STL을 사용하는 것이지만, 나중에 회사가면 회사 내의 STL이 따로 있을 수도 있다.

그러니, 문법이라고 보는 것은 오해의 소지가 많고, 프로그래머 간의 약속을 템플릿으로 만든 집합체라고 보는 것이 맞다.