(Java) Unchecked Exception과 Checked Exception

Wonjun Lee·2024년 3월 22일
0

예외(Exception)
사용자의 조작 코드 상의 로직으로 인해 발생하는 프로그램의 오류

에러(Error)
자바 프로그램이 아닌 환경(JVM, IO장치, Main memory etc)에 의해 발생하는 오류로 개발자가 처리할 수 없는 경우

상속 계층도를 보면 Throwable 클래스를 상속하는 Error와 Exception으로 구분된다. 초록색 상자는 Unchecked Exception이며, 빨간색 상자는 Checked Exception이다.

Unchecked Exception과 Checked Exception의 차이는 컴파일 시간에 컴파일러가 예외의 발생을 확인하는가 하지않는가에 있다.

풀어쓰자면, 컴파일러가 컴파일 하는 과정에서 어떤 프로그램 코드가 예외를 발생시킬 가능성이 있는지 확인하는 것이 Checked Exception이고, 하지 않는 것이 Unchecked Exception 이라는 것이다.

이런 이유로 Checked Exception은 예외처리 구문(try-chatch-finally 혹은 throws)이 강제적으로 요구되는 특징이 있다. 보통 Checked Exception의 경우 프로그램의 제어를 벗어난 오류를 나타낼 때 사용된다.

반면 Unchecked Exception은 검사되지 않기 때문에 프로그래머에게 자율적으로 처리를 맡긴다. 보통 프로그램 로직에 의한 오류를 처리할 경우 사용한다.

예외를 정의하는 방법

보통 예외를 정의할 경우 Exception 클래스 혹은 Runtime Exception 클래스를 상속한다.

오라클 자바 문서에 의하면
"클라이언트가 발생한 예외 상황에 대해서 어떤 조치를 수행할 수 있다면 Unchecked Exception, 예외 상황에서 조치되어야 한다면 Checked Exception을 사용하라." 라는 가이드라인을 제공한다.

예를들어, 어떤 파일을 여는 동작을 수행할 때,

File file = new File("not_existing_file.txt");
FileInputStream fis = new FileInputStream(file);

위 코드는 FileNotFoundException을 발생시킨다. 따라서 이 예외에 대한 예외처리 구문을 추가해야 한다.

자바에선 예외를 발생시킬 때, throw 키워드를 이용한다.


이렇게 Checked Exception을 던지는 경우 throw new 예외(message);를 입력하면 throws 키워드를 항상 입력해야한다.

그리고 이 메소드를 호출하는 상위 메소드는 다음과 같이 예외처리가 강제된다.

던지는 예외를 Exception이 아니라 RuntimeException으로 변경해보자.



이렇듯 별다른 예외처리를 하지 않아도 문제가 발생하지 않는다.

추가) 예외 정의시 주의할 점

항상 생성자에서 super() 를 이용해 부모 클래스 생성자를 호출해야 한다.

0개의 댓글