일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- css
- pwn.college
- 리버싱
- 컴퓨터구조
- 시스템해킹
- 시스템프로그래밍
- kernel
- wargame
- 시그널
- Pwnable.kr
- 리눅스
- radare2
- C언어
- Leviathan
- 시스템 프로그래밍
- 프로그래밍
- 리눅스 커널
- 하드링크
- 어셈블리어
- C++
- 리눅스커널
- 시스템
- pwncollege
- 포너블
- 워게임
- 커널
- multiplexing
- 알고리즘
- write up
- Bandit
- Today
- Total
Computer Security
#10 C++ 템플릿 본문
일반화
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 |