
자바 프로그래밍을 하다 보면 빨간색 메시지와 함께 프로그램이 멈추는 상황을 누구나 마주하게 됩니다. 이때 출력되는 메시지를 자세히 보면 어떤 것은 'Error'로 끝나고, 어떤 것은 'Exception'으로 끝나는 것을 알 수 있습니다. 언뜻 비슷해 보이지만, 이 둘을 어떻게 구분하고 대처하느냐에 따라 시스템의 안정성과 복구 능력이 결정됩니다. 오늘은 자바 예외 처리의 근간이 되는 Throwable 계층 구조를 살펴보고, 실무 개발자가 반드시 알아야 할 에러와 예외의 본질적인 차이점을 심도 있게 다뤄보겠습니다.
1. Throwable: 모든 문제의 뿌리
자바에서 발생하는 모든 비정상적인 상황은 java.lang.Throwable 클래스로부터 시작됩니다. 이 클래스는 두 개의 거대한 줄기로 나뉘는데, 그것이 바로 Error(에러)와 Exception(예외)입니다.
2. Error와 Exception의 결정적 차이
가장 큰 차이점은 "프로그램 내부에서 수습이 가능한가?"입니다. 에러는 시스템 레벨의 심각한 문제를 의미하며, 예외는 애플리케이션 로직에서 제어 가능한 문제를 의미합니다.
| 비교 항목 | Error (에러) | Exception (예외) |
|---|---|---|
| 발생 시점 | JVM 인터페이스, 하드웨어 등 시스템 레벨 | 애플리케이션 코드 및 로직 레벨 |
| 복구 가능성 | 불가능 (프로그램 강제 종료 권장) | 가능 (try-catch 등을 통한 처리) |
| 대표 사례 | OutOfMemoryError, StackOverflowError | IOException, NullPointerException |
| 대처 방법 | 인프라 확장, 코드 근본적 개선 | 예외 처리 로직(Exception Handling) 작성 |
3. 깊이 보기: Error (에러)
에러는 JVM(Java Virtual Machine) 실행에 문제가 생긴 상황입니다. 예를 들어, 힙 메모리가 가득 찬 OutOfMemoryError나 무한 재귀 호출로 스택이 넘치는 StackOverflowError가 발생하면, 개발자가 코드로 catch해서 정상 흐름으로 돌리기가 거의 불가능합니다. 에러가 발생했다는 것은 애플리케이션이 구동되는 환경 자체가 무너졌음을 뜻하므로, 즉시 프로세스를 종료하고 원인을 분석해야 합니다.
4. 깊이 보기: Exception (예외)
예외는 다시 두 가지로 분류됩니다. 이 구분은 자바의 안정성을 지탱하는 핵심 설계 철학입니다.
- Checked Exception: 컴파일 시점에 체크됩니다. 반드시
try-catch로 처리하거나throws로 던져야 하며, 외부 리소스(파일, DB, 네트워크) 연동 시 자주 발생합니다. (예:SQLException) - Unchecked Exception (RuntimeException): 실행 시점(Runtime)에 발생합니다. 주로 개발자의 실수(로직 오류)로 인해 발생하며, 컴파일러가 강제하지 않습니다. (예:
IndexOutOfBoundsException)
5. 실무에서의 올바른 자세
전문적인 개발자라면 에러를 잡으려(catch) 노력하기보다, 예외를 안전하게 처리하고 에러가 발생하지 않는 견고한 구조를 만드는 데 집중해야 합니다.
- Error는 로깅 후 종료: 에러를 무리하게 catch하여 시스템을 유지하려고 하면 데이터 오염 등 더 큰 부작용을 낳을 수 있습니다.
- 비즈니스 예외 활용: 단순히 표준 예외를 쓰는 것에 그치지 않고, 비즈니스 흐름에 맞는
Custom Exception을 정의하여 코드의 가독성을 높이십시오. - 예외 삼키지 않기:
catch블록을 비워두는 것은 미래의 나에게 독을 주는 행위입니다. 최소한 로그라도 남겨야 합니다.
6. 결론
Error와 Exception을 구분하는 것은 단순히 용어의 차이를 아는 것이 아니라, 시스템의 제어 가능 범위를 파악하는 일입니다. 시스템 레벨의 에러에는 겸허히 항복하고 환경을 개선하며, 로직 레벨의 예외에는 적극적으로 대응하여 중단 없는 서비스를 만드는 것이 자바 전문가의 길입니다.
참고 문헌 및 출처
- Oracle Java Documentation: Exceptions in Java
- Herbert Schildt, "Java: The Complete Reference", McGraw-Hill Education.
- Joshua Bloch, "Effective Java", Item 70: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors.
'Language > Java' 카테고리의 다른 글
| [JAVA] 개발자의 숙명, Checked vs Unchecked Exception 깊이 파헤치기 (0) | 2026.01.20 |
|---|---|
| [JAVA] 프로그램의 안전벨트, try-catch-finally 실행 순서 완벽 가이드 (0) | 2026.01.20 |
| [JAVA] 코드에 생명력을 불어넣는 기술, 사용자 정의 예외(Custom Exception) 설계법 (0) | 2026.01.20 |
| [JAVA] 던지느냐, 알리느냐! throw와 throws의 명확한 차이와 실무 활용법 (0) | 2026.01.20 |
| [JAVA] 코드의 격을 높이는 자원 관리의 혁신, try-with-resources 완벽 가이드 (0) | 2026.01.19 |