🚩 1. 들어가며...
얼마전 면접 질문 중, "객체가 생성될 때의 과정을 스택과 힙 '자료구조'와 연관 지어 설명하라"는 질문이 받았다. 혼란스러웠다. 스택 메모리의 내부 동작 방식은 스택 자료구조와 같은 후입선출 구조이기에 연관이 있지만, 힙 메모리는 힙 자료구조와의 동작 방식과 관련이 없다고 알고 있었기에 '어떻게 힙 자료구조와 연관지어 설명하라는 거지..?'라는 생각을 했고 결국 힙 자료구조에 대해서는 모르겠고, 스택 메모리와 스택 자료구조에 대해서만 대답하였다. 뭔가 답답한 구석이 있어 이번 포스팅은 그것에 대한 진실에 대해 포스팅한다.
🚩 2. 각 영역의 역할과 저장되는 데이터

먼저 자바는 프로그램 실행에 필요한 데이터를 메소드 영역, 스택 영역, 힙 영역에 나누어 저장한다.
📌 2-1. 메소드 영역(Method Area)
- 메소드 영역은 클래스 수준의 정보를 저장하는 영역이다.
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
- 저장되는 데이터
- 클래스와 인터페이스에 대한 메타 데이터
- 정적(static) 변수: 클래스 변수라고도 하며, 클래스에 속한 변수이다.
- 상수 풀(Constant Pool): 문자열 리터럴과 기타 상숫값들
- 메소드 데이터: 클래스 내의 메소드에 대한 정보(코드 포함)
📌 2-2. 스택 영역(Stack Area)
- 스택 영역은 스레드별로 생성되며, 스레드의 메소드 호출과 지역 변수들을 관리한다.
- LIFO(Last In, First Out) 구조를 가진다.
- 저장되는 데이터
- 지역 변수: 메소드 내에서 선언된 모든 변수
- 메소드 호출에 대한 정보: 메소드가 호출될 때 생성되는 스택 프레임들. 메소드의 매개 변수, 지역 변수, 부분 결과 및 메소드 의 리턴 값 등을 포함한다.
📌 2-3. 힙 영역(Heap Area)
- 힙 영역은 객체와 배열과 같은 런타임 데이터를 저장하는 곳이다.
- 가비지 컬렉터(Garbage Collector)가 관리하는 영역으로 힙 영역에서 더 이상 어디에서도 참조되지 않는 객체들을 찾아 삭제한다.
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
- 저장되는 데이터
- 인스턴스 변수: 객체에 속한 변수들
- 객체: 'new' 연산자를 통해 생성된 모든 객체와 배열
🚩 3. 스택(Stack) 메모리, 자료구조 & 힙(Heap) 메모리, 자료구조의 연관성
이 포스팅의 요지 부분이다. 스택 메모리와 스택 자료구조, 힙 메모리와 힙 자료구조는 서로 같은 이름을 쓰는데 정말 연관이 있을까?
결론만 말하자면 스택은 맞고 힙은 아니다.
📌 3-1. 스택 메모리와 스택 자료구조

- 스택 메모리는 스택 자료구조의 원리를 따른다. 스택 자료구조는 'Last In, First Out' (LIFO) 원칙에 따라 동작하는데, 이건 후입선출 구조로서 가장 나중에 들어온 데이터가 가장 먼저 나가는 구조를 의미한다.
- 자바에서 스택 메모리는 이러한 LIFO 원칙을 따라 메소드 호출과 지역 변수를 관리한다. 메소드 호출 시 스택 프레임이 스택에 쌓이고, 메소드가 종료되면 해당 스택 프레임이 제거된다.
📌 3-2. 힙 메모리와 힙 자료구조


- 힙 메모리는 힙 자료구조와는 다른 개념이다. 힙 메모리는 동적으로 할당되는 자유로운 메모리 영역으로, 주로 객체와 배열과 같은 인스턴스 데이터를 저장하는 데 사용된다.
- 반면, 힙 자료구조는 데이터를 특정한 순서(예: 최댓값 또는 최값이 위에 오도록)에 따라 정렬하는 트리 기반 자료구조이다.
- 이는 우선순위 큐(Queue)와 같은 자료 구조를 구현하기 위해 힙이 사용된다.
➡️즉 스택 메모리는 스택 자료구조의 후입선출 동작 과정을 따르기 때문에 서로 연관을 가지지만, 힙 메모리와 힙 자료구조는 이름만 같을 뿐 아무런 연관성이 없다.
Why are two different concepts both called "heap"?
Why are the runtime heap used for dynamic memory allocation in C-style languages and the data structure both called "the heap"? Is there some relation?
stackoverflow.com
이미 이름에 대한 미스터리는 몇 번 언급된 적이 있는 것으로 보인다. 이 글을 살펴보면 둘은 아무런 연관이 없고 처음에는 힙 메모리가 아닌 메모리 풀(Pool)이라는 이름으로 사용되었다고 한다. 나 또한 지금의 힙 메모리의 의미를 보면 수직적 구조를 연상시키는 '힙'보다는 풀이라는 이름이 더 잘 어울리는 것 같다.
🚩 4. 마치며...
함정 질문일까? 생각했는데 직접 힙 메모리는 힙 자료구조로 이루어져 있다고 설명하시던 것과 여러 뉘앙스를 보아 그건 아니었던 것 같다. 사실 이 내용에 대한 국내 포스팅이 별로 없기도 하고, 심지어 하루 방문자 몇백 명인 블로그는 힙 메모리가 힙 자료구조로 이루어져 있다고 설명한다. 이는 틀린 내용이다. 이번 기회에 자바에서 영역마다 어떤 데이터가 저장되는지, 스택과 힙 자료구조에 대해 더 알아볼 수 있어서 결과적으론 좋은 경험이 되었다. 하지만 다음에도 이런 난감한 상황이 오면 어떻게 해야 할까?🤨