Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 11장. 템플릿과 STL 2011-1학기 프로그래밍언어및실습 (C++).

Similar presentations


Presentation on theme: "제 11장. 템플릿과 STL 2011-1학기 프로그래밍언어및실습 (C++)."— Presentation transcript:

1 제 11장. 템플릿과 STL 2011-1학기 프로그래밍언어및실습 (C++)

2 학습 목표 클래스 템플릿을 정의하고 인스턴스화하는 방법을 알아본다. 템플릿 기반 라이브러리의 일반적인 특징을 알아본다.
STL(Standard Template Library)의 특징을 알아본다. STL 컨테이너와 STL 알고리즘에 대해서 간단히 알아본다. 제너릭 프로그래밍의 개념을 이해하고 특징을 알아본다. 2011-1학기 프로그래밍언어및실습 (C++)

3 템플릿 C++의 템플릿을 이용하면 함수나 클래스를 정의할 때 특정 데이터 형을 사용하는 대신 범용형을 사용할 수 있다.
함수 템플릿이나 클래스 템플릿은 여러 가지 데이터 형에 대해서 함수 정의나 클래스 정의를 생성할 수 있다. 템플릿은 처리 알고리즘은 동일하고, 처리할 값의 데이터 형이 다양할 때 유용하게 사용될 수 있는 기능이다. 2011-1학기 프로그래밍언어및실습 (C++)

