C 언어에서 변수의 범위(scope)는 어떻게 결정될까요? 이 글에서는 C에서 변수의 스코프가 지정되는 방식을 예제와 함께 살펴보겠습니다.
정적 범위(Static Scope)란?
C 언어의 변수는 항상 정적 범위(static scope), 즉 렉시컬 스코프(lexical scope) 규칙을 따릅니다. 정적 범위란 변수의 바인딩(binding)이 프로그램의 소스 코드 텍스트만으로 결정된다는 의미입니다.
즉, 어떤 변수 이름이 실제로 어느 변수를 가리키는지는 프로그램 실행 중의 함수 호출 스택과는 무관하며, 코드 작성 시점의 구조에 따라 고정됩니다.
예제 코드
#include <stdio.h>
int x = 0;
int my_function() {
return x;
}
int my_function2() {
int x = 1;
return my_function();
}
int main(){
printf("The value is: %d\n", my_function2());
}
실행 결과
The value is: 0
결과가 0으로 출력되는 이유
실행 결과는 0입니다. 그 이유는 my_function()이 반환하는 값이 이 함수를 호출한 함수(my_function2)에 전혀 영향을 받지 않기 때문입니다.
my_function() 내부에는 지역 변수 x가 선언되어 있지 않으므로, 이 함수는 항상 전역 변수 x(값 0)를 참조해 반환합니다. 만약 C가 동적 범위(dynamic scope)를 사용하는 언어였다면 호출자인 my_function2()의 지역 변수 x(값 1)가 사용되어 결과가 1이 되었겠지만, C는 정적 범위를 채택하고 있으므로 0이 출력되는 것입니다.