프로그래밍 언어/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 설계, 도메인 처리, 에러 응답 메시지 구성 등 다양한 곳에서
사용자 정의 예외를 거의 필수적으로 사용하고 있으니,
프로젝트를 진행하면서 꼭 익혀두시길 추천드립니다

 

예외를 잘 다루는 개발자 = 유지보수가 쉬운 코드를 만드는 개발자

 

 

 

 

읽어주셔서 감사합니다 😊

 


소스 코드 바로가기