Storage duration/Scope
지역변수와 static 지역변수 그리고 전역변수들 간의 차이점을 알려면 먼저 storage duration과 scope라는 개념부터 알고 가야 한다.
- Storage duration: 변수를 저장하는 공간이 존재하는 기간으로써 변수를 위해 메모리가 할당되고 변수가 다 사용되었을 때 메모리가 해제되는 기간을 말함
- Scope: 변수가 참조될 수 있는 범위를 의미함
지역변수(Local variable)
C언어에서 지역변수(Local variable)란 아래와 같이 함수 내부에서 정의된 변수를 의미한다.
#include <stdio.h>
int func(){
int local_variable = 3; // 지역변수
return local_variable;
}
int main(int argc, char* argv[]) {
printf("%d\n", func());
return 0;
}
/*
Result
3
*/
지역변수는 아래와 같은 두 가지 특성을 가진다.
- Automatic storage duration: 변수가 포함된 block이 실행될 때 메모리가 할당되고, block이 종료되면 메모리가 사라짐
- Block Scope: block 내에서 변수가 선언될 때부터 block이 끝날 때까지 참조 가능
따라서 위의 예시에서 local_variable을 func 함수 바깥에서 사용하면 에러가 발생한다.
#include <stdio.h>
int func(){
int local_variable = 3; // 지역변수
return local_variable;
}
int main(int argc, char* argv[]) {
printf("%d\n", func());
printf("%d\n", local_variable); // error: ‘local_variable’ undeclared (first use in this function)
return 0;
}
static 지역변수(Static local variable)
지역변수를 선언할 때 앞에 static을 붙이면 static 지역변수가 생성된다. 이 static 지역변수는 아래와 같은 특성을 지닌다.
- Static storage duration: 프로그램을 compile 할 때 메모리가 할당됨. 그리고 프로그램 종료 시 메모리가 사라짐
- Block Scope: block 내에서 변수가 선언될 때부터 block이 끝날 때까지 참조 가능
Static storage duration은 compile 할 때 메모리의 크기와 주소가 할당되고 프로그램 종료 시까지 이 메모리가 바뀌지 않기 때문에 프로그램이 실행될 때 값이 사라지지 않고 값을 저장하여 사용할 수 있다. 따라서 아래 예시에서 static 지역변수의 값은 초기화되지 않고 계속 증가된 상태로 유지된다.
#include <stdio.h>
int func(){
int local_variable = 3; // 지역변수
local_variable ++;
return local_variable;
}
int static_func(){
static int local_variable = 3; // static 지역변수
local_variable++;
return local_variable;
}
int main(int argc, char* argv[]) {
printf("%d\n", func()); // 4
printf("%d\n", static_func()); // 4
printf("-------------------------\n");
printf("%d\n", func()); // 4
printf("%d\n", static_func()); // 5
return 0;
}
/* Result
4
4
-------------------------
4
5
*/
전역변수(Global variable)
전역변수는 함수 바깥에서 선언하고 아래와 같은 특성을 지닌다.
- Static storage duration: 프로그램을 compile 할 때 메모리가 할당됨. 그리고 프로그램 종료 시 메모리가 사라짐
- File Scope: 변수가 선언될 때부터 파일이 끝날 때까지 참조 가능(선언 후 파일 내 모든 지점에서 참조 가능)
file scope을 가지기 때문에 선언 이후 파일 내 모든 지점에서 참조할 수 있다.
#include <stdio.h>
int global_variable;
void func1(){
global_variable ++;
printf("%d\n", global_variable); // 1
}
void func2(){
global_variable *= 10;
printf("%d\n", global_variable); // 10
}
void func3(){
global_variable --;
printf("%d\n", global_variable); // 9
}
int main(int argc, char* argv[]) {
func1();
func2();
func3();
return 0;
}
/* Result
1
10
9
*/
전역변수의 장점과 단점
- 장점
전역변수는 여러 함수들이 공통으로 사용하는 변수를 설정할 때 사용하면 편리하다. 하지만 꼭 필요한 경우가 아니고서야 함수 자체의 parameter로 값을 넘겨주는 것이 좋다.
- 단점
먼저 전역변수를 사용해 프로그램을 만든 뒤 전역변수를 수정해야 할 일이 생기면(ex 전역변수의 타입 변경) 전역변수가 사용되는 함수 각각의 내부에서 전역변수가 변경된 형식에 맞춰서 잘 실행되는지 체크해주어야 한다. 굉장히 귀찮다.
그리고 전역변수가 사용되는 함수들은 다른 파일에서 재사용하기 어렵다는 단점이 있다. 재사용하기 위해서는 다른 파일에서 동일한 전역변수를 만들어 주어야 한다.
출처
- K. N. King, 『C Programming : A Modern Approach, 2/E』, W. W. Norton & Company(2008), p219-223.
'개인공부 > C, C++' 카테고리의 다른 글
[C] GCC와 CC의 차이점 (2) | 2021.02.12 |
---|---|
[C/C++] scanf의 작동원리 (2) | 2021.01.24 |
[C/C++] C언의 강점과 약점 (0) | 2021.01.10 |
댓글