Java

checked exception vs unchecked exception

제주니어 2024. 5. 26. 18:02

 

최근 사수에게 PR 리뷰를 받던 중 exception 처리에 대해서 지적을 받았다. 

 

사실 이제까지의 exception 처리는

"내가 짠 코드가 에러가 발생했을 경우"를 고려한 것이 아닌

다른 분들의 exception 처리와 동일하게 진행을 했었다.

 

그러나 

사수와의 대화를 통해 예외 처리가 얼마나 중요한지, 

그리고 이를 통해 코드의 안정성과 유지보수성이 어떻게 향상되는지 깨닫게 되었습니다. 

 

오늘은 그 경험을 바탕으로 Java에서의 checked exception과 unchecked exception에 대해 이야기해 보려고 한다.

 

예외 처리의 중요성


코드를 작성하다 보면 다양한 오류 상황에 직면하게 된다.

 

사용자가 잘못된 입력을 하거나,

파일이 존재하지 않거나,

네트워크 연결이 끊기는 등의 상황은언제든지 발생할 수 있다. 

 

이러한 예외 상황을 적절히 처리하지 않으면

프로그램이 비정상적으로 종료될 수 있고, 이는 사용자에게 불편을 초래할 뿐만 아니라

데이터 손실 등의 심각한 문제를 야기할 수 있다. 

 

 

Checked exception

 


checked exception은 컴파일 타임에 체크되는 예외로, 반드시 예외 처리를 해야 한다.

이를 처리하지 않으면 컴파일 오류가 발생한다.

대표적인 예로는 파일 입출력 시 발생하는 IOException이 있다. 

import java.io.*;

public class FileExample {
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader("example.txt");
            BufferedReader br = new BufferedReader(reader);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println("파일을 찾을 수 없습니다.");
        } catch (IOException e) {
            System.out.println("파일을 읽는 도중 오류가 발생했습니다.");
        }
    }
}

 

위 예제에서는 FileNotFoundException과 IOException을 처리하고 있다.

파일이 존재하지 않거나 읽는 도중 문제가 발생하면 예외가 발생하고,

이를 적절히 처리하여 프로그램이 비정상적으로 종료되지 않도록 합니다.

 

 

 

checked exception 에서 필수적으로 알아야 하는 것은 

1. checked exception은 컴파일 시점에 체크되므로 반드시 예외 처리를 해야 한다.
2. throws 키워드를 사용하여 메서드 시그니처에 예외를 명시할 수 있다. 
3. catch 블록을 사용하여 예외를 처리하거나 상위 메서드로 전달할 수 있다. 
public void readFile(String fileName) throws IOException {
    FileReader reader = new FileReader(fileName);
    BufferedReader br = new BufferedReader(reader);
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    br.close();
}

 

Unchecked Exception

 

 

unchecked exception은 런타임에 발생하는 예외로, 컴파일러가 예외 처리를 강제하지 않는다. 

주로 프로그래머의 실수로 발생하는 경우가 많으며, 대표적인 예로는 NullPointerException이 있다.

 

public class ArrayExample {
    public static void main(String[] args) {
        String[] array = new String[3];
        try {
            array[1] = "Hello";
            System.out.println(array[0].length()); // NullPointerException 발생 가능성
        } catch (NullPointerException e) {
            System.out.println("널 포인터 예외가 발생했습니다.");
        }
    }
}

 

위 예제에서는 배열의 첫 번째 요소가 null일 경우 NullPointerException이 발생할 수 있다.

이 경우에도 예외를 처리하여 프로그램이 예기치 않게 종료되지 않도록 해야 한다. 

 

 

unchecked exception 에서 필수적으로 알아야 하는 것은 

1. unchecked exception은 런타임 시점에 발생하며, 예외 처리를 강제하지 않는다.
2. 일반적으로 프로그래머의 실수나 논리적 오류로 인해 발생한다.
3. 코드 작성 시 예외가 발생할 가능성이 있는 부분을 잘 파악하여 예외 처리를 하는 것이 좋다.
public int divide(int a, int b) {
    if (b == 0) {
        throw new IllegalArgumentException("분모는 0이 될 수 없습니다.");
    }
    return a / b;
}