• 검색 결과가 없습니다.

템플릿함수

N/A
N/A
Protected

Academic year: 2021

Share "템플릿함수"

Copied!
30
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

14 장 예외처리와 템플릿 제 14 장 예외처리와 템플릿

1. 템플릿 개념

2. 템플릿 함수

3. 템플릿 클래스

(2)

템플릿 함수

C++ 에서도 하나의 형틀을 만들어서 다양한 코드를 생산

해 내도록 할 수 있는데 이것을 템플릿이라고 한다 . 템

플릿 함수 (function template) 는 함수를 찍어내기 위한

형틀이다 .

(3)

함수 템플릿

Recall:

다형적 함수 (polymorphic function) 란 함수 호출시에 다른 타입

의 매개변수를 가질 수 있는 함수를 말함

(4)

일반화와 템플릿

제네릭 ( 또는 포괄형 ) (generic) 또는 일반화

함수나 클래스를 일반화시키고 , 매개 변수 타입을 매개변수화하 여 틀에서 찍어 내듯이 함수나 클래스 코드를 생산하는 기법

함수 호출시 다른 타입의 매개변수를 가지므로 다형적 함수임

제네릭을 포괄형 함수라고 함

C++ 에서 포괄형 함수는 템플리트 함수 (template function) 로 작 성

4

(5)

일반화와 템플릿

템플릿

함수나 클래스를 일반화하는 C++ 도구

template 키워드로 함수나 클래스 선언

변수나 매개 변수의 타입만 다르고 , 코드 부분이 동일한 함수 를 일반화시킴

템플릿 선언

5

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

}

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

템플릿 함수 myswap } template <class T> // 타입 매개변수

1 개

template <class T1, class T2>

// 타입 매개변수 2 개

템플릿 선언 타입 매개변수 선언

(6)

일반화와 템플릿

