자바에서 Exception 클래스와 Error 클래스는 모두 java.lang.Throwable 클래스의 하위 클래스입니다. 두 클래스 모두 프로그램 실행 중 발생하는 문제를 나타내지만, 예외(Exception)는 개발자가 런타임에 직접 처리할 수 있는 반면, 에러(Error)는 애플리케이션 레벨에서 처리할 수 없다는 점이 가장 큰 차이입니다.
Exception과 Error의 핵심 차이점
- 예외(Exception)는 런타임에 발생하는 논리적 오류를 나타내는 객체로, JVM을 '모호한(ambiguity)' 상태로 만들어 정상적인 흐름을 방해합니다.
- JVM이 런타임 오류를 표현하기 위해 자동으로 생성하는 객체가 바로 예외입니다. 반면 에러(Error)는 정상적인 애플리케이션이 처리하려고 시도해서는 안 되는 심각한 문제를 의미하며, 대부분 비정상적인 상황에서 발생합니다.
- 예외가 발생하면
try-catch블록을 사용하여 적절히 처리할 수 있지만, 에러가 발생하면 이를 처리할 방법이 없으며 프로그램 실행이 곧바로 종료됩니다. - 예외는 Checked Exception(검사 예외)과 Unchecked Exception(비검사 예외) 두 가지 유형으로 나뉩니다. 반면 에러는 기본적으로 비검사(Unchecked) 범주에 속합니다.
- 클래스 계층 구조 관점에서 예외는
java.lang.Exception타입이고, 에러는java.lang.Error타입입니다.
예외(Exception)의 대표적인 예시
IOException, SQLException, NullPointerException, ArrayIndexOutOfBoundsException 등이 있으며, 이들은 적절한 코드 작성과 예외 처리 로직을 통해 복구할 수 있습니다.
에러(Error)의 대표적인 예시
OutOfMemoryError, StackOverflowError, VirtualMachineError 등이 있으며, 이는 JVM 자체의 심각한 문제나 시스템 리소스 고갈과 같은 상황을 나타냅니다. 따라서 일반적으로 catch 블록으로 잡아 처리하는 것이 아니라, 근본 원인을 제거하는 방식으로 접근해야 합니다.
정리
결론적으로, 예외는 개발자가 예측하고 처리할 수 있는 문제이며, 에러는 개발자가 처리할 수 없는 치명적인 문제입니다. 따라서 견고한 자바 애플리케이션을 작성하려면 예외를 적절히 처리하는 동시에, 에러가 발생하지 않도록 메모리 사용과 재귀 호출 깊이 등을 신중하게 관리하는 것이 중요합니다.