자바(Java)에서 예외(Exception)는 프로그램 실행 중 발생하는 비정상적인 상황을 의미하며, 이를 어떻게 다루느냐에 따라 프로그램의 안정성이 크게 달라집니다. 자바의 예외는 크게 체크 예외(Checked Exception)와 언체크 예외(Unchecked Exception) 두 가지로 나눌 수 있습니다. 이번 글에서는 두 예외의 차이점을 자세히 살펴보겠습니다.
체크 예외(Checked Exception)란?
컴파일 시점에 확인됩니다. 컴파일러가 해당 예외의 처리 여부를 반드시 검사합니다.
예외 처리가 강제됩니다. try-catch 블록으로 직접 처리하거나, 메서드 선언부에
throws키워드를 사용해 상위 호출자에게 위임해야 합니다.Exception 클래스의 하위 클래스 중 RuntimeException을 상속하지 않는 예외들이 여기에 해당합니다.
JVM은 체크 예외가 반드시 catch되어 적절히 처리되기를 요구합니다.
대표적인 예:
FileNotFoundException,IOException,SQLException등
언체크 예외(Unchecked Exception)란?
런타임 시점에 발생합니다. 프로그램이 실제로 실행되는 도중에 나타나는 예외입니다.
컴파일러가 검사하지 않습니다. 따라서 컴파일 단계에서 예외 처리 여부를 확인하지 않으며, 컴파일 시점에 catch하거나 처리할 수 없습니다.
주로 프로그래밍 실수로 인해 발생합니다. 예를 들어 null 객체 참조, 배열 범위 초과 등이 대표적입니다.
RuntimeException 클래스의 하위 클래스에 속하며, 컴파일러가 예외 처리를 강제하지 않습니다.
JVM 역시 해당 예외의 catch 및 처리를 필수로 요구하지 않습니다.
대표적인 예:
NoSuchElementException,NullPointerException,ArrayIndexOutOfBoundsException,ArithmeticException등
체크 예외 vs 언체크 예외 비교 정리
| 구분 | 체크 예외 | 언체크 예외 |
|---|---|---|
| 발생 및 확인 시점 | 컴파일 시점에 확인 | 런타임 시점에 발생 |
| 컴파일러 검사 | 검사함 | 검사하지 않음 |
| 예외 처리 강제 여부 | 강제 (try-catch 또는 throws 필수) | 강제하지 않음 |
| 상속 관계 | Exception 하위 (RuntimeException 제외) | RuntimeException 하위 |
| 대표 예시 | FileNotFoundException, IOException | NoSuchElementException, NullPointerException |
정리하면, 체크 예외는 컴파일러가 미리 확인하고 처리를 강제하는 예외이며, 언체크 예외는 주로 개발자의 코드 실수로 인해 런타임에 발생하는 예외입니다. 두 예외의 특성을 정확히 이해하고 상황에 맞게 처리하면, 더욱 견고하고 안정적인 자바 애플리케이션을 개발할 수 있습니다.