스택 메모리와 힙 메모리의 차이

이강용·2023년 12월 18일
0

CS

목록 보기
24/109
특성스택 메모리 (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)는 메소드 호출 간에도 유지되며, 이는 여러 메소드에서 동일한 
객체의 상태를 공유할 수 있음을 의미
profile
HW + SW = 1

0개의 댓글