Menu
Coddy logo textTech

사용자 정의 예외

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 60번째.

Java에 내장된 예외는 많은 일반적인 오류 상황을 처리하지만, 때로는 애플리케이션의 도메인에 특화된 예외가 필요합니다. custom 예외를 사용하면 무엇이 잘못되었는지 명확하게 전달하는 의미 있는 오류 유형을 만들 수 있습니다.

custom 예외를 만들려면 기존 예외 클래스를 단순히 확장하면 됩니다. checked 예외의 경우 Exception을 확장합니다.

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

검사되지 않는 예외의 경우 RuntimeException을 상속하세요:

public class InvalidAgeException extends RuntimeException {
    public InvalidAgeException(String message) {
        super(message);
    }
}

super(message) 호출은 오류 message를 부모 class에 전달하여 getMessage()를 통해 available하게 만듭니다. 그런 다음 다른 것과 마찬가지로 사용자 지정 custom exception을 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

챌린지

쉬움

서로 다른 오류 상황을 처리하기 위해 custom 예외를 사용하는 티켓 예약 시스템을 만들어 봅시다! 티켓을 예약할 때 무엇이 잘못되었는지 명확하게 전달하는 의미 있는 예외 유형을 만들게 됩니다.

코드를 네 개의 파일로 구성합니다.

  • TicketSoldOutException.java: 티켓을 더 이상 이용할 수 없을 때 사용할 custom checked 예외를 만드세요(Exception을 extends). 예외의 constructor가 message를 받도록 하고, super(message)를 사용하여 부모 class에 전달하세요.
  • InvalidSeatException.java: 잘못된 좌석 번호를 예약하려고 할 때 사용할 custom unchecked 예외를 만드세요(RuntimeException을 extends). 이 예외 역시 message를 받아 부모 class에 전달해야 합니다.
  • TicketBooth.java: 티켓 판매를 manages하는 class를 만드세요. booth는 available 좌석의 전체 number와 유효한 좌석 번호 중 가장 큰 값을 추적해야 합니다. 다음을 포함하세요.

    이용 가능한 좌석의 전체 number를 받는 constructor.

    예약을 검증하는 bookTicket(int seatNumber) method. 남은 티켓이 없으면(available 좌석이 0 이하이면) TicketSoldOutException"No tickets remaining" message와 함께 throw하세요. 좌석 번호가 1보다 작거나 전체 좌석 수보다 크면 InvalidSeatException"Seat [seatNumber] does not exist" message와 함께 throw하세요. Otherwise, available 좌석을 1만큼 줄이고 Booked seat [seatNumber] successfully를 출력하세요.

    현재 available 좌석의 count를 반환하는 getAvailableSeats() method.

  • Main.java: 티켓 시스템을 하나로 구성하세요! 두 개의 입력을 받습니다. 좌석의 전체 number와 예약할 좌석 number입니다.

    given 전체 좌석 수로 TicketBooth을 Create하세요. 그런 다음 try-catch block 안에서 지정된 좌석 number를 예약하도록 attempt하세요. TicketSoldOutException은 checked이므로 반드시 처리해야 합니다. 먼저 TicketSoldOutException을 catch하고 Booking failed: [exception message]를 출력하세요. 그런 다음 InvalidSeatException을 catch하고 동일한 형식인 Booking failed: [exception message]를 출력하세요.

    try-catch block After에는 getter method를 사용하여 Remaining seats: [count]를 출력하세요.

입력은 다음 순서로 두 개가 주어집니다. 전체 좌석 수(정수), 예약할 좌석 number(정수)입니다.

checked 예외는 호출자가 이를 처리하도록 강제한다는 점(try-catch 또는 throws를 사용)을 확인하세요. 반면 unchecked 예외는 명시적인 처리가 필요하지 않습니다. 오류가 호출자가 예상하고 복구해야 하는 유형인지에 따라 예외 유형을 선택하세요!

직접 해보기

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: After the try-catch, print "Remaining seats: [count]"
    }
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 Java 컴파일러