728x90

 

프로젝트를 진행하면서 커스텀 예외(Custom Exception)를 적용하게 되었습니다. 그런데 보통 커스텀 예외를 정의할 때 Exception 대신 RuntimeException상속받는다는 얘기를 들었습니다.

 

이 글에서는 Exception과 RuntimeException의 차이를 살펴보고, 커스텀 예외를 정의할 때 왜 Exception 대신 RuntimeException을 상속받는 것이 일반적인지에 대해 알아보겠습니다.

 

Checked Exception & Unchecked Exception 

https://www.nextree.co.kr/p3239/

 

Exception과 RuntimeException을 알아보기에 앞서 먼저 알아야할 개념이 있습니다.

 

바로 "Checked Exception & Unchecked Exception"인데요, 위 표를 보면 알 수 있듯이 

Checked Exception

체크드 예외컴파일 타임에 발생할 수 있는 예외로, 프로그램에서 이 예외가 발생할 가능성이 있는 경우 반드시 처리해야 합니다.

즉, 메서드에서 발생할 수 있는 체크드 예외를 처리하지 않으면 컴파일 오류가 발생합니다.

 

Checked Exception은 다음과 같은 특징이 있습니다.

 

처리 필수

  • 메서드에 throws 키워드를 사용하거나, try-catch 블록으로 예외를 처리해야 합니다.
  • 예시
    • IOException: 파일 입출력 시 발생할 수 있는 예외
    • SQLException: 데이터베이스 접근 시 발생할 수 있는 예외

Unchecked Exception

언체크 예외는 런타임 시에 발생할 수 있는 예외로, 컴파일 타임에는 검사가 이루어지지 않습니다. 개발자가 이 예외를 처리할 필요가 없으며, 필요에 따라 선택적으로 처리할 수 있습니다.

 

Unchecked Exception은 다음과 같은 특징이 있습니다.

 

처리 선택적

  • 호출자가 이 예외를 처리하지 않아 컴파일 오류가 발생하지 않습니다.
  • 예시
    • NullPointerException: null 객체에 접근할 때 발생하는 예외
    • ArrayIndexOutOfBoundsException: 배열의 잘못된 인덱스에 접근할 때 발생하는 예외

Exception이란❓

 

Exception 클래스는 Java의 모든 체크드 예외의 부모 클래스입니다. 체크드 예외컴파일 타임에 발생할 수 있는 예외로, 개발자는 이 예외를 반드시 처리해야 합니다.

 

  • Checked Exception이기 때문에 컴파일러가 예외 처리강제
  • 메서드 선언부에 throws 키워드로 예외를 명시하거나, try-catch 블록으로 처리해야 함
  • 주로 외부 요인으로 인한 예외 상황에 사용
  • 예: IOException, SQLException

Exception 사용 예시

 

try {
    FileInputStream file = new FileInputStream("test.txt");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

 

 

RuntimeException이란❓

RuntimeException 클래스는 Exception의 하위 클래스이며, 주로 런타임 시에 발생할 수 있는 예외를 나타냅니다. 이 예외는 체크드 예외와는 달리, 컴파일 타임에 반드시 처리할 필요가 없습니다.

 

  • Unchecked Exception이기 때문에 컴파일러가 예외 처리를 강제하지 않음
  • 주로 프로그래밍 오류로 인한 예외 상황에 사용
  • 예: NullPointerException, ArrayIndexOutOfBoundsException

 

RuntimeException 사용 예시

public void divideNumbers(int a, int b) {
    System.out.println(a / b);  // ArithmeticException 가능성
}

 

 

Exception과 RuntimeException 차이점

특징 Exception RuntimeException
종류 Checked Exception Unchecked Exception
처리 요구 여부 필수 처리(try-catch or Throws) 선택적 처리(필요 시 처리)
발생 시점 컴파일 타임 런타임
예시 IOException, SQLException NullPointerException, ArrayIndexOutOfBoundsException

 

 

RuntimeException를 상속 받는 이유 ✅

그렇다면 왜 Custom Exception에서는 왜 Excpetion이 아니라 RuntimeException을 상속받을까요❓

public class CustomRuntimeException extends RuntimeException {
    public CustomRuntimeException(String message) {
        super(message);
    }

    public CustomRuntimeException(String message, Throwable cause) {
        super(message, cause);
    }
}

// 사용 예시
public void someMethod() {
    throw new CustomRuntimeException("Something went wrong!");
}

1. Checked Exception을 피할 수 있음

  • 커스텀 예외를 정의할 때 RuntimeException을 상속받으면 언체크 예외가 됩니다. 이는 호출자가 예외를 처리하도록 강제받지 않기 때문에 코드가 더 간결해질 수 있습니다.

2. 사용자 편의성

  • 개발자가 특정한 상황에서 발생하는 예외를 명확하게 정의할 수 있어, 코드의 가독성을 높이고 예외 처리 로직을 간단하게 유지할 수 있습니다. 불필요한 예외 처리피할 수 있는 장점이 있습니다.

3. 비즈니스 로직과의 일관성

  • 대부분의 비즈니스 로직에서 발생하는 예외는 런타임 예외로 간주되므로, 커스텀 예외도 이를 따르는 것이 자연스럽습니다.