8.1 예외 처리 소개 (Exception Handling Overview)
안내: 이 가이드는 Java 21 버전을 기준으로 작성되었습니다. 최신 규격은 공식 Java Documentation을 참고하세요.
프로그램을 만들다 보면 필연적으로 다양한 오류를 만나게 됩니다. 사용자가 숫자를 입력해야 하는 곳에 문자를 입력하거나, 읽어야 할 파일이 삭제되어 없거나, 네트워크 연결이 끊어지는 등 다양한 예외 상황이 발생할 수 있습니다.
자바에서 예외 처리(Exception Handling) 란, 이처럼 프로그램 실행 중 발생할 수 있는 예기치 못한 에러 상황에 대비한 코드를 미리 작성하여, 프로그램의 비정상적인 죵료를 막고 정상적인 실행 상태를 유지 하도록 하는 필수적인 작업입니다.
1. 에러 (Error) vs 예외 (Exception)
자바에서는 프로그램 실행 시 발생할 수 있는 문제를 크게 두 가지로 분류합니다.
- 에러 (Error)
- 메모리 부족(OutOfMemoryError)이나 스택 오버플로우(StackOverflowError)처럼 시스템 자체가 마비될 정도로 심각하고 복구할 수 없는 수준의 오류입니다.
- 발생하면 프로그램의 비정상 종료를 막을 방법이 없으므로, 개발자가 코드 레벨에서 수습할 수 있는 영역이 아닙니다.
- 예외 (Exception)
- 사용자의 잘못된 조작이나 개발자의 코딩 실수로 인해 발생하는 다소 가벼운 형태의 오류입니다.
- 예외 처리 구문(
try-catch)을 통해 코드 레벨에서 충분히 수습 및 복구 가 가능합니다.
우리가 공부하고 코드로 방어해야 하는 부분은 바로 이 예외(Exception) 입니다.
2. 예외 클래스의 계층 구조
자바에서는 모든 예외와 에러도 객체로 취급되며, 최상위 조상인 java.lang.Object 클래스를 상속받습니다. 예외 클래스들의 족보를 보면 크게 두 부류로 나뉩니다.
Exception및 그 자손 클래스들:(주로 외부 환경에 의한 예외)- 사용자의 실수 등 외부적인 요인에 의해 발생하는 예외입니다.
- 파일 이름이 잘못되었거나(
FileNotFoundException), 입력한 데이터의 형식이 잘못된 경우(DataFormatException) 등입니다. - 이클립스나 인텔리제이 같은 컴파일러가 "예외 처리를 하지 않으면 컴파일을 안 해줌!"이라며 강력히 통제하는 Checked Exception 입니다.
RuntimeException및 그 자손 클래스들:(프로그래머 실수에 의한 예외)- 주로 프로그래머의 계산 실수나 로직 오류로 인해 발생합니다.
- 배열의 범위를 벗어나거나(
ArrayIndexOutOfBoundsException),null인 참조 변수의 멤버를 호출하려 할 때(NullPointerException) 발생합니다. - 컴파일러가 예외 처리를 강제하지 않는 Unchecked Exception 입니다.
3. 예외 처리가 중요한 이유
- 언제 터질지 모르는 치명적인 버그로부터 프로그램이 죽지 않도록 방탄(Bullet-proof) 코드를 만듭니다.
- 에러가 발생했을 때 사용자에게 무서운 에러 추적 메시지(Stack Trace)를 보여주는 대신, "지금은 서버 점검 중입니다"처럼 부드럽고 친절한 안내 메시지를 출력할 수 있습니다.
- 문제 발생 시 관련 로그(Log)를 안전하게 기록하여 개발자가 추후 버그를 쉽게 픽스하도록 돕습니다.
다음 장에서는 자바에서 예외를 통제하는 가장 기본이자 핵심적인 무기인 try-catch 블록에 대해 자세히 알아보겠습니다!