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)
→ 클래스 안에 선언된 변수를 가리키는 공식적인 자바 용어.
(자바 언어 스펙에서 "클래스의 변수"를 필드라고 정의함)
애초에 인스턴스 변수라는 단어는 객체(인스턴스)가 생성될 때 힙에 같이 생기니까 붙은 이름 이라고생각하면 왜 이렇게 부르는지 이해할수있다.
'JAVA' 카테고리의 다른 글
| 재할당 vs 내부 상태 변경 (0) | 2025.10.08 |
|---|---|
| 자바의 generic 정리 (0) | 2025.10.06 |
| Entity설계 시 ID 값을 Long으로 지정하는 이유 (0) | 2025.09.10 |
| 인스턴스 변수를 private으로 해야하는 이유가 뭘까 (0) | 2025.08.25 |
| Hashmap in java (2) (0) | 2025.07.29 |