프로그래밍 언어/Java
[Java] 34. 사용자 정의 예외 만들기
WooZzing
2025. 4. 21. 16:24
사용자 정의 예외란?
자바에서 기본으로 제공하는 예외 클래스(NullPointerException, IOException 등) 외에
개발자가 직접 만드는 예외 클래스를 말합니다.
왜 사용자 예외가 필요할까요?
자바가 제공하는 예외들은 일반적인 상황에는 충분하지만,
우리 서비스만의 특수한 예외 상황에는 부족할 수 있어요.
예시 상황
- 로그인 시도 5회 초과 → LoginAttemptExceededException
- 잔액 부족 → InsufficientBalanceException
- VIP 전용 페이지 접근 → UnauthorizedVipAccessException
👉 이럴 때 의미 있는 이름을 가진 예외 클래스를 만들어 상황을 더 명확하게 표현할 수 있습니다.
사용자 정의 예외 만드는 방법
방법 | 상속 대상 | 예외 종류 |
Exception | Checked Exception 상속 | 반드시 처리해야 함 (try-catch 또는 throws) |
RuntimeException | Unchecked Exception 상속 | 선택적 처리 (컴파일 에러 없음) |
✅ 대부분은 RuntimeException을 상속해서 처리합니다
실습 1: 기본 사용자 정의 예외 만들기 (RuntimeException 상속)
예제 시나리오 : 회원 나이 제한 – 18세 미만이면 가입 금지
1. 사용자 예외 클래스 생성
// 나이 제한 예외 클래스
public class TooYoungException extends RuntimeException {
public TooYoungException(String message) {
super(message); // 예외 메시지를 부모 클래스에 전달
}
}
2. 예외 던지기 (throw)
public class MembershipService {
public void registerMember(int age) {
if (age < 18) {
throw new TooYoungException("18세 미만은 가입할 수 없습니다.");
}
System.out.println("회원가입이 완료되었습니다.");
}
}
3. 예외 사용 테스트
public class Main {
public static void main(String[] args) {
MembershipService service = new MembershipService();
try {
service.registerMember(15); // 예외 발생
} catch (TooYoungException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
- 출력 결과 -
예외 발생: 18세 미만은 가입할 수 없습니다.
예외 클래스명을 보면 어떤 문제인지 바로 알 수 있고, 메시지도 상세히 확인할 수 있습니다.
실습 2: Exception을 상속한 Checked 사용자 예외
예제 시나리오: 파일 처리 중, 내부 규칙 위반 발생 시 강제로 중단시키기
1. 예외 클래스 만들기
public class FileRuleViolationException extends Exception {
public FileRuleViolationException(String message) {
super(message);
}
}
2. 예외 던지고 처리하기 (throws + try-catch)
public class FileService {
public void validateFile(String filename) throws FileRuleViolationException {
if (!filename.endsWith(".txt")) {
throw new FileRuleViolationException("❌ .txt 파일만 허용됩니다.");
}
System.out.println("파일 유효성 통과: " + filename);
}
}
3. 예외 사용 테스트
public class Main {
public static void main(String[] args) {
FileService fileService = new FileService();
try {
fileService.validateFile("image.png");
} catch (FileRuleViolationException e) {
System.out.println("파일 오류: " + e.getMessage());
}
}
}
- 출력 결과 -
파일 오류: ❌ .txt 파일만 허용됩니다.
throws를 사용했기 때문에, 반드시 try-catch로 감싸줘야 합니다 (Checked Exception).
사용자 예외 팁
팁 | 설명 |
예외 이름은 상황을 명확히 표현 | TooYoungException, NoPermissionException 등 |
메시지를 생성자에 담아 전달 | super(message) 호출 |
Unchecked vs Checked 구분 | 일반적인 경우엔 RuntimeException 상속 |
요약 정리
구분 | 설명 |
사용자 정의 예외란? | 내가 직접 만든 예외 클래스 |
언제 사용? | 비즈니스 로직상 특수한 상황일 때 (로그인 5회 실패 등) |
만드는 방법 | extends Exception 또는 extends RuntimeException (대부분 RuntimeException 사용) |
던지는 방법 | throw new 예외클래스() |
처리 방법 | try-catch 또는 throws 선언 |
실무에서는 API 설계, 도메인 처리, 에러 응답 메시지 구성 등 다양한 곳에서
사용자 정의 예외를 거의 필수적으로 사용하고 있으니,
프로젝트를 진행하면서 꼭 익혀두시길 추천드립니다
✅ 예외를 잘 다루는 개발자 = 유지보수가 쉬운 코드를 만드는 개발자
읽어주셔서 감사합니다 😊