C 언어 - static 키워드 (정적 키워드)

컴퓨터/C

728x90
반응형

static 키워드

static은 사전적 의미로 정적이다라는 의미를 가지고 있습니다. 

말 그대로 static 키워드를 사용하면 움직이지 않는 정적인 변수를 만들 수 있습니다.

 

복습 - 지역변수와 전역변수

지역변수 - 지역변수는 지역에 존재하는 변수로 메모리 stack영역에 저장되며 중괄호 { } 안에 포함된다.

전역 변수 - 전역 변수는 프로그램 모든 곳에서 쓰이며 메모리 data영역에 저장된다.

 

지역 변수와 전역 변에 static 키워드가 붙으면?

지역 변수와 전역 변수의 개념을 이해하고 있다면, 여기에 정적인 의미를 가진 static을 연결하면 어떻게 되는지 알아보겠습니다.

 

  • 정적 전역변수
int g_a = 1;
static int g_sa = 1;

int main()
{
	return 0;
}
  • 정적 전역 변수와 그냥 전역 변수는 위의 소스코드에서는 똑같은 역할을 합니다. 하지만 C언어를 소개할 때 여러 소스코드 파일들을 링커라는 녀석이 합쳐주어 프로그램을 만들어 준다고 했습니다. 이런 여러 소스코드 파일이 생기면 두 변수의 특징은 확연하게 차이가 납니다.
    • 전역변수는 모든 소스파일에서 사용되는 공통된 변수입니다.
    • 정적 전역 변수는 선언된 소스파일에서만 사용 가능합니다.
  • 물론 2개다 전역 변수의 큰 개념을 가지고 있어 프로그램의 시작과 동시에 메모리 data영역에서 종료될 때까지 존재하고 있는 것은 같지만 static 키워드를 사용함으로써 사용하는 범위를 제한할 수 있습니다.

 

정적 지역변수

void func()
{
    int counter = 0;
    counter++;
    printf("지역 변수 counter 의 값 : %d\n",counter);
	static int static_counter = 0;
    static_counter++;
    printf("정적 변수 static_counter 의 값 : %d\n",static_counter);
}

int main()
{
    func();
    func();
    func();
    return 0;
}​

 

  • 정적 지역변수를 선언한 결과는 지역변수와 차이를 바로 확인해 볼 수 있습니다.
  • 지역변수의 경우 스택 영역에 저장되며 지역의 생성과 소멸에 동일하게 동작하여 계속 1의 값이 나오는 것을 확인할 수 있습니다.
  • 하지만 정적 지역변수의 경우는 data영역에 생성되어 프로그램의 시작과 종료까지 계속 존재합니다.
    • 따라서 결과처럼 계속해서 값을 누적하는 것을 확인할 수 있습니다. 

하지만 지역변수의 특성인 해당 지역에서만 사용하는 특성은 그대로 가지고 있기 때문에 다른 지역에서의 접근은 불가능합니다.

void func()
{
    int counter = 0;
    counter++;
    printf("지역 변수 counter 의 값 : %d\n", counter);
    static int static_counter = 0;
    static_counter++;
    printf("정적 변수 static_counter 의 값 : %d\n", static_counter);
}

int main()
{
    func();
    func();
    func();
    static_counter = 100; // error 발생 !
    return 0;
}

 

이런 식으로 static 키워드를 통해 변수에 정적인 개념을 더 하여 다양하게 활용할 수 있습니다.

 

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - 함수의 원형 선언  (0) 2021.06.29
C 언어 - 소스파일 나누기  (0) 2021.06.28
C 언어 - Stack Frame (스택 프레임)  (0) 2021.06.26
C 언어 - 다중 포인터  (2) 2021.06.24
C 언어 - 구조체 포인터  (0) 2021.06.23

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :