관련 이론 및 문법

(Java 메모리 구조 참고)

http://kkikkodev.tistory.com/400


문제 의도

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


답안

B


풀이 방법

총 class 는 Foo, Gamma 2 개입니다. 먼저 Foo 클래스부터 살펴보면, 멤버변수로 int 형 x 를 가지고 있고, 멤버 변수 x 를 초기화하는 매개변수 생성자가 있습니다. 그리고, 멤버변수가 private 이기 때문에, 외부에서 접근하기 위한 getter / setter 메소드들인, setX, getX 메소드가 있습니다.


Gamma 클래스에는 fooBar 라는 static 메소드가 있고, main 이라는 static 메소드가 존재합니다. 먼저 main 메소드를 실행합니다. 첫 번째 문장인 Foo foo = new Foo(300); 을 실행하면 다음과 같이 메모리 구조로 변화합니다.



Java 의 메모리는 크게 메소드, 힙, 스택의 3 영역으로 구성되는데, 일단 이 문제에서는, 메소드 영역에 대한 그림은 생략하겠습니다. main 메소드가 호출되면 스택에 main 메소드 영역이 생기게 되고, new Foo(300); 생성자 메소드 호출을 통해서 힙에 Foo 형 인스턴스가 생기게 됩니다. 그리고 이를 foo 라는 인스턴스 변수가 가리키게 됩니다. 그리고, foo.getX() 를 화면에 출력하면, 300 이 출력됩니다.



Foo fooFoo = fooBar(foo); 문장을 보면, 먼저, fooBar(foo); 를 실행하면, fooBar 라는 영역이 스택에 생기게 되고, 매개변수로 foo 를 넘겨서 같이 가리키게 됩니다. 



fooBar 메소드에서는 foo = new Foo(100); 문장을 통해서, 힙에 또다른 Foo 형 객체를 생성하고 이를 fooBar 영역안에 있는 foo 변수가 가리키게 합니다. 그리고 foo 변수를 반환하면서 fooBar 메소드를 종료합니다. 종료하면서 fooBar 영역도 사라집니다.



Foo fooFoo = fooBar(foo); 문장을 마저 실행하면, fooBar 메소드가 종료되어 반환된 것을 main 메소드의 fooFoo 변수가 가리키게 됩니다. 이 상태에서, foo.getX() 와 fooFoo.getX() 를 출력하면, 300 과 100 이 출력됩니다.



그 다음, foo = fooBar(fooFoo); 문장에서 fooBar(fooFoo); 부터 실행하면, 다시 fooBar 영역이 생기고, 매개변수로 fooFoo 가 넘어가게 되어, 이를 foo 변수가 같이 가리킵니다.



fooBar 메소드에서 foo = new Foo(100); 문장을 실행하면 힙에 또다른 Foo 형 객체를 생성하고 이를 fooBar 영역의 foo 가 가리키게 합니다. 그리고 foo 변수를 반환하면서 fooBar 메소드를 종료합니다. 종료하면서 fooBar 영역도 사라집니다.



foo = fooBar(fooFoo); 문장을 마저 실행하면, fooBar 메소드가 종료되어 반환된 것을 main 메소드의 foo 변수가 가리키게 됩니다. 이 상태에서, foo.getX() 와 fooFoo.getX() 를 출력하면, 100 과 100 이 출력됩니다.


멤버변수 x 의 값이 300 인 Foo 형 객체는 가비지 컬렉션 대상이 됩니다. 최종적으로 300-300-100-100-100 이 출력되고, 답안은 B 가 됩니다.


by kkikkodev 2016. 11. 13. 10:41