C++ Espresso 제12장 템플릿
일반적인 하나의 코드로 다양한 자료형을 처리하는 기법을 살펴봅시다. 이번 장에서 학습할 내용 일반적인 하나의 코드로 다양한 자료형을 처리하는 기법을 살펴봅시다. 함수 템플릿 클래스 템플릿 스택 예제
템플릿이란? 템플릿(template): 물건을 만들 때 사용되는 틀이나 모형을 의미 함수 템플릿(function template): 함수를 찍어내기 위한 형틀
만약 float 값중에서 최대값을 구하는 함수가 필요하다면? 함수 get_max() int get_max(int x, int y) { if( x > y ) return x; else return y; } 만약 float 값중에서 최대값을 구하는 함수가 필요하다면? 1. 하나더 만든다. 2.
핵심적인 내용은 같고 매개 변수의 타입만 달라진다. 함수 get_max() float get_max(float x, float y) { if( x > y ) return x; else return y; } 핵심적인 내용은 같고 매개 변수의 타입만 달라진다.
일반화 프로그래밍 일반화 프로그래밍(generic programming): 일반적인 코드를 작성하고 이 코드를 정수나 문자열과 같은 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법
get_max() template<typename T> T get_max(T x, T y) { if( x > y ) return x; else return y; } 자료형이 변수처럼 표기되어 있음을 알 수 있다
템플릿 함수의 사용
예제
실행 결과
템플릿 함수의 특수화 template <typename T> // 함수 템플릿으로 정의 void print_array(T[] a, int n) { for(int i=0;i<n; i++) cout << a[i] << " "; cout << endl; } template <> // 템플릿 특수화 void print_array(char[] a, int n) // 매개 변수가 char인 경우에는 이 함수가 호출된다. cout << a << endl;
함수 템플릿과 함수 중복 중복
함수 템플릿과 함수 중복
두개의 타입 매개 변수
중간 점검 문제 1. 변수의 절대값을 구하는 int abs(int x)를 템플릿 함수로 정의하여 보자. 2. 두수의 합을 계산하는 int add(int a, int b)를 템플릿 함수로 구현하여 보자. 3. displayArray()라는 함수는 배열을 매개 변수로 받아서 반복 루프를 사용하여서 배열의 원소를 화면에 출력한다. 어떤 타입의 배열도 처리할 수 있도록 함수 템플릿으로 정의하여 보라.
클래스 템플릿 클래스 템플릿(class template): 클래스를 찍어내는 틀(template) 예제: 하나의 값을 저장하고 있는 박스 template <typename 타입이름, ...> class 클래스이름 { ... }
예제
실행 결과 클래스 템플릿으로 만들어 보자.
클래스 템플릿 버전
클래스 템플릿 정의 template <typename T> class 클래스이름 { }
예제
클래스 외부에 정의
두개의 타입 매개 변수 두 개의 데이터를 저장하는 클래스 Box2
예제
예제
중간 점검 문제 1. 클래스 템플릿 형태로 라이브러리를 제공하면 어떤 장점이 있는가? 2. 세개의 데이터를 가지고 있는 Triple라는 클래스를 클래스 템플릿으로 작성하여 보라.
예제: 스택 스택(stack): 후입 선출(LIFO:Last-In First-Out) 자료 구조
스택의 연산들 ▪ is_empty(s) ::= 스택이 비어있는지를 검사한다. ▪ is_full(s) ::= 스택이 가득 찼는가를 검사한다. ▪ push(s, e) ::= 스택의 맨 위에 요소 e를 추가한다. ▪ pop(s) ::= 스택의 맨 위에 있는 요소를 삭제한다.
스택의 공백 상태와 포화 상태
isEmpty() , isFull() isEmpty() if top = -1 then return TRUE else return FALSE isFull() if top = (MAX_STACK_SIZE-1) then return TRUE else return FALSE
push() push(x) if isFull() then error "overflow" else top←top+1 stack[top]←x
pop() pop(x) if isEmpty() then error "underflow" else e←stack[top] top←top-1 return e
스택의 구현 #include <iostream> using namespace std; // 예외 처리를 위한 클래스 class FullStack {} ; class EmptyStack {};
스택의 구현 template <class T> class Stack { private: T* s; int size; int top; public: Stack(int n = 100) : size(n), top(-1) { s = new T[size]; } ~Stack() { delete []s; } void push(T v); T pop(); bool isEmpty() const { return top == -1;} bool isFull() const { return top == size - 1;} };
스택의 구현 template< typename T > void Stack< T >::push( T v ) { if ( isFull() ) throw FullStack(); s[ ++top ] = v; } T Stack< T >::pop( ) if ( isEmpty() ) throw EmptyStack(); return s[ top-- ];
스택의 구현 400 300 200 100 계속하려면 아무 키나 누르십시오 . . . int main() { Stack<int> s; // 크기가 100인 정수형 스택 s.push(100); s.push(200); s.push(300); s.push(400); cout << s.pop() << endl; return 0; } 400 300 200 100 계속하려면 아무 키나 누르십시오 . . .
스택의 응용
실행 결과
Q & A