사용자 정의 예외
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 또는 라이브러리를 구축할 때 특히 유용합니다.
챌린지
쉬움서로 다른 오류 상황을 처리하기 위해 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]"
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러