전역변수와 지역변수 모두에 static 선언을 추가할 수 있다. 그러나 여기서는 지역변수의 static 선언에 대하여 설명하고자 한다.
1. 지역변수와 지역변수에 static 선언이 붙는 경우 차이점
지역변수 특성
1) 선언된 함수 내에서만 접근이 가능하다.
2) 함수 내에 선언된 지역변수는 해당 함수가 반환하면 소멸된다.
지역변수에 static 선언이 붙는 경우 특성
1) 선언된 함수 내에서만 접근이 가능하다.
2) 프로그램 시작과 동시에 할당 및 초기화 된다.
3) 딱 1회 초기화되고 별도의 초기화 조건이 없으면 0으로 초기화된다.
4) 프로그램 종료 시까지 메모리 공간에 존재한다.
2. 예제 코드 및 분석
그림1의 실행결과를 보면 static변수(num1)는 계속해서 메모리에 존재하기 때문에 값이 유지가 되지만 그냥 지역변수(num2)는 함수가 종료됨과 동시에 메모리에서 소멸되기 때문에 값이 계속 그대로인 것을 알 수 있다.
여기서 주의할 것은 static 변수는 SimpleFunc 함수가 호출되어야 선언되는 것이 아니라 프로그램이 시작과 동시에 할당 및 초기화된다는 사실이다. 그래서 사실 5행(static int num1 = 0;)은 존재하지 않는 것이다. 이미 프로그램 시작과 동시에 할당되었고 0으로 초기화되었기 때문이다.
결론적으로 위의 예제 코드에서 static으로 선언된 변수(num1)는 초기화하지 않으면 전역변수처럼 0으로 초기화되고, 프로그램 시작과 동시에 할당 및 초기화되어서 프로그램이 종료될 때까지 메모리 공간에 남아있다. 그리고 static으로 선언된 변수(num1)가 함수 내에 선언된 이유는 접근의 범위를 SimpleFunc로 제한하기 위해서이다.
※ static 지역변수는 매우 쉽게 전역변수로 대체가 가능하다. 하지만 static 지역변수는 전역변수보다 안정적이다. 전역변수와 마찬가지로 프로그램이 종료될 때까지 메모리 공간에 남아있지만, 접근할 수 있는 범위를 하나의 함수로 제한했기 때문이다. 따라서 static 지역변수를 전역변수로 대체하는 일은 없어야 한다. 반대로 전역변수를 static 지역변수로 대체할 수 있다면 대체해서 프로그램의 안전성을 높여야 한다.
<참고 자료>
윤성우의 열혈 C 프로그래밍
'프로그래밍 언어 개념 > C' 카테고리의 다른 글
구조체 패딩(struct padding) (1) | 2023.12.08 |
---|---|
[C언어] 함수의 정의 (0) | 2023.11.23 |
[C언어] Strcpy 함수 주의할 점 (0) | 2022.10.04 |
[C언어] 지역변수와 전역변수 (0) | 2021.12.23 |