C 기본 문법 – 변수와 상수 – 1편: 변수의 스코프(Scope) 완전 정복
안녕하세요, 코딩을 사랑하는 여러분 😊
오늘은 C 언어의 변수 중에서도 실무와 시험에서 정말 자주 마주치는 개념!
바로 **변수의 스코프(Scope, 유효 범위)**에 대해 알아보겠습니다.
변수의 스코프는 마치 변수가 살아서 활동할 수 있는 공간이에요.
“어디까지 이 변수를 사용할 수 있는가?”라는 범위의 개념이죠.
스코프를 이해하지 못하면, 동일한 변수 이름을 여러 번 사용하거나,
사용할 수 없는 변수를 사용하려고 해서 오류가 발생하기도 해요.
자, 그럼 차근차근! 스코프의 개념부터 종류, 예시, 주의사항까지
풍부한 비유와 예제로 완벽하게 알려드릴게요 😊
변수의 스코프란?
변수의 스코프(Scope)는 변수가 선언된 이후부터 접근이 가능한 코드 범위를 의미합니다.
즉, “이 변수는 어디까지 쓸 수 있나요?”를 결정하는 중요한 규칙이에요.
🎯 비유하자면,
변수는 “그 지역에서만 활동 가능한 알바생”이라고 생각해 보세요!
변수의 스코프는 그 알바생이 일할 수 있는 구역이에요.
지역 변수는 자기 구역에서만, 전역 변수는 전체 매장 어디서든 일할 수 있는 것과 같죠!
C 언어의 스코프 종류
| 종류 | 설명 | 선언 위치 |
|---|---|---|
| 전역 스코프(Global Scope) | 프로그램 전체에서 접근 가능 | 함수 바깥 |
| 지역 스코프(Local Scope) | 특정 함수나 블록 내부에서만 유효 | 함수 안 또는 {} 내부 |
| 블록 스코프(Block Scope) | 제어문이나 중괄호 블록 내부 | if, while, for 등 |
| 파일 스코프(File Scope) | 한 파일 내에서만 접근 가능 (static) |
파일 상단에 static 사용 |
1. 전역 변수(Global Variable)
#include <stdio.h>
int count = 10; // 전역 변수
void showCount() {
printf("count: %d
", count);
}
int main() {
count = 20;
showCount(); // 출력: 20
return 0;
}
- 함수 외부에서 선언
- 모든 함수에서 접근 가능
- 프로그램 종료 시까지 유지
📌 너무 남용하면 코드가 꼬일 수 있으니 조심하세요!
2. 지역 변수(Local Variable)
#include <stdio.h>
int main() {
int x = 5; // 지역 변수
printf("x = %d
", x);
return 0;
}
- 함수 내부에서 선언
- 해당 함수 내에서만 접근 가능
- 함수가 끝나면 소멸됨
3. 블록 스코프(Block Scope)
#include <stdio.h>
int main() {
int x = 10;
if (x == 10) {
int y = 20; // y는 이 블록에서만 유효
printf("x + y = %d
", x + y);
}
// printf("%d
", y); // 오류! y는 if문 밖에서 접근 불가
return 0;
}
{}블록 내에서 선언된 변수- 블록을 벗어나면 자동으로 사라짐
🧠 블록 스코프는 메모리 절약에 유리하고, 코드 구조도 깔끔하게 해줘요.
4. 함수 매개변수도 지역 변수!
void greet(char name) {
printf("Hello, %c!
", name);
}
name은 greet 함수에서만 사용 가능- 함수 호출이 끝나면 사라짐
매개변수는 함수 내에서 선언된 특수한 지역 변수라고 보시면 돼요!
5. 중첩된 스코프에서는 가장 가까운 변수가 우선
#include <stdio.h>
int x = 1; // 전역 변수
int main() {
int x = 2; // 지역 변수 (전역 x는 가려짐)
{
int x = 3; // 블록 변수 (지역 x도 가려짐)
printf("x = %d
", x); // 출력: 3
}
printf("x = %d
", x); // 출력: 2
return 0;
}
🎯 이름이 겹치는 경우엔 가장 가까운 스코프의 변수가 사용됩니다!
이를 **”이름 숨김(Shadowing)”**이라고 불러요.
6. static 변수는 지역 + 정적
#include <stdio.h>
void counter() {
static int count = 0; // 함수 내부 static 변수
count++;
printf("count = %d
", count);
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
return 0;
}
static지역 변수는 함수가 종료돼도 값을 유지합니다.- 단, 스코프는 여전히 지역적이에요!
✅ 요약: 스코프 비교표
| 구분 | 선언 위치 | 접근 가능 범위 | 수명 |
|---|---|---|---|
| 전역 변수 | 함수 밖 | 모든 함수 | 프로그램 종료 시까지 |
| 지역 변수 | 함수 내부 | 해당 함수 내 | 함수 종료 시까지 |
| 블록 변수 | 블록 내부 | 해당 블록 내 | 블록 종료 시까지 |
| static 지역 변수 | 함수 내부 + static | 함수 내부 | 종료 후에도 값 유지 |
⚠️ 변수 스코프 사용 시 주의사항
| 주의사항 | 설명 |
|---|---|
| 동일한 이름 중첩 주의 | 의도치 않게 전역 변수가 가려질 수 있어요 |
| 지역 변수 초기화 필수 | 초기화 안 하면 쓰레기 값 포함될 수 있음 |
| 블록 바깥에서 블록 변수 접근 금지 | 컴파일 에러 발생 |
| 전역 변수 남용 금지 | 디버깅 어려움, 코드 복잡도 증가 |
| static 변수는 기억됨 | 반복 호출 시 누적되는 특성 주의! |
마무리하며 💬
변수의 스코프는 프로그래밍의 기본 중 기본이자 실수를 줄이기 위한 핵심 개념이에요!
특히 C 언어는 메모리와 스코프에 예민한 언어이기 때문에
이해가 깊어질수록 더 깔끔하고 효율적인 코드를 작성할 수 있습니다 😊
다음 시간에는 **상수(const)**를 배워서,
절대 변하지 않는 값들을 안전하게 다루는 방법을 익혀보도록 할게요.
그럼 오늘도 좋은 하루 보내시고,
다음 편에서 또 만나요! 감사합니다 💻✨
