C_C++

(C언어) static 변수: 내부 정적변수와 외부 정적변수 그리고 전역변수 차이점

고니자니 2022. 11. 1. 12:55
반응형

C언어에서 main() 함수 위에서 다음과 같은 변수가 선언되었는데, 이 둘의 차이점을 이해하지 못하는 분들이 많은 것 같습니다.

이 둘의 차이점을 설명하면서 내부 static 변수까지 설명을 해보겠습니다.

 

내부 정적변수와 외부 정적변수

함수 내부에서 static 키워드로 선언된 변수를 내부 정적 변수라고 하고, 함수 외부에서 static으로 선언된 변수를 외부 정적 변수라고 합니다.

#include <stdio.h>

static int a;    // 외부 정적 변수
int main()
{
   ...
}
void abc()
{
   static int b;   // 내부 정적 변수
}

 

외부 정적 변수는 전역 변수처럼 프로그램 전체에 영향을 미칩니다- 현재 프로그램 전체에서 사용하라 수 있습니다.

내부 정적 변수는 선언된 함수 내부에서만 사용할 수 있지만, 제어가 선언된 함수를 벗어나더라도 static으로 선언된 변수값을 그대로 보관합니다. 최초에 호출할 때 값이 초기화되고(값이 없으면 0으로 초기화됩니다), 그 다음 부터는 보관된 기존 값을 사용하게 됩니다.

 

간단한 예를 들어 보겠습니다 - static이 아닌 변수와 비교하면 이해가 쉽습니다.

#include <stdio.h>

void func()
{
	int a = 1;        // 자동 변수(auto), 지역변수
	static int b = 1;  // 정적 변수, 지역 변수 = 내부 정적 변수
	a++;
	b++;
	printf("a=%d, b=%d\n", a, b);
}
int main()
{
	func();
	func();
	func(); 
}

(Output)

 

내부 정적변수 b는 최초 호출할 때, b값이 1로 초기화되며, 자동 변수 a는 1로 초기화 되지만 함수가 반환되면서 메모리에서 소멸되기 때문에 호출할 때마가 매 번 1로 초기화 됩니다. 그러나 static 변수 b는 최초 호출할 때 1로 초기화 되고, 함수가 종료되도 그 값이 그대로 보관됩니다. 다음 호출할 때는 초기화 되지 않고 이 전 값으로 사용할 수 있습니다.

 

외부 정적 변수와 전역 변수의 차이점

아래의 프로그램 코드를 먼저 보겠습니다.

#include <stdio.h>

int a = 1;
static int b = 1;
void func()
{
	a++;
	b++;
	printf("a=%d, b=%d\n", a, b);
}
int main()
{
	func();
	func();
}

(Output)

위 코드만으로는 두 변수(전역변수와 외부 정적 변수)의 차이점을 알 수 없습니다. 둘 다 전역변수처럼 프로그램 전체에서 사용할 수 있습니다. 이 둘의 차이점은 한 개의 프로그램이 2개 이상으로 분할되어 작성된 경우에 있습니다.

 

다음 코드는 위에서 작성한 간단한 코드를 2개의 파일로 분할한 경우입니다.

참고로, extern 키워드는 변수가 다른 파일에 선언된 변수임을 선언할 때 사용하는 키워드입니다.

#include <stdio.h>

int a = 1;
static int b = 1;

int main()
{
func();
func();
}
#include <stdio.h>
extern int a;     // extern:  다른 파일에 선언된 변수임을 선언
extern int b;

void func()
{
a++;
b++;
printf("a=%d, b=%d\n", a, b);
}

 

이 코드를 실행하면 다음과 같은 오류가 뜹니다.

static으로 선언된 변수 b는 다른 파일에서 사용할 수 없기 때문에 생긴 오류입니다.

 

정리해보면, 일반 전역변수는 다른 파일에서 extern으로 선언한 다음에 사용할 수 있습니다. 그러나 static으로 선언된 변수는 다른 파일에서 사용할 수 없습니다. 그래서 전역변수 위치에 static 키워드를 사용하는 이유는 해당 변수를 다른 파일에서 사용할 수 없게 하는 것입니다.

 

내부 정적 변수와 외부 정적 변수

여기까지의 설명을 살펴보면 내부 정적 변수와 외부 정적 변수는 모두 static 키워드로 선언하지만 사용하는 의미(용도)는 완전히 다르다는 것을 알 수 있습니다.

 

  • 내부 정적 변수: 함수를 다시 호출 했을 때, 이전에 보관된 값을 사용할 수 있습니다.
  • 외부 정적 변수: 다른 파일에서 이 값을 사용할 수 없게합니다.

이해가 되었을까요?

 

 

 

 

 

728x90
반응형