정적 지역변수 개념
정적 지역변수(static variable)는 지역변수에 static 이라는 예약어를 붙인 것이다.
static 지역변수 , static 변수 라고 부르기도 한다. 다 동일한 것을 의미한다.
static이 붙으면 일반 지역변수는 전역변수와 유사한 기능을 할 수 있다.
정적 지역변수 특징
일반적인 지역변수의 특징은 다음과 같다.
- 지역변수로의 접근 범위는 그 변수가 선언된 블록(함수) 내부이다.
- 함수 값이 반환이 되면 선언된 지역변수는 소멸한다.
그러나, 지역변수에 static 예약어가 첨가 되면 아래와 같은 특징을 갖게 된다.
- 지역 변수에 접근 범위는 보통 지역변수와 같다.
- 그러나 , 함수가 반환하여도 지역변수는 프로그램 종료할 때까지 살아 있다.
- 초기화 하지 않으면 초기 값은 자동으로 0이 된다.
지역 변수가 프로그램 종료까지 메모리 공간에 존재한다는 것은 전역변수의 특징을 갖는 것이다. 그리고 변수의 자동 초기화 또한 전역변수의 특징이다.
따라서 하나의 함수가 여러 번 호출되는 경우 동일한 변수를 공유하는 것이 가능하다. 일반 지역변수와 static 지역변수의 차이에 관한 아래 예제를 봅시다.
예제 01
위 예제의 실행 결과는 아래와 같다.
static : 1 , local : 1
static : 2 , local : 1
static : 3 , local : 1
5행 : static 지역변수 a 를 선언하고 0으로 초기화 했다.
6행 : 보통 지역변수 b를 선언하고 0으로 초기화 했다.
변수 a는 static 변수이므로 프로그램이 종료하기 전까지 메모리에 공간을 갖고 있다. 즉 정적 지역 변수는 선언된 함수인 3행의 func 함수가 값을 반환하여도 메모리에 7행에 의하여 1이 증가된 값을 계속 유지하고 있는 것이다.
따라서 14행의 for문이 반복을 할 때마다 메모리에 저장된 값이 1 씩 증가하게 된다. 그래서 최종적으로 static변수 a의 값은 3이 되는 것이다.
그러나 변수 b는 함수가 호출되어 값을 반환한 후에 메모리에서 소멸되므로 for문 반복 과정에서 다시 처음부터 메모리에 할당을 받게 된다. 그래서 계속 값이 1이 될 뿐이다.
전역변수 보다는 static 변수를 사용 권장
전역변수에서 설명한 바와 같이 전역변수의 남용은 프로그램을 불안정하게 만든다. 여기 저기 복잡하게 코드가 무질서하게 되므로 이른바 “스파게티 코드“가 된다.
예컨대 , 전역변수의 이름 또는 값을 변경해야 할 경우 그 변수에 접근한 다른 모든 코드도 함께 수정해야 한다. 귀찮고 번거로운 일이다.
따라서 프로그램 종료할 때까지 변수를 메모리에 저장해서 공유해야 하고 접근 범위는 함수 내부인 경우로 명확해야 할 때는 전역변수보다는 static 변수를 사용이 권장된다.