Java/[inflearn] 자바 기본

[김영한_자바기본][7. 자바 메모리 구조와 static] 자바 메모리 구조 이해 / 스택과 큐 자료 구조(p.1-12)

줌인. 2024. 2. 7. 01:48
메서드 영역: 프로그램의 클래스 정보와 정적 변수를 저장하는 공간
영역: 동적으로 생성되는 객체들을 저장하는 공간
스택 영역: 메서드 호출 및 파라미터임시로 저장하는 공간
**메인 메서드 자체는 메서드 영역이나, 호출되고 실행될 때는 관련데이터가 스택에 저장된다.

 

 

 

[자바 메모리 구조 이해]

ex) 커피 빨리 마시기 대회

메서드 영역 > 스택 영역  > 힙 영역
1. 커피머신 - 상시 배치
2. 테이블 - 상시 배치
3. 감독관 - 상시 배치
1. N번 참가자
2. N번 참가자가 마시는 커피
    (참가자가 생성하는 Sth)
1. 커피 마신 시간 - 전광판 기록
ex) 동작이 발생할때 마다 기록
(실제) 클래스, 메서드, 생성자, 
        멤버변수(=필드), static변수
  (실제) 파라미터 값, 지역변수, 호출자
           중간연산결과 = 지역변수 담음
  (실제) 객체 / 인스턴스 요소
           >> 임시 사용


- 메서드 영역은 프로그램의 구조를 정의한다.

- 힙 영역은 동적으로 생성되는 데이터들을 관리한다.

- 스택 영역은 메서드의 호출과 실행을 추적하고 관리한다. 

 

▶ 메서드 / 힙 / 스택 이해 (메타 코딩님 유튜브)

https://www.youtube.com/watch?v=QRj0WR5Uh2M

 

 

 

 

[스택과 큐 자료 구조]

스택 자료구조 큐 자료구조
- 후입선출(LIFO, Last In First Out) - 선입선출(FIFO, First In First Out)

 

 

 

 

[스택 영역 이해하기]

[p.5 / JavaMemoryMain1 class] 스택 영역은 메서드 호출과 관련된 정보가 임시로 저장된다.

public class JavaMemoryMain { //메서드 영역

    public static void main(String[] args) {//메서드 영역
        System.out.println("main start");
        method1(10); //호출자 -> 스택 영역
        System.out.println("main end");
    }

    static void method1(int m1) { //메서드 영역
        //int m1 -> 지역변수(파라미터) 스택 영역
        System.out.println("method1 start");
        int cal = m1 * 2; //중간 연산자 -> 스택 영역 = 지역변수
        method2(cal); // 호출자 -> 스택영역
        System.out.println("method1 end");
    }

    static void method2(int m2) { //메서드 영역
        //int m2 -> 지역 변수(파라미터) 스택
        System.out.println("method2 start");
        System.out.println("method2 end");
    }
}
// 힙영역은 보이지 않음

- 메서드 영역에는 프로그램의 클래스 정보와 정적 변수가 저장된다.

- 스택 영역에는 메서드 호출과 관련된 정보들이 임시로 저장된다.

메서드 호출 시에는 호출된 메서드의 파라미터와 지역 변수들이 스택에 저장되며,

   메서드의 실행이 끝나면 해당 정보들이 스택에서 제거된다.

- 주어진 코드에서는 동적으로 생성되는 객체가 없으므로 힙 영역은 나타나지 않는다.

- 주의할 점은 메인 메서드 자체는 메서드 영역이나 호출되고 실행될 때는 호출정보와 관련된 데이터가 스택에 저장된다.

 

 

 

 

 

[스택과 힙 영역 이해하기]

[p.8 / Data class] 

public class Data {//메서드 영역
    private int value; //멤버 변수 -> 메서드 영역
    //그러나, 객체가 생성될 때 마다 힙 영역에 저장

    public Data(int value) { //생성자 -> 메서드 영역
        //int value는 호출자 = 매개변수 -> 스택영역
        this.value = value; //Data자체 변수(value) 초기화 선언 -> 힙영역
    }

    public int getValue() { //메서드 자체 -> 메서드 영역
        return value; //value로 값 전달 받음 -> 힙영역
    }
}

 

 

[p.8 / javaMemoryMain2 class] 

public class JavaMemoryMain2 { //메서드 영역

    public static void main(String[] args) { //메서드 영역 + //스택 영역
        System.out.println("main start");
        method1();//스택 영역 -> 호출자
        System.out.println("main end");
    }

    static void method1() { //메서드 영역
        System.out.println("method1 start");
        Data data1 = new Data(10); // 객체 생성 -> 힙영역
        method2(data1); //method 호출자 -> 스택 영역
        System.out.println("method1 end");
    }

    static void method2(Data data2) {//메서드 영역 + 매개변수는 스택영역 + data자체는 힙영역
        System.out.println("method2 start");
        System.out.println("data.value = " + data2.getValue()); //힙영역(객체 결과값)
        System.out.println("method2 end");
    }
}
728x90