사용자 정의 예외
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 60번째.
Java의 내장 예외는 많은 일반적인 오류 시나리오를 다루지만, 때로는 애플리케이션의 도메인에 특화된 예외가 필요할 때가 있습니다. 사용자 정의 예외를 사용하면 무엇이 잘못되었는지 명확하게 전달하는 의미 있는 오류 유형을 만들 수 있습니다.
사용자 정의 예외를 만들려면 단순히 기존 예외 클래스를 상속하면 됩니다. 체크 예외(checked exception)의 경우, Exception을 상속하십시오:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}언체크 예외(unchecked exception)의 경우, RuntimeException을 상속하십시오:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}super(message) 호출은 에러 메시지를 부모 클래스로 전달하여 getMessage()를 통해 사용할 수 있게 합니다. 그런 다음 다른 예외와 마찬가지로 사용자 정의 예외를 발생시키고(throw) 잡을(catch) 수 있습니다:
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Balance too low: " + balance);
}
balance -= amount;
}
// 사용 예시
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}사용자 정의 예외는 코드의 가독성을 높여주며, 호출자가 특정 오류 조건을 다르게 처리할 수 있도록 해줍니다. 이는 명확한 오류 전달이 중요한 API나 라이브러리를 구축할 때 특히 유용합니다.
챌린지
쉬움다양한 오류 시나리오를 처리하기 위해 사용자 정의 예외를 사용하는 티켓 예약 시스템을 구축해 봅시다! 티켓 예약 시 무엇이 잘못되었는지 명확하게 전달하는 의미 있는 예외 유형을 만들게 됩니다.
코드는 다음 네 개의 파일로 구성됩니다:
TicketSoldOutException.java: 티켓을 더 이상 사용할 수 없을 때를 위한 사용자 정의 체크 예외(Exception상속)를 생성합니다. 이 예외는 생성자에서 메시지를 받아super(message)를 사용하여 부모 클래스에 전달해야 합니다.InvalidSeatException.java: 누군가 잘못된 좌석 번호를 예약하려고 할 때를 위한 사용자 정의 언체크 예외(RuntimeException상속)를 생성합니다. 이 예외 또한 메시지를 받아 부모에게 전달해야 합니다.TicketBooth.java: 티켓 판매를 관리하는 클래스를 생성합니다. 매표소는 총 가용 좌석 수와 유효한 최대 좌석 번호를 추적해야 합니다. 다음을 포함하세요:사용 가능한 총 좌석 수를 매개변수로 받는 생성자.
예약을 검증하는
bookTicket(int seatNumber)메서드. 남은 티켓이 없으면(가용 좌석이 0 이하),"No tickets remaining"이라는 메시지와 함께TicketSoldOutException을 던집니다. 좌석 번호가 1보다 작거나 총 좌석 수보다 크면,"Seat [seatNumber] does not exist"라는 메시지와 함께InvalidSeatException을 던집니다. 그렇지 않으면 가용 좌석을 1 감소시키고Booked seat [seatNumber] successfully를 출력합니다.현재 가용 좌석 수를 반환하는
getAvailableSeats()메서드.Main.java: 티켓 시스템을 하나로 합칩니다! 총 좌석 수와 예약할 좌석 번호라는 두 개의 입력을 받게 됩니다.주어진 총 좌석 수로
TicketBooth를 생성합니다. 그런 다음 try-catch 블록 내에서 지정된 좌석 번호의 예약을 시도합니다.TicketSoldOutException은 체크 예외이므로 반드시 처리해야 합니다. 먼저TicketSoldOutException을 캐치하여Booking failed: [exception message]를 출력합니다. 그다음InvalidSeatException을 캐치하여 동일한 형식인Booking failed: [exception message]를 출력합니다.try-catch 블록 이후에 getter 메서드를 사용하여
Remaining seats: [count]를 출력합니다.
총 좌석 수(정수)와 예약할 좌석 번호(정수) 순서대로 두 개의 입력을 받습니다.
체크 예외는 호출자가 이를 처리하도록(try-catch 또는 throws 사용) 강제하는 반면, 언체크 예외는 명시적인 처리가 필요하지 않다는 점에 유의하세요. 오류가 호출자가 예상하고 복구해야 하는 것인지에 따라 예외 유형을 선택하세요!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int totalSeats = scanner.nextInt();
int seatNumber = scanner.nextInt();
// TODO: 주어진 전체 좌석 수로 TicketBooth를 생성하세요
// TODO: try-catch 블록을 사용하여 좌석 예약을 시도하세요
// - 먼저 TicketSoldOutException을 catch하고 "Booking failed: [exception message]"를 출력하세요
// - InvalidSeatException을 catch하고 "Booking failed: [exception message]"를 출력하세요
// TODO: try-catch 이후에 "Remaining seats: [count]"를 출력하세요
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조