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