Java에서 예외 처리(Exception Handling)는 안정적인 프로그램 작성을 위한 중요한 요소입니다. 예외는 크게 Checked Exception과 Unchecked Exception으로 나뉩니다. 이 중 RuntimeException과 Exception은 가장 자주 등장하는 개념으로, 둘의 차이를 알아보겠습니다.
1. Exception
Exception은 java.lang.Exception 클래스에서 파생된 예외입니다. 일반적으로 Checked Exception에 해당하며, 컴파일 시점에 반드시 처리해야 합니다. 즉, 예외가 발생할 가능성이 있는 코드를 작성할 때 반드시 try-catch 블록이나 throws 키워드를 사용하여 처리해야 합니다.
특징
- Checked Exception은 컴파일러가 예외 처리 여부를 검사합니다.
- 주로 프로그램 외부의 문제(파일 입출력, 데이터베이스 연결 등)로 인해 발생합니다.
다음은 파일을 읽는 코드에서 Checked Exception인 IOException을 처리하는 예입니다:
import java.io.*;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line = reader.readLine();
System.out.println(line);
reader.close();
} catch (IOException e) {
System.out.println("파일 읽기 중 예외 발생: " + e.getMessage());
}
}
}
여기서 IOException은 Checked Exception이므로, 컴파일러는 반드시 예외 처리를 요구합니다.
2. RuntimeException
RuntimeException은 java.lang.RuntimeException 클래스에서 파생된 예외입니다. 이는 Unchecked Exception에 해당하며, 컴파일 시점에 예외 처리 여부를 검사하지 않습니다. 개발자가 원한다면 예외 처리를 생략할 수도 있습니다.
특징
- Unchecked Exception은 런타임 시점에 예외가 발생합니다.
- 주로 프로그래머의 실수(잘못된 로직, null 참조 등)로 인해 발생합니다.
다음은 ArithmeticException을 처리하는 코드입니다:
public class UncheckedExceptionExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // 0으로 나누기 시도
} catch (ArithmeticException e) {
System.out.println("수학적 오류: " + e.getMessage());
}
String text = null;
try {
System.out.println(text.length()); // null 객체 참조
} catch (NullPointerException e) {
System.out.println("Null 참조 오류: " + e.getMessage());
}
}
}
여기서 ArithmeticException과 NullPointerException은 RuntimeException의 서브클래스이며, 예외 처리를 강제하지 않습니다.
3. Exception과 RuntimeException의 주요 차이점
구분 | Exception | RuntimeException |
종류 | Checked Exception | Unchecked Exception |
처리 강제 여부 | 컴파일러가 예외 처리 요구 | 예외 처리 선택 가능 |
주요 발생 원인 | 외부적 요인(입출력, DB 등) | 내부적 요인(로직, 프로그래머 실수) |
예시 | IOException, SQLException 등 | NullPointerException, ArithmeticException 등 |
4. 언제 어떤 예외를 사용해야 할까?
- Checked Exception 사용 시점
- 외부 시스템과 상호작용할 때(파일, 네트워크, 데이터베이스 등).
- 예외를 반드시 처리하도록 강제해 안정성을 높이고 싶을 때.
- 파일이 없을 경우를 대비한 FileNotFoundException.
- 데이터베이스 연결 오류를 처리하는 SQLException.
- Unchecked Exception 사용 시점
- 프로그래머의 실수로 발생할 수 있는 예외.
- 논리적 오류나 잘못된 입력값을 처리하고 싶을 때.
- 잘못된 인덱스 접근 시 발생하는 IndexOutOfBoundsException.
- null 값을 참조하는 NullPointerException.
5. 커스텀 예외 만들기
필요에 따라 사용자 정의 예외(Custom Exception)를 만들어 사용할 수 있습니다. Checked와 Unchecked 중 하나를 선택하여 만들 수 있습니다.
Checked Exception 예제
class MyCheckedException extends Exception {
public MyCheckedException(String message) {
super(message);
}
}
public class CustomCheckedExceptionExample {
public static void main(String[] args) {
try {
throw new MyCheckedException("이것은 Checked Exception입니다.");
} catch (MyCheckedException e) {
System.out.println(e.getMessage());
}
}
}
Unchecked Exception 예제
class MyUncheckedException extends RuntimeException {
public MyUncheckedException(String message) {
super(message);
}
}
public class CustomUncheckedExceptionExample {
public static void main(String[] args) {
throw new MyUncheckedException("이것은 Unchecked Exception입니다.");
}
}
RuntimeException은 선택적 처리(Unchecked), Exception은 필수적 처리(Checked)로 프로그램 안정성을 위한 예외 처리 방식이 다릅니다.