런타임 스택이란 무엇인가?
Java에서 프로세스, 코드 또는 스레드(thread)가 실행될 때마다 런타임 스택(runtime stack)이 생성됩니다. 이 스택은 스레드가 실행되는 동안 수행되는 다양한 연산 정보를 저장하는 역할을 합니다.
런타임 스택에 쌓이는 각 항목은 스택 프레임(stack frame) 또는 활성화 레코드(activation record)라고 불립니다. 메서드가 호출되면 해당 메서드의 데이터가 스택에 저장되고, 실행이 완료되면 그와 관련된 데이터는 런타임 스택에서 제거됩니다.
모든 메서드의 실행이 끝나면 런타임 스택은 비게 되며, 더 이상 필요하지 않으므로 메모리에서 제거되어야 합니다. 이 시점에 런타임 스택은 소멸되고, 그과 함께 스레드도 종료됩니다.
스레드 종료의 두 가지 방식
스레드의 종료는 크게 두 가지 경우로 나눌 수 있습니다.
- 정상 종료(자발적 종료): 스레드가 모든 코드를 문제없이 실행하고 스스로 실행을 마치는 경우
- 비정상 종료(강제 종료): 실행 중 예외(exception)가 발생하여 코드 실행이 중단되는 경우
LIFO 구조: 생성과 소멸의 순서
런타임 스택에서 요소들이 소멸되는 순서는 항목이 생성된 순서의 반대입니다. 즉, 가장 나중에 호출된 메서드가 가장 먼저 스택에서 제거되는 LIFO(Last In, First Out) 구조를 따릅니다.
정상 종료 시 런타임 스택의 흐름
스레드가 정상적으로 작동하여 실행을 완료하는 경우를 살펴보겠습니다.
- main 메서드가 호출되고, 그 항목이 런타임 스택에 저장됩니다.
- main 메서드 내에서 다른 메서드가 호출되면, 해당 메서드의 항목 역시 스택에 쌓입니다.
- 각 메서드의 실행이 완료되면, 스택에서 항목을 제거하기 시작합니다.
- 이때 마지막에 실행된 메서드가 가장 먼저 스택에서 제거됩니다.
비정상 종료 시 런타임 스택의 흐름
스레드가 비정상적으로 종료된다는 것은 코드의 모든 라인이 성공적으로 실행되지 못했다는 의미입니다. 실행 중 오류를 만나면 예외가 발생하고, 이로 인해 스레드가 강제로 종료됩니다.
예제 코드
public class Demo{
public static void main(String[] args){
test();
}
public static void test(){
test_2();
System.out.println("This is a test method.");
}
public static void test_2(){
System.out.println(45/0);
System.out.println("This is a method that divides 10 by 0.");
}
}실행 결과
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.test_2(Demo.java:14)
at Demo.test(Demo.java:9)
at Demo.main(Demo.java:5)
코드 분석
Demo 클래스에는 main 메서드가 있으며, 여기서 test() 메서드를 호출합니다. test() 메서드 내부에서는 다시 test_2() 메서드를 호출하도록 정의되어 있습니다.
test_2() 메서드 안에서는 숫자를 0으로 나누려고 시도합니다. 자바에서 0으로 나누기는 허용되지 않기 때문에 ArithmeticException이 발생하고, 이 예외 정보가 콘솔에 출력됩니다.
예외가 발생한 순간 제어 흐름이 중단되므로, test_2() 메서드의 두 번째 println 문은 물론이고 test() 메서드의 println 문까지 실행되지 못한 채 프로그램이 종료됩니다. 출력 결과의 스택 트레이스(stack trace)를 보면 main → test → test_2 순으로 호출된 것을 확인할 수 있으며, 이는 런타임 스택에 메서드가 쌓인 순서와 일치합니다.
정리
Java의 런타임 스택은 스레드 실행의 핵심 구조로, 메서드 호출 정보를 LIFO 방식으로 관리합니다. 정상적으로 실행이 끝나면 스택이 비워지면서 스레드가 종료되고, 예외가 발생하면 스택 트레이스를 남기며 비정상 종료됩니다. 스택 트레이스를 읽는 능력은 디버깅에 매우 유용하므로, 런타임 스택의 동작 원리를 정확히 이해해 두는 것이 좋습니다.