직접 그려본 호출 스택 구조 (참조)
https://www.youtube.com/channel/UC1IsspG2U_SYK8tZoRsyvfg
유튜브 남궁성의 정석코드 채널
'자바의 정석 - 기초편'을 보고 메모한 것임을 알려드립니다.
JVM(Java Virtual Machine)의 메모리 구조는
1.메소드 영역(Method Area)
2.호출 스택(Call Stack)
3.힙(Heap)
3가지로 나눌 수 있다.
그 중에서 두 번째인 호출 스택(Call Stack)을 알아보도록 하자.
스택(stack)이란? 위에 차곡차곡 쌓이는 성질을 가진 밑이 막힌 상자이다.
사진과 같이 쌓을 때는 위로 차곡차곡 쌓이며 꺼낼 때 또한 위에서부터 꺼낼 수 있다.
중간에 끼워넣을 수 없으며, 위에 있는 것들을 무시하고 맨 밑에 있는 것을 꺼낼수도 없다.
무조건 순서대로 차곡차곡 쌓이는 성질을 가지고 있다.
스택(stack)을 알아보았으니 이제 호출 스택(call stack)이 무엇인지 알아보자!
호출 스택이란, 메소드 수행에 필요한 메모리가 제공되는 공간이다.
메소드가 호출되면 호출 스택에 메모리가 할당. 즉, 만들어지게 되고 메모리에서 작업하다가
작업이 종료되면 호출 스택에서 사용되던 메소드 메모리 공간이 제거(반환) 된다.
호출 스택이 가지고 있는 특징들이다.
호출 스택의 제일 위에 있는 메소드가 현재 실행중인 메소드이며, 아래에 있는 메소드가
바로 위의 메소드를 호출한 메소드다.
더 자세히 알아보자.
위와 같이 main() 메소드가 있다고 가정한다면
맨 처음 호출 스택에는 main() 메소드만 들어있다. 그리고 현재 상태는 실행 중이다.
그럼, main() 메소드가 println()을 호출 한다면?
차곡차곡 쌓이는 성질에 따라, main() 위에 println()이 쌓이게 될 것이다.
그리고 main() 메소드는 대기 상태일 것이고 println() 메소드는 실행 중인 상태가 된다.
println() 메소드가 작업이 끝나게 된다면 어떻게 될까?
호출 스택은 사용되던 메소드 메모리 공간은 작업이 끝나게 되면 제거(반환) 된다고 했다.
위와 같이
println() 메소드가 종료됨에 따라, println() 메소드는 메모리 공간이 제거(반환) 되고
println()을 호출 후에 대기상태가 되었던 main() 메소드가 다시 실행 상태가 됨을 알 수 있다.
그럼 호출 스택에서 여러 메소드가 쌓여있다면 어떻게 될까?
답은 간단하다.
맨 위의 메소드 하나만 실행 중이고 나머지는 대기중이다.
그리고 차곡차곡 쌓이는 성질에 따라 아래에 있는 메소드가 위의 메소드를 호출한 것임을
쉽게 알 수 있다. 포인트는 하나의 스택에는 하나의 메소드만 실행 중이다!
나머지는? 대기중이다.
마무리로 아래의 코드에서 프로그램의 시작과 끝의 과정에서
호출 스택의 구조가 어떻게 변하는지 한 번 살펴보고 직접 그려보자.
class CallStackTest {
public static void main(String[] args) {
fristMethod();
}
static void firstMethod() {
secondMethod();
}
static void secondMethod() {
System.out.println("secondMethod()");
}
}
CallStackTest 클래스의 프로그램 시작부터 종료까지 호출 스택 변화 과정을 직접 그려보았다!
직접 그려보니 이해 하는데 확실히 도움이 되었다.
자료 출처 : 자바의 정석 요약집
(https://github.com/castello/javajungsuk_basic/blob/master/javajungsuk_basic_%EC%9A%94%EC%95%BD%EC%A7%91.pdf)