기타/백엔드 기초
자바 Java | 호출 스택(Call Stack) 구조와 원리: 메서드 실행 과정의 이해
YUNI Heo
2023. 2. 16. 19:19
반응형
✅ 호출 스택 Call Stack
메서드 호출의 실행 순서를 추적하는 자료구조이다.
- 메인 메서드(main method)가 호출되면, 메서드의 스택 프레임이 호출 스택에 쌓인다.
- 메인 메서드 내에서 다른 메서드를 호출하면, 해당 메서드의 스택 프레임이 호출 스택의 맨 위에 쌓인다.
- 호출된 메서드 내에서 다른 메서드를 호출하면, 해당 메서드의 스택 프레임도 호출 스택의 맨 위에 쌓인다.
- 호출된 메서드가 실행을 완료하고 반환(return)할 때, 해당 메서드의 스택 프레임을 호출 스택에서 제거한다.
- 호출된 메서드 내에서 예외가 발생하면, 해당 예외를 처리하기 위해 호출 스택을 따라서 예외 처리 구문으로 이동한다.
- 호출 스택에 있는 메서드들은 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"); // 출력문이 실행됨
} // 호출 스택의 끝점
}
- 프로그램 시작: JVM(main 스레드)
- main() 메서드 호출
- System.out.println() 메서드 호출
- 출력 문자열 "Hello" 출력
- System.out.println() 메소드 종료
- main() 메소드 종료
- 프로그램 종료: JVM(main 스레드)
class cs {
public static void main(String[] args) { // 호출 스택의 시작점
System.out.println("Hello"); // 출력문이 실행됨
} // 호출 스택의 끝점
}
반응형