C++

템플릿

khon98 2020. 12. 16. 19:35

일반화

- 일반화 프로그래밍(Generic Programming)이 가능한 언어

- 템플릿을 이용해서 일반화 프로그래밍을 사용할 수 있음

 

템플릿(Template)

- 템플릿이란 매개 변수의 타입에 따라서 함수 및 클래스를 손쉽게 사용할 수 있도록 해줌

- 템플릿은 그 타입 자체가 매개 변수에 의해서 다루어짐

- 템플릿을 사용하면 타입마다 별도의 함수나 클래스를 만들지 않고 다양한 타입에서 동작할 수 있는 단 하나의 객체를 정의할 수 있음

- 결과적으로 소스코드의 재사용성을 극대화할 수 있는 객체 지향 프로그래밍 기법 중 하나

#include <iostream>
#include <string>
#include <stdio.h>

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 = "khon";
    string b = "khon01";
    change(a, b);
    cout << a << ":" << b << endl;
    system("pause");
    return 0;
}

 

함수 템플릿(Fuction Template)

- 각각의 자료형에 대해서 처음으로 호출이 될 때 C++ 컴파일러는 해당 타입의 인스턴스를 생성

- 이후에 생성된 하나의 인스턴스는 해당 자료형에 대해서 특수화가 이루어짐

- 이러한 인스턴스는 해당 함수 템플릿에 해당 자료형이 사용될 때마다 호출됨

 

명시적 특수화(Explicit Specialization)

- C++의 함수 템플릿은 특정한 타입에 대하여 명시적 특수화 기능을 제공

- 이러한 명시적 특수화를 이용하면 특정한 타입에 대해서 특수한 기능을 정의할 수 있음

- 컴파일러는 호출된 함수에 대응하는 특수화된 정의를 발견한 이후에는 해당 정의만을 사용

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

template <typename T> // int형이 아닌경우 수행
void change(T& a, T& b) {
    T temp;
    temp = a;
    a = b;
    b = temp;
}

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

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

 

클래스 템플릿(Class Template)

- 클래스를 일반화하기 위해서 클래스 템플릿을 활용할 수 있음

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

#include <iostream>
#include <string>
#include <stdio.h>

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("khon");
    cout << data1.getData() << ":" << data2.getData() << "\n";
    system("pause");
    return 0;
}

 

* 디폴트 템플릿 인수

#include <iostream>
#include <string>
#include <stdio.h>

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("khon");
    cout << data1.getData() << ":" << data2.getData() << "\n";
    system("pause");
    return 0;
}