코딩 하는 가든

Java - Runtime Exception, Checked Exception 뭐가 다를까? 본문

Java

Java - Runtime Exception, Checked Exception 뭐가 다를까?

가든리 2020. 8. 26. 22:22

얼마 전 본 면접에서 Runtime Exception과 Checked Exception에 대한 차이점에 대한 질문을 받았습니다.

 

그 당시에는 차이점을 잘 몰랐고 느낀 점으로만 Runtime Exception은 수행 중에 발생하는 예외이고 Checked Exception은 컴파일 때 잡아내는 Exception이라고 대답을 했고 잘 알아보아야겠다는 생각에 공부를 한 후 기록합니다.

 

Exception 이란(?)

Exception(예외) 이란 프로그램의 수행 도중 예상할 수 없었던 상황이 발생하여 프로그램을 더 이상 수행할 수 없는 상황이 발생하는 것입니다. (Java를 사용하는...) 개발자는 이러한 예외 상황이 발생할 수 있는 구간에 try ~ catch 구문을 사용하여 만약 예외 상황이 발생한다면 정해진 로직을 따라 수행하게 하며 프로그램이 안정적으로 수행을 이어 나갈 수 있도록 처리해 주어야 합니다. 이를 예외 처리라고 합니다.

 

Java8 Exception class

Throwable 클래스를 상속받은 Exception 클래스는 크게 Runtime Exception과 CheckedException으로 나뉩니다.

 

Runtime Exception (NullPointerException 등...)들은 Exception 클래스를 상속받은 RuntimException 클래스의 자식 클래스들입니다.

 

Java8 RuntimeException
Java8 NullPointerException

 

Checked Exception은 RuntimeException과 다르게 직접 Exception 클래스를 상속받습니다.

Java8 IOException

 

Runtim Exception과 Checked Exception은 모두 프로그램 수행 중 발생할 수 있는 예외 상황입니다. 하지만 둘 간의 차이가 있다면 Runtime Exception은 명시적으로 예외 처리를 하지 않아도 되지만 Checked Exception은 명시적으로 예외 처리를 해 주어야 합니다. 실제로 Checked Exception이 발생 할 수 있는 코드에 예외처리를 하지 않았다면 컴파일을 할 수 없습니다.

 

input을 읽어 들이는 BufferedReader의 readLine 메소드를 사용하고자 했을 때 CheckedException의 종류인 IOException이 발생할 수 있는데, IDE에서도 exception을 던져주라고 알려 주며 컴파일에도 실패한 모습입니다.

 

하지만 Runtime Exception이 발생할 수 있는 경우(예를 들어 숫자를 0으로 나누는 경우...)에는 컴파일러는 해당 예외를 미리 알 수 없고 개발자가 직접 적절한 예외처리 구문을 넣어 줘야 합니다.

 

두 Exception의 또 다른 차이는 Roll-back의 여부입니다.

  • Runtime Exception : Roll-back 을 한다.
  • Checked Exception : Roll-back 을 하지 않는다.

만약 트랜잭션(Transaction) 도중 Runtime Exception이 발생한다면 Roll-back을 시킵니다. 하지만 Checked Exception은 트랜잭션 도중 발생해도 롤백을 시켜 주지 않습니다.