[Java] 힙(Heap)과 스택(Stack), 이것도 모르고 객체 생성 하셨나요? (JVM 메모리 구조)

이세준·2025년 11월 23일

실전 압축 CS

목록 보기
2/12
post-thumbnail

"코드 한 줄 짤 때마다 메모리 지도가 그려지시나요?"

우리가 자바에서 무심코 작성하는

int a = 10;
User user = new User();

겉보기엔 비슷해 보이지만, 컴퓨터 내부에서는 완전히 다른 세상에서 살고 있는 녀석들입니다.

이 둘이 메모리의 '어디'에 저장되는지 모르면, 나중에 이런 에러를 만났을 때 멍하니 모니터만 바라보게 됩니다.

  • StackOverflowError (재귀함수 돌리다 터짐)
  • OutOfMemoryError (서버가 뻗어버림)
  • NullPointerException (가장 흔한 그 녀석)

오늘은 백엔드 개발자가 꼭 알아야 할 JVM의 3대장, Method, Stack, Heap 영역을 아주 쉽게 털어보겠습니다.


1. JVM 메모리 3분할 요약 (The Big Picture)

JVM(자바 가상 머신)의 메모리 구조는 복잡하지만, 실무에서는 딱 3가지만 기억하면 됩니다.

  1. Method Area (메서드 영역): 붕어빵 틀 (설계도)

    • 클래스(class) 정보, static 변수가 저장되는 곳. 프로그램 시작부터 끝까지 살아있습니다.
  2. Stack Area (스택 영역): 잠깐 쓰는 작업실

    • 메서드가 호출될 때마다 생기는 임시 공간. 변수들이 잠깐 머물다 사라집니다.
  3. Heap Area (힙 영역): 거대한 창고

    • new 키워드로 생성된 객체(Object)들이 사는 곳. 우리가 관리해야 할 핵심 구역입니다.

2. Stack vs Heap: 여기가 핵심입니다

면접관이 "스택과 힙의 차이가 뭐죠?"라고 묻는다면, 아래 내용을 머릿속에 그리고 대답하면 됩니다.

📍 Stack (스택)

  • 특징: LIFO(Last In First Out) 구조입니다. 메서드가 호출되면 프레임이 쌓이고, 끝나면 바로 사라집니다.

  • 누가 사나요?
    - 기본형 변수(Primitive Type): int, double, boolean 등 실제 값(10, 3.14, true)이 여기에 바로 저장됩니다.
    - 참조형 변수(Reference Type)의 '주소값': 객체를 가리키는 리모컨만 저장됩니다.

📍 Heap (힙)

  • 특징: 자유롭게 데이터를 저장하는 거대한 공간입니다. Garbage Collector(GC) 라는 청소부가 주기적으로 안 쓰는 데이터를 지워줍니다.

  • 누가 사나요?
    - 참조형(Reference Type) 데이터: new 명령어로 만든 모든 객체, 배열(Array), String 등이 여기에 저장됩니다.


3. 코드로 보는 메모리 이동

백문이 불여일견, 코드를 보면서 메모리에 어떻게 쌓이는지 추적해 봅시다.

public class Main {
    public static void main(String[] args) {
        int age = 25;                 // 1. Stack에 저장
        String name = "BugStar";      // 2. Stack엔 주소, Heap엔 "BugStar" 객체
        User user = new User();       // 3. Stack엔 user(리모컨), Heap엔 User 객체
    }
}

이 코드가 실행될 때 일어나는 일:

  1. int age = 25;

    • Stack에 age라는 상자가 생기고, 그 안에 25라는 값이 직접 들어갑니다.
  2. User user = new User();

    • Heap에 거대한 User 객체가 생성됩니다. (예: 주소번지 100번지)
    • Stack에는 user라는 변수가 생기는데, 여기엔 객체 자체가 아니라 주소값(100번지)이 들어갑니다.

💡 핵심 포인트: 스택에 있는 user 변수는 힙에 있는 실제 객체를 가리키는 '리모컨'일 뿐입니다!


4. 실전 면접 대비: 3초 요약

기술 면접에서 자주 나오는 질문에 대한 모범 답안입니다.

Q. 자바의 메모리 구조 중 Stack과 Heap의 차이를 설명해주세요.

A. "Stack은 메서드 호출 시 지역 변수나 매개변수가 저장되는 임시 공간으로, 메서드가 종료되면 데이터가 즉시 소멸됩니다. 반면, Heap은 new 연산자로 생성된 객체가 저장되는 공간이며, 개발자가 직접 지우지 않고 Garbage Collector(GC)에 의해 관리됩니다."

Q. 그럼 StackOverflowError는 언제 발생하나요?

A. "주로 재귀 함수가 종료 조건 없이 무한 호출되어, Stack 메모리 영역이 꽉 찼을 때 발생합니다."


🚀 다음 글 예고

Q. "Heap 영역에 객체가 계속 쌓이기만 하면 메모리가 터지지 않을까요?"

A. 맞습니다. 그래서 자바에는 아주 부지런한 청소부, GC(Garbage Collector)가 존재합니다. 다음 시간에는 개발자가 몰라도 알아서 메모리를 정리해 주는 GC의 동작 원리에 대해 아주 쉽게 알아보겠습니다.

⏭ Next Topic:

[Java] 개발자가 메모리 관리를 안 해도 되는 이유 (GC의 원리)

profile
기술정리

0개의 댓글