Java

사용자 정의 예외

1space 2025. 6. 21. 18:27

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

 

자바에는 기본적으로 많은 예외 클래스(NullPointerException, IOException 등)가 정의되어 있지만,
프로그래머가 자신의 상황에 맞는 특별한 예외를 직접 만들 수 있습니다.
이렇게 만든 예외 클래스를 사용자 정의 예외라고 합니다.

 

사용자 정의 예외 만드는 방법

기본적으로 다음 두 가지 중 하나를 상속받아 만듭니다:

  • Exception 클래스를 상속 → checked 예외
  • RuntimeException 클래스를 상속 → unchecked 예외

 

기본 사용자 정의 예외 클래스

class MyException extends Exception {
    MyException(String msg) {
        super(msg); // 부모(Exception)의 생성자 호출 → 메시지 저장
    }
}
  • Exception을 상속받았기 때문에 checked 예외입니다.
  • 생성자에서 메시지를 받아 부모 클래스의 생성자에게 전달합니다.
  • 이렇게 하면 getMessage()로 나중에 이 메시지를 꺼낼 수 있습니다.

 

오류 코드도 함께 저장하는 예외 클래스

class MyException extends Exception {
    private final int ERR_CODE;

    // 메시지와 에러 코드 받는 생성자
    MyException(String msg, int errCode) {
        super(msg);          // 메시지는 Exception에 저장
        ERR_CODE = errCode;  // 에러코드는 MyException에 저장
    }

    // 메시지만 받는 생성자 → 에러코드는 기본값 100
    MyException(String msg) {
        this(msg, 100);
    }

    // 에러 코드를 꺼내는 메서드
    public int getErrCode() {
        return ERR_CODE;
    }
}

📌 여기서 중요한 점

  • 생성자 오버로딩으로 메시지만 받을 수도 있고, 메시지 + 코드 둘 다 받을 수도 있게 함
  • getMessage()는 Exception 클래스에 정의되어 있고,
  • getErrCode()는 사용자가 직접 만든 메서드

이렇게 하면 catch 블록 안에서 getMessage()와 getErrCode()를 함께 사용해서
예외의 내용을 더 풍부하게 처리할 수 있습니다.

 

실전에서의 장점

try {
    // 예외 발생
    throw new MyException("파일이 없습니다.", 404);
} catch (MyException e) {
    System.out.println(e.getMessage());   // "파일이 없습니다."
    System.out.println(e.getErrCode());   // 404
}
  • 메시지와 에러코드를 나눠서 관리할 수 있기 때문에, 더 명확하고 풍부한 예외 처리가 가능해집니다.

 

기존에는 보통 Exception을 상속해서 checked 예외로 만들었는데,
요즘은 RuntimeException을 상속해서 unchecked 예외로 만드는 경우도 많아졌습니다. 이유는 다음과 같습니다:

Exception (checked) RuntimeException (unchecked)
예외 처리를 강제 예외 처리를 선택할 수 있음
try-catch 또는 throws가 필수 예외 처리 생략 가능
복잡한 코드에서는 불편 간단한 예외 처리에 적합

그래서 예외 발생이 매우 드문 경우복잡한 상황에서 예외 처리를 강제하지 않으려는 경우에는

RuntimeException을 상속해서 unchecked 예외로 만드는 것이 유리할 수도 있습니다.

 

요약

  • Exception을 상속하면 checked 예외, RuntimeException은 unchecked 예외
  • 생성자에서 메시지와 함께 필요한 데이터를 저장할 수 있음
  • 예외 클래스에 메서드 (getErrCode()) 추가 가능
  • 상황에 따라 checked와 unchecked 중 선택하여 설계

'Java' 카테고리의 다른 글

연결된 예외  (0) 2025.06.21
예외 되던지기  (0) 2025.06.21
Checked예외, Unchecked예외  (0) 2025.06.21
try-catch가 동작하는 내부 구조  (0) 2025.06.21
예외 클래스 계층구조  (0) 2025.06.21