Today's special moments become memories of tomorrow.

C

[C언어] static 변수(정적변수)

lotus lee 2024. 3. 22. 15:34

static 변수(정적변수)를 설명하기에 앞서, 먼저 지역변수와 전역변수의 특징을 정리하면 다음과 같다.

지역변수와 전역변수는 선언 위치에 따라 구분된다.

 

[지역변수]

- 함수 내(지역)에서 선언되는 변수

- 범위 : 함수 내부

- 생존시간 : 함수가 호출될 때 스택에 저장되었다가 함수 호출이 종료되면 삭제됨

- 초기화하지 않으면 쓰레기값이 들어감

 

[전역변수]

- 함수 외부에 선언되는 변수

- 범위 : 소스 파일 전역

- 생존시간 : 프로그램 시작 시 생성되며 프로그램 종료 시에 메모리에서 삭제됨

- 초기값으로 0이 들어감

 

 

static은 지역변수와 전역변수 둘 다 붙을 수 있다. 지역변수에 붙는 경우와 전역변수에 붙는 경우의 차이를 알아보자.

 

static 지역변수

위에서 봤듯이, 지역변수는 함수가 종료되는 순간 메모리에서 삭제되지만 앞에 static이 붙으면 함수가 종료되어도 제거되지 않는다. 지역변수와 static 지역변수의 차이를 다음 코드에서 확인해보자.

 

#include <stdio.h>
void testFunc(void);
int main(void){
    
    for(int i=0;i<5;i++)
    {
        testFunc();
    }
}
void testFunc(void)
{
    int var = 0;
    static int staticVar = 0;
    
    var++;
    staticVar++;
    
    printf("일반 지역변수 : %d\n",var);
    printf("static 지역변수 : %d\n",staticVar);
}

 

지역변수 var과 static 지역변수 staticVar이 있다. main함수에서 testFunc() 함수를 5번 호출했을 때, 두 변수는 각각 어떤 값을 출력할까?

testFunc()가 호출될 때마다 변수 var은 메모리에서 생성되고 삭제됨을 반복한다. 호출될 때마다 새로 생성되고, 변수 var 안에는 함수 초반에 초기화한 0값이 들어간다. 반면, 변수 staticVar는 함수가 종료되어도 값이 사라지지 않고 그대로 누적이 된다. 메모리에서 삭제되지 않기 때문이다.

 

실행결과 : 

 

실행결과를 보면 static 변수는 함수가 호출될 때마다 ++한 결과가 누적되어 1->2->3->4->5 로 증가된다. 반면에 지역변수는 함수가 호출될 때마다 다시 0으로 초기값이 세팅되어 계속 1로 찍히게 된다.

 

 

static 전역변수와 extern

그렇다면 전역변수에 static이 붙으면 어떻게 될까?

static 전역변수에 대해 설명하기 전에 extern 키워드에 대한 지식이 필요하다. c 소스파일이 2개 이상 있을 때, 경우에 따라서는 A.c라는 파일에서 생성된 전역변수를 B.c라는 파일에서 사용하고 싶을 수도 있다. 이 때, B.c 파일에서는 사용하고 싶은 A.c 파일의 변수 이름 앞에 "extern" 이라는 키워드를 붙이면 사용이 가능해진다.

 

sub.c 파일 : 

#include "sub.h"
int var;

 

main.c 파일 : 

#include <stdio.h>

extern int var;
int main(void){
    
    var++;
    
    printf("sub.c에서 선언된 변수 var = %d\n",var);
}

 

위의 예제를 실행시키면, main.c 파일에서 var 변수 사용이 가능해진다. var 앞에 "extern"이라는 키워드를 붙였기 때문이다.

 

실행결과 : 

그런데 위의 예제의 sub.c 파일에서 선언된 변수 var 앞에 static 키워드를 붙이게 되면, 이 변수는 sub.c 파일에서만 사용이 가능해진다. 다시말해, main.c 에서 변수 var을 쓰고 싶어도 사용이 불가능해진다는 의미이다.

 

즉, 전역변수에 static이 붙게 되면 변수의 사용범위가 축소된다. (모든 소스파일 -> 변수가 선언된 소스파일)

 

sub.c 파일 : 

#include "sub.h"
static int var;

 

main.c 파일 : 

#include <stdio.h>
void testFunc(void);
extern int var;
int main(void){
    
    var++;
    
    printf("sub.c에서 선언된 변수 var = %d\n",var);
}

 

이렇게 된 파일을 실행시키면, main.c에서는 var을 쓸 수가 없으므로 빌드 에러가 발생한다.

 

 

 

 

이번 글에서 설명한 것을 정리하면 다음과 같다.

 

지역변수에 static이 붙으면 변수의 소멸 시기가 달라지게 되고, 전역변수에 static이 붙으면 변수의 사용가능한 범위가 달라지게 된다.

'C' 카테고리의 다른 글

[C언어 기초] 출력함수 printf(), 주석  (0) 2023.05.07
[C언어] 조건부 컴파일 1. #ifdef 와 #endif  (1) 2022.08.27