Wanna be Brilliant Full-Stack Developer

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

Some Memos/Java

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

Flashpacker 2022. 2. 18. 00:53


큐라는 Queue라는 자료구조와 스택 Stack이라는 자료구조가 있다. 

자료구조라는것이니까 어떤 자료를 저장할 수 있는 구조라는건데! 

어떤식으로 저장이 되냐면 원통이 있는데 내가 처리해야될 데이터가 3개가 있으면 

Stack의 처리순서는 입력순서와는 다르게 3, 2 , 1이다 왜냐하면 출구가 없기때문에 

하지만 큐는 다르다 빠져나갈 구멍이 있기 때문에 처리순서는 들어온순서와 같이 1, 2, 3 이렇게 처리가된다.

 

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");

	}

}

인간이 이해할 수 있는 영어다. 이 영어 문법을 자바(JAVA)언어라고한다. 

StackEx01.Java를 인간이 이해할 수 있는 코드로 만든다! 

애를 컴파일하기위해 던진다.  해석하는것인데 JVM위해서 하게 된다.

StackEx02.class 바꾸게 되고 여기에 적혀있는 코드는 해석된 코드기 때문에 인간이 보면 이해할 수 없다.

이 해석된 코드를 실행하게 되면 JVM이 받는다 

1. JVM이 받으면 .class 파일을 로드하고

2. 두번쨰는 static을 찾는다 

static이 하나 , 둘 , 세개가 있다. a, b ,main! 

StackEx02 라는 엄청나게 큰 클래스 영역에 static이라는 공간이 생긴다

static공간에 a(0) , b(0), main() 이 뜨는데 중요한점은 저 안에 있는 내부는 뜨지않는다

(static을 찾아서 메모리 공간에 올렸다)

3. main 메서드 실행을 해야한다! main메서드 실행하기 위해서는 static공간안에 main을 찾아서 실행 시킨다

여기서부터가 중요한데 mian이 실행될떄 머가 열리냐면 main이라는 코드 영역이 오픈된다. 

main이라는 코드 영역이 오픈되는데

21번 라인에서 a라는 메서드를 호출한다! 

이 영역을 앞서 배운 자료구조 관점에서 보면 큐와 스택이라는것을 배웠다. 

큐라는 영역에 main이라는 원통이 생겼고 출구와 입구가 다열려있고 19, 20, 21, 22 ,23 이 들어오면 

Main이라는 부분을 큐라는 관점에서 본것이다.

코드라는 영역이 오픈되었다는것은 큐안에 Main원통이 만들어졌다는 것이다. 

그래서 이제 큐가 하는일이 머냐면 처리를 해야하는데 main코드 영역 open은 보기 좋으라고 표현해놓은것이고 

실제 부분은 큐영역이다. 

머부터 처리를 해야하냐면 19번부터 처리한다 왜냐하면 출구가 있기떄문에 19번부터 처리가 된다. 

이떄 하나의 영역이 더 만들어지는데 

stack이라는 영역이 생긴다.  이건 똑같은 원통인데 입구로부터 들어오는데 나가는건 그 입구로 또 나가게 된다.

제일 밑에 main 메서드 저장영역이 생긴다? 

지금은 메인메서드에 아무것도 저장한것이 없지만 

이렇게 변수를 선언하면? 

메인 내부안에서 만든것이기 떄문에 이 메인 메서드 영역에 int num이 저장된다! 지금은 신경쓰지 않아도 된다.

 

두개가 생기는데 main메서드가 호출될떄 하나는 실행을 위해서 실행의 순서대로 19,20,21,22,23,24  실행할것이고

이 저장영역이 stack에 생기는것이다. 지금 비어있다 저장한것이 없으니까 

하지만 영역은 생긴거다 ! 

 

이제 순서대로 진행을 해볼까요? 

제일 19번이 원통에 나가면서 실행이 되고 m1이 찍히고 , 19번 실행하고 나서 20번이 실행되어야한다

20번 라인이 원통에서 나가면서 m2이 찍힌다! 

 

그다음에 보니까 21번 라인을 실행하려고하니까 a를 호출하려고 하는데 메서드를 호출한다 

이때 어떤일 이 일어나냐면 

a 코드 영역이 open된다! a코드 영역 보면 6, 7, 8, 9 라인이다. 

그리고 코드를 보면 6번 라인에서 b메서드를 호출한다! 

그리고 나머지는 화면에 출력하고 끝난다! 

실제로는 또한 A라는 원통이 생기고 6, 7 , 8 , 9 번라인이 들어오고 

또한   A 메서드 영역이 stack이 생긴다 또 비어있다. 

 

21번이 실행될떄 실행되는 순간 A코드 영역이 생기게 되면서 A에 큐가 만들어지고 스택 영역이 생긴다

아직 21번은 종료가 되지 않고 22번으로 넘어가는것이 아니라 

6번 라인으로 점프해서 6번라인을 실행한다! 

6번라인을 실행하니까 애가 또 b를 호출한다! 

그러면 또 b 코드 영역 오픈! 

13,14,15 다 화면에 출력이 되는데 

전체 진행순서는 지금까지는 처음에는 19번, 20번, 그다음 21번 라인이 실행될떄 a를 호출하여 6번으로 넘어가는 것을 (점프한다) 6번라인을 실행하면 b를 호출하고 b를 실행하게되어 또 점프하게되면 B에도 원통이 생기게 되는데 처음에 13, 14, 15 들어오고 stack에 B메서드 저장영역이 생기게 된다! 

6번 라인(StackEx01.b(); b가  실행되니까 13-14-15 가 오픈되고 큐에 딱 들어오고 B에 stack 잠깐 저장영역이 생겼다

그리고 13, 14 , 15 각각 실행되고 바로 a 의 7번라인으로(b를 불렀던곳으로) 돌아오게 된다.

정확하게 이야기하면 다시 6번라인으로 돌아가는데 6번이 끝나면 7번을 실행하는것이다. 

 

여기서 잘봐야하는데 열려있는 b영역 13, 14, 15 실행되면  b영역은 쓸모가 없기 때문에 

제일 중요한점은 실행이 다 되었으니까 stack에 b메서드 저장공간이 먼저 빠져나간다 이런것을 pop이라고 말한다 

그러면 b 메서드는 메모리에서 사라진다. 

 

그리고 7 , 8, 9 실행하고 다 실행한뒤 a를 호출한 21번라인으로 다시 메인쪽으로 돌아옵니다! 

a메서드도 일을 다했기 떄문에 stack영역에서 pop된다! 

큐와 스택의 차이는 먼가 ? 큐는 19, 20 ,21 ,22 들어왔으면  19번부터 처리하는데

stack은 메인이 1번 2번 a ,3번이 b로 들어왔는데 날라가는건 처리되는 순간이 마지막에 들어오는 애들부터 먼저 나가진다. 

 

그리고 나서 22번 , 23번 실행하면 모든것이 다 실행 되었으니 메인이 종료 되는 프로그램도 종료된다! 

다 실행되었으면 stack에 있는 메인 메서드 저장영역도 pop된다. 

stack에 아무것도 없어졌다

 

stack에 메인메서드가 올라오는것이 작업 프로그램이 시작되는것이고 stack에 메인메서드가 pop되는 순간 다 처리되는 순간 자바 프로그램은 종료가 된다!