C++ #08 템플릿

underlier12·2020년 2월 5일
0

C++

목록 보기
8/19

08. 템플릿

일반화

C++ 은 일반화 프로그래밍(Generic Programming)이 가능한 언어이다. 따라서 템플릿(Template)을 이용해 일반화 프로그래밍을 사용할 수 있다.

템플릿

템플릿이란 매개변수의 타입에 따라서 별도의 함수 및 클래스를 만들지 않고 다양한 타입에서 동작하는 단 하나의 객체를 정의할 수 있다. 소스코드의 재사용성을 극대화한다.

함수 템플릿

함수 템플릿(Function Template)이 각각의 자료형에 대해 처음으로 호출이 될 때 C++ 컴파일러는 해당 타입의 인스턴스를 생성한다. 이후 생성된 하나의 인스턴스는 해당 자료형에 대해 특수화가 이루어진다. 이러한 인스턴스는 해당 함수 템플릿에 해당 자료형이 사용될 때마다 호출된다.

#include<iostream>
#include<string>

using namespace std;

template<typename T>
void change(T& a, T& b) {
	T temp;
	temp = a;
	a = b;
	b = temp;
}
int main(void) {
	string a = "나동빈";
	string b = "홍길동";
	change(a, b);
	cout << a << ":" << b << endl;
	system("pause");
}

명시적 특수화

C++의 함수 템플릿은 특정한 타입에 대해 명시적 특수화(Explicit Specialization) 기능을 제공한다. 이러한 명시적 특수화를 이용하면 특정한 타입에 대해 특수한 기능을 정의할 수 있다. 컴파일러는 호출된 함수에 대응하는 특수화된 정의를 발견한 후에는 해당 정의만 사용한다.

#include<iostream>
#include<string>

using namespace std;

template<typename T>
void change(T& a, T& b) {
	T temp;
	temp = a;
	a = b;
	b = temp;
}

template <> void change<int>(int& a, int& b)
{
	cout << "정수형 데이터를 교체\n";
	int temp;
	temp = a;
	a = b;
	b = temp;
}


int main(void) {
	int a = 7;
	int b = 5;
	change(a, b);
	cout << a << ":" << b << endl;
	system("pause");
}

클래스 템플릿

C++은 클래스를 일반화하기 위해 클래스 템플리(Class Template)을 활용할 수 있따. 템플릿을 사용하면 자료형에 따라 다르게 동작하는 클래스 집합을 만들 수 있다.

클래스 템플릿

#include<iostream>
#include<string>

using namespace std;

template<typename T>
class Data{
private:
	T data;
public:
	Data(T data) : data(data) { }
	void setData(T data) { this->data = data; }
	T getData() { return data; }
};
int main(void) {
	Data<int> data1(1);
	Data<string> data2("나동빈");
	cout << data1.getData() << ":" << data2.getData() << "\n";
	system("pause");
}

클래스 템플릿 : 디폴트 템플릿 인수

#include<iostream>
#include<string>

using namespace std;

template<typename T = int>
class Data{
private:
	T data;
public:
	Data(T data) : data(data) { }
	void setData(T data) { this->data = data; }
	T getData() { return data; }
};
int main(void) {
	Data<> data1(1);
	Data<string> data2("나동빈");
	cout << data1.getData() << ":" << data2.getData() << "\n";
	system("pause");
}
profile
logos and alogos

0개의 댓글