지역 참조 환경

함수를 다시 부르면, 지난번 지역 변수의 값은 남아 있을까?

지역 변수

서브프로그램 안에서만 쓰는 변수

서브프로그램 안에서 선언한 변수가 지역 변수입니다. 서브프로그램마다 자기만의 지역 참조 환경(local referencing environment)을 가집니다. 지역 변수의 칸을 만드는 방법은 둘입니다.

참조 환경은 어떤 문장에서 보이는 모든 이름의 모음(4강), 칸은 값을 담는 메모리 칸입니다. 예시 코드입니다.

① 스택 동적 지역 변수

부를 때 생기고 끝나면 사라집니다

스택 동적 지역 변수(stack-dynamic local variable)는 서브프로그램이 불릴 때 칸이 생기고 끝나면 사라집니다. 다시 부르면 값이 처음부터 시작합니다.

스택은 함수가 불리면 칸이 쌓이고 끝나면 걷히는 메모리 구역입니다(4강). 예시 코드입니다.

② 정적 지역 변수

칸이 남아 값이 이어집니다

정적 지역 변수(static local variable)는 칸이 실행 전에 정해지고 프로그램이 끝날 때까지 남습니다. 호출이 끝나도 값이 그대로여서, 호출 횟수를 세는 데 쓸 수 있습니다.

앞 호출의 값을 기억하는 이 성질을 이력 민감성(history sensitivity)이라고 합니다. 정적 영역은 실행 내내 그대로인 메모리 구역입니다.

스택 동적의 장점

호출마다 따로, 쓸 때만 차지

스택 동적 방식은 호출마다 새 칸이 생겨 재귀를 지원합니다. 재귀는 함수가 자기 자신을 다시 부르는 것입니다. 또 실행 중이 아닌 서브프로그램은 칸을 차지하지 않아, 여러 서브프로그램이 저장 공간을 함께 씁니다.

예시입니다. f(3)은 3을 넘겨 f를 부른다는 뜻이고, A와 B는 서브프로그램의 이름입니다.

견주기

장단점이 정반대입니다

스택 동적 방식의 단점은 셋입니다. 부를 때마다 칸을 할당하고 초기화하는 시간이 들고, 칸을 한 번 거쳐서 찾아야 하며, 앞 호출의 값을 기억하지 못합니다. 정적 지역 변수는 장단점이 이와 반대입니다.

할당은 쓸 칸을 받는 것입니다. 칸의 주소가 호출 때 정해져 한 번 거쳐서 찾는 것을 간접 주소 지정이라고 합니다(4강).

언어마다

대부분은 스택 동적입니다

요즘 언어 대부분에서 지역 변수는 스택 동적입니다. C 계열 언어(C와 거기서 나온 C++ 등)는 기본이 스택 동적이고 static을 붙이면 정적이 됩니다. C++, 자바, 파이썬, C#의 메서드에는 스택 동적 지역 변수만 있습니다.

메서드는 클래스에 딸린 함수입니다.

다음 편

지역 변수 다음은 매개변수입니다. 값은 어느 방향으로 건너갈까요?

5편sub(x)를 부르면 x가 바뀔까? 8강 목록