
C언어 변수의 종류에는 지역, 전역, 정적 변수가 있습니다. 사용 범위 및 메모리 존재 기간이 각자 다르므로, 이 점에 집중해서 공부해봅시다.
auto 예약어를 사용해야 하지만, 생략할 수 있음#include <stdio.h>
void other(void);
int main(void){
int a = 0; // 지역 변수 a
other();
printf("main 함수의 a: %d\n", a);
return 0;
}
void other(void){
int a = 10; // 지역 변수 a (main에서 선언된 a와 다름)
printf("other 함수의 a: %d\n", a);
}
// [출력]
// other 함수의 a: 10
// main 함수의 a: 0
main 함수와 other 함수에 같은 이름의 변수 a가 사용됐지만, 함수가 다르므로 문제 없음main 함수 내에선 main에서 할당된 변수 a만 사용 가능other 함수 내에선 other에서 할당된 변수 a만 사용 가능a는 독립된 저장 공간을 가지므로, other 함수가 호출돼도 main의 a의 값은 바뀌지 않음(), { })int i = 555;
for (int i = 0; i < 3; i++){
printf("%d\n", i);
}
// [출력 (블록 내부에서 선언된 i 출력)]
// 0
// 1
// 2
printf("%d\n", i);
// [출력 (블록 외부에서 선언된 i 출력)]
// 555
i가 아닌 내부에서 선언된 i를 사용0부터 시작해 1, 2를 출력i는 반복문이 종료된 후 사용될 수 없으며, 할당된 저장공간도 회수됨i를 출력하면, 외부에서 선언된 i의 값을 출력#include <stdio.h>
int num; // 전역변수
void set(int newNum);
int main(void){
// 전역변수는 초기화하지 않아도 0으로 초기화됨
printf("%d\n", num); // [출력] 0
set(10);
printf("%d\n", num); // [출력] 10
set(20);
printf("%d\n", num); // [출력] 20
return 0;
}
void set(int newNum){
num = newNum; // 전역변수 num에 매개변수 newNum의 값 대입
}
num의 값은 선언한 위치 이후 어디서든 쓸 수 있음main 함수든, set 함수든 상관없음#include <stdio.h>
int a = 10; // 전역변수
void function(void);
int main(void){
printf("%d\n", a); // 10 (전역변수 a 출력)
function();
return 0;
}
void function(void){
int a = 20;
printf("%d\n", a); // 20 (지역변수 a 출력)
}
static 예약어를 사용하면, 정적 지역 변수가 됨#include <stdio.h>
void auto_f(void){
int a = 0; // 일반 지역 변수
a++; // a의 값에 1을 더함
printf("%d ", a); // a를 출력
}
void static_f(void){
static int a; // 정적 지역 변수 (선언만 해도 0으로 초기화)
a++; // a의 값에 1을 더함
printf("%d ", a); // a를 출력
}
int main(void){
for (int i = 0; i < 3; i++) auto_f(); // 1 1 1
printf("\n");
for (int i = 0; i < 3; i++) static_f(); // 1 2 3
return 0;
}
auto_f의 일반 지역변수 a는 호출할 때마다 0으로 초기화됨static_f의 정적 지역변수 a는 초기화하지 않으면 0으로 자동 초기화됨다음 문장에서 설명이 틀린 것을 모두 고르세요.
- 지역 변수는 선언된 함수가 반환되면, 할당된 저장 공간이 자동으로 회수된다.
- 전역 변수와 정적 변수는 프로그램이 실행되는 동안 계속 저장 공간을 유지한다.
- 정적 지역 변수와 전역 변수는 변수의 사용 범위가 같다.
auto를 사용한 지역 변수는 저장 공간 할당과 동시에 0으로 자동 초기화된다.
- 하나의 함수 내에서는 같은 이름의 변수를 선언할 수 없다
- 전역 변수와 지역 변수는 같은 이름을 사용할 수 있으나 전역 변수에 우선권이 있다