예외 처리(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: 복사 생성자, 대입 연산자 구현