4 클래스 템플릿의 정의 클래스 템플릿의 정의 클래스 템플릿의 멤버 함수의 정의
template <typename 범용형이름, ...> class 클래스이름 { // 멤버 변수 정의 // 멤버 함수 정의 }; template <typename 범용형이름, ...> 리턴형 클래스템플릿이름<파라미터>::멤버함수이름(인자 리스트) { // 멤버 함수의 구현 }; 2011-1학기 프로그래밍언어및실습 (C++)

5 Stack 클래스의 예 template <typename T=int, int sz=0> class Stack {
protected: int m_size; int m_top; T *m_buffer; public: Stack(int size = sz) m_size = size; m_top = -1; m_buffer = new T[m_size]; } ~Stack() { ... Stack(const Stack& s) ... bool Push(T value) { ... } bool Pop(T& value) int GetSize() const { return m_size; } int GetTop() const { return m_top; } bool SetSize(int size) bool GetData(int index, T& data) const if( index < 0 || index > m_top ) return false; data = m_buffer[index]; return true; }; 2011-1학기 프로그래밍언어및실습 (C++)

6 클래스 템플릿의 인스턴스화 명시적으로 템플릿의 파라미터를 지정해야 한다. 객체를 생성할 때, 템플릿의 파라미터 지정
객체를 생성하지는 않지만 객체에 대한 포인터나 레퍼런스를 정의하면서 템플릿의 파라미터 지정 typedef 문으로 클래스 템플릿의 별명을 정의하면서 템플릿의 파라미터 지정 Stack<int> s1(10); // T는 int 형, sz는 0 Stack<string> s2(5); // T는 string 형, sz는 0 Stack<double, 10> s3; // T는 double 형, sz는 10 Stack<char, 10> *pStack = NULL; // T는 char 형, sz는 10 typedef Stack<Point> PointStack; // T는 Point 형, sz는 0 PointStack s4(20); // Stack<Point> 클래스의 객체 생성 2011-1학기 프로그래밍언어및실습 (C++)

7 클래스 템플릿의 사용 클래스 템플릿에 의해서 정의된 클래스는 어디에 사용할 수 있을까?
원칙적으로 클래스 템플릿에 의해서 정의된 클래스는 프로그래머가 직접 정의한 클래스와 마찬가지로 어디에서든지 사용 가능하다. 다른 클래스의 기본 클래스로 사용할 수도 있으며, 심지어는 다른 클래스 템플릿의 파라미터로 사용할 수도 있다. void f1(Stack<int>& s); // 함수의 인자로 사용 Stack<double>* f2(); // 함수의 리턴형으로 사용 class X { protected: Stack<string> m_strStack;// 멤버 객체의 데이터 형으로 사용 ... }; 2011-1학기 프로그래밍언어및실습 (C++)

8 템플릿의 특징 (1) 실제로 사용되기 전까지는 코드가 생성되지 않는다.
프로그램 내에서 실제로 사용되는 클래스나 함수에 대해서만 코드가 생성된다. 템플릿을 사용하면 코드 크기가 최소화된다. 일반적으로 템플릿 기반 라이브러리는 코드 사이즈 면이나 확장성 면에서 매우 우수하다. 2011-1학기 프로그래밍언어및실습 (C++)

9 템플릿의 특징 (2) 템플릿 함수의 정의나 템플릿 클래스의 멤버 함수의 정의를 소스 파일에 넣는 대신 헤더 파일에 넣는다는 점이다. 2011-1학기 프로그래밍언어및실습 (C++)

10 STL(Standard Template Library)
표준 C++이 제공하는 템플릿 기반 라이브러리 STL 컨테이너와 STL 알고리즘으로 구성된다. STL 컨테이너 일종의 컬렉션 클래스 같은 종류의 데이터의 모임 같은 데이터 형의 데이터를 저장하고 읽어오기 위한 자료 구조 클래스 일반적으로 많이 사용하는 동적 배열이나 연결 리스트, 맵 등 STL 알고리즘 자주 사용되는 유용한 알고리즘을 함수 템플릿으로 정의 프로그램 개발 시 많이 사용되는 데이터 검색이나 정렬, 최소값/최대값 찾기 등 2011-1학기 프로그래밍언어및실습 (C++)

11 STL의 장점 STL은 성능이 우수하고 안전성이 검증된 라이브러리이다. STL은 표준 C++ 라이브러리이다.
개발 기간도 단축하고 최소한의 노력만으로 원하는 기능을 구현할 수 있다. STL은 표준 C++ 라이브러리이다. 대부분의 C++ 컴파일러는 STL을 지원한다. 다양한 시스템에 호환성 있는 코드를 작성하려면 표준 라이브러리의 사용이 필수적이다. 2011-1학기 프로그래밍언어및실습 (C++)

12 STL 컨테이너 STL 컨테이너는 프로그램 내에서 데이터를 보관하고 관리하기 위해서 필요한 여러 가지 기능을 제공한다.
프로그래밍언어및실습 (C++)

13 STL 컨테이너의 종류 순차 컨테이너(sequence container)
데이터를 순차적으로 저장하는 가장 일반적인 컨테이너 삽입된 데이터를 저장할 때 별도의 제약을 갖지 않음 시퀀스 컨테이너의 임의의 위치에 원소를 삽입/삭제 가능 vector, list, deque 연관 컨테이너(associative container) 데이터를 무조건 저장만 하는 것이 아니라 일정한 규칙에 따라서 데이터를 관리하는 컨테이너 정렬이나 해시 등의 방법을 통해 삽입되는 데이터를 항상 일정한 기준에 맞는 위치에 저장  검색 속도가 빠르다. set, map 어댑터 컨테이너(adapter container) 순차 컨테이너를 변형하여 데이터를 미리 정해진 방식에 따라 관리 데이터를 삽입하고 제거하는 순서가 항상 컨테이너의 규칙에 의해서 결정 stack(LIFO), queue(FIFO), priority_queue 2011-1학기 프로그래밍언어및실습 (C++)

14 iterator 클래스 STL 컨테이너는 공통적으로 iterator 클래스를 제공한다.
STL 컨테이너는 공통적으로 첫 번째 원소를 가리키는 iterator를 리턴하는 begin 함수와 마지막 원소를 가리키는 iterator를 리턴하는 end 함수를 제공한다. 2011-1학기 프로그래밍언어및실습 (C++)

15 iterator의 사용 2011-1학기 프로그래밍언어및실습 (C++)

16 STL 컨테이너의 사용 예 #include <list> using namespace std; int main() {
list<Shape*> list1; while(true) ... switch( choice ) case 1: list1.push_back(new Rectangle); break; case 2: list1.push_back(new Ellipse); } ... Shape*& pShape = list1.back(); pShape->SetStartPoint(x, y); pShape->SetEndPoint(x, y); } list<Shape*>::iterator it; for(it = list1.begin() ; it != list1.end() ; ++it) (*it)->Draw(); delete (*it); return 0; 2011-1학기 프로그래밍언어및실습 (C++)

