글
관련 이론 및 문법
(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 가 됩니다.
'4.1) OCJP > 1Z0-851 / 2012-08-28' 카테고리의 다른 글
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 42 번 (0) | 2016.11.13 |
---|---|
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 41 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 40 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 39 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 38 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 36 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 35 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 34 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 33 번 (0) | 2016.11.13 |
OCJP (1Z0-851 / 2012-08-28 / Exam C) - 32 번 (0) | 2016.11.13 |
RECENT COMMENT