Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 메서드 오버라이딩 시 하위 클래스가 예외를 던지지 않아도 될까요?

결론부터 말하면, 네, 가능합니다. 상위 클래스의 메서드가 특정 예외를 던지도록 선언되어 있더라도, 이를 오버라이드(재정의)하는 하위 클래스의 메서드는 아무런 예외도 던지지 않도록 구현할 수 있습니다.

오버라이딩과 예외 규칙

Java에서 메서드 오버라이딩 시 예외 처리에는 다음과 같은 규칙이 적용됩니다.

  • 하위 클래스에서 던질 수 있는 확인된 예외(Checked Exception)는 상위 클래스 메서드가 선언한 예외와 같거나 그 하위 타입이어야 합니다.
  • 반대로, 상위 클래스 메서드가 예외를 던진다고 해서 하위 클래스 메서드도 반드시 예외를 던져야 하는 것은 아닙니다.
  • 즉, 하위 클래스에서는 예외를 축소(narrowing)할 수는 있어도 확대(widening)할 수는 없습니다.

예제 코드

다음 예제에서 상위 클래스의 sampleMethod() 메서드는 FileNotFoundException 예외를 던지도록 선언되어 있습니다. 반면, 이를 오버라이드한 하위 클래스의 sampleMethod() 메서드는 어떤 예외도 던지지 않습니다. 그럼에도 불구하고 이 프로그램은 컴파일 오류나 실행 오류 없이 정상적으로 동작합니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

abstract class Super {
    public void sampleMethod() throws FileNotFoundException {
        System.out.println("Method of superclass");
    }
}

public class ExceptionsExample extends Super {
    public void sampleMethod() {
        System.out.println("Method of Subclass");
    }

    public static void main(String args[]) {
        ExceptionsExample obj = new ExceptionsExample();
        obj.sampleMethod();
    }
}

실행 결과

Method of Subclass

정리

상위 클래스 메서드가 확인된 예외를 던지도록 선언되어 있어도, 하위 클래스에서 오버라이드할 때 해당 예외를 생략하는 것은 완전히 허용됩니다. 다만 주의할 점은, 다형성(polymorphism)으로 상위 클래스 타입의 참조 변수를 통해 메서드를 호출하는 경우 컴파일러는 상위 클래스에 선언된 예외를 기준으로 검사한다는 것입니다. 따라서 설계 시에는 호출 방식까지 고려하여 예외 처리 전략을 세우는 것이 좋습니다.