(C/C++) 참고용 정리 - 전역 변수 vs 지역 변수 vs static 변수
- 전역 변수(Global Variable)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int var = 3; // 전역변수
void add() {
var++; // 어디서나 접근 가능
printf("%d\n", var); // 4
}
int main() {
add();
printf("%d", var); // 4, 값의 유지
return 0;
}
- 값의 유지
- 어디에서든 접근 가능
- main 함수 실행 전에, 프로그램이 실행되자 마자 메모리에 할당됨.
- 프로그램이 끝나는 순간 메모리에서 해제됨.
- 메모리의 Data 영역에 적재됨.
2번의 이유로 인해서 변수의 스코프가 더럽혀진다.
더럽혀진다는 의미는 변수 이름의 충돌 가능성이 존재하고,
그로 인해 변수 이름 짓기에 큰 시간을 할애해야 하며,
변수의 이름이 길어지거나 이상해지는 경우도 존재한다.
어디서나 접근 가능하기 때문에 실수로 변수의 값이 바뀔 가능성이 존재한다.
뭐 그렇다고 해서 꼭 안 좋은 것만은 아니기 때문에 적절히 활용하면 된다.
- 지역 변수(Local Variable)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int var = 3; // 전역변수
void add() {
int var = 4;
var++;
// 지역 변수의 우선순위가 전역 변수보다 높음.
printf("%d\n", var); // 5
}
int main() {
{ // block scope
int asdf = 33;
printf("%d", asdf);
}
// printf("%d", asdf); // 스코프를 벗어나서 컴파일 오류가 남.
add();
printf("%d\n", var); // 3, 값의 유지가 안 됨.
int i = 0;
// 지역 변수 i의 scope 시작
for(int i=0; i<3; i++) {
printf("%d ", i); // 0 1 2
}
// 지역 변수 i의 scope 끝
printf("\n%d", i); // 0, 여기서 나온 건 전역 변수 i
return 0;
}
- 매번 새로운 값 생성, 값의 유지가 안 됨.
- 지정된 블록 스코프(제어문, 함수 등등)에서만 접근 가능
- 함수가 실행되는 순간마다 메모리에 할당됨.
- 함수가 종료되는 순간마다 메모리에서 해제됨.
- 메모리의 Stack 영역에 적재됨.
값이 유지되지 않기 때문에 함수를 실행할 때마다 매번 똑같은 값을 써야할 때 쓴다.
스코프 내에서만 접근 가능하기 때문에 유지보수에 용이하다.
가능하면 스코프의 범위는 좁은 게 유지보수하기 편하다고 들었다.
- static 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
void add() {
static int var = 4;
var++;
printf("%d\n", var);
}
int main() {
add(); // 5
add(); // 6
return 0;
}
- 값의 유지
- 지정된 블록 스코프(제어문, 함수 등등)에서만 접근 가능
- main 함수 실행 전에, 프로그램이 실행되자 마자 메모리에 할당됨.
- 프로그램이 끝나는 순간 메모리에서 해제됨.
- 메모리의 Data 영역에 적재됨.
값이 유지돼야 하지만, 유지보수 등등 때문에 전역변수도, 지역변수도 마땅치 않을 때가 있다.
이럴 때 쓰는 게 static 변수이다.
값이 유지 된다는 전역 변수의 특징과 지정된 스코프에서만 접근 가능하다는 지역 변수가 짬뽕된 케이스이다.