변수는 선언되는 위치에 따라 **사용할 수 있는 범위(Scope)**와 **메모리에 살아있는 기간(Lifetime)**이 결정됩니다.
1. 지역 변수 vs 전역 변수 vs 정적 변수
| 변수 종류 | 선언 위치 | 유효 범위 (Scope) | 생성 및 소멸 시점 (Lifetime) |
|---|---|---|---|
| 지역 변수 (Local) | 함수 또는 {} 중괄호 내부 |
선언된 {} 블록 내부 |
블록 시작 시 생성, 블록 끝날 때 소멸 |
| 전역 변수 (Global) | 모든 함수 외부 | 프로그램 코드 전체 | 프로그램 시작 시 생성, 종료 시 소멸 |
정적 변수 (static) |
함수 내부 (static 키워드) |
선언된 {} 블록 내부 |
프로그램 시작 시 생성, 종료 시 소멸 (값 유지) |
2. 정적 변수 (static) 의 동작 코드
지역 변수처럼 블록 안에서만 접근 가능하지만, 함수가 끝나도 메모리에서 사라지지 않고 값이 계속 유지됩니다.
#include <stdio.h>
void count_up(void) {
static int count = 0; // 최초 1회만 초기화됨
count++;
printf("방문 횟수: %d\n", count);
}
int main(void) {
count_up(); // 1
count_up(); // 2
count_up(); // 3
return 0;
}
3. 메모리 영역 구증 (Memory Stack / Heap / Data / Code)
- 코드 영역 (Code/Text): 실행할 C 언어 명령어 기계어가 저장되는 영역.
- 데이터 영역 (Data/BSS): 전역 변수와 static 변수가 저장되는 영역.
- 스택 영역 (Stack): 지역 변수와 매개변수가 함수 호출 시 생성되었다 사라지는 공간.
- 힙 영역 (Heap): 동적 메모리 할당으로 사용자가 직접 제어하는 공간.
4. 자주 묻는 질문 (Q&A)
Q. 편하다고 전역 변수를 막 많이 써도 되나요? A. 전역 변수는 어디서나 접근하여 수정할 수 있어 어디서 값이 바뀌었는지 추적하기 힘든 side-effect 오류를 유발합니다. 따라서 꼭 필요한 경우가 아니면 지역 변수를 사용하는 것이 바람직합니다.