6

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

}

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap (int & a, int &

b) {

int tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap (int & a, int &

b) {

int tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap (double & a, double &

b) {

double tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap (double & a, double &

b) {

double tmp;

tmp = a;

a = b;

b = tmp;

} int a, b;

double c, d;

myswa[(a, b);

myswap(c, d);

int a, b;

double c, d;

myswa[(a, b);

myswap(c, d);

사 례 화

Template 인자이며 , 타입 매개변수 표현

컴파일러가 실 매개변수 타입 기반 실제 함수 생성

템플리트 함수

(7)

일반화 프로그래밍 (generic programming)

(8)

예제

#include <iostream>

using namespace std;

template <typename T>

T get_max(T x, T y) {

if (x > y) return x;

else return y;

}

int main() {

cout << get_max(1, 3) << endl;

cout << get_max(1.2, 3.9) << endl;

return 0;

(9)

예제

9

template <class T>

void myswap(T & a, T &

b) {

T tmp;

tmp = a;

a = b;

b = tmp;

}

template <class T>

void myswap(T & a, T &

b) {

T tmp;

tmp = a;

a = b;

b = tmp;

}

T ->

int

int a=4, b=5;

myswap(a, b);

double c=0.3, d=12.5;

myswap(c, d);

T ->doubl

e

void myswap(int & a, int & b) { int tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap(double & a, double &

b) {

double tmp;

tmp = a;

a = b;

b = tmp;

char e=‘a’, f=‘k’;} myswap(e, f);

void myswap(char & a, char & b) { char tmp;

tmp = a;

a = b;

b = tmp;

}

T ->

char

구체화된 버전의 C++ 소스 생성

사례화

(10)

중복 함수와 템플릿 함수

10

중복된 함수의 본체가 모두 동일한 경우에는 템블릿 함 수로 작성하는 것이 바람직

void myswap (double & a, double &

b) {

double tmp;

tmp = a;

a = b;

b = tmp;

}

void myswap(int & a, int & b) { int tmp;

tmp = a;

a = b;

b = tmp;

}

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

}

template <class T>

void myswap (T & a, T & b) { T tmp;

tmp = a;

a = b;

b = tmp;

}

중복된 함수들

템플릿 함수

(11)

타입 매개변수가 2 개인 템플릿 함수

template<typename T1, typename T2>

void copy(T1 a1[], T2 a2[], int n) {

for (int i = 0; i < n; ++i) a1[i] = a2[i];

}

(12)

타입 매개변수가 2 개인 템플릿 함수

12

template <class T1, class T2>

void mcopy(T1 src [], T2 dest [], int n) { for(int i=0; i<n; i++)

dest[i] = (T2)src[i];

}

int main() {

int x[] = {1,2,3,4,5};

double d[5];

char c[5] = {'H', 'e', 'l', 'l', 'o'}, e[5];

mcopy(x, d, 5);

mcopy(c, e, 5);

for(int i=0; i<5; i++) cout << d[i] << ' ';

cout << endl;

for(int i=0; i<5; i++) cout << e[i] << ' ';

cout << endl;

}

(13)

예제 : 템플릿 함수

template<typename T>

void copy_array(T a[], T b[], int n) {

for (int i = 0; i < n; ++i) a[i] = b[i];

}

template <typename T>

T get_first(T[] a) {

return a[0];

}

(14)

예제

14

다음 코드의 실행 결과는 ?

template <class T>

void print(T array [], int n) { for(int i=0; i<n; i++)

cout << array[i] << '\t';

cout << endl;

}

int main() {

int x[] = {1,2,3,4,5};

char c[5] = {1, 2, 3, 4, 5};

double d[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };

print(x, 5);

print(d, 5);

print(c, 5);

}

(15)

15

템플릿 함수보다 중복 함수가 우선

template <class T>

void print(T array [], int n) { for(int i=0; i<n; i++)

cout << array[i] << '\t';

cout << endl;

}

void print(char array [], int n) { for(int i=0; i<n; i++)

cout << (int)array[i] << '\t';

cout << endl;

}

int main() {

int x[] = {1,2,3,4,5};

double d[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };

char c[5] = {1,2,3,4,5};

print(x, 5);

print(d, 5);

print(c, 5);

}

다음 코드의 실행 결과는 ?

바인딩되는

함수는 ?

(16)

16

템플릿 함수보다 중복 함수가 우선

template <class T>

void print(T array [], int n) { for(int i=0; i<n; i++)

cout << array[i] << '\t';

cout << endl;

}

void print(char array [], int n) { for(int i=0; i<n; i++)

cout << (int)array[i] << '\t';

cout << endl;

}

int main() {

int x[] = {1,2,3,4,5};

double d[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };

char c[5] = {1,2,3,4,5};

print(x, 5);

print(d, 5);

print(c, 5);

}

다음 코드의 실행 결과는 ?

템플릿 함수와 이름이 동일한

함수가 중복될 경우에 , 컴파일

러는 중복된 함수를 템플릿 함

수보다 우선하여 바인딩함

(17)

오류

다음 코드의 문제점은 ?

17

template <class T>

void myswap(T & a, T & b) {...}

int s=4;

double t=5;

myswap(s, t);

(18)

템플릿 클래스

(19)

템플릿 클래스

(20)

템플릿 클래스 만들기

제네릭 클래스 선언부와 구현부 모두 template 로 선언 해야 함

템플릿 클래스의 멤버 함수는 자동으로 템플릿 함수임

20

template <class T>

class MyStack { int tos;

T data [100];

public:

MyStack();

void push(T element);

T pop();

};

template <class T>

void MyStack<T>::push(T element) {

...

}

template <class T> T MyStack<T>::pop() {

...

}

(21)

21

예제 : 템플릿 스택 클래스

template <class T>

class MyStack {

int tos;// top of stack T data [100];

public:

MyStack();

void push(T element);

T pop();

};

template <class T>

MyStack<T>::MyStack() { tos = -1;

}

template <class T>

void MyStack<T>::push(T element) {

if(tos == 99) {

cout << "stack full";

return;

}

tos++;

data[tos] = element;

}

template <class T>

T MyStack<T>::pop() { T retData;

if(tos == -1) {

cout << "stack empty";

return 0; // 오류 }

retData = data[tos--];

return retData;

}

int main() {

MyStack<int> iStack;

iStack.push(3);

cout << iStack.pop() << endl;

MyStack<double> dStack;

dStack.push(3.5);

cout << dStack.pop() << endl;

MyStack<char> *p = new MyStack<char>();

p->push('a');

cout << p->pop() << endl;

delete p;

}

(22)

예제

template <typename T>

class Box { T data;

public:

Box() { }

void set(T value) { data = value;

}

T get() {

return data;

} };

int main() {

Box<int> box;

box.set(100);

cout << box.get() << endl;

Box<double> box1;

box1.set(3.141592);

cout << box1.get() << endl;

return 0;

}

(23)

템블릿 클래스가 두개 이상의 타입 매개 변수를

가질 때

(24)

예제

24

template <class T1, class T2>

class GClass { T1 data1;

T2 data2;

public:

GClass();

void set(T1 a, T2 b);

void get(T1 &a, T2 &b);

};

template <class T1, class T2>

GClass<T1, T2>::GClass() { data1 = 0; data2 = 0;

}

template <class T1, class T2>

void GClass<T1, T2>::set(T1 a, T2 b) {

data1 = a; data2 = b;

}

template <class T1, class T2>

void GClass<T1, T2>::get(T1 & a, T2

& b) {

a = data1; b = data2;

}

int main() { int a;

double b;

GClass<int, double> x;

x.set(2, 0.5);

x.get(a, b);

cout << "a=" << a << '\t' << "b=" << b

<< endl;

char c;

float d;

GClass<char, float> y;

y.set('m', 12.5);

y.get(c, d);

cout << "c=" << c << '\t' << "d=" << d <<

endl;

}

(25)

예제

#include <iostream>

using namespace std;

template <typename T1, typename T2>

class Box2 {

T1 first_data;

T2 second_data;

public:

Box2() { } T1 get_first();

T2 get_second();

void set_first(T1 value) { first_data = value;

}

void set_second(T2 value) { second_data = value;

}

};

(26)

예제

template <typename T1, typename T2>

T1 Box2<T1, T2>::get_first() { return first_data;

}

template <typename T1, typename T2>

T2 Box2<T1, T2>::get_second() { return second_data;

}

int main() {

Box2<int, double> b;

b.set_first(10);

b.set_second(3.14);

cout << "(" << b.get_first() << ", " << b.get_second() << ")"

<< endl;

return 0;

(27)

템플릿 장점과 제네릭 프로그래 밍

템플릿 장점

함수 코드의 재사용

높은 소프트웨어의 생산성과 유용성

제네릭 프로그래밍

generic programming

포괄적 또는 일반화 프로그래밍이라고도 부름

템플릿 함수나 템플릿 클래스를 활용하는 프로그래밍

C++ 에서 STL(Standard Template Library) 제공 . 활용

보편화 추세

Java, C# 등 많은 언어에서 지원

27

(28)

C++ 표준 템플릿 라이브러리 , STL

STL(Standard Template Library)

표준 템플릿 라이브러리

C++ 표준 라이브러리 중 하나

많은 템플릿 클래스와 템플릿 함수 포함

개발자는 이들을 이용하여 쉽게 응용 프로그램 작성

STL의 구성

컨테이너 템플릿 클래스 –

데이터를 담아두는 자료 구조를 표현한 클래스

리스트 , 큐 , 스택 , 맵 , 셋 , 벡터

iterator – 컨테이너 원소에 대한 포인터

컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터

알고리즘 템플릿 함수 –

컨테이너 원소에 대한 복사 , 검색 , 삭제 , 정렬 등의 기능을 구현한 템플릿 함수

컨테이너의 멤버 함수 아님

28

(29)

C++ 표준 템플릿 라이브러리 , STL

STL 컨테이너 종류

(30)

C++ 표준 템플릿 라이브러리 , STL

STL 알고리듬 함수들

참조

관련 문서

이전 학기 강의에서 학 습한 일변수 실수함수의 미분과 적분을 확장하여, 하나 이상의 변수를 가지 는 벡터함수들의 성질에

☆ 이 책에 실린 숙어는 공무원, 고시, TOEIC, TOEFL 및 각종 자격시험에서 출제되었거나, 출제될 가 능성이 가장 높은 것들을 엄선한 것입니다. 이

이수와 수질 정책네트워크의 중심성 분석결과를 비교하였 을 때, 내향 및 외향 연결 중심성과 매개 중심성이 높은 행위자 가 상이함을 알 수 있다. 다만, 내향 연결

이상의 결과를 종합하여 볼 때 초등학생의 아침결식을 감 소시키고 아침식사를 장려하기 위해서는 아침식사의 중요성 및 결식의 유해성에 대한 교육과 더불어

이러한 연구는 사용자의 물리 적, 경험적 지식을 기반으로 원하는 광특성을 나타낼 수 있는 기본적 나노 광학 구조체를 설 정하고 그 구조체 안에서 적절한 매개

함수 fx의 증가와 감소를 표로 나타내면 다음과 같다... fx가 극값을 가질 때, 삼차방정식 fx=0이 서로 다른 두 실근을 가질 필요충분조건은

다변량 자료 : 3가지 이상의 변수를 가지고 있는 자료로 측정대상으로부터 여러 개의 변수들을 측정하여 구하는 자료..

고차원 자료를 이용할 때 발생할 수 있는 과적합을 방지하고 랜섬웨어 탐지에 유의한 변수를 확인하기 위해 변수 선택을 적용하였으며, 모든 변수를 이용하는