C 언어에서 스코프(scope) 규칙은 변수가 프로그램 내에서 어떻게 다루어지는지를 결정하는 핵심 개념입니다. 스코프 규칙과 관련된 주요 요소는 다음과 같습니다.
- 변수에 대한 접근 가능 여부
- 변수가 존재하는 기간(생명 주기)
- 변수를 사용할 수 있는 경계(유효 범위)
함수와 관련된 스코프 규칙
- 함수는 특정 작업을 수행하는 독립적인(self-contained) 코드 블록입니다.
- 함수 본문 내부에서 선언된 변수를 지역 변수(local variable)라고 합니다.
- 지역 변수는 해당 변수를 생성한 특정 함수 내부에서만 존재하며, 다른 함수나 main 함수에서도 접근할 수 없습니다.
- 함수가 자신의 작업을 완료하고 호출 지점으로 반환되는 순간, 지역 변수의 존재도 함께 소멸합니다.
예제 1 – 지역 변수를 사용한 스왑 함수
다음은 함수와 관련된 스코프 규칙을 보여주는 C 프로그램입니다.
#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 함수 호출 후에도 값이 바뀌지 않았습니다. 그 이유는 C 언어가 기본적으로 값에 의한 호출(call by value) 방식을 사용하기 때문입니다. 즉, main 함수의 a와 b 값이 swap 함수의 매개변수에 복사될 뿐이며, swap 함수 내부의 a, b는 서로 다른 지역 변수입니다. 따라서 함수 내부에서 값을 교환해도 원본 변수에는 아무런 영향을 주지 못합니다.
전역 변수(Global Variable)
- 함수 본문 외부, 즉 모든 함수 바깥에서 선언된 변수를 전역 변수(global variable)라고 합니다.
- 전역 변수는 프로그램 내 어떤 함수에서든 접근하고 수정할 수 있습니다.
예제 2 – 전역 변수를 사용한 스왑 함수
다음은 전역 변수를 활용한 스코프 규칙 예제입니다.
#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
이번에는 swap 함수 호출 후 값이 실제로 교환되었습니다. a와 b가 함수 외부에 선언된 전역 변수이므로, swap 함수가 직접 원본 데이터에 접근하여 값을 변경할 수 있기 때문입니다.
정리
지역 변수는 선언된 함수 안에서만 유효하며 함수 종료 시 소멸하지만, 전역 변수는 프로그램 전체에서 접근 가능하고 프로그램이 실행되는 동안 유지됩니다. 다만 전역 변수를 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있으므로, 필요한 경우에만 신중하게 사용하는 것이 좋습니다.