10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf ·...
Transcript of 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf ·...
C++ 프 그래 문
10 템플릿
템플릿 본 개념
함수 템플릿
클래스 템플릿
클래스 템플릿 폴트 템플릿 매개 수
비타 템플릿 매개 수
템플릿 스턴스 전문
템플릿 동 원리 주 사항
10 템플릿 1
1. 템플릿 본 개념
템플릿(template)
n 프 그램 만들어 내는 틀!?
n 어 타 (int, double, CPoint, …)에 해 적 가능한 함수 또는
클래스를 미함
1 : 좌 를 나타내는 클래스
n int 좌 , double 좌 를 나타내는 클래스
Ø 존 : 클래스
ü 내 동
Ø 템플릿 클래스
ü 단 하나만 하 à : 본 주제
2 : 가 열
n int , double , char , CPoint , …
à 템플릿 클래스 만든다 단 한 처리 가능
템플릿 라 브러리(STL) : C++ 라 브러리
n vector, list, stack, queue, … à 13
class CIntPoint { ... }class CDoublePoint { ... }CIntPoint P1(1, 2);CDoublePoint P2(1.1, 2.2);
10 템플릿 2
2. 함수 템플릿
다 과 같 프 그램
해 보라.
n int 정수 2개를 하는
함수
n double 정수 2개를 하
는 함수
n char 정수 2개를 하는
함수
int Sum(int a, int b) {
int c = a + b;return c;
}
double Sum(double a, double b){
double c = a + b;return c;
}
char Sum(char a, char b) {
char c = a + b;return c;
}
int main(void){
cout << Sum(1, 2) << endl;cout << Sum(1.1, 2.2) << endl;cout << Sum('1', '2') << endl;
return 0;}
함수 공통점과 차 점 ?
* 기능 동
* 타 (형)만 다름
à 하나 함수로 만드는 방법 없 까?
à 함수 템플릿
10 템플릿 3
2. 함수 템플릿
Sum 함수 템플릿template <typename T> // 템플릿 언 및 템플릿 매개변수 언T Sum(T a, T b){
T c = a + b;return c;
}
int main(void){
cout << Sum(1, 2) << endl; // T를 int로 체한 함수 생cout << Sum(1.1, 2.2) << endl; // T를 double로 체한 함수 생cout << Sum('1', '2') << endl; // T를 char로 체한 함수 생
return 0;}
typename 신 class 체 가능
* 타 매개 수 !
à템플릿 매개 수
함수 템플릿
à실제 함수를 만드는 과정
10 템플릿 4
2. 함수 템플릿
Sum 함수 템플릿 CPoint 객체에 해 수행 가능한가?
n T를 CPoint 체해 보라.
n 답 : CPoint 클래스 결과에 라 수행 여 가 결정
Ø + 연산 드시 해야 함!
CPoint P1(1, 2), P2(3, 4);
CPoint P3 = Sum(P1, P2); // 수행 가능한가?
CPoint Sum(CPoint a, CPoint b)
{
CPoint c = a + b;
return c;
}
10 템플릿 5
2. 함수 템플릿
Sum 함수 템플릿과 CPoint 클래스
template <typename T>T Sum(T a, T b){
T c = a + b;return c;
}
class CPoint {private :
int x, y;
public :CPoint(int a, int b) : x(a), y(b) { }CPoint operator+(CPoint &Po) { return CPoint(x + Po.x, y + Po.y); }void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};
int main(void){
CPoint P1(1, 2), P2(3, 4);CPoint P3 = Sum(P1, P2); // T를 CPoint로 체한 함수 생P3.Print();return 0;
}
함수 프 토타 과함수 정 리template <typename T> 함수 언 .(한 술 가능)
template <typename T> T Sum(T a, T b);
template <typename T> T Sum(T a, T b){
T c = a + b;return c;
}
10 템플릿 6
template <typename T1, typename T2, typename T3> // 3개 템플릿 매개변수
void Print(T1 a, T2 b, T3 c)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main(void)
{
Print(1, 1, 1.1); // (T1, T2, T3)=>(int, int, double)로 체
Print(2, 2.2, 'a'); // (T1, T2, T3)=>(int, double, char)로 체
Print("test", 3, 3.3); // (T1, T2, T3)=>(char *, int, double)로 체
return 0;
}
2. 함수 템플릿
2개 상 템플릿 매개 수 전달 가능
다 과 같 함수 생void Print(int a, int a, double c) { ... }
void Print(int a, double a, char c) { ... }
void Print(char *a, int a, double c) { ... }
10 템플릿 7
CIntPoint CDoublePoint 클래스
3. 클래스 템플릿
class CIntPoint {private :
int x, y;
public :CIntPoint(int a, int b) : x(a), y(b) { }void Move(int a, int b) { x += a; y += b; }void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};
class CDoublePoint {private :
double x, y;
public :CDoublePoint(double a, double b) : x(a), y(b) { }void Move(double a, double b) { x += a; y += b; }void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};
int main(void){
CIntPoint P1(1, 2);CDoublePoint P2(1.1, 2.2);
P1.Print();P2.Print();return 0;
}
int 좌 (x, y)
double 좌 (x, y)
CIntPoint CDoublePoint는 타 만
제 하고 든 내 동 함
à클래스 템플릿 사 à단 한 Ok!
10 템플릿 8
3. 클래스 템플릿
CPoint 클래스 템플릿
template <typename T>class CPoint {private :
T x, y;
public :CPoint(T a, T b) : x(a), y(b) { }void Move(T a, T b);void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};
template <typename T>void CPoint<T>::Move(T a, T b){
x += a;y += b;
}
int main(void){
CPoint<int> P1(1, 2);CPoint<double> P2(1.1, 2.2);
P1.Print();P2.Print();
return 0;}
함수 정
객체 생
CPoint<타 >
à해당 타 클래스를
만들어 냄!
typedef CPoint<int> CIntPoint;
CIntPoint P1(1, 2); // CPoint<int> P1(1, 2); 동
10 템플릿 9
3. 클래스 템플릿
: 열 하는 CArray 클래스 템플릿
n 문제점 해결 ?
class CPoint {private :
int x, y;
public :CPoint(int a = 0, int b = 0) : x(a), y(b) { }void Print() { cout << "(" << x << ", " << y << ")"; }
};
template <typename T>class CArray {private :
T ary[5];
public :CArray(T a) { for (int i = 0; i < 5; i++) ary[i] = a; }void Print() {
for (int i = 0; i < 5; i++) cout << ary[i] << " "; cout << endl;
} };
int main(void){
CArray<int> Ary1(5);CArray<CPoint> Ary2(CPoint(1, 2));
Ary1.Print();Ary2.Print();
return 0;}
CPoint 객체를 원 갖는 열
각 원 출 : CPoint 객체에 한
<< 연산 사 가능한가?
à << 연산 필 !
연산
한 수행해 보라.
10 템플릿 10
3. 클래스 템플릿
CPoint 클래스를 클래스 템플릿 만든다 ?
template <typename T>class CPoint {private :
T x, y;
public :CPoint(T a = 0, T b = 0) : x(a), y(b) { }template <typename T> friend ostream &operator<<(ostream &out, CPoint<T> &Po);
};
template <typename T> // << 연산 버로 템플릿 로 현ostream &operator<<(ostream &out, CPoint<T> &Po){
out << "(" << Po.x << ", " << Po.y << ")"; return out;
}
friend 함수 언
10 템플릿 11
template <typename T>class CArray {private :
T ary[5];
public :CArray(T a) { for (int i = 0; i < 5; i++) ary[i] = a; }void Print() {
for (int i = 0; i < 5; i++) cout << ary[i] << " "; cout << endl;
}};
int main(void){
CArray<int> Ary1(5);CArray<CPoint<int>> Ary2(CPoint<int>(1, 2)); // CPoint<int>를 원 로 가짐
Ary1.Print();Ary2.Print();
return 0;}
3. 클래스 템플릿
드 계
10 템플릿 12
4. 클래스 템플릿 폴트 템플릿 매개 수
템플릿 매개 수에 한 폴트 타 정 가능
template <typename T = int> // 폴트 템플릿 매개변수
class CPoint {
private :
T x, y;
public :
CPoint(T a = 0, T b = 0) : x(a), y(b) { }
void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};
int main(void)
{
CPoint<> P1(1, 2); // CPoint<int> P1(1, 2) 동
P1.Print();
return 0;
}폴트 템플릿 매개 수 폴트 값 에 터
정 가능
template <typename T1 = int, typename T2> class CMyClass { ... }; // error
template <typename T1 = int, typename T2 = double> class CMyClass { ... }
10 템플릿 13
5. 비타 템플릿 매개 수
비타 템플릿 매개 수
n int, double, CPoint 같 타 템플릿 매개 수
template <typename T, int Radius> // 비타 템플릿 매개변수class CPoint {private :
T x, y;
public :CPoint(T a = 0, T b = 0) : x(a), y(b) { }void Print() { cout << "(" << x << ", " << y << ")" << endl;
cout << "반 름 : " << Radius << endl; }};
int main(void){
CPoint<int, 15> P1(3, 4); // Radius로 int값 15 전달P1.Print();
return 0;}
비타 템플릿 매개 수는
r-value 만( ) 사 가능
10 템플릿 14
5. 비타 템플릿 매개 수
비타 템플릿 매개 수 수 는 타
n 정수 상수 또는 정수 상수 식
n 전역 수 또는 전역 객체 주 : & 주 연산 를 사 하여 전
달하 열과 함수 경 & 생략 가능, 템플릿 식매개 수는
포 터
n 전역 수 또는 전역 객체 : 템플릿 식매개 수는 참조
template <typename T, int Radius> CPoint { };
int a = 5; CPoint<int, a> P1; // X, 상수가 아님
template <typename T, char *p> CPoint { };
CPoint<int, "C++"> P1; // X, 정수형 상수가 아님
char p[] = "C++"; CPoint<int, p> P1; // O, 주 전달 가능
template <typename T, double p> CPoint { }; // X, 정수형 매개변수가 아님
template <typename T, int &Radius> CPoint { };
int a = 5; CPoint(int, a) P1; // O, 참조 전달 가능
10 템플릿 15
5. 비타 템플릿 매개 수
함수 템플릿에 비타 템플릿 매개 수 사 가능
template <typename T, bool x> // 비타 템플릿 매개변수 bool x
T MaxMin(T a, T b)
{
if (x == true)
return ((a > b) ? a : b);
else
return ((a < b) ? a : b);
}
int main(void)
{
cout << "최 값: " << MaxMin<int, true>(3, 4) << endl;
cout << "최 값: " << MaxMin<int, false>(3, 4) << endl;
return 0;
} 함수 템플릿에 함수 사 시
템플릿 매개 수에 한 타 가능
10 템플릿 16
6. 템플릿 스턴스 전문
템플릿 스턴스 (template instantiation)
n 함수 템플릿 나 클래스 템플릿 터 특정 타 함수 클래스를
만들어 내는 과정
n 묵시적 스턴스 : 컴파 러에 해 동 생 ,
n 시적 스턴스 : 프 그래 가 특정 타 에 한 함수 클래스를
만들어내 시적 컴파 러에게 청
템플릿 전문 (template specialization)
n 템플릿 스턴스 를 통해 만들어 함수 클래스 시적 전문 를
통해 만들어 함수 클래스를 칭하는 말
n 시적 전문 : 특정 타 에 해 존 템플릿과는 다른 내 함
수 또는 클래스를 만들 수
10 템플릿 17
template <typename T>T Sum(T a, T b){
T c = a + b;return c;
}
template int Sum(int a, int b); // int형 Sum 함수 시적 스턴스화
int main(void){
int x = Sum(3, 4);double y = Sum(1.1, 2.2);
cout << x << endl;cout << y << endl;
return 0;}
6. 템플릿 스턴스 전문
시적 스턴스
컴파 러에 해 int 에 한 함수가 생
내 템플릿과 동 함
상 묵시적 스턴스 는수행 않
묵시적 스턴스 가수행
클래스 템플릿에 한 시적 스턴스
emplate <typename T> class CPoint { ... };
template class CPoint<int>;
10 템플릿 18
6. 템플릿 스턴스 전문
시적 전문
n Sum 함수에 해 int 경 다른 미를 여하고 함
template <typename T>T Sum(T a, T b){
T c = a + b;return c;
}
template <>int Sum(int a, int b){
int c = a * b;return c;
}
int main(void){
int x = Sum(3, 4);double y = Sum(1.1, 2.2);
cout << x << endl;cout << y << endl;
return 0;}
int Sum 함수에 한 시적 전문
존 템플릿과는 내 다름!
문 : template<> 다 에 함수가
클래스 템플릿에 한 시적 전문
template <typename T> class CPoint { ... };
template <> CPoint<int> { ... };
함수 Sum(int, int)가 존 한다
수행 순 는?
함수à 시적 전문 à템플릿
10 템플릿 19
7. 템플릿 동 원리 주 사항
함수(또는 클래스)를 사 하 해 는
n 컴파 시 : 함수 프 토타 상 알아야만
n 링크 시 : 프 그램 어 가에 함수 정 가 단 한 나 야
템플릿
n 함수나 클래스를 만들어낼 수 는 틀 제공
n 컴파 시 : 실제 함수 또는 클래스를 만들어 냄
Ø 컴파 : 파 단 수행
n 컴파 시 템플릿 스턴스 를 수행할 실제 함수 체 만들어야
하므 템플릿 언과 정 해당 파 내에 포함하고 어야만
함
적 템플릿 사
n 템플릿 사 하는 파 내에 템플릿 언과 정 를 포함à
n 헤 파 에 템플릿 언과 정 를 포함하고 를 include하여 사
à 보다 적 !
10 템플릿 20
7. 템플릿 동 원리 주 사항
template <typename T> // 함수 템플릿 함수 체 포함T Sum(T a, T b){
T c = a + b;return c;
}
void func(int a); // 반 함수는 프로토타 만
#include <iostream>#include "template.h"using namespace std;
void func(int a){
cout << Sum(a, a) << endl;}
#include <iostream>#include "template.h"using namespace std;
int main(void){
cout << Sum(1, 2) << endl;func(3);
return 0;}
template.h
template.cpp main.cpp