관련 이론 및 문법

(throws 가 적용된 메소드 overriding 참고)

http://kkikkodev.tistory.com/294


문제 의도

주어진 코드를 컴파일한 후 실행한 결과를 고르는 문제입니다.


답안

D


풀이 방법

주어진 소스코드를 살펴보면 A, SubB2, Tester 총 3 개의 클래스를 확인할 수 있습니다. 먼저 A 클래스는 foo 메소드를 가지고 있고 이는 Exception 객체를 생성하여 throw 하고 있고 이를 throws 하여 발생된 exception 을 회피하고 있습니다. SubB2 클래스는 A 클래스를 상속하며 foo 메소드를 overriding 하고 있습니다.


Tester 클래스의 main 메소드가 실행되면, SubB2 객체를 생성하여 A 형 인스턴스 변수로 가리키게 합니다. 그리고 a.foo(); 문장을 통해 A 클래스의 foo 메소드를 호출합니다. 이 경우에, 최종적으로는 SubB2 클래스에 overriding 되어 있는 foo 메소드가 호출될 것이지만, 이 사실은 컴파일 타임에는 모르고 런타임이 되어야 알 수 있으므로, 컴파일 타임에는 단순히 A 클래스의 foo 메소드가 호출되는 것으로만 알고 있게 됩니다. 따라서 발생되는 Exception 을 main 메소드에서 처리해 주어야 합니다. 이는 a 인스턴스 변수가 A 클래스형이기 때문에 발생된 문제이고, 만약 A 형 인스턴스 변수를 생략하고 new SubB2().foo(); 문장을 사용하여 foo 메소드를 호출하면 SubB2 클래스의 foo 메소드를 호출하는 것이 컴파일 타임에 명확히 정해지므로 Exception 처리를 할필요가 없어집니다.


결과적으로 14 라인에서 발생되는 Exception 처리를 하지 않았으므로 컴파일 오류가 발생하게 되고 답안은 D 가 됩니다.


by kkikkodev 2016. 11. 13. 01:16