71. 필요 없는 검사 예외 사용은 피하라

  1. 검사 예외(Checked Exception)

    • 컴파일러가 확인하는 예외

  2. 비검사 예외(Unchecked Exception)

    • 컴파일러가 확인하지 않는 예외

검사 예외는 프로그램이 실행되기 전에 컴파일러가 확인하는 예외

이런 예외가 발생할 수 있는 코드를 작성할 때는 반드시 예외 처리를 해야 하고, 그렇지 않으면 프로그램이 컴파일되지 않는다

검사 예외의 문제점

검사 예외는 안전한 프로그램을 만드는 데 도움이 될 수 있지만, 과도하게 사용하면 문제가 생긴다

1. 코드가 복잡해진다

// 검사 예외를 사용하는 코드
try {
    readFile("데이터.txt");
    processData();
    saveResults();
} catch (IOException e) {
    // 예외 처리 코드
    System.out.println("파일 처리 중 오류 발생: " + e.getMessage());
}

여러 개의 검사 예외를 처리해야 한다면 코드는 더 복잡해진다

2. Java 8 이후의 스트림과 함께 사용하기 어렵다

검사 예외를 피하는 방법

방법 1: Optional 사용하기

검사 예외 대신 Optional을 반환하면 예외 처리 없이 코드를 작성할 수 있다

Optional을 사용하면 다음과 같이 바꿀 수 있다

방법 2: 메서드 분할하기

검사 예외를 던지는 메서드를 두 개로 나누는 방법도 있다

  1. 첫 번째 메서드: 작업이 가능한지 boolean으로 확인

  2. 두 번째 메서드: 실제 작업 수행

메서드를 분할하면 다음과 같이 바꿀 수 있다

검사 예외와 비검사 예외 비교

검사 예외 (Checked)
비검사 예외 (Unchecked)

컴파일러가 확인함

컴파일러가 확인하지 않음

반드시 처리해야 함

처리는 선택사항

API 호출자에게 부담

더 유연한 코드 작성 가능

예: IOException

예: NullPointerException

스트림에서 사용 어려움

스트림에서 사용 가능

어떤 예외를 사용해야 할까?

  1. 호출자가 예외 상황에서 복구할 수 있을까?

    • YES: 옵셔널을 고려해볼 수 있다

    • NO: 비검사 예외(RuntimeException)를 사용한다

  2. 옵셔널로 충분한 정보를 제공할 수 있을까?

    • YES: 옵셔널을 사용한다

    • NO: 검사 예외를 고려한다

예시로 배우는 예외 선택

은행 송금 시스템 예시


🧩 어려웠던 점

처음에는 검사 예외와 비검사 예외의 차이점과 각각의 장단점을 이해하는 데 어려움이 있었다

메서드를 분할하는 방식이 항상 더 좋은 대안인지도 의문이었다

💡 느낀 점

예외 처리는 단순히 오류를 잡아내는 것이 아니라 API 설계의 중요한 부분임을 깨달았다

호출자가 실제로 복구할 수 있는 상황인지, 그리고 그 복구에 필요한 정보를 충분히 제공하고 있는지를 고민하는 것이 좋은 API 설계의 핵심임을 배웠다

Last updated