Presentation is loading. Please wait.

Presentation is loading. Please wait.

C++ Espresso 제11장 예외 처리와 형변환.

Similar presentations


Presentation on theme: "C++ Espresso 제11장 예외 처리와 형변환."— Presentation transcript:

1 C++ Espresso 제11장 예외 처리와 형변환

2 예외는 오류가 발생하더라도 오류를 우아하게 처리하게 합니다.
이번 장에서 학습할 내용 예외는 오류가 발생하더라도 오류를 우아하게 처리하게 합니다. 예외 처리의 개념 예외 처리기 구조 예외 전달 다중 catch 문장 자신의 예외 클래스 작성

3 예외란? 예외(exception): 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의하여 발생하는 오류
(예) 0으로 나누는 것과 같은 잘못된 연산이나 배열의 인덱스가 한계를 넘을 수도 있고, 디스크에서는 하드웨어 에러가 발생할 수 있다.

4 예외는 처리하는 것이 좋다.

5 피자 나누기 프로그램

6 피자 나누기 프로그램 #include <iostream> using namespace std; 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; } 피자 조각수를 입력하시오: 12 사람수를 입력하시오: 4 한사람당 피자는 3입니다. 계속하려면 아무 키나 누르십시오 . . .

7 전통적인 오류 처리 방식 If-else을 사용하여 조건을 검사 정상적인 코드와 오류 처리 처리 분리가 어려움
if (pizza_slices < 0) { cout << "피자조각이 음수임"; } else if (pizza_slices == 0) { cout << "피자조각이 0임"; } else { if (persons == 0) { cout << "사람이 0명입니다. "<< endl; } else if (persons < 0) { cout << "사람이 음수입니다. " << endl; slices_per_person = pizza_slices / persons; cout << "한사람당 피자는" << slices_per_person << "입니다." << endl; }

8 중간 점검 문제 1. 예외는 어떤 경우에 발생하는가? 2. 예외를 처리하는 경우와 처리하는 않은 경우를 비교하여 보라. 장점은 무엇인가?.

9 예외 처리기

10 피자 나누기 프로그램 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;

11 실행 결과 피자 조각수를 입력하시오: 12 사람수를 입력하시오: 4 한사람당 피자는 3입니다.
계속하려면 아무 키나 누르십시오 . . . 피자 조각수를 입력하시오: 12 사람수를 입력하시오: 0 사람이 0 명 입니다. 계속하려면 아무 키나 누르십시오 . . .

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

13 catch 블록의 매개 변수

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

15 실행 결과

16 모든 타입의 예외를 잡고 싶으면 catch(...) { // 모든 예외를 잡아서 처리할 수 있다. }

17 중간 점검 문제 1. try 블록에서 예외가 발생한 지점 이후의 문장들은 실행되는가?
2. catch 블록에서 모든 예외를 다 잡으려면 매개 변수를 어떻게 정의하는가?

18 예외 전달

19 예외 전달

20 예외 전달

21 실행 결과

22 예외를 처리하고 다시 보내고자 할때

23 함수 헤더에 예외 명시 int dividePizza(int s, int p) throw () // 예외를 던지지 않는다.
int dividePizza(int s, int p) throw (int) // int 타입의 예외를 던진다. int dividePizza(int s, int p) throw (int, double)

24 중간 점검 문제 1. 예외를 처리했지만 호출한 함수에게도 예외를 보내줄 수 있는가?
1. 예외를 처리했지만 호출한 함수에게도 예외를 보내줄 수 있는가? 2. 예외는 3개의 함수를 거쳐서도 전달될 수 있는가?

25 다중 catch 문장 하나의 try 블록에서는 여러 개의 throw 문장을 가질 수 있다.

26 다중 catch 문장

27 실행 결과

28 구체적인 예외를 먼저 잡는다.

29 반대로 하면

30 중간 점검 문제 1. 발생된 예외와 catch 블록의 매개 변수는 어떤 규칙에 의하여 매칭되는가?

31 자신의 예외 클래스 작성 throw 문장은 클래스 타입의 객체도 던질 수 있다. 예외 클래스도 단지 하나의 클래스에 불과
(예) throw NoPersonException(persons); 예외를 위한 클래스의 객체

32 예제

33 예제

34 실행 결과

35 상속 관계에 있는 예외 클래스

36 상속 관계에 있는 예외 클래스

37 중간 점검 문제 1. catch 블록의 매개 변수를 레퍼런스로 정의하게 되면 어떤 경우에 유용한가?
2. 클래스 A의 객체를 매개 변수로 받는 catch 블록을 정의하여 보라.

38 형변환

39 C언어의 형변환의 문제점 너무 관대함!

40 C++의 형변환 연산자

41 static_cast 컴파일 시간에 논리적으로 타당한 변환만을 수행한다

42 예제

43 예제

44 dynamic_cast 기본적으로 상향 형변환(upcast)은 허용하지만 하향 형변환(downcast)은 허용하지 않는다.

45 예제

46 dynamic_cast dynamic_cast 연산자는 실행 시간에 포인터가 가리키는 객체의 타입을 보고 판단하여서 변환이 올바르면 변환된 타입이 반환된다. 그렇지 않으면 NULL이 반환된다. 이 기능을 사용하려면 부모 클래스가 가상 함수를 사용하고 있어야 한다.

47 예제

48 const_cast const_cast는 타입에서 const 속성을 제거하거나 추가한다

49 reinterpret_cast 어떤 포인터 타입이라도 다른 포인터 타입으로 변환

50 타입 정보 typeid 연산자는 실행 시간에 객체의 타입을 식별할 수 있다.
typeid가 반환하는 값은 type_info에 대한 참조자이다.

51 예제

52 Q & A


Download ppt "C++ Espresso 제11장 예외 처리와 형변환."

Similar presentations


Ads by Google