Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

README.md

CPP Module 05

예외 처리(Exception Handling)와 중첩 클래스(Nested Class)를 학습하는 모듈입니다. 관료제 시뮬레이션을 통해 예외 상황을 처리하는 방법을 배웁니다.

주요 학습 포인트:

  • 예외 처리 (try, catch, throw)
  • 사용자 정의 예외 클래스
  • 중첩 클래스 (Nested Class)
  • 예외 안전성 (Exception Safety)
  • RAII (Resource Acquisition Is Initialization)

구성

ex00: Mommy, when I grow up, I want to be a bureaucrat!

  • Bureaucrat 클래스 구현
  • 속성: name (const), grade (1-150)
  • 등급 범위 검증 및 예외 처리
  • 중첩 예외 클래스: GradeTooHighException, GradeTooLowException
  • 멤버 함수: incrementGrade, decrementGrade

ex01: Form up, maggots!

  • Form 클래스 (후에 AForm으로 변경)
  • 속성: name (const), signed (bool), gradeToSign, gradeToExecute
  • beSigned() 함수로 서명 처리
  • Bureaucrat의 signForm() 함수
  • 예외: GradeTooHighException, GradeTooLowException

ex02: No, you need form 28B, not 28C...

  • AForm 추상 클래스
  • 구체 클래스: ShrubberyCreationForm, RobotomyRequestForm, PresidentialPardonForm
  • execute() 순수 가상 함수
  • 각 폼의 고유 실행 로직
  • 실행 조건 검증

ex03: At least this beats coffee-making

  • Intern 클래스
  • makeForm() 함수로 동적 폼 생성
  • 폼 이름으로 적절한 폼 객체 생성
  • 팩토리 패턴 (Factory Pattern) 활용

핵심 개념

예외 처리 (Exception Handling)

  • try-catch 블록으로 예외 상황을 처리
  • throw로 예외를 발생시키고, catch에서 포착하여 처리
  • std::exception을 상속받아 사용자 정의 예외 클래스 생성

중첩 클래스 (Nested Class)

  • 클래스 내부에 정의된 클래스
  • 외부 클래스와 밀접한 관련이 있을 때 사용
  • GradeTooHighException, GradeTooLowException 등을 Bureaucrat 클래스 내부에 정의

추상 클래스와 순수 가상 함수

  • 순수 가상 함수 (= 0)를 포함한 클래스는 인스턴스화 불가
  • 파생 클래스에서 반드시 구현해야 함
  • AForm 클래스가 추상 클래스, execute()가 순수 가상 함수

폼 클래스 구조

  • ShrubberyCreationForm: ASCII 트리를 파일에 작성 (sign 145, exec 137)
  • RobotomyRequestForm: 50% 확률로 로봇화 시도 (sign 72, exec 45)
  • PresidentialPardonForm: 대통령 사면 메시지 출력 (sign 25, exec 5)

팩토리 패턴

  • Intern 클래스가 폼 이름을 받아 적절한 폼 객체를 동적으로 생성
  • 객체 생성 로직을 캡슐화하여 코드 유연성 향상
  • 함수 포인터 배열을 사용하여 폼 생성 함수 매핑

예외 안전성

  • Basic guarantee: 예외 발생 시 유효한 상태 유지
  • Strong guarantee: 예외 발생 시 상태 변경 없음
  • No-throw guarantee: 예외를 던지지 않음

컴파일

c++ -Wall -Wextra -Werror -std=c++98 *.cpp -o bureaucrat

각 exercise에서:

make

주의사항

  • 예외 클래스 상속: std::exception 상속
  • what() 함수: const throw() 지정자 사용 (C++98)
  • const 정확성: const 멤버 변수는 초기화 리스트에서 초기화
  • 메모리 관리: 동적 할당된 폼 객체 해제
  • 등급 검증: 생성자와 멤버 함수에서 항상 범위 확인
  • Orthodox Canonical Form: 복사 생성자, 대입 연산자 구현