C언어에서 static 변수는 특이한 속성을 가지고 있습니다. 반절 정도는 지역 변수, 반절은 전역 변수 속성을 지니고 있는데요. visible한 범위는 블록 내이지만. 메모리는 프로그램이 종료가 될 때 까지 해제가 되지 않아요. 의외로 많은 함수들이, 내부에서 static, 그러니까 정적 변수를 쓰기도 합니다. 레퍼런스 시간에 몇 번 언급을 했을 거에요.

 

 


 예제 프로그램 1개만 분석해 보겠습니다.

 

 

 먼저 main 함수는 foo를 2번 호출합니다.

 

 다음에, foo는 정적 변수인 atari를 가지고 있는데요. 10번째 줄에도 선언이 되어 있고, 12번째 줄에도 선언이 되어 있습니다. 10번째 줄과 16번째 줄에 주석이 달려 있네요. 일단 프로그램을 실행해 봅시다.

 

 

 atari 라는 변수가 not decleared 되었다고 뜹니다. 12번째 줄에 선언된 atari는, 쓰지 못하는데요. 이는 11번째 ~ 15번째 블록에 선언이 되어 있습니다. 이 안에 선언이 되어 있어요. 바깥에서는 안에 선언된 atari를 볼 수 없어요. 그것만 지역변수와 같을 뿐입니다.

 

 당연하게도 main에서는 foo에 선언된, 2개의 정적 변수를 볼 수 없습니다.

 

 


 하나 다른 점은, life time인데요. 지역 변수가, 실질적으로 선언된 block이 끝나면 사용할 수 없었던 것을 생각해 봅시다.

 

 그에 비해 정적 변수는 처음 보았을 때는 상당히 이상하게 동작한다는 것을 알 수 있는데요.

 

 

 6, 11, 7, 12. 안쪽에 있는 변수도, 바깥쪽에 있는 변수도 foo가 1번 호출이 될 때 마다 1씩 증가하는 것을 알 수 있어요. 이는 스택이 아닌 어딘가에, atari를 위한 메모리를 올려놓고 관리한다는 소리가 됩니다. 심지어, 10번째 줄과 12번째 줄에 선언문이 또 있어요. 그런데도 불구하고, 2번째로 foo를 호출했을 때에는, 이 문장을 무시하는 듯한 동작을 하는데요.

 

 

 이런 추론이 가능합니다. 미리, 로더가, static으로 선언된 변수나, 전역 변수들을 모두 읽습니다. 10번째 줄에 선언된, atari를 읽었습니다. 그리고, 이것을 메모리에 올려놓습니다.

 

 

 다음에 12번째에 있는 선언문을 읽어서, 메모리 상에 올려버립니다. 즉, 프로그램이 로드가 될 때 올라가더라. 정도의 합리적인 추론은 가능합니다. 실행 시간에 메모리에 변수가 올라가지 않는다. 정도의 생각을 할 수 있다는 겁니다. 함수가 호출되고 끝나면, 영향을 받는 영역은, 사실 스택에 있는 변수들입니다.

 

 

 data 영역이나, 정적 영역은 아무런 영향을 받지 않아요. 따라서, 지역 변수와는 다르게, 함수가 끝나도, 메모리에서 사라지지 않게 됩니다. 그러면, foo를 한 번 호출했을 때, 어떠한 일이 일어나나 봅시다.

 

 

 먼저, 12번째에서 선언된, atari의 값이 하나 증가됩니다. 그 다음에, 13번째 줄에서 그 값을 출력하는데요. 6이 출력이 될 겁니다. 다음에 바깥에 있는 변수의 값을 1 증가시킬 겁니다.

 

 

 그러면 11이 될 거고 이 값이 출력될 거에요. 그러면 전역 변수랑 다른 게 뭔가요? 결정적으로 전역 변수와 다른 점은, 전역 변수는 어디에서나 접근이 가능합니다. 예를 들어서, 아래와 같은 프로그램이 있다고 해 봅시다.

 

 

 그러면, a라는 변수에, foo도 접근할 수 있고, ra도 접근할 수 있어요. 이걸 알기 쉽게 풀어서 쓰면, 관계자만 접근을 해야 하는 공간에, 개나 소나 다 접근하는 격이 되어 버립니다. 이는 전역 변수의 range가 넓기 때문입니다. 그 반면에 static은 range가 좁습니다. 선언된 블록 내에서만 접근할 수 있기 때문입니다.