C 언어에서 변수의 저장 영역은 데이터가 저장되는 위치, 접근 가능한 시간 및 어떤 코드 영역이 이를 참조할 수 있는지를 결정합니다. 역사적으로 auto(로컬 변수를 위한 기본값), static(호출 간에 값을 유지, 상태 저장에 자주 사용됨) 및 extern(어디선가 정의된 변수를 선언함)은 변수의 가시성과 생명 주기를 제어하기 위해 도입되었습니다.
문제 — 변수가 어디에서 얼마 동안 존재하는지 잘못 이해하면 접근 오류, 메모리 누수 및 읽기 어려운 코드로 이어질 수 있습니다. 예를 들어, 로컬 static 변수가 함수 호출 시마다 재생성되리라 잘못 기대하거나, 반대로 auto 변수가 호출 간에 값을 유지할 것이라고 잘못 생각할 수 있습니다.
해결책 — 항상 저장 지정자를 의식적으로 선택하고 그 결과를 이해해야 합니다:
사용 예:
// main.c int global_var = 42; // 기본적으로 static 저장 영역을 가짐, 외부 링크 void func() { static int counter = 0; // 호출 간에 존재함 auto int temp = 5; // 로컬, auto는 명시적으로 작성할 필요 없음 counter++; printf("call #%d ", counter); } extern int global_var;
주요 특징:
왜 auto를 작성해야 하나요, 변수는 기본적으로 auto 아닌가요?
답변: 현대 C 버전에서는 auto 키워드를 명시적으로 거의 사용하지 않으며, 로컬 변수는 기본 지정자입니다. 일반적으로 이를 명시적으로 작성하는 것은 아무런 이점을 주지 않습니다.
함수 내에서 static을 사용하여 전역 변수를 선언할 수 있나요?
답변: 아니요, 함수 내에서의 static은 변수를 로컬로 만들지만 호출 간에 상태를 유지합니다. 함수 외부에서는 보이지 않습니다.
코드 예:
void foo() { static int call_count = 0; // 전역이 아니지만 호출 간에 존재함 call_count++; }
함수 내에서 변수를 extern으로 선언했지만 어디에도 정의하지 않으면 어떻게 되나요?
답변: 이는 링커 오류를 초래할 것입니다. 존재하지 않는 전역 변수에 대한 참조가 선언되었기 때문입니다.
대규모 프로젝트에서 모듈 변수를 모든 소스 파일에 extern으로 선언했지만, 정의하는 것을 잊었습니다. 그 결과, 초보 개발자에게는 불명확한 연결 오류가 발생했습니다.
장점:
단점:
가시성을 엄격하게 정의했습니다: 각 static 변수는 필요한 모듈 내에서만, 글로벌 extern은 헤더에 선언하고 한 곳에서만 정의했습니다.
장점:
단점: