반응형

스택 (call)


호출스택을 공부하기 전에, 먼저 스택에 대해 알아보자.

  • 스택 (stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다.

 

스택은 어떤 특징이 있냐면,
무언가를 집어넣으면 차곡차곡 쌓인다. 위의 그림은 스택에 무언가를 넣을때의 그림이다.

 

이 그림은 스택에서 무언가를 꺼낼 때의 그림이다.
스택은 FILO(First-In-Last_Out) 방식으로 작동한다.
스택은 위로 뚫린 공간으로만 넣을 수 있으며, 

이렇게 동작시킬 수는 없다.

이런 특징을 가지고 있는 것이 특징이다.

 


 

호출 스택 (call stack)

메서드 수행에 필요한 메모리가 제공되는 공간

  • 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

 

이 그림을 보면, 처음에 main메서드가 호출되서  스택에 올라가있는 그림인데,
main메서드가 println메서드를 호출하면, 오른쪽과 같은 그림이 된다.
즉, main메서드가 println메서드한테 일을 시키면 main메서드는 대기상태가 된다.
그리고 println메서드가 실행상태가 된다. 

처음에는 main메서드가 실행중이었는데, 
main메서드가 println메서드를 호출하면서, main메서드는 대기상태가 되고, println메서드는 실행상태가 되었다.
main메서드는 println메서드가 작업을 마칠 때까지 기다려야 한다. 

그다음, println메서드가 작업을 종료하면 스택에서 사라진다.
그리고나서 다시 main메서드가 println메서드를 호출한 곳으로 돌아와서 main메서드가 다시 실행상태가 된다.

 즉, 아래 있는 메서드가 위의 메서드를 호출한 것이다.
맨 위의 메서드 하나만 실행중, 나머지는 대기중

기본적으로 하나의 스택을 가지고 있지만, 우리가 13장을 공부하게 되면,
쓰레드마다 스택을 하나씩 가지고 있기 때문에, 멀티쓰레드 프로그래밍을 하면 스택이 여러개 생길 수 있다.

근데 그 전까지는 싱글스레드로 생각하면 된다.

 

[Ex6_5]

public class Ex6_5 {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

[실행 결과]

Hello

이 예제는 Hello를 출력하는 간단한 예제이다.
이 프로그램이 실행될 때, 호출스택의 변화가 어떻게 일어나는지를 단게별로 알아보자.

맨 처음에는 스택이 비어있다가,

main메서드가 올라간다.

그리고나서 main메서드가println메서드를 호출하는데 이때,  main메서드는 대기상태가 되고, println메서드는 실행상태가 된다.

그다음에, println메서드가 화면에 Hello라고 출력을 하고, 작업을 마치고나서 자기가 사용했던 메모리를 반환하고  스택에서 사라지게 된다.

그리고나서 println을 호출했던 main메서드로 돌아간다. 그러면, 대기상태에 있던 main메서드가 다시 실행상태로 바뀌게 된다.

근데 더이상 실행할 문장이 없어서 main메서드도 종료가 되고 스택은 완전히 비워지게 되고 프로그램을 종료하게 된다.

반응형

'JAVA' 카테고리의 다른 글

참조형 매개변수, 참조형 반환타입  (0) 2022.03.27
기본형매개변수  (0) 2022.03.26
return문, 반환값  (0) 2022.03.26
메서드 호출과 메서드의 실행흐름  (0) 2022.03.25
메서드란? 메서드의 선언부와 구현부  (0) 2022.03.25