10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf ·...

21
C++ 프로그래밍 입문 10장 템플릿 템플릿의 기본 개념 함수 템플릿 클래스 템플릿 클래스 템플릿의 디폴트 템플릿 매개변수 비타입 템플릿 매개변수 템플릿 인스턴스화와 전문화 템플릿의 동작 원리 및 주의 사항

Transcript of 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf ·...

Page 1: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

C++ 프 그래 문

10 템플릿

템플릿 본 개념

함수 템플릿

클래스 템플릿

클래스 템플릿 폴트 템플릿 매개 수

비타 템플릿 매개 수

템플릿 스턴스 전문

템플릿 동 원리 주 사항

Page 2: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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);

Page 3: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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;}

함수 공통점과 차 점 ?

* 기능 동

* 타 (형)만 다름

à 하나 함수로 만드는 방법 없 까?

à 함수 템플릿

Page 4: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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 체 가능

* 타 매개 수 !

à템플릿 매개 수

함수 템플릿

à실제 함수를 만드는 과정

Page 5: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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;

}

Page 6: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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;

}

Page 7: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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) { ... }

Page 8: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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!

Page 9: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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); 동

Page 10: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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 객체에 한

<< 연산 사 가능한가?

à << 연산 필 !

연산

한 수행해 보라.

Page 11: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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 함수 언

Page 12: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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. 클래스 템플릿

드 계

Page 13: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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 { ... }

Page 14: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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 만( ) 사 가능

Page 15: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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, 참조 전달 가능

Page 16: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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;

} 함수 템플릿에 함수 사 시

템플릿 매개 수에 한 타 가능

Page 17: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

10 템플릿 16

6. 템플릿 스턴스 전문

템플릿 스턴스 (template instantiation)

n 함수 템플릿 나 클래스 템플릿 터 특정 타 함수 클래스를

만들어 내는 과정

n 묵시적 스턴스 : 컴파 러에 해 동 생 ,

n 시적 스턴스 : 프 그래 가 특정 타 에 한 함수 클래스를

만들어내 시적 컴파 러에게 청

템플릿 전문 (template specialization)

n 템플릿 스턴스 를 통해 만들어 함수 클래스 시적 전문 를

통해 만들어 함수 클래스를 칭하는 말

n 시적 전문 : 특정 타 에 해 존 템플릿과는 다른 내 함

수 또는 클래스를 만들 수

Page 18: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) 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>;

Page 19: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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)가 존 한다

수행 순 는?

함수à 시적 전문 à템플릿

Page 20: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

10 템플릿 19

7. 템플릿 동 원리 주 사항

함수(또는 클래스)를 사 하 해 는

n 컴파 시 : 함수 프 토타 상 알아야만

n 링크 시 : 프 그램 어 가에 함수 정 가 단 한 나 야

템플릿

n 함수나 클래스를 만들어낼 수 는 틀 제공

n 컴파 시 : 실제 함수 또는 클래스를 만들어 냄

Ø 컴파 : 파 단 수행

n 컴파 시 템플릿 스턴스 를 수행할 실제 함수 체 만들어야

하므 템플릿 언과 정 해당 파 내에 포함하고 어야만

적 템플릿 사

n 템플릿 사 하는 파 내에 템플릿 언과 정 를 포함à

n 헤 파 에 템플릿 언과 정 를 포함하고 를 include하여 사

à 보다 적 !

Page 21: 10장템플릿 - contents.kocw.or.krcontents.kocw.or.kr/document/CPP10_Template.pdf · 10장템플릿 1 1. 템플릿의기본개념 템플릿(template) n 프로그램을만들어내는틀!?

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