Java

언체크 예외는 왜 존재할까?

Adrian_Kim 2025. 7. 1. 08:28

Java로 개발을 하다보면 다음과 같은 말을 자주 듣게 된다.

체크 예외는 호출하는 쪽에서 반드시 처리하거나 throws로 다시던져야 하지만, 
언체크 예외는 굳이 처리하지 않아도 된다.

그런데 근본적으로 언체크 예외는 왜 존재할까?

 

체크 예외와 언체크 예외 

Java에서의 예외는 크게 두가지로 나뉘며 각 특징은 다음과 같다.

예외 종류 상속 구조 컴파일 타입 검사 예시
체크 예외 Exception 필수 IOException ..
언체크 예외 RuntimeException 없음 NullPointerException .. 

 

왜 RuntimeException은 체크 예외가 아닐까?

James Gosling은 예외 설계에 있어 다음과 같은 기준을 제시했다.

복구 가능한 예외만 체크 예외로 강제하고, 프로그래머의 실수로 발생하는 예외는 컴파일러가 강제하지 않는다.

 

체크 예외의 한계

체크 예외는 강력한 타입 안정성을 제공하지만, 다음과 같은 문제들이 존재합니다.

  1. 많은 예외 전파
  2. 실질적으로 복구 불가능한 예외에도 try-catch를 강제
  3. 코드 가독성 저하

많은 예외 전파 

public void readFile() throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("sample.txt"));
    String line = reader.readLine();
    reader.close();
}

public void processFile() throws IOException {
    readFile();
}

public void run() {
    try {
        processFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

하위 메서드에서 체크 예외를 던질 때, 중간 호출자들이 처리를 하지 않는다면 다시 체크 예외를 던져야 합니다.

만약 더 많은 메서드를 호출 시 많은 예외들을 계속 throws ... 해야 할 수 있습니다.

 

복구 불가능한 예외에도 try-catch 강제

public void encodeString() {
    try {
        byte[] bytes = "example".getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException("UTF-8 encoding not supported", e);
    }
}

UTF-8의 경우 사실상 모든 JVM에서 지원됨에도 불구하고 try-catch를 강제해야 합니다.

아울러 실질적으로 복구할 수 없는 예외상황임에도 불구하고 try-catch를 강제해야 합니다.

 

코드 가독성 저하 

public void loadData() {
    try {
        String content = new String(Files.readAllBytes(Paths.get("data.txt")));
        System.out.println(content);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (AccessDeniedException e) {
    	// do something ..
    }
}

 

만약 모든 예외가 체크 예외라면 다음과 같이 계속 catch를 하는 상황이 발생합니다.

물론 최상위 예외인 Exception을 받아서 처리해도 되겠지만, 보다 상세한 컨트롤을 하기 위해서는 다음과 같이 예외를 처리해야 할 것입니다.

이 때, 비즈니스 로직 외의 예외 처리 코드가 많아지면, 메서드의 핵심 동작을 이해하는데 방해가 될 수 있습니다.

 

마무리

Java에서 언체크 예외는 "예외 상황이 아닌 버그"라는 철학에 기반하여 설계되었습니다. 

체크 예외는 복구 가능한 예외만 강제해야 하며, 그렇지 않으면 코드의 복잡도와 유지보수 비용만 증가시킬 수 있습니다.

 

reference : Oracle

'Java' 카테고리의 다른 글

Heap Pollution  (3) 2025.07.15
JVM의 내부 구조와 메모리 구조에 대해  (2) 2025.07.06
Primitive Type vs Reference Type  (3) 2025.06.18
[Java] Optional  (0) 2024.01.26
[Java] Stream  (2) 2024.01.24