Wanna be Brilliant Full-Stack Developer

2/17 JAVA 메서드 Stack 메모리 개념잡기 #1 본문

Some Memos/Java

2/17 JAVA 메서드 Stack 메모리 개념잡기 #1

Flashpacker 2022. 2. 17. 21:55


목표 별 5개 굉장히 중요하다! 

우리가 일단은 .java 파일을 만들면 코드를 넣는다(인간이 이해할수있는 언어) 이 코드를 컴파일 해서 .class 파일로 바꾼다

.class 파일로 바꾸는 목적은 무엇인가? 똑같이 코드로 변환되는데 인간이 이해하는 언어가아니라 JVM이 이해하는 언어로 변경이된다.

.class 파일을 JVM에게 던지는데 실행을 하면 JVM이 .class 파일을 보고 분석하고 실행하는데

JVM 이 첫번쨰로 하는건 .class파일을 로드한다. 2  static을 찾는다.  static을 찾으니까 Hello라는 클래스 영역에 

static이라는 메모리 영역이 만들어지면서 main을 가장 먼저 찾고 그다음에는 main 메서드를 실행한다! 

main에도 괄호가 있고 중괄호가 있다. 이것도 행위이다. 

main이라는 메서드를 실행한다는건 main이라는 행위를 실행한다는것이다.

 

실행할 수 있는 근거는 머냐면 static에 떠있기 때문이다. main이라는 메서드를 실행하면 어떻게되냐면 

이 Hello라는 애가 멀 만들게 되냐면 main의 큐라는걸 만든다. main안에 적혀있는 코드들을 하나씩 올린다! 

main이라는 큐가 딱 오픈되면 언제 오픈되냐면 메인 메서드 실행할때 , 순서대로 코드를 진행한뒤 종료된다. 

main이라는 큐가 오픈될떄 일어나는일이 하나 더있는데 stack이라는 메모리공간이 생긴다.

 

stack이라는 공간에 제일 밑에 main 메서드 영역 이라는것이 쌓인다. 

 

순서를 말하자면 .class 로드되고 static 찾고 메인 메서드가 실행되면 main 큐 오픈되고 stack 공간에 메인 메서드 영역이 만들어진다 ( 먼가를 저장할수있는 영역)

메인 메서드가 실행될때 satck공간안에 main 메서드 저장공간이만들어진다 

package ch02;

public class StackEx01 {

	static void a() {
		StackEx01 .b();
		System.out.println("a2");
		System.out.println("a3");
		System.out.println("a4");
	}
	
	static void b() {
		System.out.println("b1");
		System.out.println("b2");
		System.out.println("b3");
	}
	
	public static void main(String[] args) {
		System.out.println("m1");
		System.out.println("m2");
		StackEx01.a();
		System.out.println("m4");
		System.out.println("m5");

	}

}

제일 처음에 static을 다찾을것이다. 이제 main 메서드를실행할떄 19, 20 , 21번 라인이 실행될텐데 

21번 라인이 실행될떄 a를 호출했으니까 

{
StackEx01 .b();
System.out.println("a2");
System.out.println("a3");
System.out.println("a4");
} 이 실행이 되는것이다.  

그러면 StackEx01.b(); 부터먼저 실행하니까 

 {
System.out.println("b1");
System.out.println("b2");
System.out.println("b3");
} 이 셋이 다 실행하고 나서 종료되고 나머지 a2 ,a3, a4를 실행하고 , m4 , m5 를 실행하고 종료 될것이다 ! 

a를 실행하려고 했더니 a가 b를 먼저 실행하니까  b가 실행이 끝나고 다끝나면 a가실행이되고 a가 실행이 끝나고 m4 , m5가 실행이 된다.