1. 예외 소개
간단한 비유로 시작해 봅시다. 여러분의 프로그램 — 이것을 도로를 달리는 자동차라고 생각해 보세요. 모든 것은 잘 돌아가지만, 어느 순간 예상치 못한 일이 벌어집니다: 타이어가 펑크 나거나, 연료가 바닥나거나, 엔진이 과열됩니다. 이 상황을 “처리”하지 않으면(예: 스페어 타이어를 끼우거나 주유하지 않으면) 자동차는 멈추고 더 이상 가지 못합니다. 프로그램도 마찬가지입니다. 예외를 처리하지 않으면 프로그램은 비정상 종료됩니다.
예외 (exception) — 프로그램 실행 중 어떤 문제가 발생했을 때 생성되는 객체입니다. 예외는 이렇게 알립니다: “정지! 뭔가 잘못됐습니다!”
예외가 발생하는 상황의 예:
- 0으로 나누기 (10 / 0)
- 존재하지 않는 배열 요소에 접근 시도 (arr[999])
- 디스크에 없는 파일 열기
- 문자열 "abc"를 숫자로 변환 (Integer.parseInt("abc"))
중요: 예외는 컴파일 오류(예: 코드 오타)가 아니라, 프로그램 실행 중에 발생하는 문제입니다.
왜 예외가 유용할까요?
- 깨끗한 코드: 프로그램의 핵심 로직이 자잘한 검증 코드로 어지럽혀지지 않습니다.
- 유연성: 오류를 중앙집중식으로 처리할 수 있습니다(예: 파일 읽기 오류를 한 곳에서 처리).
- 신뢰성: 프로그램이 알 수 없는 메시지와 함께 ‘뚝’ 꺼지는 대신, 무엇이 발생했는지 알려 줍니다.
2. 예외 (Exceptions) vs 오류 (Errors)
Java에는 프로그램 실행 중에 발생할 수 있는 문제 유형이 크게 두 가지가 있습니다:
오류 (Errors)
오류 — Java 가상 머신(JVM) 자체의 동작 장애로 인해 발생하는 치명적이고 복구 불가능한 문제입니다. 보통 컴퓨터 자원이나 JVM 내부의 장애와 관련되어 있습니다.
오류의 예:
- OutOfMemoryError — 메모리가 부족함.
- StackOverflowError — 스택 오버플로(예: 무한 재귀).
중요: 이러한 오류는 보통 프로그램에서 처리하려고 하지 않는 것이 좋습니다.
예외 (Exceptions)
예외 — 프로그램이 대응할 수 있고(또는 해야 하는) 문제입니다. 프로그램 로직의 실수나 외부 요인(예: 사용자가 예상과 다른 값을 입력) 때문에 발생합니다.
예외의 예:
- NullPointerException — null을 객체처럼 사용하려는 시도.
- ArrayIndexOutOfBoundsException — 배열 범위를 벗어남.
- IOException — 파일 작업 중 오류.
Java의 예외는 두 가지로 나뉩니다:
- Checked exceptions (체크 예외) — 컴파일러가 처리를 요구합니다(예: IOException).
- Unchecked exceptions (언체크 예외) — 컴파일러가 처리를 요구하지 않습니다(예: NullPointerException).
도식: 구조 한눈에 보기
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(기타 예외)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
설명:
- Throwable — Java의 오류와 예외 계층 구조의 루트입니다.
- Error — JVM의 치명적 오류로, 처리하지 않습니다.
- Exception — 처리할 수 있고 처리해야 하는 ‘일반적인’ 예외입니다.
- RuntimeException — 언체크 예외(프로그래머 실수).
3. 코드에서는 어떻게 보이나요?
예제 1: 0으로 나누기
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // 여기서 ArithmeticException이 발생합니다!
System.out.println("결과: " + c);
}
}
무슨 일이 일어날까요?
프로그램은 오류와 함께 종료되고, 다음과 같은 메시지가 출력됩니다:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
예제 2: 존재하지 않는 배열 요소에 접근
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
예제 3: 파일 작업
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
이제 이러한 예외 상황을 깔끔하게 처리하는 방법을 살펴보겠습니다.
GO TO FULL VERSION