정적변수

안녕하세요 밥한그릇입니다.

오늘은 변수들의 종류, 그리고 그 scope와 lifetime에 대해 알아보는 시간을 가질거에요.

다음 C 예제코드를 보고 그 scope와 lifetime에 대해 추측해봅시다.

int x;
static int y;

int f(int v) {
	static int a = 0;
	int b;
	...
	a++;
	b = a + v;
	...
}

다음과 같은 예제 코드가 주어졌을 때, 변수 x, y, v, a, b 의 scope와 lifetime은 각각 어떻게 될까요?

 

int x : 전역 변수

static int y : 정적 전역 변수

int v : 지역 변수 (매개변수)

static int a : 정적 지역 변수

static int b : 지역 변수

위 변수들은 이러한 종류로 구분됩니다.

 

정답은 다음과 같습니다.

 

1. x : <이 파일 및 이 파일을 참조하는 다른 파일에서도 사용 가능, 프로그램의 시작 ~ 끝>

  전역변수인 x는 프로그램 실행 시 이 파일을 참조하는 다른 파일에서 extern int x;와 같은 형태로 선언될 경우 참조될 수 있습니다. 전역변수이므로 이 프로그램의 시작부터 끝까지 메모리가 유지됩니다.

2. y : <이 파일 내부에서만, 프로그램의 시작~끝>

 static이라는 키워드를 붙이면 정적 변수로 선언되어, 변수의 범위가 이 파일 범위로 제한됩니다.

 전역변수이므로 이 프로그램의 시작부터 끝까지 메모리가 유지됩니다.

3. v : <이 함수 f 내에서만, 함수 실행 ~ 종료 시>

 v는 함수 호출 시 복사되어 온 값입니다. 이 함수가 실행되는 동안만 lifetime이 지속되며, 이 함수 안에서만 사용될 수 있습니다.

4. a : <함수 내부에서 쓸 수 있는 지역 변수, 프로그램 종료 시까지 (영원히)>

 static 지역변수는 특별한 의미를 갖습니다. 프로그램의 data 영역에 선언되어 static 지역 변수가 있는 함수가 끝나도 그 값을 유지합니다.

 Data 영역에 초기화되기 때문에 그렇습니다.

 지역 변수이므로 지역변수 특유의 scope(함수 내부)를 가집니다.

5. b : <지역 변수, 함수 종료 시>

 이때 만일 b가 main함수의 지역변수라면, 그 lifetime은 프로그램의 시작~끝이라고 볼 수 있습니다.

 


아까 static 지역 변수가 특별하다고 했는데, 그 예시를 다음과 같이 직접적으로 살펴볼 수도 있습니다.

 

static으로 선언한 경우에는 값이 1이 아닌 2로 늘어난 것을 볼 수 있습니다. static 변수의 초기화는 첫 호출 시 한번만 이루어지고, 이전의 값이 사라지지 않습니다. 때문에, 함수를 호출할때마다 a의 기존의 값에서 값이 더해지는 모습을 볼 수 있습니다.

그러나 static이 아닌 일반 지역변수로 선언한 경우에는 변수 a의 메모리가 temp()가 한번 실행되는 동안만 유지되기 때문에 그 값이 매번 새롭게 초기화되어 1이라는 출력을 유지하는 것을 볼 수 있게 됩니다.

(예시) static 지역 변수와 일반 지역 변수의 차이

 

참고) 이 포스팅은 다음의 포스팅을 참고하였으며, 더 많은 정보를 얻으시려면 다음 링크를 참고하세요.

 

+ Recent posts