[C++] template, 템플릿 사용 예제 – 2. 클래스 템플릿

이번 글에서는 클래스 템플릿에 대해 알아보겠습니다.

클래스 템플릿도 함수 템플릿처럼 만드시면 됩니다.

// class template
template <typename T>
class A
{
private:
	T a;
public:
	A( T a ) : a( a ) {}

	void SetA( T a ) { this->a = a; }
	T GetA() { return this->a; }
};

클래스 멤버 변수나 함수에 템플릿을 지정해주셔서 위와 같이 사용하시면 됩니다.
만약 클래스 내부에 멤버 함수를 선언하고, 외부에 멤버 함수를 정의하면 아래와 같이 코딩해야 합니다.

// class template
template <typename T>
class A
{
private:
	T a;
public:
	A( T a ) : a( a ) {}

	void SetA( T a ) { this->a = a; }
	T GetA() { return this->a; }
	
	void Print();
};

// 클래스 외부에 함수 정의
template <typename T>
void A<T>::Print() { cout << this->a << endl; }

템플릿 매개변수를 여러 개 지정할 수 있습니다. 템플릿 매개변수 T 이외에 다른 템플릿 매개변수를 추가하고 싶으시면 아래와 같이 작업합니다.

// class template
template <typename T1, typename T2>
class A
{
private:
	T1 a;
	T2 b;
public:
	A( T1 a, T2 b ) : a( a ), b( b ) {}

	void SetA( T1 a ) { this->a = a; }
	T1 GetA() { return this->a; }

	void SetB( T2 b ) { this->b = b; }
	T2 GetB() { return this->b; }
	
	void Print();
};

// 클래스 외부에 함수 정의
template <typename T1, typename T2>
void A<T1, T2>::Print() { cout << this->a << endl << this->b << endl; }

전체 코드는 아래와 같습니다.

#include <iostream>
#include <string>
using namespace std;

// 함수 템플릿
// class, typename 둘다 사용 가능
template <typename T>
T Sum( T A, T B )
{
	T C = A + B;

	cout << "Sum : " << C << endl;

	return C;
}

// 인자가 2개
template <typename T1, typename T2>
void printAll( T1 A, T2 B )
{
	cout << "T1 : " << A << endl;
	cout << "T2 : " << B << endl;
}

// template 특수화
template <>
char* Sum<char*> ( char* s1, char* s2 )
{
	char* str = "[char*] template";

	cout << s1 << " " << s2 << endl;

	return str;
}

// class template
template <typename T1, typename T2>
class Person
{
private:
	string name;
	T1 height;
	T2 age;
public:
	Person( string name, T1 height, T2 age ) : name( name ), height( height ), age( age ) {}

	void SetName( string name ) { this->name = name; }
	void SetHeight( T1 height ) { this->height = height; }
	void SetAge( T2 age ) { this->age = age; }

	void PrintInfo1() { cout << "1 name : " << this->name << ", height : " << this->height << ", age : " << this->age << endl; }
	void PrintInfo2();
};

// 외부 선언
template <typename T1, typename T2>
void Person<T1, T2>::PrintInfo2() { cout << "2 name : " << this->name << ", height : " << this->height << ", age : " << this->age << endl; }

int main()
{
	// 일반적임 함수 템플릿
	float fA = 4.3f, fB = 6.2f;
	Sum<float>( fA, fB );

	short sA = 4, sB = 1;
	Sum<short>( sA, sB );
	cout << endl;

	// 서로 다른 데이터 형으로 인자가 2개
	string str1 = "hellow C++ ";
	int iB = 30;
	printAll<string, int>( str1, iB );
	cout << endl;

	// template 특수화 : 재정의 하고싶을때
	char *s1 = "hellow C++";
	char *s2 = "world";
	Sum<char *>( s1, s2 );
	cout << endl;

	// class template
	Person<int, string> p1( "David", 180, "10살" );
	Person<string, int> p2( "Lachel", "165cm", 20 );

	p1.PrintInfo1();
	p2.PrintInfo1();
	cout << endl;

	// class 멤버 함수 class 외부 정의
	p1.PrintInfo2();
	p2.PrintInfo2();

	system( "pause" );

	return 0;
}
실행 결과