C에서 변수의 범위(scope)는 변수 사용이 가능한 코드의 영역을 정의합니다. 역사적으로, C 언어의 초기 버전부터 지역 및 전역 범위 지원은 프로그램을 구조화하고, 변수 재정의로 인한 오류 수를 줄이며, 코드 가독성을 높이는 데 도움을 주었습니다.
문제: 범위에 대한 올바른 이해와 사용 없이는 변수의 우연한 재정의, 코드 유지 보수 및 확장에 어려움이 발생할 수 있으며, 변수의 명확하지 않은 동작으로 인한 버그가 나타날 수 있습니다.
해결책: 다양한 범위를 올바르게 사용합니다: 블록 범위(중괄호 내), 함수 범위, 파일 범위(static 사용), 전역 범위. 이는 코드의 한 부분이 다른 부분에 미치는 영향을 최소화하고 부작용 가능성을 줄이는 데 도움을 줍니다.
코드 예:
int global_var = 10; void foo() { int block_var = 5; if (block_var > 3) { int inner_var = 2; printf("inner_var: %d\n", inner_var); } // inner_var는 여기서 접근할 수 없음 — 자신의 블럭 외부 }
주요 특징:
포인터를 통해 다른 함수에서 로컬 변수에 접근할 수 있습니까?
로컬 변수의 주소를 반환하는 경우에만 가능하지만, 이는 해당 함수가 완료된 후 로컬 변수의 메모리가 덮어씌워질 수 있으므로 정의되지 않은 동작을 초래합니다.
코드 예:
int* bad_function() { int temp = 42; return &temp; // 위험! }
다른 범위에 동일한 이름의 두 변수를 선언하면 어떻게 됩니까?
가장 가까운 위치의 변수가 동일한 이름을 가진 다른 변수들을 가립니다(스크리닝 규칙). 그러므로 해당 변수를 사용할 때 가까운 변수가 우선적으로 사용됩니다.
코드 예:
int value = 100; // 전역 void foo() { int value = 10; // 지역, 전역을 가림 }
static 지정자가 다양한 선언 위치에서 변수의 범위에 미치는 영향은 무엇입니까?
함수 내의 변수를 위해 static이 사용되면 함수 호출 간 값이 유지되는 지역 변수로 변환됩니다(블록 범위 시간 및 블록 가시성). 전역 변수에 대해 static이 사용되면 가시성이 현재 파일로 제한됩니다(file scope).
큰 프로젝트에서 모든 변수가 전역으로 선언됩니다. 누군가 다른 함수에서 전역 변수를 우연히 재정의하고, 함수 호출 순서에 따라 프로그램이 잘못 작동합니다.
장점:
단점:
각 함수에서 지역 변수만 사용하고, 필요한 데이터는 함수 인자를 통해 전달됩니다.
장점:
단점: