해당 글은 '자바의 정석 기초편'을 보고 작성 되었습니다.
여러 함수들을 호출하는 스크립트에서 해당 위치를 추적하는 인터프리터를 위한 매커니즘이다. 메서드의 작업에 필요한 메모리 공간을 제공한다.
class ExampleCallStack {
public static void main(String[] args) {
System.out.println("Hello");
}
}
라는 코드가 있다고 가정을 하자. 당연히 결과물은 콘솔창에 Hello라고 찍힐거라는 것은 우리 모두가 알고있다.
메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워지는 메커니즘이다.
자바의 정석에서 위 그림을 보는게 해당 코드를 기반으로 호출 스택을 이해하는데 가장 쉬웠으니, 이 부분을 1번부터 5번까지 설명해보도록 할것이다.
1 - 2 : 우선 해당 예제 코드를 돌리면, JVM에 의해서 메인 메서드가 호출되면서 프로그램이 시작될 것이다. 이 때, 호출스택에는 메인 메서드를 위한 메모리공간이 할당되고 메인 메서드의 코드가 수행되기 시작하는 것이다.
3 : 메인메서드에서 println()를 호출한 상태이다. 아직 메인메서드는 끝난게아니다!!!! 메인메서드는 호출스택에 대기상태로 남아있고 println()의 수행이 시작된다. println 메서드에 의해 Hello가 화면에 출력 되는것이지😎
4 : println()의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 메인 메서드로 돌아가는데, 대기중이던 메인 메서드는 println()을 호출한 이후부터 수행을 시작한다
5 : 메인메서드에도 더 이상 수행할 코드가 없으므로 종료되고 호출 스택은 완전히 비어지게 되고 프로그램은 종료된다.
컴파일한 프로그램 분해해서 어셈블리단위에서 확인해보면 스택에 출력될 역순 차례대로 코드들이 담기고 꺼내지던데
그런것과 비슷한 매커니즘이군요!