목차
- 지역 변수
- 블록과 지역 변수
- 전역 변수
1. 지역 변수
지금까지 사용된 모든 변수는 지역 변수(local variable)입니다.
지역 변수는 이름에서 알 수 있듯이, 함수 내 일정 지역에서만 사용하는 변수입니다.
원래는 auto 예약어와 함께 선언해야 하는데, 그냥 생략해도 자동적으로 붙습니다.
auto라는 이름 답게 자동 변수라고도 부릅니다.
몇 가지 알아두셔야 할 것이 있는데..
- 블록 밖에서는 사용할 수 없다.
- 다른 블록에서 동일한 이름을 가진 지역 변수가 존재할 수 있다.
정도네요. 예제로 알아봅시다.
#include <stdio.h>
void run(void);
int main(void)
{
auto int a = 20; //지역변수 a 선언
printf("%d\n", a);
printf("%d\n", &a); //함수 main 내에 위치한 변수 a의 주소
run();
return 0;
}
void run(void)
{
auto int a = 10; //지역변수 a 선언
printf("%d\n", a);
printf("%d\n", &a); //함수 run 내에 위치한 변수 a의 주소
}
출력은 다음과 같아요.
20
-1907164828
10
-1907165116
지역 변수에는 여러가지 장점이 있습니다.
먼저 함수의 작동이 끝나면 변수도 날려버리기 때문에 메모리를 효율적으로 사용할 수 있고,
값에 문제가 있을 때도 그 함수 부분만 조사하면 되기 때문에 디버깅이랑 리펙토링에 강하죠.
그리고 외부에서 접근도 불가능해서 코드도 안정적이고.. 프로젝트에서 변수끼리 충돌날 일도 없어요.
여담으로, 함수의 매개변수 역시 지역변수입니다.
2. 블록과 지역 변수
지역 변수에서, 블록 밖에서는 사용할 수 없다고 했죠.
반대로 블럭이 여러개 겹쳐져 있으면, 블럭 안에서 같은 이름의 지역 변수를 사용할 수 있습니다.
이때 사용되는 변수는 가장 내부 가까운 것을 사용합니다.
물론 혼란을 줄 수 있으니 사용하지 않는 것이 제일 좋지만, 스코프(scope)가 달라서 충돌하지는 않아요.
한번 예제를 보죠.
#include <stdio.h>
int main(void)
{
int a = 0;
printf("%d ", a);
for (int a = 0; a < 5; a++)
{
printf("%d", a);
}
return 0;
}
출력은 다음과 같아요.
0 01234
본질적으로 for문 내부의 a와 main 문 내부의 a는 서로 달라요.
main문 내부의 a의 scope는 다음과 같지만..

for문 내부의 scope는 다음과 같아요.

사실 main문은 조금 틀렸어요, for문 내의 변수 a에 의해 실질적으로 for문에서는 사용할 수 없거든요.
저렇게 프로그래밍을 하면 for문 내부에서 사용되었던 변수 a는 for문 종료 후 사라지면서 메모리를 절약할 수 있지만,
중첩 블록들 안에서 같은 이름의 변수를 사용하면 예기치 못한 결과를 가져올 수 있기에 조심해야 합니다.
3. 전역 변수
지역 변수는 함수 바깥에서는 사용할 수 없습니다.
음.. 좋은 방법이 없을까요?
그럴 때 사용하는 것이 전역 변수입니다(또는 포인터..)
사용 방법은 간단합니다. 함수를 선언하는 것처럼 함수 밖에다가 변수를 선언하면 전역 변수(globar variable)가 됩니다.
전역 변수는 프로그램 범위 전역에서 사용할 수 있습니다.
당연하게도 단점이 있어요. 코드 리펙토링(유지보수)가 어려워지고, 디버깅도 어려워지고..
왜냐하면 이름을 하나하나 다 바꿔야 하고, 값이 이상하면 접근하는 모든 지역을 건드려야 하고..
전역 변수는 자동으로 0으로 초기화됩니다. 선언과 동시에 초기화할 필요 없어요.
그리고 위쪽의 변수들의 범위(scope)처럼, 전역 변수와 지역 변수가 같은 이름을 가지고 선언되면 그 함수에서는 전역 변수를 사용할 수 없답니다.
한번 알아보죠.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void run1(void);
void run2(void);
int a; //전역 변수 a 선언
int main(void)
{
printf("%d\n", a); //전역 변수 a 출력
run1();
printf("%d\n", a); //함수 실행 후 전역변수 a 출력
run2();
printf("%d\n", a); //함수 실행 후 전역변수 a 출력
return 0;
}
void run1(void)
{
a += 10; //전역 변수 a에 10을 더함
}
void run2(void)
{
int a = 10; //지역 변수 a 선언
a += 10; //지역 변수 a에 10을 더함
}
전역 변수는 어디서든 접근할 수 있다는 장점이 있습니다.
출력은 다음과 같아요.
0
10
10
여기까지 전역 변수와 지역 변수에 대해 알아봤습니다.
지역 변수와 전역 변수는 범위(scope)에 따라 분류됩니다.
하지만 변수들은 범위 말고 수명(lifetime)에 따라서도 분류되는데, 다음에는 그걸 알아보도록 합시다.
'프로그래밍 > C' 카테고리의 다른 글
함수의 데이터 공유 (0) | 2025.06.11 |
---|---|
변수 저장 유형 (2) | 2025.06.11 |
버퍼를 사용하는 입력 함수 (0) | 2025.06.09 |
문자 (4) | 2025.06.07 |
배열을 처리하는 함수 (0) | 2025.06.06 |