[자격증]/정보처리기사 실기

1450701 Java 메모리 영역

Ben의 프로그램 2023. 9. 28. 12:09
728x90

핵심 Keyword

1. Stack 영역

2. Heap 영역

3. 선언과 생성


Stack 영역과 Heap 영역
Stack 영역은 정적으로 부여되는 영역을 의미합니다. Heap 영역은 동적으로 할당되는 메모리 영역을 의미합니다. 
기본적으로 변수를 생성하고 초기화를 하면 Stack 영역에 전부 저장이 되게 됩니다. Heap 영역에는 모든 오브젝트 타입의 데이터들이 할당됩니다. 생성된 객체는 Heap 영역에 저장이 됩니다. 

 

문제 풀이
Connection 이라는 클래스 안의 _inst 라는 Connection 객체 변수를 선언을 하는 것을 볼 수 있습니다. 변수는 정적으로 할당이 되므로, Stack 영역에 저장이 됩니다. 

따라서 위의 그림과 같이 _inst 변수가 생성됩니다. _inst 가 객체형임에도, stack 영역에 생성된 이유는 원래 객체변수를 생성할 때는 new 라는 키워드를 사용합니다. 

이와 같이 new 키워드를 사용해야 Heap 영역에 객체가 생성이 되는데, 우리 문제에서는 객체 생성 예약어가 없습니다. 이곳에서는 객체 변수를 생성하는 것이 아니라, 객체 변수를 선언하는 것으로 이해할 수 있습니다. 그래서 메모리 영역에 _inst 라는 변수는 Heap 영역이 아니라 Stack 영역에 생성이 됩니다. 객체변수를 생성한 것이 아니라 선언만 한 것이기 때문에, 객체 변수를 생성하는 코드가 이어서 나올 것이라는 것을 예상할 수 있습니다. 

그 다음 정수형 변수 count 를 만든 다음 0을 넣어서 초기화합니다. Stack 영역에 count 변수가 위와 같이 생성됩니다.

메인 함수를 살펴볼 텐데요. Connection conn1 은 객체를 생성한 것이 아니라 선언만 한 것입니다. 따라서 Stack 영역에 생성이 됩니다. stack 영역에 생성된 conn1 변수에 Connection.get( ) 메서드의 반환 값을 가지게 됩니다. 

get( ) 메서드를 살펴보겠습니다. get( ) 메서드를 살펴보면 드디어 new 예약어를 사용하여 선언하는 것이 아닌 실제로 생성을 하는 것을 볼 수 있는데요. 이렇게 되면 Heap 영역에 Connection 객체가 생성되게 됩니다.

이것을 그림으로 표현하면 예를 들어 위와 같은데요. _inst 변수는 이제 null 값이 아니라 new 키워드에 의해서 생성된 Connection 객체가 담겨있는 주소 값을 가지게 됩니다. 예를 들자면 위에서 보는 것처럼 100 이라는 주소 값을 _inst 변수가 갖게 되는 것이죠. 그리고 이렇게 생성된 _inst 의 값을 conn1 이 가지게 됩니다. 마찬가지로 conn1 도 100이라는 heap 영역 주소 값을 가지게 되는 것이죠. 그러면 conn1.count 를 하게 되면 100 이라는 주소에서 count 함수가 실행됩니다. conn2 와 conn3 도 마찬가지로 100이라는 Heap 메모리 주소를 가리키게 되므로 count 를 총 3 번을 100 이라는 heap 메모리 주소에서 실행하게 되어 정답은 3이 됩니다.