식별자의 가시성 범위는 프로그램에서 변수, 함수 또는 기타 엔티티가 어디에서 접근 가능한지를 정의하는 기본 개념입니다. 가시성 관리는 풍부한 역사를 가지며, C의 초기 구현부터 잘못된 가시성 사용은 재정의, 예상치 못한 동작 및 링킹 오류와 같은 잡기 힘든 오류를 초래했습니다.
C는 원래 작은 프로젝트를 위해 설계되었으며, 모든 프로그램이 하나의 파일에 작성되었습니다. 언어의 발전과 함께 프로그램의 다양한 부분에 대한 변수/함수를 명확하게 구분할 필요성이 생기면서 가시성 범위가 형식화되었고, 이는 블록, 파일 및 전역 가시성으로 구분됩니다.
적절하게 조직된 가시성 범위가 없으면 변수 값을 잘못 변경하거나, 이름 충돌이 발생하거나, 프로그램 구조에 대한 제어를 잃을 수 있습니다. "그림자" 변수를 사용한 오류와 전역 정의의 로컬 재정의는 버그의 일반적인 원인입니다.
C에서 가시성 범위는 다음과 같습니다:
{ ... } 내부에서 접근 가능하며 (예: 함수나 루프에서) 블록 외부에서는 변수가 "잊혀집니다".코드 예시:
#include <stdio.h> int global = 10; // 전역 가시성 void foo() { int block_var = 5; // 블록 가시성 static int static_file_var = 0; // 파일 가시성, 만약 static이 함수 밖에 있다면 printf("%d\n", block_var); } int main() { printf("%d\n", global); // 전역 변수 접근 가능 foo(); // printf("%d\n", block_var); // 오류: block_var는 접근 불가능 return 0; }
주요 특징:
1. 전역 변수와 함수 매개변수의 이름이 동일할 경우 함수 내에서 무엇이 사용되나요?
함수가 매개변수로 전역 변수를 "그림자"로 만들므로 함수 내에서는 매개변수의 값이 사용됩니다. 전역 변수는 다른 이름으로만 접근 가능합니다 (이름이 겹치지 않은 경우).
2. 함수 내부와 외부의 static의 가시성은 동일한가요?
아니요! 함수 내부의 static (static local) 변수가 호출 사이에 값을 유지하지만 오직 그 함수 내에서만 보입니다. 함수 외부의 static은 변수/함수의 가시성을 현재 파일로 제한합니다.
코드 예시:
static int a = 0; // static 파일 범위 void foo() { static int b = 0; // static 로컬 범위 }
3. 전역 변수와 일치하는 로컬 변수 이름을 사용할 수 있나요?
예, 그러나 이는 현재 블록 내에서 전역 변수를 "그림자"로 만들게 됩니다. 이는 잘못된 값에 대한 접근으로 인해 오류를 발생시킬 수 있습니다.
코드 예시:
int var = 10; void f() { int var = 20; printf("%d", var); // 20을 출력, 전역 변수는 보이지 않음 }
프로젝트가 2개의 파일로 나누어져 있습니다. 두 파일에 동일한 전역 변수가 static/extern 없이 선언됩니다. 링커는 오류를 발생시키거나 프로그램은 예기치 않은 값으로 실행됩니다.
장점:
단점:
명시적으로 static과 extern을 사용하며, 변수가 별도의 헤더로 나뉘어지고 명명 규칙이 설명되어 있습니다.
장점:
단점: