사용자 정의 예외
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 사용) 강제하는 반면, 언체크 예외는 명시적인 처리가 필요하지 않다는 점에 유의하세요. 호출자가 예상하고 복구해야 하는 오류인지 여부에 따라 예외 유형을 선택하세요!
치트 시트
사용자 정의 예외(custom exception)를 만들려면 기존 예외 클래스를 상속(extend)하십시오.
일반 예외(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;
}
// Using it
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}일반 예외(Checked exceptions)는 호출자가 try-catch 또는 throws를 사용하여 강제로 처리하도록 합니다. 실행 예외(Unchecked exceptions)는 명시적인 처리가 필요하지 않습니다. 호출자가 예상하고 복구해야 하는 에러인지 여부에 따라 선택하십시오.
직접 해보기
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 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조