-

[JAVA 문법 Step 8] - 메서드 Stack 메모리(중요) 본문

CS/JAVA

[JAVA 문법 Step 8] - 메서드 Stack 메모리(중요)

흣차 2021. 12. 1. 01:05
728x90
반응형

지난번에 했던걸 총 정리해보겠습니다.

자바로 코드를 작성한다고 합시다.

자바의 내용은 컴파일되어서 .class안에 담기게 되고 이것은 JVM으로 실행할 수 있습니다.

이 JVM으로 실행된 .class는 1,2,3번 순서대로 실행이 될텐데요.

1번이 실행되고 2번에서 static을 찾습니다. 이 찾아진 static은 메모리 공간에 항상 띄워지게 됩니다.

그리고 3번의 main메서드를 실행하는데요. 이 main또한 static이기 때문에 메모리 공간에 담깁니다.

그리고 4번이 실행되는데요. 4번은 main 큐를 실행하는 과정으로서 main내부의 코드들을 각각 실행합니다.

그리고 이 main이 종료되면 마지막으로 스택 공간에 main이라는 것이 쌓입니다.

순서는 이렇게 됩니다. 아직까지 스택이 뭔지, 큐가 뭔지 정확히 몰라도 됩니다. 다만 이런 그림으로 만들어진다 이것만 이해해주시면 됩니다. 

그럼 실습을 해볼게요.

 

클래스 이름을 StackEx01로 만들어볼게요. 그리고 아래와 같이 입력해줍니다.

 

요건 출력하면 아래와 같이 나오겠죠??? 그럼 이렇게 바꿔봅시다.

main 내부에 StackEx01.a();라고 입력하겠습니다.

그럼 m1, m2가 출력되고 다시 a로 들어가서 StackEx01.b()가 실행될테고 a들이 출력되었다가 마지막에 m4, m5가 출력될 것입니다.

어떨까요??

이렇게 나오시는거 확인되시나요???

각각의 메서드 내부에서 a와 b를 호출시켰더니 코드가 순차적으로 실행되는 것을 보이시죠???

여기서 제일 핵심은 main이 우선적으로 실행되고 내부의 코드들이 순차적으로 실행되는 부분이 가장 중요합니다.

또한 어떤 메서드에서 클래스 내부에 있는 다른 메서드를 참조하는 것도 가능하며 거기서도 똑같이 입력된 순서대로 구문이 실행되는 것을 알 수 있습니다.

이해가셨나요??

 

그럼 이제 아까 언급했던 스택과 큐에 대해서 설명을 해보려 합니다.

큐는 제 블로그에서도 빈번히 나왔던 자료구조 중 하나입니다.

그림을 보면서 이해해봅시다.

큐는 선입선출 구조를 가지고 있습니다.

먼저 들어온 데이터가 1 2 3 데이터라면 나갈 때 순서도 1 2 3입니다.

즉, 먼저 들어온 것이 먼저 나가는 구조이기 때문에 아까 나왔던 main큐 또한 먼저 실행된 것이 먼저 출력이 되었던 것입니다.

하지만 스택은 조금 다릅니다. 스택은 1 2 3 순서대로 데이터가 들어왔다면 3 2 1 순서대로 데이터가 나갑니다.

왜냐하면 큐는 들어오는 입구와 출구가 하나씩 있는 반면에 스택은 출구가 없고 입구만 있기 때문이죠.

그래서 넣었던 데이터를 빼내려면 최근에 넣었던 데이터까지 모두 빼내야 한다는 번거로움이 있습니다.

그러면 지금까지의 코드들을 스택과 큐로 이해해보겠습니다.

main안의 19번재줄부터 23번째줄까지 실행하겠습니다.

21번째 줄에서 a()메서드를 호출했꼬 a()메서드는 첫번째줄부터 b()메서드를 호출합니다.

이것을 큐에 담으면 제일 먼저 main안에 있는 19번째줄부터 23번째 줄까지 그림처럼 담길테고 a메서드도 6번째줄부터 9번째줄까지 담깁니다.

그럼 여기서 핵심은 스택입니다.

큐는 한줄, 한줄씩 실행될때마다 출력이되어 나가니까 상관없는데 큐는 그렇지 않습니다.

제일 먼저 실행되는 것은 static으로 선언한 main메서드기 때문에 스택에는 main이 먼저 쌓입니다.

그리고 이후 a메서드가 쌓이는데, 이때 main메서드는 a메서드가 종료될때까지 절대 먼저 종료되지 않습니다.

그리고 a메서드는 b()메서드를 호출하고 b()에서는 13, 14, 15번째 줄을 실행합니다.

그럼 스택에는 b()까지 쌓이게 되고 스택에는 1층엔 main, 2층엔 a, 3층엔 b가 담겨있습니다.

이후 b()가 전부 실행되고 나면 b()는 종료되며 스택에서 사라집니다.

이때 스택에서는 pop()이라는 메서드를 사용합니다.

스택에서 데이터를 제거할 때 쓰는 용어입니다.

그렇게 b가 종료되고 a는 6,7,8,9까지 실행하고 종료되며 pop()되어 날라갑니다.

그럼 스택에는 a도 제거되고 main만 남아있습니다.

남아있던 main은 실행되어서 13, 14, 15번째 줄을 실행 후 다 실행하면 종료되어 마지막 남아있던 스택의 main도 제거되어 최종적으로 모두 종료되는 것입니다.

이해가 가셨나요?

그림으로 보는 것이 훨씬 낫죠???

감사합니다.

728x90
반응형
Comments