29.5 함수의 호출 과정 알아보기

지금까지 함수를 만드는 방법을 알아보았습니다. 이번에는 함수 여러 개를 만든 뒤에 각 함수의 호출 과정을 스택 다이어그램(stack diagram)으로 알아보겠습니다. 스택은 접시 쌓기와 같은데 접시를 차곡차곡 쌓고 꺼낼 때는 위쪽부터 차례대로 꺼내는 방식입니다(단, 중간에 있는 접시는 뺄 수 없습니다). 파이썬에서는 접시 쌓기와 방향이 반대인데, 함수가 아래쪽 방향으로 추가되고 함수가 끝나면 위쪽 방향으로 사라집니다.

다음은 덧셈 함수 add와 곱셈 함수 mul이 있고, add 함수 안에서 mul 함수를 호출하는 방식으로 만들어져 있습니다.

function_call.py

def mul(a, b):
    c = a * b
    return c
 
def add(a, b):
    c = a + b
    print(c)
    d = mul(a, b)
    print(d)
 
x = 10
y = 20
add(x, y)


실행 결과

30
200

소스 코드를 알아보기 쉽도록 줄 번호를 붙였습니다. 먼저 파이썬 스크립트를 실행하면 줄 1부터 실행합니다. 여기서 줄 12 y = 20까지 실행하면 전역 프레임(global frame)에는 함수 mul, add 변수 x, y가 들어갑니다(함수 mul, add는 생성만 되었을 뿐 호출이 되지 않은 상태입니다).

그림 29-5 전역 프레임

프레임이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간입니다. 특히 전역 프레임은 파이썬 스크립트 전체에서 접근할 수 있어서 전역 프레임이라 부릅니다.

이제 함수 add를 호출한 뒤 안으로 들어가서 줄 7 print(c)까지 실행하면 다음과 같은 모양이 됩니다. 즉, 함수 add의 스택 프레임이 만들어지고 매개변수 ab 그리고 변수 c가 들어갑니다.

그림 29-6 함수 add의 스택 프레임

여기서 함수 mul을 호출한 뒤 안으로 들어가서 줄 3 return c까지 실행하면 함수 mul의 스택 프레임이 만들어지고 매개변수 ab 그리고 변수 c가 들어갑니다.

그림 29-7 mul 함수의 스택 프레임

이제 줄 9 print(d)까지 실행해서 함수 mul을 끝내고 함수 add로 되돌아 갑니다. 이렇게 하면 mul에서 반환한 반환값 200이 변수 d에 저장되며 add의 스택 프레임에 들어갑니다. 물론 mul은 끝났으므로 스택 프레임도 사라집니다.

그림 29-8 mul 함수가 끝남

그다음에 줄 13 add(x, y)까지 실행해서 함수 add를 끝냅니다. 이렇게 하면 add의 스택 프레임도 사라집니다.

그림 29-9 add 함수가 끝남

지금까지 설명한 과정처럼 함수는 스택(stack) 방식으로 호출됩니다. 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라집니다. 특히 프레임은 스택 안에 있어서 각 프레임을 스택 프레임이라고 부릅니다.

참고로 전역 프레임은 스크립트 파일의 실행이 끝나면 사라집니다.

지금까지 함수를 만드는 방법과 호출하는 방법을 배웠습니다. 앞으로 파이썬 프로그래밍을 하면 함수를 만들고 호출할 일이 많이 생깁니다. 함수는 중요한 부분이므로 함수를 만드는 방법, 반환값을 사용하는 방법, 함수를 호출하는 방법은 꼭 익혀 두기 바랍니다.