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

Slides:



Advertisements
Similar presentations
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
Advertisements

10. 예외 처리.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제1장 기초 사항.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
제14장 동적 메모리.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Excel 일차 강사 : 박영민.
[INA470] Java Programming Youn-Hee Han
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Lesson 9. 예외처리.
제 3장. C보다 나은 C++ II.
명품 C++ 7장 프렌드와 연산자 중복.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Power Java 제4장 자바 프로그래밍 기초.
C++ Espresso 제12장 템플릿.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
25강 예외처리 - 예외란? - 예외처리의 필요성 - 예외처리 문법 (try ~ catch) - 예외처리 문법 (throws)
10장. 예외처리.
11장. 1차원 배열.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
27장. 모듈화 프로그래밍.
명품 C++ 9장 가상 함수와 추상 클래스.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
C++ Espresso 제8장 객체 지향 소개.
19. 함수 포인터와 void 포인터.
제 1장. C++ 시작하기.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
01_ C++ 스타일의 입출력 02_ C 스타일의 입출력
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
12. 상속 : 고급.
Chapter 16. C++ 형 변환 연산자와 맺는 글
제 6 장 함수(functions).
Chapter 15. 예외처리(Exception Handling)
Chapter 2 C++ 함수와 네임스페이스. 최호성.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Java의 정석 제 8 장 예외처리 (Exception handling) Java 정석 남궁성 강의
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
Pointers summary.
7 생성자 함수.
6 객체.
Presentation transcript:

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

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

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

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

피자 나누기 프로그램

피자 나누기 프로그램 #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입니다. 계속하려면 아무 키나 누르십시오 . . .

전통적인 오류 처리 방식 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; }

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

예외 처리기

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

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

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

catch 블록의 매개 변수

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

실행 결과

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

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

예외 전달

예외 전달

예외 전달

실행 결과

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

함수 헤더에 예외 명시 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)

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

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

다중 catch 문장

실행 결과

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

반대로 하면

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

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

예제

예제

실행 결과

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

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

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

형변환

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

C++의 형변환 연산자

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

예제

예제

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

예제

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

예제

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

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

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

예제

Q & A