제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.

Slides:



Advertisements
Similar presentations
12 장 템플릿 (template) Sung-Min Jung Internet Management Technology Lab. School of Information & Communication Engineering, Sungkyunkwan Univ. 300 Cheoncheon-dong,
Advertisements

01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
10. 예외 처리.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
최윤정 Java 프로그래밍 클래스 상속 최윤정
강좌명 : C++프로그래밍 (C++ Programming)
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
8. 객체와 클래스 (기본).
[INA470] Java Programming Youn-Hee Han
윤 홍 란 다형성과 가상 함수 윤 홍 란
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제6장 생성자와 소멸자.
Lesson 9. 예외처리.
제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
1. C++ 시작하기.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
C++ Programming: chapter 7 – inheritence
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
Method & library.
어서와 C언어는 처음이지 제14장.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
C++ Espresso 제11장 예외 처리와 형변환.
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
5. 논리적 자료표현 : 구조체.
12. 상속 : 고급.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Chapter 13. 템플릿(Template) 1
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Chapter 2 C++ 함수와 네임스페이스. 최호성.
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
10장 템플릿과 표준 템플릿 라이브러리(STL)
새로운 타입 정의하기 Defining new types
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Java의 정석 제 8 장 예외처리 (Exception handling) Java 정석 남궁성 강의
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
Presentation transcript:

제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다. 템플릿으로 간단한 클래스를 설계할 수 있다.

이번 장에서 만들어 볼 프로그램 (1) 한사람이 먹을 수 있는 피자 조각 개수를 계산하는 프로그램을 작성하자. 사람 수를 0 으로 입력하여도 오류가 일어나지 않게 한다. (2) 템플릿을 사용하여서 어떤 자료형도 저장할 수 있는 Box 클래스를 작성하고 실험해보 자.

예외처리란?

예제 int main() { int pizza_slices = 0; int persons = -1; int slices_per_person = 0; cout << "피자 조각수를 입력하시오: "; cin >> pizza_slices; cout << "사람수를 입력하시오: "; cin >> persons; slices_per_person = pizza_slices / persons; cout << "한사람당 피자는 " << slices_per_person << "입니다." << endl; return 0; }

예외처리기

try-catch 블록

예제 int main() { int pizza_slices = 0; int persons = -1; int slices_per_person = 0; try cout << "피자 조각수를 입력하시오: "; cin >> pizza_slices; cout << "사람수를 입력하시오: "; cin >> persons;

예제 if (persons == 0) throw persons; slices_per_person = pizza_slices / persons; cout << "한사람당 피자는 " << slices_per_person << "입니 다." << endl; } catch (int e) { cout << "사람이 " << e << " 명 입니다. " << endl; return 0;

try/catch 블록에서의 실행 흐름

catch 블록의 매개 변수

타입이 일치되는 예외만 처리된다. try { int person =0; ... if (persons == 0) throw persons; } catch(char e) { cout << "사람이 " << e << " 명 입니다. "<< endl;

예외 전달

예제 #include <iostream> using namespace std; int dividePizza(int pizza_slices, int persons); int main() { int pizza_slices = 0; int persons = 0; int slices_per_person = 0; try cout << "피자 조각수를 입력하시오: "; cin >> pizza_slices; cout << "사람수를 입력하시오: "; cin >> persons; slices_per_person = dividePizza(pizza_slices, persons); cout << "한사람당 피자는 " << slices_per_person << "입니 다." << endl; }

예제 catch (int e) { cout << "사람이 " << e << " 명 입니다. " << endl; } return 0; int dividePizza(int pizza_slices, int persons) if (persons == 0) throw persons; return pizza_slices / persons;

표준예외 C++ 표준 라이브러리에서 예외가 발생하면 std::exception이라는 특별한 예외가 발생하며 <exception>헤더에 정의된다.

예제 #include <iostream> #include <exception> using namespace std; int main() { try { int* p = new int[100000]; delete p; } catch (exception& e) { cout << "표준 예외가 발생했습니다. " << e.what() << endl; return 0;

다중 catch 문장 try { cout << "피자 조각수를 입력하시오: "; cin >> pizza_slices; cout << "사람수를 입력하시오: "; cin >> persons; if (persons < 0) throw "negative"; // 예외 발생! if (persons == 0) throw persons; // 예외 발생! slices_per_person = pizza_slices / persons; cout << "한사람당 피자는 " << slices_per_person << "입니 다." << endl; } catch (const char *e) { cout << "오류: 사람수가 " << e << "입니다" << endl; catch (int e) { cout << "오류: 사람이 " << e << " 명입니다." << endl;

실행결과

구체적인 예외를 먼저 잡는다. try { getIput(); } catch(TooSmallException e) {

함수 템플릿 C++에서도 하나의 형틀을 만들어서 다양한 코드를 생산 해 내도록 할 수 있는데 이것을 템플릿이라고 한다. 함수 템플릿(function template)은 함수를 찍어내기 위한 형틀 이다.

일반화 프로그래밍(generic programming) template<typename T> T get_max(T x, T y) { if( x > y ) return x; else return y; }

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

예제 #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;

함수 템플릿과 함수 오버로딩 #include <iostream> using namespace std; template <typename T> void swap_values(T& x, T& y) { T temp; temp = x; x = y; y = temp; }

함수 템플릿과 함수 오버로딩 void swap_values(char* s1, char* s2) { int len; len = (strlen(s1) >= strlen(s2)) ? strlen(s1) : strlen(s2); char* tmp = new char[len + 1]; strcpy(tmp, s1); strcpy(s1, s2); strcpy(s2, tmp); delete[] tmp; }

함수 템플릿과 함수 오버로딩 int main() { int x = 100, y = 200; swap_values(x, y); // x, y가 모두 int 타입- OK! cout << x << " " << y << endl; char s1[100] = "This is a first string"; char s2[100] = "This is a second string"; swap_values(s1, s2); // s1, s2가 모두 배열 - 오버로딩 함수 호출 cout << s1 << " " << s2 << endl; return 0; }

두개의 타입 매개 변수를 같는 함수 템플릿 template<typename T1, typename T2> void copy(T1 a1[], T2 a2[], int n) { for (int i = 0; i < n; ++i) a1[i] = a2[i]; }

예제 #1 template<typename T> void copy_array(T a[], T b[], int n) { for (int i = 0; i < n; ++i) a[i] = b[i]; }

예제 #2 template <typename T> T get_first(T[] a) { return a[0]; }

클래스 템플릿

클래스 템플릿

예제 #include <iostream> using namespace std; template <typename T> class Box { T data; // T는 타입(type)을 나타낸다. 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; }

두개 이상의 타입 매개 변수를 가지는 경우

예제 #include <iostream> using namespace std; template <typename T1, typename T2> class Box2 { T1 first_data; // T1은 타입(type)을 나타낸다. T2 second_data; // T2는 타입(type)을 나타낸다. public: Box2() { } T1 get_first(); T2 get_second(); void set_first(T1 value) { first_data = value; } void set_second(T2 value) { second_data = value; };

예제 template <typename T1, typename T2> T1 Box2<T1, T2>::get_first() { return first_data; } 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;

Q & A