Menu
Coddy logo textTech

사용자 정의 예외

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나 라이브러리를 구축할 때 특히 유용합니다.

challenge icon

챌린지

쉬움

다양한 오류 시나리오를 처리하기 위해 사용자 정의 예외를 사용하는 티켓 예약 시스템을 구축해 봅시다! 티켓 예약 시 무엇이 잘못되었는지 명확하게 전달하는 의미 있는 예외 유형을 만들게 됩니다.

코드는 다음 네 개의 파일로 구성됩니다:

  • 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]"를 출력하세요
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