4.1) OCJP/1Z0-851 / 2012-08-28

OCJP (1Z0-851 / 2012-08-28 / Exam B) - 36 번

kkikkodev 2015. 9. 3. 23:29



관련 이론 및 문법

(Garbage Collection 참고)

http://kkikkodev.tistory.com/185


문제 의도

주어진 소스코드에서 23 라인이 실행된 직후에, snoog, snooch, booch 에 의해 참조되는 객체들에 대한 설명 중, 참인 것을 고르는 문제입니다.


답안

E


풀이 방법

소스코드를 보면, Snoochy, Boochy 클래스가 정의되어 있고, Snoochy 클래스 안에는 멤버 변수로 Boochy 형 인스턴스 변수 booch 가 있습니다. 생성자에서는, booch 에 객체를 생성하고 있습니다.


Boochy 클래스에는 Snoochy 형 인스턴스 변수 snooch 가 있고, 생성자에서는 snooch 를 초기화하고 있습니다.


main 메소드가 실행되면, 먼저 22 라인에서 Snoochy 형 인스턴스 변수 snoog 가 Snoochy 객체를 생성하여 가리키게 합니다. 이 때, Snoochy 객체에는, 내부적으로 booch 인스턴스가 Boochy 형 객체를 생성하여 가리키게 되고, 또 Boochy 객체 내에 있는 Snoochy 형 인스턴스 변수 snooch 는 이전에 생성된 Snoochy 형 객체를 가리키게 됩니다. 이는, Snoochy 의 생성자에서 new Boochy(this) 문장을 통해, 현재 객체인 Snoochy 객체를 매개변수로 넘겨서 Boochy 의 멤버변수가 가리키게 하기 때문입니다. 결과적으로, Snoochy 객체의 멤버 변수 booch 는 Boochy 형 객체를 가리키고, 그 가리키고 있는 Boochy 형 객체의 멤버 변수 snooch 는 반대로 Snoochy 객체를 가리키는 형태가 됩니다. (객체 서로간에 가리키고 있습니다.)


이 상태에서, 23 라인의 snoog = null; 문장을 통해서, snoog 인스턴스 변수가 어떠한 객체도 가리키지 못하게 하면, 원래 가리키던 객체에 접근할 수 있는 방법이 없어집니다. snoog 는 가비지 컬렉션의 대상이 됨은 물론, 가리키던 객체들의 멤버 변수인 snooch 와 booch 또한 객체는 여전히 가리키고는 있지만, 외부에서 이 멤버 변수들을 접근할 방법이 없으므로 역시 가비지 컬렉션의 대상에 들어가게 됩니다. 따라서 답안은 E 가 됩니다.