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 키워드로 선언하지만 사용하는 의미(용도)는 완전히 다르다는 것을 알 수 있습니다.
- 내부 정적 변수: 함수를 다시 호출 했을 때, 이전에 보관된 값을 사용할 수 있습니다.
- 외부 정적 변수: 다른 파일에서 이 값을 사용할 수 없게합니다.
이해가 되었을까요?
'C_C++' 카테고리의 다른 글
(C언어) 1년 1월 1일부터 특정 날짜까지의 총 날수 계산하기 (0) | 2022.11.01 |
---|---|
(C언어) 오늘 날짜 시간 출력하기 time.h tm 구조체 (0) | 2022.11.01 |
(C언어) 입력받은 문자열에서 알파벳 개수 카운트하기 (1) | 2022.10.30 |
(C언어) 구조체를 이용한 성적처리: 파일에서 데이터 읽기 (0) | 2022.10.27 |
(C언어) 구조체를 이용한 성적처리 (0) | 2022.10.27 |