JAVA

스택과 힙 다시 정리

싸블양 2025. 9. 12. 00:52

MemoryMemberRepository repo = new MemoryMemberRepository();

private Map<Long,Member> store = new HashMap<>();

 

repo는 스택인데

store는 힙이다

 

왜??

기준: "변수가 어디 선언되었나?"

다시 스택과 힙의 차이에 대해 알아보자


스택(Stack)
 
메서드 실행 시 생겼다가 끝나면 사라지는 공간 (지역변수, 매개변수 저장)

 

힙(Heap) 
new로 만든 객체가 저장되는 공간 (필드, 인스턴스 데이터 저장)

 

 

repo 예시

public static void main(String[] args) {
    MemoryMemberRepository repo = new MemoryMemberRepository();
}
  • main 메서드 안에 선언된 지역 변수
  • 따라서 스택에 저장됨
  • 값으로는 힙에 있는 MemoryMemberRepository 객체의 주소값을 들고 있음

 

store 예시

public class MemoryMemberRepository implements MemberRepository {

    private Map<Long,Member> store = new HashMap<>();
  • MemoryMemberRepository 객체의 필드(멤버변수)
  • 따라서 그 객체와 함께 힙에 저장됨
  • 값으로는 또 다른 힙 객체(HashMap)의 주소값을 들고 있음

 

그림 

[Stack]
repo  ──▶  (Heap) MemoryMemberRepository 객체
              └─ store ──▶ (Heap) HashMap 객체
  • repo는 스택에 있는 지역변수(Local variable)
  • store는 힙에 있는 MemoryMemberRepository 객체 안의 필드
  • 둘 다 "주소값(reference)"을 저장하지만, 어디에 위치하느냐가 다름

정리

기준은 "선언된 위치"

  • 메서드 안에서 선언 → 스택
  • 클래스 안(필드, 멤버변수) → 힙 (그 객체의 일부로 들어감)
  • new 키워드로 만든 객체 → 무조건 힙

그러니까 repo는 main 메서드 안 지역변수라 스택,
store는 MemoryMemberRepository 객체의 일부라 힙에 저장되는 것이다

 

번외

  • 멤버변수(Member Variable)
    → 클래스의 "멤버" 중 변수라는 뜻.
  • 인스턴스 변수(Instance Variable)
    → 객체(인스턴스)가 생성될 때 힙에 같이 생기니까 붙은 이름.
  • 필드(Field)
    → 클래스 안에 선언된 변수를 가리키는 공식적인 자바 용어.
    (자바 언어 스펙에서 "클래스의 변수"를 필드라고 정의함)

애초에 인스턴스 변수라는 단어는 객체(인스턴스)가 생성될 때 힙에 같이 생기니까 붙은 이름 이라고생각하면 왜 이렇게 부르는지 이해할수있다.