[42 Seoul] C언어의 static 변수에 대하여

업데이트:

42cursus의 Get Next Line 과제를 수행하는 데 있어 반드시 필요한 개념인 정적 변수(static variable)에 대해 공부하며 정리하게 되었다. 이 개념을 알지 못한다면 절대로 Get Next Line 과제를 해결할 수 없다. 만약 GNL 과제를 통과했음에도 이 개념을 모르는 사람이 있다면 치팅을 의심해봐야 함이 옳다.

이 글을 42 Seoul의 hycho님에게 바칩니다.

hycho_scrnshot

사진은 hycho님의 과제 현황 화면. 여기에는 비밀이 있을지도 모른다.

Static 변수 (정적 변수)

  • static 변수를 한 줄로 요약하자면, 지역변수와 전역변수 둘의 성질을 같이 가지고 있다고 생각하면 된다.
    • static 변수는 지역변수와 같이 선언된 함수 내에서만 사용이 가능하다.
    • 그러나 한 번만 초기화하며, 전역 변수처럼 프로그램이 종료될 때까지 메모리 공간에 존재한다.
    • 지역 변수와는 달리, 해당 함수가 종료되거나 반환을 하더라도 소멸되지 않는다.
  • 변수를 선언할 때 static 키워드를 붙여 선언한다. static int num
  • 메모리의 데이터 영역에 저장되어 프로그램이 종료될 때까지 남아있는 변수다.
  • 함수를 벗어나도 해당 변수는 사라지지 않고 계속 유지된다. 하지만 함수 내부에서 선언되었다면, 다른 함수에서는 이 값을 참조할 수 없다. 또한 함수의 시작이 아닌 프로그램의 시작 시 할당이 되며, 프로그램이 종료될 때 해제된다.
  • 일반 지역 변수가 할당되는 stack 부분이 아니라 data 부분에 할당된다.
  • 함수 내에서 static int num = 0 식으로 초기화하면 프로그램이 시작될 때 변수를 초기화하며, 함수가 호출될 때는 변수를 초기화하지 않는다. (여러 번 함수를 실행하더라도 그 변수가 또 초기화되지 않는다)
  • 정적 변수는 초깃값을 지정하지 않으면 0으로 알아서 초기화된다. (지역 변수는 초기화하지 않으면 쓰레기값으로 초기화된다.)
  • 무슨 말인지는 잘 모르겠는데, C언어에서는 정적 변수를 리터럴 상수로만 초기화가 가능하다고 한다.
  • 정적 변수를 전역 변수로 사용한다면 img 이미지 출처 : https://dojang.io/mod/page/view.php?id=690
  • 위키피디아의 정적 변수 설명

Static 변수 예제

static 변수를 사용하지 않은 경우

#include <stdio.h>
 
int non_static(void)
{
    int cnt = 0;
    cnt++;
 
    return cnt;
}
 
int main(void)
{
    printf("%d\n", non_static());
    printf("%d\n", non_static());
 
    return 0;
}

위와 같이, 일반적인 경우 (지역 변수를 사용했다면) 아래와 같이 프로그램이 실행된다.

1
1

non_static() 함수 안에 cnt라는 지역 변수가 선언되었으며, 이는 main() 함수에서 non_static() 함수를 호출할 때 비로소 메모리에 할당되며 초기화된다. 이후 cnt++ 문을 통해 cnt 변수의 값은 1이 되며, 그 1을 출력하게 된다.

static 변수를 사용하는 경우

#include <stdio.h>
 
int static_test(void)
{
    static int cnt = 0;
    cnt++;
 
    return cnt;
}
 
int main(void)
{
    printf("%d\n", static_test());
    printf("%d\n", static_test());
 
    return 0;
}

static 이라는 문구가 static_test 함수 내에 선언된 변수 앞에 추가되었다. 이는 정적 변수로 선언되었음을 의미하며, 이는 상술한 바와 같이 컴파일 시 아예 메모리에 할당된다. cnt 변수는 프로그램이 종료되기 전까지 메모리의 자리를 차지한다. 이렇게 정적 변수를 사용했다면 실행 결과는 아래와 같다.

1
2

마무리

hycho님 덕분에 GNL 과제에 있어 꼭 필요한 static 변수 개념에 대해 다시 한 번 공부할 수 있었다. 좋은 시간을 보낼 수 있어 감사한 마음이다. 개포동 어디에선가는 극히 드물게 정적 변수가 무엇인지 전혀 모르는 상태에서 GNL을 (심지어 보너스까지) 통과하는 기적이 일어나기도 한다고 들었지만, 여러모로 정적 변수 개념은 더할 나위 없이 중요한 개념이므로 꼭 기억해둬야겠다.

댓글을 남겨주세요