프로그래밍하다보면 전체 영역에서 사용하지 않지만 값을 유지해야 할 때가 있죠.
이럴 때는 전역 변수로 선언하면 사용하지 말아야 하는 곳에서 사용하는 실수를 범하여 버그를 만드는 원인이 되기도 한답니다.
그렇다고 지역 변수로 선언하면 함수 호출했을 때 메모리를 할당하고 끝나면 해제해서 다시 호출했을 때 이전의 값이 사라져요.
이 때 정적 변수를 선언하여 사용하면 문제를 해결할 수 있어요.
정적 변수를 선언할 때는 static 키워드를 붙여서 선언해요.
정적 변수는 특정 블록 내부에 변수를 선언해도 프로그램 시작할 때 메모리를 할당하고 해제해서 값을 유지할 수 있어요.
◈ 정적 변수와 지역 변수를 비교하는 예
#include <stdio.h>
void Foo();
int main()
{
Foo();
Foo();
return 0;
}
void Foo()
{
int i = 0;
static int si = 0;
i++;
si++;
printf("i: %d si: %d\n", i, si);
}
◈ 실행 결과
i:1 si:1
i:1 si:2
그런데 전역에 정적 변수를 선언하는 것은 어떠한 의미일까요?
전역에 정적 변수를 선언하면 같은 프로그램의 다른 소스 파일에서는 접근할 수가 없어요.
만약 같은 이름으로 다른 소스 파일에서 전역에 변수를 선언하면 두 변수는 이름은 같아도 메모리는 독립적이예요.
따라서 서로 다른 데이터를 관리할 수 있어요.
◈ 블록 외부에 정적 변수를 선언한 예
//Demo.c
#include <stdio.h>
static int si;
void Stub()
{
si++;
printf("Stub: %d\n",si);
}
//Program.c
#include <stdio.h>
static int si;
void Stub();
int main(void)
{
si=3;
printf("main: %d\n",si);
Stub();
printf("main: %d\n",si);
si=6;
printf("main: %d\n",si);
Stub();
printf("main: %d\n",si);
return 0;
}
◈ 실행 결과
main: 3
Stub: 1
main: 3
main: 6
Stub: 2
main: 6
자세한 설명은 하지 않을게요.
위 코드를 작성해서 실행해 보고 혼자 고민해 보세요.
물론 이러한 문법을 아는 것보다는 어떨 때 이러한 변수를 선언해서 사용하는 것이 좋을 지 판단하는 능력이 더 중요해요.
여기에서는 이에 관한 설명은 생략할게요.
힌트를 주자면 srand 함수와 rand 함수 사용법을 살펴보시고 이들의 동작 원리를 고민해 보세요.
자주 사용하는 문법 사항은 아니지만 라이브러리를 만들 때 종종 사용하는 문법이예요.
'언어 자료구조 알고리즘 > 디딤돌 C언어' 카테고리의 다른 글
64. 함수 원형 결정 (0) | 2016.01.01 |
---|---|
63. 함수명 결정 (0) | 2016.01.01 |
62. 도메인 분석 (0) | 2016.01.01 |
61. 함수 만들기 실습 시나리오 (0) | 2016.01.01 |
60. 상수화 변수 (0) | 2016.01.01 |
58. 지역변수 (0) | 2016.01.01 |
57. 전역 변수 (0) | 2016.01.01 |
56. 매개변수 전달 원리 (0) | 2016.01.01 |
55. 프로그램 동작 원리 (0) | 2016.01.01 |
54. 프로세스 메모리 구조 (0) | 2016.01.01 |