Java

[인프런] 스택과 큐 자료 구조

sejin2 2024. 5. 25. 17:54

자료 구조 : 데이터를 어떤식으로 보관하고 관리할지에 대한 구조

스택 구조

다음과 같이 1, 2, 3 블럭을 통에 넣는다고 가정해본다. 

 

=> 후입 선출 ( LIFO ) : 가장 마지막에 넣은 3번이 가장 먼저 나온다. 이런 방식을 후입 선출이라 하고, 이런 자료 구조를 스택이라고 한다.  

=> 선입 선출 ( FIFO ) : 후입 선출과 반대로 가장 먼저 넣은 것이 가장 먼저 나오는 것을 말하고, 이러한 자료 구조를 큐 라고 한다.

이러한 자료 구조는 각자 필요한 영역이 있다. 예를 들어 선착순 이벤트를 하는데 고객이 대기해야 한다면 큐 자료 구조를 사용해야 한다.

스택 영역

public class JavaMemoryMain1 {
    public static void main(String[] args) {
        System.out.println("main start");
        method1(10);
        System.out.println("main end");
    }

    static void method1(int m1) {
        System.out.println("method1 start");
        int cal = m1 * 2;
        method2(cal);
        System.out.println("method1 end");
    }

    static void method2(int m2) {
        System.out.println("method2 start");
        System.out.println("method2 end");
    }
}

처음 자바 프로그램을 실행하면 main( )을 실행한다. 이때 main( ) 을 위한 스택 프레임이 하나 생성된다.
main( ) 은 method1 ( ) 을 호출한다. method1( ) 스택 프레임이 생성된다.
method1( ) 은 method2( ) 를 호출한다. method2 () 스택 프레임이 생성된다. method2 ( ) 는 m2 지역 변수를 가지므로 해당 지역 변수가 스택 프레임에 포함된다. 

method2( ) 가 종료되면 스택 프레임이 제거되고, 매개변수 m2도 제거된다. method2( ) 스택 프레임이 제거되었으므로 프로그램은 method1 ( )로 돌아간다. 이때 method1( )의 처음으로 돌아가는게 아니라 method1( ) 에서 method2( ) 를 호출한 지점으로 돌아가고, method1 ( ) 이 종료되면, 스택 프레임이 제거되고 지역변수 m1, cal도 제거 된다. 프로그램은 main ( ) 으로 돌아가고 main ( ) 이 종료되면 더 이상 호출할 메서드가 없고 스택 프레임도 완전히 비워져 자바는 프로그램을 정리하고 종료한다. 

  • 자바는 스택 영역을 사용해 메서드 호출과 지역변수를 관리한다.
  • 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
  • 지역 변수는 스택 영역에서 관리한다.
  • 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
  • 스택 프레임이 모두 제거되면 프로그램도 종료된다.

스택 영역과 힙 영역

스택 영역과 힙 영역이 함께 사용되는 경우 

public class Data {
    private int value;

    public Data(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}


public class JavaMemoryMain2 {
    public static void main(String[] args) {
        System.out.println("main start");
        method1();
        System.out.println("main end");
    }

    private static void method1() {
        System.out.println("method1 start");
        Data data1 = new Data(10);
        method2(data1);
        System.out.println("method1 end");
    }

    private static void method2(Data data2) {
        System.out.println("method2 start");
        System.out.println("data.value = " + data2.getValue());
        System.out.println("method2 end");
    }
}

처음 main( ) 메서드를 실행하면, main( ) 스택 프레임이 생성된다.
main( ) 에서 method1( ) 을 실행하고, method1 ( ) 스택 프레임이 생성된다. method1 ( ) 은 지역 변수로 Data data1을 가지고 있다. 이 지역 변수도 스택 프레임에 포함된다. method1 (  )은 new Data1 ( ) 을 사용해서 힙 영역에 Data 인스턴스를 생성한다. 그리고 참조 값은 data1에 보관한다. 
method1 ( ) 은 method2( ) 를 호출하면서 Data data2 매개변수에 x001 참조값을 넘긴다. 
이제 method1( ) 에 있는 data1과 method2 ( )에 있는 data2 지역 변수는 둘다 같은 x001인스턴스를 참조한다.
method2( ) 가 종료되고, 스택 프레임이 제거되면서 매개변수 data2도 함께 제거 된다. 
method1 ( ) 이 종료되고, 스택 프레임이 제거되면서 지역 변수 data1도 함께 제거 된다.
method1 (  )이 종료되면, x001 참조값을 가진 Data 인스턴스를 참조하는 곳이 없다. 그러므로 사용되는 곳이 없기 때문에 메모리만 차지하게 되다. 이때 GC가 이러한 인스턴스를 찾아서 메모리에서 제거한다. 

지역 변수는 스택 영역에, 객체는 힙 영역에 관리되는 것을 확인할 수 있다. 

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] static 메서드  (0) 2024.05.26
[인프런] static 변수  (0) 2024.05.26
[인프런] 자바 메모리 구조  (0) 2024.05.25
[인프런] 캡슐화  (0) 2024.05.22
[인프런] 접근 제어자  (0) 2024.05.22