Java에서 예외는 크게 두 가지 종류로 나뉩니다. CheckedException과 UncheckedException. 이 두 예외는 예외 발생 시 처리해야 할 방식에 따라 구분됩니다.
CheckedException은 컴파일 시점에 예외 처리를 강제하는 예외입니다. 즉, 이러한 예외가 발생할 가능성이 있는 메소드를 호출할 때는 반드시 예외 처리를 해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
특징:
예시:
public void readFile(String fileName) {
    try {
        FileReader file = new FileReader(fileName);  // FileNotFoundException이 발생할 수 있음
        BufferedReader fileInput = new BufferedReader(file);
        
        // 파일에서 데이터 읽기
        fileInput.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();  // 예외 처리
    } catch (IOException e) {
        e.printStackTrace();  // 예외 처리
    }
}
위의 예제에서 FileNotFoundException과 IOException은 CheckedException입니다. 파일 작업 중 발생할 수 있는 오류이므로, 반드시 예외 처리를 해야 합니다.
UncheckedException은 컴파일러가 예외 처리를 강제하지 않는 예외입니다. 즉, 이러한 예외는 컴파일 시점에서 체크되지 않으며, 런타임 시점에서 발생합니다. 예외 처리(try-catch)가 선택 사항이며, 예외가 발생하더라도 해당 예외를 처리하지 않아도 컴파일 오류가 발생하지 않습니다.
특징:
예시:
public void divide(int a, int b) {
    int result = a / b;  // b가 0일 경우 ArithmeticException 발생
}
public void accessArray(int[] arr, int index) {
    int value = arr[index];  // index가 배열의 크기를 벗어나면 ArrayIndexOutOfBoundsException 발생
}
위의 예제에서 ArithmeticException과 ArrayIndexOutOfBoundsException은 UncheckedException입니다. 런타임에 발생할 수 있으며, 예외를 처리하지 않아도 컴파일 오류는 발생하지 않습니다.
| 비교 항목 | CheckedException | UncheckedException (RuntimeException) | 
|---|---|---|
| 처리 시점 | 컴파일 시점에 처리 강제 | 런타임 시점에 발생하며 처리 선택적 | 
| 예외 처리 강제 여부 | 반드시 try-catch나 throws로 처리해야 함 | 예외 처리 선택적, 처리하지 않아도 컴파일됨 | 
| 상속 | Exception 클래스에서 파생 | RuntimeException 클래스에서 파생 | 
| 주로 발생하는 상황 | 외부 환경에 의한 오류 (파일, 네트워크, DB 등) | 개발자의 실수나 논리적 오류 (잘못된 연산 등) | 
| 예시 | IOException, SQLException | NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException |