지역 범위(Local Scope)
지역 범위란 특정 블록(중괄호 {}로 묶인 영역) 내부에서 선언된 변수가 그 블록 안에서만 유효하고, 블록 외부에서는 접근할 수 없음을 의미합니다.
전역 범위(Global Scope)
전역 범위란 블록 외부, 즉 모든 함수 바깥에서 선언된 변수가 프로그램이 종료될 때까지 어디서든 접근 가능함을 의미합니다.
예제 코드
#include<stdio.h>
int r = 50; /* 전역 영역 */
main() {
int p = 30;
printf("p=%d, r=%d", p, r);
fun();
}
fun() {
printf("r=%d", r);
}
출력 결과
p =30, r = 50
r = 50
위 예제에서 변수 p는 main() 함수 내부에 선언된 지역 변수이므로 main() 안에서만 사용할 수 있습니다. 반면 변수 r은 전역 변수이기 때문에 fun() 함수처럼 다른 함수에서도 자유롭게 참조할 수 있습니다.
함수와 관련된 범위 규칙
함수(Function)는 특정 작업을 수행하는 문장들이 모여 이루어진 하나의 블록입니다.
함수 본문 내부에서 선언된 변수를 지역 변수(Local Variable)라고 부릅니다.
지역 변수는 자신이 선언된 함수 내부에서만 존재하며, 다른 함수는 물론 main() 함수에서도 접근할 수 없습니다.
지역 변수의 생존 기간은 해당 함수가 자신의 작업을 마치고 호출 지점으로 돌아갈 때까지입니다. 함수가 종료되면 지역 변수도 함께 소멸합니다.
지역 변수를 사용한 예제
#include<stdio.h>
main() {
int a=10, b=20;
printf("before swapping a=%d, b=%d", a, b);
swap(a, b);
printf("after swapping a=%d, b=%d", a, b);
}
swap(int a, int b) {
int c;
c = a;
a = b;
b = c;
}
출력 결과
Before swapping a=10, b=20
After swapping a = 10, b=20
위 예제에서 swap() 함수는 매개변수로 전달받은 a와 b의 값을 서로 교환하지만, 이들은 모두 지역 변수이므로 main() 함수의 a와 b에는 아무런 영향을 주지 못합니다. 따라서 함수 호출 후에도 값이 그대로 유지되는 것을 확인할 수 있습니다.
반면, 함수 본문 외부에서 선언된 변수를 전역 변수(Global Variable)라고 하며, 이러한 변수는 프로그램 내 모든 함수에서 접근할 수 있습니다.
전역 변수를 사용한 예제
#include<stdio.h>
int a=10, b=20;
main() {
printf("before swapping a=%d, b=%d", a, b);
swap();
printf("after swapping a=%d, b=%d", a, b);
}
swap() {
int c;
c = a;
a = b;
b = c;
}
출력 결과
Before swapping a = 10, b =20
After swapping a = 20, b = 10
이번 예제에서는 a와 b가 전역 변수로 선언되었기 때문에 swap() 함수에서 값을 변경하면 main() 함수에서도 변경된 값이 그대로 반영되어 실제로 두 값이 교환됩니다.
정리
C 언어에서 변수의 범위(scope)는 변수가 선언된 위치에 따라 결정됩니다. 함수 내부에 선언된 지역 변수는 해당 함수 안에서만 유효하며 함수가 끝나면 소멸하지만, 함수 외부에 선언된 전역 변수는 프로그램 전체에서 유효합니다. 이 두 가지 변수의 차이를 정확히 이해하면 위 스왑(swap) 예제처럼 같은 코드라도 결과가 왜 달라지는지 명확하게 파악할 수 있습니다.