Computer Security

#10 C++ 템플릿 본문

프로그래밍/C++

#10 C++ 템플릿

쿠리 Kuri 2022. 6. 21. 18:30

일반화
C++은 일반화 프로그래밍(Generic Programming)이 가능한 언어이다.

C++에서는 템플릿(Template)을 이용해서 일반화 프로그래밍을 사용할 수 있다.

 

템플릿 (template<typename T> 명령어)
템플릿(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 = "고동산";
    //스트링이 템플릿 안에 따로 선언이 안되어 있지만, typename을 이용하면, 스트링이 들어왔구나!
    //인식하여, 저절로 타입이 바뀌게 된다.
	string b = "홍길동";
	change(a, b);
	cout << a << ":" << b << endl;
	system ("pause");
}

결과 값

 


명시적 특수화
C++의 함수 템플릿은 특정한 타입에 대하여 명시적 특수화(Explicit Specialization) 기능을 제공한다.

이러한 명시적 특수화를 이용하면 특정한 타입에 대해서 특수한 기능을 정의할 수 있다.
컴파일러는 호출된 함수에 대응하는 특수화된 정의를 발견한 이후에는 해당 정의만을 사용한다.

 

코드 예시1

#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)
//타입으로 int형이 들어왔을땐, 정수형 데이터를 교체합니다가 출력되게끔한다.
//이렇게 명시적으로 int형을 지정할 수 있다.
{
cout << "정수형 데이터를 교체합니다.\n";
int temp;
temp = a;
a = b;
b = temp;
}
int main(void) {
	string a = "고동산";
    //스트링이 템플릿 안에 따로 선언이 안되어 있지만, typename을 이용하면, 스트링이 들어왔구나!
    //인식하여, 저절로 타입이 바뀌게 된다.
	string b = "홍길동";
	change(a, b);
	cout << a << ":" << b << endl;
	system ("pause");
}

 

결과 값1

 

만약, int형을 받게 되면 어떻게 될까?

 

코드 예시 2

#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)
//타입으로 int형이 들어왔을땐, 정수형 데이터를 교체합니다가 출력되게끔한다.
//이렇게 명시적으로 int형을 지정할 수 있다.
{
	cout << "정수형 데이터를 교체합니다.\n";
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main(void) {
    int a = 3;
	int b = 8;
	change(a, b);
	cout << a << ":" << b << endl;
	system("pause");
}

결과 값2

이렇게 정수형 데이터를 교체합니다. 라는 문구도 같이 출력 되는 것을 볼 수 있다.


클래스 템플릿
C++은 클래스를 일반화하기 위해서 클래스 템플릿(Class Template)을 활용할 수 있다.

클래스 템플릿을 사용 하면 자료형에 따라서 다르게 동작하는 클래스 집합을 만들 수 있다.

 

코드 예시

#include <iostream>
#include <string>

using namespace std;

template <typename T> //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); //데이터1은 인트형
Data<string> data2("고동산"); //데이터2는 스트링
cout << data1.getData() << ":" << data2.getData() << "\n";
system("pause");
}

 

결과 값

 

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

 

만약 어떤 typename 도 안들어갔을때, int라고 지정을 하게 된다면,

data<> 빈 공간을 만들어 놨을때, 알아서 data타입을 int형으로 지정하게끔 할 수 있다.

 

코드 예시

#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");
}

 

결과 값

'프로그래밍 > C++' 카테고리의 다른 글

#12 C++ STL 컨테이너 어댑터 라이브러리  (0) 2022.06.23
#11 C++ 스마트 포인터  (0) 2022.06.22
#9 다형성 기법 2  (0) 2022.06.20
#8 C++ 다형성 기법 1  (0) 2022.06.19
#7 정적멤버,상수멤버  (0) 2022.06.18
Comments