관련 이론 및 문법

(Garbage Collection 참고)

http://kkikkodev.tistory.com/185


문제 의도

주어진 코드의 11 라인에 도달했을 때, 가비지 컬렉션의 대상이 되는 객체들의 수를 고르는 문제입니다.


답안

A


풀이 방법

주어진 소스코드를 한줄한줄 살펴보도록 하겠습니다. 먼저 자바의 메모리 구조가 메소드, 힙, 스택 영역으로 구성됩니다. 메소드는 자바 바이트 코드가 올라가는 영역, 힙은 객체가 생성되는 영역, 스택은 메소드 공간이 올라가는 영역입니다.



먼저 7 번 라인의 main 메소드가 호출되면 스택에 main sub 영역이 할당됩니다. 그 후에 매개변수와 지역변수들이 그 main sub 영역에 할당되게 되는데, 여기서 String[] args 매개변수는 사용하지 않으므로 생략하도록 하겠습니다. 8 번 라인의 Tahiti t = new Tahiti(); 문장을 실행하면 main sub 영역에 t 라는 인스턴스 변수로 heap 에 생성한 Tahiti 객체를 가리키게 됩니다.



9 번 라인의 t.go(t); 문장을 실행하면 go sub 영역이 stack 에 생기게 되고 그 안에는 this 라는 인스턴스 변수가 자동 생성되어 t 를 가리키게 되고, 매개변수 t 인스턴스 변수가 heap 에 있는 main 에서 생성된 객체를 함께 가리키게 됩니다.



15 번 라인의 Tahiti t1 = new Tahiti(); 문장을 실행하면 go sub 영역에 t1 이라는 인스턴스 변수로 heap 에 새로 생성한 Tahiti 객체를 가리키게 됩니다.



16 라인의 Tahiti t2 = new Tahiti(); 문장을 실행하면, go sub 영역에 t2 라는 인스턴스 변수로 heap 에 새로 생성한 Tahiti 객체를 가리키게 됩니다.



17 라인의 t1.t = t2; 문자을 실행하면 t1 이 가리키는 객체 안에 있는 t 인스턴스 변수가 t2 가 가리키고 있는 객체를 가리키게 됩니다.



18 라인의 t2.t = t1; 문장을 실행하면, t2 가 가리키는 객체의 안에 있는 t 인스턴스 변수가 t1 이 가리키고 있는 객체를 가리키게 됩니다.



19 라인의 t.t = t2; 문장을 실행하면, go sub 영역의 t 가 가리키는 객체 안에 있는 t 인스턴스 변수가 t2 가 가리키는 객체를 가리키게 됩니다.



20 라인의 return t1; 문장을 실행하면 go sub 영역이 해제되고, t1 인스턴스 변수를 반환합니다. 반환받은 t1 은 9 번 라인의 Tahiti t2 = t.go(t); 문장을 통해서 main sub 영역의 t2 인스턴스 변수에 대입됩니다. 그래서 t2 는 기존의 go sub 영역에서 t1 이 가리키던 객체를 가리키게 됩니다.



10 번 라인의 t2 = null; 문장을 실행하면, main sub 영역의 t2 인스턴스 변수에 null 이 들어가게 됩니다.



최종적으로 heap 상태를 보면 3 개의 객체 모두가 인스턴스 변수에 의해서 참조되고 있음을 확인할 수 있습니다. 따라서 가비지 컬렉션의 대상이 되는 객체는 0 개입니다.


결과적으로 답안은 A 가 됩니다.


by kkikkodev 2016. 11. 13. 01:19