정적 할당과 재귀
자기 자신을 부를 수 없는 함수가 있었다면, 왜 그랬을까?
활성 레코드의 모양
단순 서브프로그램은 세 영역
단순 서브프로그램의 활성 레코드는 세 영역입니다. 위에서부터 지역 변수, 매개변수, 반환 주소입니다.
활성 레코드는 2편에서 본, 서브프로그램의 데이터를 어떤 순서로 둘지 정한 형식입니다. 그 형식대로 값이 담긴 실제 칸 묶음이 인스턴스입니다. 2편의 상태 정보 같은 것은 그림에서 뺐습니다.
메모리 배치
함수마다 인스턴스가 딱 하나
단순 서브프로그램은 활성 레코드 인스턴스의 자리를 실행 전에 정해 둡니다. 함수마다 하나씩입니다. 이것이 정적 할당(static allocation)입니다.
main은 프로그램이 시작하는 함수라 호출자가 없어 지역 변수 칸만 있습니다. 함수 이름은 예시입니다.
정적 할당
몇 번을 불러도 같은 칸
호출해도 새 칸이 생기지 않습니다. 같은 칸에 이번 호출의 값을 다시 적을 뿐입니다. 앞 호출이 다 끝난 뒤라면 문제가 없습니다.
fun1(2)는 2를 넣어 fun1을 부른다는 뜻입니다. 넣은 값은 예시입니다.
재귀
끝나기 전에 또 부르면
재귀는 한 호출이 끝나기 전에 같은 함수를 또 부릅니다. 칸이 하나뿐이면 뒤 호출이 앞 호출의 값을 덮어씁니다. 돌아와 보면 앞 호출의 값은 사라지고 없습니다.
factorial은 이 강의가 따르는 교재의 예제입니다. n × factorial(n − 1)을 계산하려고 자기 자신을 부릅니다.
그래서
호출마다 따로 가져야 합니다
재귀를 하려면 호출마다 매개변수와 지역 변수를 따로 가져야 합니다. 그러려면 인스턴스를 실행 전에 하나만 잡아 둘 수 없고, 호출할 때마다 새로 만들어야 합니다.
다음 편