개발자는 기록이 답이다

🐙 Checked Exception과 Unchecked Exception의 차이 본문

언어/Java

🐙 Checked Exception과 Unchecked Exception의 차이

slow-walker 2023. 12. 22. 14:46

 

Checked Exception과 Unchecked Exception의 차이

 

 

1. Checked Exception(예외)

  • Checked Exception은 컴파일러가 강제로 예외 처리를 요구하는 예외다.
  • RuntimeException 클래스를 상속하지 않은 예외들이 Checked Exception에 해당한다. (사진 상 오른쪽)
  • 주로 외부 리소스와의 상호 작용이나 I/O 작업과 관련된 예외 등이 여기에 속한다.
  • Checked Exception이 발생할 수 있는 메서드에서는 반드시 예외 처리를 해야 한다. (try-catch 블록 또는 메서드 선언에 throws를 사용하여 예외 전파)

 

2. Unchecked Exception(= RuntimeException)

  • Unchecked Exception은 컴파일러가 예외 처리를 강제하지 않는 예외다.
  • RuntimeException 클래스를 상속한 예외들이 Unchecked Exception에 해당한다. (사진 상 왼쪽)
  • 주로 프로그래머의 실수에 기인한 예외 또는 런타임에 발생하는 예외 등이 여기에 속한다.
  • Unchecked Exception이 발생할 수 있는 메서드에서는 예외 처리를 하지 않아도 된다.
    (하지만 예외가 발생하면 프로그램이 비정상적으로 종료될 수 있음)
특성 Checked Exception UnChecked Exception
(= RuntimeException)
처리 여부 반드시 예외 처리 필요
(try-catch 블록 또는 throws 선언) 
예외 처리가 선택 사항
컴파일러 강제 여부 아니오
발생 원인 주로 외부 리소스와의 상호작용,
I/O 작업과 관련된 예외 등
주로 프로그래머의 실수,
런타임 시 발생 가능한 예외 등
클래스 계층 구조 Exception 클래스의 하위 클래스
(RuntimeException  제외)
RuntimeException 클래스의 하위 클래스
예시 IOException, SQLException 등 NullPointException,
ArrayIndexOutOfBoundsException 등

 

 

Checked Exception 예시

 

  • IOException : 파일 입출력 작업에서 발생하는 예외로, 파일이 존재하지 않거나, 읽거나 쓰기 권한이 없는 경우에 발생
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            FileReader file = new FileReader("file.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  • SQLException : 데이터베이스와 관련된 작업에서 발생하는 예외로, SQL 문을 실행하는 동안 오류가 발생한 경우에 발생
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");
            // ...
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

UnChecked Exception 예시

  • ArithmeticException: 산술 연산 중에 발생하는 예외로, 0으로 나누거나 모듈로 연산에서 0으로 나머지를 구하는 경우에 발생
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int result = 10 / 0;
        System.out.println(result); // 이 부분은 실행되지 않음
    }
}

 

  • NullPointerException: null에 대한 메서드 호출이나 필드 접근 시에 발생하는 예
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length()); // 이 부분에서 NullPointerException 발생
    }
}

 

  • ArrayIndexOutOfBoundsException: 배열의 범위를 벗어난 인덱스로 접근 시에 발생
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] arr = new int[5];
        System.out.println(arr[10]); // 이 부분에서 ArrayIndexOutOfBoundsException 발생
    }
}

 

  • NumberFormatException: 문자열을 숫자로 변환할 때, 유효하지 않은 형식의 문자열이 입력되는 경우에 발생
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String str = "abc";
        int num = Integer.parseInt(str); // 이 부분에서 NumberFormatException 발생
    }
}

 


 

 

🤔 느낀점

 

예외 종류별로 코드상에 다 명시해주는게 좋을까?

여러 다양한 예외가 발생하는 로직이 있다고 가정했을 경우, Exception만으로 catch부분에서 잡아주면 간결하게 예외처리를 할 수 있지 않을까?

 

물론 구체적으로 예외처리를 해준다면, 코드별로 독립적으로 세밀한 제어가 가능하고, 디버깅 및 유지보수가 쉽다고 하는데

모든 예외에 대한 처리 코드를 작성하면 코드양도 증가하고, 새로운 예외가 발생할때마다 코드를 업데이트해야 할텐데 번거롭지 않을까?

 

디버깅이나 특정 예외에 대한 세부적인 조치가 필요한 경우가 많을테니 구체적으로하는게 더 좋은것 같다는 생각이 있는데,

실제로 실무에서는 어떻게 하는지 궁금하다.

 

예외를 기록하고 모니터링하는 로깅 시스템에서는 모두 세밀하게 처리할까? 아니면 중요하지 않은 부분은 공통으로 처리할까?