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

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Vision System Lab, Sang-Hun Han
명품 C++ 프로그래밍 3장. 클래스와 객체.
명품 C++ 8장 상속.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
2장 닷넷 프레임워크.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
강좌명 : C++프로그래밍 (C++ Programming)
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
8. 객체와 클래스 (기본).
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
Internet Computing KUT Youn-Hee Han
C++ Espresso 제9장 다형성.
7 스택.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
스택(stack) SANGJI University Kwangman Ko
제15장 STL과 람다식 STL의 개념을 이해하고 사용할 수 있다. 람다식을 이해하고 사용할 수 있다.
C++ Espresso 제6장 생성자와 소멸자.
Visual C++ Programming Common Controls
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
프로그래밍2 및 실습 C언어 기반의 C++ 2.
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 3 클래스. 최호성.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
추상 데이터 타입 정의하기 Defining abstract data types
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
자바 5.0 프로그래밍.
루프와 카운트 Looping and counting
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
목차 성능과 최적화. 메모리할당. STL 알고리즘. 책의 성능 단원과 다른 단원들을 함께 포괄적으로 발표를 진행 하겠습니다.
5. 논리적 자료표현 : 구조체.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Ch16_표준 템플릿 라이브러리.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
10장 템플릿과 표준 템플릿 라이브러리(STL)
Chapter 14. 템플릿(Template) 2
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
배열, 포인터, 함수 Review & 과제 1, 2.
Presentation transcript:

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

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

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

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

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

클래스 템플릿의 인스턴스화 명시적으로 템플릿의 파라미터를 지정해야 한다. 객체를 생성할 때, 템플릿의 파라미터 지정 객체를 생성하지는 않지만 객체에 대한 포인터나 레퍼런스를 정의하면서 템플릿의 파라미터 지정 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++)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

정리 클래스 템플릿을 정의한다고 해서 바로 클래스가 정의되지는 않는다. 클래스는 템플릿의 파라미터를 지정해야만 생성된다. 클래스 템플릿의 파라미터를 지정해서 클래스를 정의하는 것을 클래스 템플릿의 인스턴스화라고 한다. 클래스의 객체를 생성하는 것 외에도 다양한 인스턴스화 방법이 제공된다. 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++)