특성 | 스택 메모리 (Stack Memory) | 힙 메모리 (Heap Memory) |
---|---|---|
수명 주기 | 메소드 호출과 함께 사용되며, 메소드 종료 시 메모리에서 제거 | 애플리케이션의 생명 주기 동안 사용되며, 가비지 컬렉터에 의해 관리 |
용도 | 메소드의 실행 상태, 지역 변수, 매개변수 저장 | 모든 자바 객체와 JRE 클래스들 저장 |
접근 속도 | 빠름 | 스택에 비해 상대적으로 느림 |
메모리 관리 | 자동 (LIFO 구조) | 가비지 컬렉션에 의해 자동 관리 |
스레드 공유 | 각 스레드는 자신만의 스택을 가짐 | 모든 스레드에 의해 공유됨 |
메모리 할당 | 컴파일 시간에 결정 | 런타임에 결정 |
예
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
two(c);
int count = c.get();
}
public static void two(Counter c){
c.increment();
c.increment();
}
public class Counter{
private int state = 0;
public void increment() { state++;}
public int get() { return state; }
}
}
예 설명
main 메소드에서 Counter c는 스택 메모리에 할당된 지역 변수
new Counter()에 의해 생성된 Counter 객체는 힙 메모리에 저장
변수 c는 힙 메모리에 있는 Counter 객체를 가리키는 참조
main 메소드에서 two(c)를 호출할 때, c의 참조 값이 two 메소드의 매개변수로 복사
two 메소드의 매개변수 c도 스택 메모리에 저장되며, 같은 힙 메모리에 있는 Counter 객체를 가리킴
two 메소드에서 c.increment()를 호출하면, 이는 힙 메모리에 저장된 Counter 객체의 state 변수를 변경
이 변경은 메소드 호출이 끝난 후에도 유지
int count = c.get();에서 count는 스택 메모리에 할당되는 지역 변수이며,
c.get()에 의해 반환된 Counter 객체의 state 값으로 초기화
결론:
이 예제에서 Counter 객체는 힙 메모리에 생성되며, main 메소드와 two 메소드에서 사용되는
c 변수는 이 객체를 가리키는 참조.
c 변수는 스택 메모리에 저장되며, 객체의 실제 데이터는 힙 메모리에 저장.
객체의 상태(state)는 메소드 호출 간에도 유지되며, 이는 여러 메소드에서 동일한
객체의 상태를 공유할 수 있음을 의미