변수의 영역
1. 핵심 개념: 변수의 범위 (Variable Scope)
변수의 범위는 변수가 선언된 위치에 따라 프로그램 내에서 해당 변수에 접근하고 사용할 수 있는 영역을 의미합니다.
C 언어에서는 크게 두 가지 주요 변수 범위가 있습니다: 지역 변수와 전역 변수.
1.1. 지역 변수 (Local Variables)
-
정의:
함수 내부 또는 블록 안에서 선언되는 변수입니다. -
유효 기간:
선언된 함수나 블록이 종료되면 소멸됩니다. -
유효 범위:
해당 함수 또는 블록 내에서만 유효합니다. -
예시:
main()
함수 내에서 선언된 변수는main()
이 종료될 때까지,
중괄호{}
블록 내에서 선언된 변수는 해당 블록이 종료될 때까지 유효합니다. -
중요:
저장된 주소가 다르면 변수의 이름이 같아도 다른 값을 가집니다.
즉, 다른 블록 내에서 동일한 이름의 지역 변수를 선언할 수 있으며, 이들은 서로 독립적인 변수로 취급됩니다.
1.2. 전역 변수 (Global Variables)
-
정의:
함수 외부에서 선언하여 프로그램의 어느 곳에서든 접근할 수 있는 변수입니다. -
유효 기간:
프로그램이 종료될 때까지 유효합니다. -
유효 범위:
프로그램 전체에서 유효하며, 모든 함수에서 공유하여 사용할 수 있습니다.
2. 핵심 개념: 변수의 저장 유형 지정자 (Storage Class Specifiers)
저장 유형 지정자는 변수의 저장 방식, 유효 범위, 생존 기간을 제어합니다.
2.1. auto
- 특징:
보통 생략되며, 지역 변수 선언 시 사용됩니다. (지역 변수의 기본 저장 유형) - 작동 방식:
함수나 블록이 실행될 때 메모리가 할당되고, 종료 시 해제됩니다.
2.2. static
- 특징:
- 지역 변수가 정적으로 변환됨
- 프로그램 종료 전까지 변수의 변경된 값을 저장함
- 함수가 여러 번 호출되어도 값이 유지됨
- 작동 방식:
한 번 초기화된 후 함수 호출이 끝나도 값이 유지됩니다.
(특정 함수의 호출 간에 상태를 유지해야 할 때 유용)
2.3. register
- 특징:
변수가 CPU 레지스터에 저장되어 빠르게 처리됨 - 작동 방식:
컴파일러에게 해당 변수를 가능한 한 CPU 레지스터에 저장하도록 요청
(실제 레지스터에 저장될지는 컴파일러의 판단에 따름)
3. 코드 예시 분석
아래 코드는 변수의 범위와 저장 유형 지정자의 동작을 명확하게 보여줍니다.
#include <stdio.h>
int i = 1; // 1) 전역 변수
int main() {
int i = 1; // 2) 자동 변수 (main 함수의 지역 변수)
printf("첫번째 i=%d\n", i); // main 내의 i 출력 (값: 1)
{
register int i = 2; // 3) 레지스터 변수 (블록 내의 지역 변수)
printf("두번째 i=%d\n", i); // 블록 내의 i 출력 (값: 2)
}
printf("첫번째 i=%d\n", i); // 블록을 벗어나면 다시 main 내의 i 출력 (값: 1)
return 0;
}
void iChange() {
static int i = 1; // 4) static 변수 (iChange 함수의 지역 변수, 값이 유지됨)
printf("i=%d\n", i);
i++;
}
void iGlobal() {
printf("global i= %d\n", i); // 전역 변수 i에 접근 (값: 1)
}
예시 설명
- 전역 변수
i=1
: 프로그램 전체에서 유효.iGlobal()
함수에서 접근 가능 - main 함수 내의 지역 변수
i=1
: main 함수 내에서만 유효, 전역 변수와 이름이 같아도 다른 메모리 공간 사용 - 블록 내의 지역 변수
register int i=2
: 해당 블록 내에서만 유효, 블록을 벗어나면 소멸 - iChange 함수 내의 static 변수 : 함수 내에서만 유효하지만, static 덕분에 함수 호출이 끝나도 값이 유지됨
4. time.h
라이브러리 (참고)
C 언어에서 날짜와 시간을 얻거나 조작할 수 있는 표준 라이브러리입니다.
- 주요 함수
clock()
: 프로그램 시작부터 경과된 시간을 밀리초(ms) 단위로 반환time_t time()
: 현재 시간을 타임스탬프(Unix epoch 이후 초 단위)로 반환
정보 업데이트 로그 등에 적합합니다.
5. 결론
변수의 **유효 범위(지역/전역)**와 **저장 유형 지정자(auto, static, register)**는
C 프로그래밍에서 변수의 생명주기, 접근성 및 성능을 제어하는 데 필수적인 개념입니다.
- 지역 변수는 함수나 블록 내에서 독립성을 보장
- 전역 변수는 프로그램 전체에서 공유되는 데이터를 다룰 때 사용
- static, register와 같은 저장 유형 지정자는 특정 변수에 대한 저장 방식과 생존 기간을 세밀하게 제어
이들을 이해하고 적절히 활용하는 것은 효율적이고 안정적인 코드를 작성하는 데 매우 중요합니다.