17 STL 컨테이너의 장점 STL 컨테이너의 종류가 다르더라도 각 컨테이너가 제공하는 인터페이스가 동일하다는 점이다.
push_back, back, begin, end 등의 멤버 함수는 list, vector, deque 등의 다른 STL 컨테이너에서도 동일하게 제공된다. 프로그램의 특성에 따라 STL 컨테이너를 선택해서 구현한 다음, 유지 보수 단계에서 성능이나 구현 상의 이유로 다른 컨테이너를 사용하도록 변경하더라도 프로그램 변경을 최소화할 수 있다. #include <vector> vector<Shape*> list1; // vector로 변경해도 프로그램의 // 나머지 부분은 그대로 동작한다. 2011-1학기 프로그래밍언어및실습 (C++)

18 STL 컨테이너의 다른 사용 예 #include <map> using namespace std; int main()
{ string s; map<string, int> words; cout << "문자열을 입력하세요. 종료하려면 Ctrl+Z을 입력하세요.\n"; while( cin >> s ) words[s]++; map<string, int>::iterator it; for(it = words.begin() ; it != words.end() ; ++it) cout << it->first << " : " << it->second << "번\n"; return 0; } 2011-1학기 프로그래밍언어및실습 (C++)

19 STL 알고리즘 STL이 제공하는 범용 함수 STL 알고리즘은 STL 컨테이너에 적용되어 STL 컨테이너의 원소 중 특정 범위 내의 원소에 대하여 정해진 동작을 수행한다. 프로그래밍언어및실습 (C++)

20 STL 알고리즘 사용 예 int arr[10] = {97, 44, 23, 55, 61, 12, 3, 75, 27, 84};
cout << "정렬된 배열 : "; sort(arr, arr+10); for(int i= 0 ; i < 10 ; i++) cout << arr[i] << " "; cout << "\n"; vector<string> strings; string s; cout << "문자열을 입력하세요 : "; while( cin >> s ) strings.push_back(s); sort(strings.begin(), strings.end()); cout << "정렬된 문자열 : "; for(vector<string>::iterator it = strings.begin() ; it != strings.end() ; it++) cout << *it << " "; 2011-1학기 프로그래밍언어및실습 (C++)

21 제너릭 프로그래밍 데이터가 보관되는 형식과 데이터를 처리하는 알고리즘을 분리하여 서로 독립적으로 관리할 수 있는 프로그래밍 방식 제너릭 프로그래밍에서는 데이터가 보관되는 형식과 관계없이 동일한 방법으로 처리할 수 있는 알고리즘을 구현하는 것이 목표이다. 제너릭 프로그래밍의 장점 데이터의 형식과 데이터의 처리 알고리즘을 분리함으로써 확장성을 가질 수 있다. 2011-1학기 프로그래밍언어및실습 (C++)

22 정리 클래스 템플릿을 정의한다고 해서 바로 클래스가 정의되지는 않는다. 클래스는 템플릿의 파라미터를 지정해야만 생성된다.
클래스 템플릿의 파라미터를 지정해서 클래스를 정의하는 것을 클래스 템플릿의 인스턴스화라고 한다. 클래스의 객체를 생성하는 것 외에도 다양한 인스턴스화 방법이 제공된다. STL은 표준 C++이 지원하는 템플릿 기반 라이브러리이다. STL 컨테이너에는 vector, list, deque, map, set, stack, queue 등이 있다. STL 컨테이너는 동일한 인터페이스를 제공하므로 최소한의 노력만으로 STL 컨테이너를 교체할 수 있다. STL 알고리즘에는 binary_search, find, for_each, max, min, remove, replace, sort 등이 있다. 제너릭 프로그래밍은 데이터를 보관하는 형식과 데이터를 처리하는 알고리즘을 분리할 수 있는 방법을 제공한다. 2011-1학기 프로그래밍언어및실습 (C++)


Download ppt "제 11장. 템플릿과 STL 2011-1학기 프로그래밍언어및실습 (C++)."

Similar presentations


Ads by Google