[Java] 예외 처리 개념 정리 #2: 체크 예외, 언체크 예외

Yujeong·2024년 7월 21일
0

Java

목록 보기
22/22
post-thumbnail

체크 예외와 언체크 예외에 대해서 살펴보자.

체크 예외

Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다. 단, RuntimeException은 그렇지 않다.
체크 예외는 잡아서 처리하거나, 밖으로 던지도록 선언해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.

사용해보기

  • 예외 클래스 생성
public class CheckedException extends Exception {
	public CheckedException(String message) {
    	super(message);
    }
}

Exception을 상속받아서 CheckedException은 체크예외가 된다.
super(message)로 전달한 메시지는 Throwable에 있는 detailMessage에 보관 되고, getMessage()로 조회할 수 있다.

  • 예외 발생: Client class
public class Client {
	public void call() throws CheckedException {
    	throw new CheckedException("exception");
    }
}

throw: 예외 발생 시키기 (폭탄 터뜨리기)
throws: 예외 던지기 (폭탄 던지기)

  • 예외 처리 및 던지기: Service class
public class Service {
	Client client = new Client();
    
    public void callCatch() {
    	try {
        	client.call();
        } catch (CheckedException e) {
        	System.out.println("Exception Handling, message=" + e.getMessage());
        }
        System.out.println("Normal Flow");
    }
    
    public void callThrow() throws CheckedException {
    	client.call();
    }
}
  • 예외를 잡아서 처리하기: Main class
public class ExceptionMain1 {
	
    public static void main(String[] args) {
    	Service service = new Service();
        service.callCatch();
        System.out.println("Normal Termination");
    }
}
Exception Handling, message=exception
Normal Flow
Normal Termination
  • 예외를 던지기: Main class
public class ExceptionMain2 {
	
    public static void main(String[] args) throws CheckedException {
    	Service service = new Service();
        service.callThrow();
        System.out.println("Normal Termination");
    }
}
Exception in thread "main" exception.basic.checked.CheckedException: ex
     at exception.basic.checked.Client.call(Client.java:5)
     at exception.basic.checked.Service.callThrow(Service.java:28)
     at exception.basic.checked.ExceptionMain2.main(ExceptionMain2.java:7)

장단점

장점
개발자가 실수로 예외를 노락하지 않도록 컴파일러를 통해 문제를 잡아준다.
이로써 개발자는 어떤 체크 예외가 발생하는지 쉽게 파악할 수 있다.

단점
개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에 번거롭다.

언체크 예외

RuntimeException과 그 하위 예외는 언체크 예외로 분류된다.
언체크 예외는 컴파일러가 예외를 체크하지 않으며, throws를 선언하지 않아도 자동으로 예외를 던진다.
체크 예외는 throws를 항상 선언해야 한다!!

사용해보기

  • 예외 클래스 생성
public class UnCheckedException extends RuntimeException {
	public UnCheckedException(String message) {
    	super(message);
    }
}
  • 예외 발생: Client class
public class Client {
	public void call() {
    	throw new UnCheckedException("exception");
    }
}
  • 예외 처리 및 던지기: Service class
public class Service {
	Client client = new Client();
    
    public void callCatch() {
    	try {
        	client.call();
        } catch (UnCheckedException) {
        	System.out.println("Exception Handling, message=" + e.getMessage());
        }
        System.out.println("Normal Flow");
    }
    
    public void callThrow() {
    	client.call();
    }
}

결과는 체크 예외와 동일하다.

장단점

장점
신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다.
throw생략할 수 있다.

단점
개발자가 실수로 예외를 누락할 수 있다.

이펙티브 자바의 저자 조슈아 블로크(Josh Bloch)는 "현대 애플리케이션 개발에서는 체크 예외를 거의 사용하지 않는다."라고 말했다.


참고
김영한의 실전 자바 - 중급 1편
Class Exception
Class RuntimeException

profile
공부 기록

0개의 댓글

관련 채용 정보