관련 이론 및 문법

(static 참고)

http://kkikkodev.tistory.com/124


(final 참고)

http://kkikkodev.tistory.com/374


(인스턴스 변수로 접근할 수 있는 멤버의 범위 참고)

http://kkikkodev.tistory.com/357


문제 의도

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


답안

D


풀이 방법

코드를 살펴보면, Base, Sub 클래스로 구성되어 있는 것을 볼 수 있습니다. Base 클래스에는, public static final String 형 상수 FOO 가 있고, (값은 "foo") Sub 클래스는 Base 클래스를 상속하고 있고, public static final String 형 상수 FOO 가 있습니다. (값은 "bar")


Base 클래스의 main 메소드가 실행되면, 먼저, Base 형 객체를 만들어, b 변수가 가리키게 하고, Sub 형 객체를 만들어, s 변수가 가리키게 합니다. Base.FOO 를 출력하면, Base 클래스의 static 상수인 FOO 가 출력되므로, "foo" 가 출력됩니다. 두 번째로, Sub.FOO 를 출력하면, Sub 클래스의 static 상수인 FOO 가 출력되므로, "bar" 가 출력됩니다. static 상수의 접근은, 접근시에 사용하는 클래스명에 의존적이기 때문입니다. 세 번째로, b.FOO 를 출력하면, b 는 Base 형 인스턴스 변수이므로, Base 클래스의 static 상수인 FOO 가 출력되므로 "foo" 가 출력됩니다. (static 상수의 접근을 클래스명이 아닌, 인스턴스명으로도 할 수는 있지만, 권장되는 방법은 아닙니다.) 네 번째로, s.FOO 를 출력하면, s 는 Sub 형 인스턴스 변수이므로, Sub 클래스의 static 상수인 FOO 가 출력되므로 "bar" 가 출력됩니다. 마지막으로, ((Base)s).FOO 를 출력하면, 원래 s 는 Sub 형 인스턴스 변수이었지만, Base 형으로 강제 형변환하면, Sub 형이 Base 형으로 일시적으로 변하게 됩니다. 그 후에, FOO 상수를 접근하면, Base 클래스의 FOO 가 출력되게 되어 "foo" 가 출력되게 됩니다.


결과적으로 "foobarfoobarfoo" 가 출력되므로, 답안은 D 가 됩니다.


by kkikkodev 2016. 11. 20. 17:11