개발자

[C/C++언어] static 변수를 쓰는 이유 (feat. 메모리 구조)

june__kim 2021. 5. 18. 23:34

[C/C++언어] static 변수를 쓰는 이유 (feat. 메모리 구조)

 

과제를 하던 도중, static 변수를 쓰지 않으면 풀 수 없는 문제를 만났다.

 

사실 코딩을 하면서 static이라는 변수를 만난 적이 거의 없어서 잘 모르는데

 

이번 기회에 정리를 해보려고 한다.

 

나의 경우, 과제에서 계속해서 새로운 문자를 read() 명령어를 통해 읽어야 했고

함수가 종료되더라도 이렇게 읽은 문자들을 계속해서 기억을 할 필요가 있었다.

 

그래서 변수를 static으로 선언해야 했는데!

 

문자열로 이 예시를 보기엔 여러모로 복잡하니까 정수형을 통해 예시를 보자.

 

#include <stdio.h>

void	check()
{
	int num = 0;

	num++;
	printf("%d\n", num);
}

int main()
{
	check();
	check();
	check();
}
실행결과:

1
1
1

 

너무나도 정상적이다.

 

계속 함수를 실행할 때마다 num이 0으로 초기화 되기 때문에 실행결과는 저렇게 나온다.

 

#include <stdio.h>

void	static_check()
{
	static int num = 0;

	num++;
	printf("%d\n", num);
}

int main()
{
	static_check();
	static_check();
	static_check();
}
출력결과:

1
2
3

 

여기서는 결과가 다르다.

 

함수가 실행되고 끝나고 다음 함수가 실행되더라도 그 이전 실행에서의 num값이 유지되는 것이다.

 

즉, static 변수의 값은 함수가 종료되더라도 프로그램이 종료되지 않는 이상 메모리상에 남아있다.

 

이게 가장 큰 static의 특징이 아닐까 싶다.

 

이게 왜 이런가를 조금 더 자세하게 살펴보려면 메모리 구조 부분을 살펴봐야한다.

 

간단하게만 살펴보자.

 

메모리 구조

 

보통 우리가 작성하는 일반 지역변수는 스택(Stack)영역에 저장된다.

 

스택 영역의 변수들은 함수 호출시에 메모리에 할당되며 함수 종료시에 메모리에서 사라진다.

 

하지만 static 변수는 데이터(Data)영역에 저장된다.

(+ 전역변수 또한 데이터영역에 저장된다.)

 

데이터 영역은 프로그램 시작할 때 할당되며 프로그램 종료시에 소멸된다.

 

메모리 구조부분은 여기까지만 하는거로.

 

 

static변수에는 몇 가지 특징이 더 있는데,

 

- static으로 선언한 변수는 0으로 초기화가 된다는 것.

 

- static 변수는 외부참조가 되지 않는다는 점. (= 정보은식)

 

- static 변수는 매개변수로 사용할 수 없다는 점.

 

 

그냥 뭐... 알고 있으면 좋을 것 같다.