소프트웨어/C 언어

[C언어]22. 변수의 특별한 성질들 -3- ( 정적 변수 , static )

리습 2013. 6. 10. 06:30



안녕하십니까. 리습입니다.


지역변수와 전역변수를 알아보았고 전역변수를 외부 모듈에서 접근하는 방법도 알아보았습니다.


그런데 간혹 특이한 것이 필요할 때가 있습니다.접근은 지역변수처럼 특정 위치에서만 접근을 가능하도록 하여 안정성을 확보함과 동시에 전역변수처럼 항상 존재하는 그런 변수 말입니다. 이런 두 변수의 장점만을 취한 변수가 존재합니다. 바로 '정적 변수'입니다.


 정적 변수 static variable


 정적변수가 어떤 것인지 설명하기 전에 정적변수가 필요한 예시를 먼저 소개하도록 하겠습니다. 그래야 이해하기도 싶고 말이죠. 특정 함수가 존재하는데 이 함수가 몇번 사용되었는지 알고 싶다고 해봅시다. 함수내부에 변수를 선언하긴 해야하는데, 지역변수는 그 지역이 사라짐과 동시에 같이 사라지기 때문에 사용 할 수 없으며, 그렇다고 전역변수를 사용하자니 이름이 겹치는 경우가 우려됩니다. 

<이런식으론 절대 안됩니다.>


이런 '지역이 사라져도 변수는 유지되어야하는 경우'에 정적변수가 사용됩니다. 정적변수를 사용하는 것 또한 마찬가지로 키워드를 사용합니다.이때 사용하는 키워드는 static 입니다. 변수를 선언할 때 static 이라는 키워드를 앞에 붙여주면 됩니다 위 예시로 보았던 코드에 변수만 static을 붙여서 여러번 call 함수를 호출해보도록 하겠습니다.



 코드

 #include <stdio.h>

 void call();

 int main( )

 {

      call();

      call();

      call();

      call();

      call();

      return 0;

 }

 void call(){

   static int count = 0 ;

   count++;

   printf("%d\n" , count );

 }

 결과

   1

   2

   3

   4

   5


static 을 사용한 정적변수는 여러모로 장점이 매우 많은 변수입니다. 앞에서도 말했듯이 접근은 지역에서만 하지만 변수공간을 항상 유지해야 할때 사용합니다. 그럼 마지막으로 정적변수의 특징에 대하여 정리하고 마치도록 하겠습니다.


 1. 선언 위치는 지역변수와 같다. ( 순수 C언어의 경우 함수의 맨 처음 부분, C++은 어디서든지 가능 )

 2. 특정 선언 지역에서만 접근 할 수 있다. 

 3. 메모리 공간에서 변수의 저장공간은 전역변수와 그 위치가 같다. (후에 메모리에 대하여 알아보겠습니다.)

 4. 초기값을 주지 않을 경우 항상 0 으로 초기화 되며 프로그램을 실행시킬 때 단 한번만 초기화된다. (그래서 함수가 실행될 때 계속해서 초기값을 0으로 해주는 것 같지만 실제론 처음 한번만 초기화시킨다.)


맨 마지막 특징은 매우 중요합니다. 혹시 이해가 잘 안되신다면 예시 코드의 call 함수 첫줄을 보시면 될 것입니다. 함수가 호출될 때마다 초기화 하는 것으로 보이지만 실제론 실행이 되지 않은다는 것을 보실 수 있습니다. 


정적변수는 매우 장점이 많습니다. 필요하실 때 적절하게 사용하신다면 더 좋은 프로그램을 만드는데 도움이 될것입니다.