알고리즘/알고리즘 이론

스택프레임 이란?

정헤이 2024. 2. 19. 13:10
public void solution(int n) {
    if(n==0) return;
    else{
        System.out.print(n+" "); //Line 1
        solution(n-1); //Line 2

    }
}
public static void main(String[] args) {
    Main M = new Main();
    Scanner kb = new Scanner(System.in);
    int n = 5;
    M.solution(n);
}

위와 같은 코드일 때, 결괏값은

Output:  5 4 3 2 1 

이다. 예상한 결과이다. n이 5일 때 solution() 함수는 5가 0이 될 때까지 재귀함수를 호출하며 0이 되면 종료된다.

 

그렇다면

public void solution(int n) {
    if(n==0) return;
    else{
        solution(n-1); //Line 1
        System.out.print(n+" "); //Line 2

    }
}

이번에는 solution() 함수에 n이 0이 되면 종료되는 것은 똑같지만 재귀호출을 먼저 실행하고 그다음 n을 출력하도록 코드의 순서를

바꿨다. 그랬더니 결과가

Output: 1 2 3 4 5

가 나왔다. 처음 이 결과를 보고 왜 이 결과가 나왔는지 이해되지 않았다.

이렇게 결과가 나온 이유는 스택프레임이라는 개념 때문이다.

 

스택프레임 이란?

스택프레임이란 함수가 실행될 때 스택형태로  메모리에 저장되는데 함수의 매개 변수, 복귀 주소값, 지역 변수 등이 있지만 중요한 3가지만 기억하면 된다.

위 코드로 예시를 들어보면. n이 5일 때.

main에서 M.solution(n); 을 최초 실행하면 스택프레임에는 아래와 같이 되어있을 것이다. (스택을 표로 표현)

 

매개변수 복귀주소 지역변수
n : 5 Line 1  

n==0은 false기에 else문으로 가면

solution(n-1); 이 실행된다. 이때 스택프레임에는 함수가 실행되는 순서대로 스택형태로 정보가 push 된다.

 

매개변수 복귀주소 지역변수
n : 5 Line 1  
n : 4 Line 1  

 n이 0이 될 때까지 반복한다면 최종적으로는 아래와 같은 형태가 될 것이다.

매개변수 복귀주소 지역변수
n : 1 Line 1  
n : 2 Line 1  
n : 3 Line 1  
n : 4 Line 1
 
n : 5 Line 1  

자 스택최상단인 n:1을 보면 복귀주소가 Line 1이기 때문에 그다음라인인

System.out.print(n+" "); //2

을 실행해야 한다. 그렇다면 결과는 1 이 될 것이다.

1 출력이 실행되고 나면 그다음 라인은 존재하기 않기에 스택에서 pop()될 것이고. 이게 계속 반복되면 결국 

1 2 3 4 5 가 출력되는 것이다.

이 개념을 잘 알고 있어야. 추후 DFS와 같은 알고리즘 개념에서 헤매지 않을 것 같다.