본문 바로가기
기타/백엔드 기초

자바 Java | 호출 스택(Call Stack) 구조와 원리: 메서드 실행 과정의 이해

by YUNI Heo 2023. 2. 16.
반응형

 

✅ 호출 스택 Call Stack

메서드 호출의 실행 순서를 추적하는 자료구조이다.


  1. 메인 메서드(main method)가 호출되면, 메서드의 스택 프레임이 호출 스택에 쌓인다.
  2. 메인 메서드 내에서 다른 메서드를 호출하면, 해당 메서드의 스택 프레임이 호출 스택의 맨 위에 쌓인다.
  3. 호출된 메서드 내에서 다른 메서드를 호출하면, 해당 메서드의 스택 프레임도 호출 스택의 맨 위에 쌓인다.
  4. 호출된 메서드가 실행을 완료하고 반환(return)할 때, 해당 메서드의 스택 프레임을 호출 스택에서 제거한다.
  5. 호출된 메서드 내에서 예외가 발생하면, 해당 예외를 처리하기 위해 호출 스택을 따라서 예외 처리 구문으로 이동한다.
  6. 호출 스택에 있는 메서드들은 LIFO(Last-In-First-Out) 방식으로 처리되어, 호출 스택의 맨 위에는 현재 실행 중인 메서드의 스택 프레임이 위치한다.

 

💡 JVM 스택 JVM Stack

  • 각 스레드마다 생성한다.
  • 해당 스레드가 호출한 메서드에 대한 정보를 저장한다.
  • 스택 프레임(Call Frame)은 메서드의 반환 주소를 포함하여 현재 실행 중인 메서드의 상태를 저장한다.
  • 메서드가 반환되면 해당 스택 프레임을 제거한다.
  • 메서드 호출 시 지역 변수, 매개 변수, 메서드 반환 값 등을 저장한다.

 

💡 네이티브 스택 Native Stack

  • 네이티브 코드에서 호출된 메서드에 대한 정보를 저장한다.
  • JNI, Java Native Interface를 통해 Java 코드에서 네이티브 코드로 호출되는 경우에 사용한다.
  • JVM 스택과는 별개의 자료구조이다.
  • 네이티브 메서드가 반환되면 해당 스택 프레임을 제거한다.

 

💡 예제

class cs {
    public static void main(String[] args) { // 호출 스택의 시작점
        System.out.println("Hello"); // 출력문이 실행됨
    } // 호출 스택의 끝점
}
  1. 프로그램 시작: JVM(main 스레드)
  2. main() 메서드 호출
  3. System.out.println() 메서드 호출
  4. 출력 문자열 "Hello" 출력
  5. System.out.println() 메소드 종료
  6. main() 메소드 종료
  7. 프로그램 종료: JVM(main 스레드)
반응형