🏷️C언어의 scope (통용 범위)
- 프로그램 소스 내에서 선언된 명칭이 보이는(사용 가능한) 범위를 의미한다.
- 🖇️cf. 명칭은 흔히 식별자(identifier)라고 불리지만, 필자는 보통 명칭이라는 표현을 사용한다.
- 스코프는 모든 명칭에 적용되는 개념이며, 기본적으로 해당 명칭의 선언이 위치한 곳에 따라 결정된다.
- 매크로명과 매크로 함수의 매개변수명 역시 스코프를 갖지만, 여기서 정리하는 개념은 매크로 관련 스코프에는 적용되지 않는다.
- 모든 명칭의 스코프는 그 명칭을 선언하는 선언자(declarator)의 끝에서부터다.
- 🖇️cf. 선언자란 일단은 명칭이라고 알아두면 된다.
C언어의 선언은 어려운 편에 속해서, 나중에 따로 정리할 예정이다.
- 스코프는 웬만한 프로그래밍 언어라면 모두 갖고 있는 개념이기에, C언어로 깊게 공부해 두면 타 언어를 공부할 때 큰 도움이 된다.
- 4가지 스코프가 있지만, C프로그램에서 실질적으로 정보 은닉의 효과가 있고, 프로그래머가 사용할 수 있는 스코프는 사실상 파일 스코프와 블록 스코프 뿐이다.
- C언어가 정의하고 있는 스코프의 종류는 다음과 같다.
📌1. function scope (함수 스코프)
- goto문을 위한 레이블(label)명의 스코프를 의미한다.
- 레이블명의 스코프는 선언의 위치뿐만 아니라, 레이블만의 독특한 문법적 형태에 따라 결정된다.
- 레이블명은 레이블명이 출현하는 함수 전체를 무조건 스코프로 갖는다.
- 🔍ex)
label:
...
goto label;
📌2. file scope (파일 스코프)
- 명칭이 모든 블록의 바깥쪽에 선언될 경우, 그 명칭은 선언된 위치부터 그 프로그램 소스의 끝까지 보이는 파일 스코프를 갖는다.
- 🖇️cf. 블록은 간단하게 설명하면, 중괄호(
{}
)가 둘러쌓고 있는 부분이다.
(사실, 블록이 아니어도 중괄호가 나올 수는 있기에 완벽한 설명은 아니다.)
- 흔히 전역변수라고 설명되기도 하지만, C표준에서는 file scope라는 용어를 사용한다.
- 🔍ex) 다음 코드에서, 명칭 pci가 file scope를 갖는다.
const int *pci;
int main(void)
{
...
}
📌3. block scope (블록 스코프)
- 명칭이 블록 안에서 선언되는 경우, 선언된 위치부터 해당 블록을 닫는 중괄호가 나올 때까지 보이는 블록 스코프를 갖는다.
- 블록이 중첩되어 있는 경우 안쪽 블록을 inner scope, 바깥쪽 블록을 outer scope라고 한다.
- 함수의 매개변수로 선언되는 대상체들의 스코프 역시 블록 스코프를 갖는다.
- 🖇️cf. 대상체(object)는 흔히 변수(variable)라고 불린다.
- 명칭의 스코프가 각각 다른 곳에서 시작 할 지라도, 스코프가 끝나는 위치가 같으면 같은 스코프라고 약속하자.
- 🖇️cf. 엄밀히 따지면 시작점이 다르기 때문에 다른 스코프지만, 위와 같이 정의하는 것이 공부 할 때 편하다.
- 흔히 지역변수라고 설명되기도 하지만, C표준에서는 block scope라는 용어를 사용한다.
- 🔍ex) 명칭
a
가 block scope를 갖는다.
{
unsigned int counter = 0;
}
📌4. function prototype scope (함수 원형 스코프)
- 함수 원형선언에서 소괄호 안에 선언된 매개변수의 명칭이 갖는 스코프는 명칭이 선언된 직후에 시작하여, 매개변수의 선언이 종료되는 닫는 괄호(
)
)에서 끝난다.
- 🔍ex)
void strcpy(char *dst, const char *src);
- 위 선언에서 명칭
dst
의 scope는 보라색으로 표시한 영역이다.
- void strcpy(char *dst, const char *src);
- 🖇️cf. 위 예시에서 첫 번째 매개변수 선언의 선언자는
*dst
다.