[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 변수는 매개변수로 사용할 수 없다는 점.
그냥 뭐... 알고 있으면 좋을 것 같다.
'개발자' 카테고리의 다른 글
Crontab 로그(log) 남기는 방법 (feat. 출력 리다이렉션, 2>&1의 의미) (8) | 2021.08.11 |
---|---|
맥북 작업 스케줄러 (feat. Crontab사용방법, Cron과 Crontab 차이, 파이썬 파일 자동실행) (0) | 2021.08.09 |
Git push, clone, pull 명령어 (2) | 2021.01.15 |
Git add, commit 명령어(feat. Git과 GitHub 차이) (7) | 2021.01.10 |
iTerm2 +oh my zsh 를 이용한 터미널 꾸미기 (feat. homebrew 설치) (2) | 2021.01.09 |