[꼼꼼한 개발자] 꼼코더

[JAVA] - 스택 트레이스(Stack Trace)란? 간단하고 쉽게 이해하기 본문

간단하고 쉽게/JAVA

[JAVA] - 스택 트레이스(Stack Trace)란? 간단하고 쉽게 이해하기

꼼코더 2023. 5. 22. 22:23
반응형

👀 소개

스택 트레이스가 무엇이고 어떻게 읽어야 하는지 간단하게 알아보자!

스택 트레이스 예시 이미지

 


 1️⃣ 스택(Stack)이란?

  • 자료구조의 한 종류
  • '마지막에 들어온 것이 가장 먼저 나간다'라는 LIFO (Last In, First Out) 구조
    • 접시를 쌓아두는 것과 비슷하다. 위에 올린 접시부터 꺼내게 되는.

중요한 건 자바 프로그램 실행에서도 이 개념이 그대로 쓰인다.

 

흐름 간단 설명

  • 메서드가 호출될 때마다 호출 정보(변수, 매개변수, 실행 위치 등)가 '호출 스택(Call Stack)'에 쌓임.
  • 메서드 실행이 끝나면 해당 스택 프레임이 제거된다

2️⃣ 스택 트레이스(Stack Trace)란?

예외 발생 과정에서 호출된 메서드들의 순서와 위치 정보를 나타내는 것.

 

출력된 스택 트레이스 예외가 발생한 지점부터 호출 스택의 상위 메서드들까지의 정보를 담고 있으며,

메서드의 이름, 클래스명, 파일명, 라인 번호 등의 정보를 포함한다.

 

👍🏻 장점

스택 트레이스는 예외가 발생한 원인을 추적하고 디버깅하는 데 매우 유용하다.

 

당연한 것이 예외가 발생한 위치와 호출된 메소드들의 순서를 통해 프로그램의 실행 흐름을 파악할 수 있기 때문에

이를 통해 문제의 원인을 분석하고 해결할 수 있다.

 


3️⃣ 스택 트레이스를 출력하는 방법

 try-catch 구문 사용

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    e.printStackTrace();  // 스택 트레이스 출력
}

 

 try-catch 구문없이 실행

int result = 10 / 0;  // 프로그램 종료 + 스택 트레이스 자동 출력

 

 

 

이어서 스택 트레이스를 읽는 방법을 알아보도록 하자


4️⃣ 스택 트레이스 예시와 읽는 방법

스택 트레이스를 확인하기 위한 예시코드 (나누기 부분에서 예외발생)

public class Example {
    public static void main(String[] args) {
        a();
    }
    static void a() {
        b();
    }
    static void b() {
        int x = 1 / 0;  // 0으로 나누기 예외 발생
    }
}

 

위 코드를 실행 시 아래와 같은 스택트레이스가 나타나게 된다.

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Example.b(Example.java:11)
    at Example.a(Example.java:7)
    at Example.main(Example.java:3)

 

📌 출력 결과 및 읽는 방법

  • 스택 트레이스는 위 → 아래 순서로 읽으면 예외가 발생한 지점”부터 시작해서 어떤 메서드들을 거쳐 올라왔는지를 확인할 수 있다.

간단하게 설명하자면 

  • 에러 종류는 스택트레이스의 첫 줄에서 확인.
  • 문제가 터진 코드 위치는 at 뒤를 확인.
  • 콜스택 흐름은 at 줄들을 차례대로 읽기.

자 그럼 바로 실전에 적용해 보자! (위 스택 트레이스 기준으로 하나씩 읽어보자!)

 

1. 맨 위 줄

  • b() 메서드 11번째 줄에서 0으로 나눔 → 에러 발생 원인 지점
at Example.b(Example.java:11)

 

2.  그 위 호출자

  • b() 메서드 11번째 줄에서 0으로 나눔 → 에러 발생 원인 지점
at Example.a(Example.java:7)

 

3.  프로그램 시작점

  • → main()이 a()를 호출한 것이 최초 실행 시작.
at Example.main(Example.java:3)

 


5️⃣ 요약 정리

  • 스택(Stack): LIFO 구조, 자바는 메서드 호출 정보를 스택에 저장.
  • 스택 트레이스(Stack Trace): 예외 발생 시점의 호출 스택 내용(클래스명, 메서드명, 파일명, 라인 번호).
  • 읽는 법:
    • 맨 위 → 실제 예외 발생 지점.
    • 아래로 갈수록 → 예외를 발생시킨 호출 경로.
    • 맨 마지막(main) → 프로그램 시작점.
  • 활용: 예외가 어디서 발생했고, 어떤 호출 흐름을 거쳤는지 빠르게 디버깅 가능.