저장소 바인딩과 수명

함수가 끝나면 그 안의 변수는 어떻게 될까?

할당과 해제

칸을 받아서 돌려줄 때까지가 수명

변수가 메모리 칸에 묶이는 것을 저장소 바인딩이라고 합니다. 쓸 수 있는 칸 가운데 하나를 받는 것이 할당(allocation), 다 쓴 칸을 돌려주는 것이 해제(deallocation)입니다. 할당에서 해제까지가 변수의 수명(lifetime)입니다.

수명으로 나누면

수명으로는 넷, 놓이는 곳은 셋

변수는 수명에 따라 넷으로 나뉩니다. 정적, 스택 동적, 명시적 힙 동적, 묵시적 힙 동적 변수입니다. 칸이 놓이는 곳은 셋입니다. 정적 영역은 그대로인 칸, 스택은 쌓았다 걷는 칸, 힙은 필요할 때 받는 칸입니다.

스택(stack)은 쌓는다는 뜻입니다. 구역 그림은 이해를 돕기 위한 것입니다.

① 정적 변수

처음부터 끝까지 한 칸

정적 변수(static variable)는 실행 전에 칸에 묶이고, 프로그램이 끝날 때까지 같은 칸을 씁니다. C에서 함수 안에 static을 붙인 변수가 그 예입니다. 함수가 끝나도 칸이 남아 있어 앞 호출의 값을 기억합니다.

예시 코드입니다. count++는 count를 1 늘립니다. 칸의 주소가 정해져 있어 곧바로 찾아가므로 빠릅니다.

정적 변수의 약점

한 칸뿐이라 재귀가 안 됩니다

변수가 모두 정적이면 재귀를 쓸 수 없습니다. 재귀는 함수가 자기 자신을 다시 부르는 것이고, 호출마다 값을 따로 가져야 합니다. 정적 변수는 모든 호출이 한 칸을 함께 써서, 뒤 호출이 앞 호출의 값을 덮어씁니다.

예시입니다. f(3)은 3을 넣어 f를 부른다는 뜻입니다.

② 스택 동적 변수

부를 때마다 새 칸

스택 동적 변수(stack-dynamic variable)는 선언문이 실행될 때 칸에 묶입니다. 함수 안의 선언문은 함수가 불릴 때 실행됩니다. 그래서 함수가 불리면 지역 변수의 칸이 스택에 생기고, 끝나면 사라집니다. 호출마다 새 칸이라 재귀를 쓸 수 있습니다.

C에서 static이 없는 지역 변수, Java 메서드(함수)의 지역 변수가 이 방식입니다. 타입은 실행 전에, 칸의 주소만 실행 중에 묶입니다.

견주기

하나를 얻으면 하나를 내줍니다

정적 변수는 빠르고 앞 호출의 값을 기억하지만 재귀가 안 됩니다. 스택 동적 변수는 재귀가 되고 메모리를 아끼지만, 호출 때마다 칸을 받고 돌려주는 비용이 듭니다.

스택 동적 변수의 칸은 주소가 실행 중에 정해져 한 번 거쳐서 찾습니다. 이것을 간접 주소 지정이라고 합니다.

다음 편

실행해 봐야 크기를 아는 데이터는 어디에 둘까요?

6편필요할 때 받아 쓰는 칸 4강 목록