Java Adv 03 - Thread 3

채크 예외 재정의

  • Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptionException 체크 예외를 밖으로 던질 수 없는 이유를 알아보자
package thread.control;

public class CheckedExceptionMain {
    public static void main(String[] args) throws Exception {
        throw new Exception();
    }

    static class CheckedRunnable implements Runnable {

        @Override
        public void run() {
            throw new Exception();
        }
    }
}

  • 자바에서 메서드를 재정의 할 때, 재정의 메서드가 지켜야할 예와와 관련 규칙이 있다.

체크예외

  • 부모 메서드가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크예외를 던질 수 없다.
  • 자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.

언체크 예외

  • 예외 처리를 강제하지 않으므로 상관없이 던질 수 있다.

자바는 왜 이런 제약을 두는 걸까?

  • 부모 클래스의 메서드를 호출하는 클라이언트 코드는 부모 메서드가 던지는 특정 예외만을 처리하도록 작성한다. 자식 클래스가 더 넓은 예외의 범위를 던지면 해당 코드는 모든 예외를 제대로 처리하지 못할 수 있다.
  • 예외 처리의 일관성을 해치고, 예상하지 못한 런타임 오류가 발생할 수 있다.
  • ex) 예를 들어서 만약 부모가 InteruptException을 던지면 자식은 Exception을 던질 수 없다. 왜냐?
    • InteruptException은 Exception의 자식이기 때문이다. 예외도 부모와 자식관의 범주를 정해놓고 그 해당 범위 내에서만 예외가 적용됨을 알 수 있다.

예시코드

public class Test{
	public static void main(String[] args){
		Parent p = new Child(); //인스턴스는 자식이지만 참조는 Parent이다.
		try {
			p.method();
			} catch(InterruptedException e) {
			}
		}
	}
  • 자식 클래스의 재정의된 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.
  • 원래 메서드가 체크 예외를 던지지 않는 경우, 재정의된 메서드도 체크 예외를 던질 수 없다.

안전한 예외처리

  • 체크 예외를 run() 메서드에서 던질 수 없도록 강제함으로써, 개발자는 반드시 체크 예외를 try-catch 블록 내에서 처리하게 된다.
  • 프로그램이 비정상으로 종료되는 상황을 방지할 수 있다.
  • 멀티스레딩 환경에서는 예외 처리를 강제함으로써 스레드의 안정성과 일관성을 유지할 수 있다.
  • 최근에는 체크예외 보다는 언체크(런타임) 예외를 선호한다.

Reference

인프런 김영한님의 자바강좌 + 나의 뇌



© 2022. by taewoo

Powered by taewoo