다음: 변수 상태, 이전: 전역 변수, 상위 문서: 변수   [차례][찾아보기]


7.2 영속 변수

함수 안에서 persistent으로 선언한 변수는 선언이 있는 함수의 다음 호출까지 막기억장치에 내용을 유지합니다. 영속 변수와 전역 변수의 차이점은 영속 변수는 울안에 있어 특정 함수만이 유효 범위이고, 다른 곳에서는 보이지 않습니다.

아래는 함수 호출 횟수를 출력하는 함수를 만드는 데에 영속 변수를 사용하는 예시입니다.

function count_calls ()
  persistent calls = 0;
  printf ("'count_calls' has been called %d times\n",
          ++calls);
endfunction

for i = 1:3
  count_calls ();
endfor

-| 'count_calls' has been called 1 times
-| 'count_calls' has been called 2 times
-| 'count_calls' has been called 3 times

예시가 보여주는 것처럼, 영속 변수는 persistent 선언문으로 선언합니다. 아래 명령문 모두 영속 변수 선언문입니다.

persistent a
persistent a b
persistent c = 2
persistent d = 3 e f = 5

C 언어의 정적 변수와 영속 변수의 행동이 같습니다.

영속 변수에 대한 한 가지 제한은, 함수의 입출력 매개변수 모두 영속할 수 없다는 것입니다.

function y = foo ()
  persistent y = 0;  # Not allowed!
endfunction

foo ()
-| error: can't make function parameter y persistent

전역 변수와 동일하게, 영속 변수도 한 번만 초기화됩니다. 예를 들어, 아래 부호를 실행하고 나면,

persistent pvar = 1
persistent pvar = 2

영속 변수 pvar의 값은 1이지 2가 아닙니다.

영속 변수를 선언하였으나 특정 값으로 초기화하지 않으면, 영속 변수는 빈 행렬을 가집니다. 그래서 아래처럼 영속 변수가 비었는지를 확인하여 초기화할 수도 있습니다.

function count_calls ()
  persistent calls;
  if (isempty (calls))
    calls = 0;
  endif
  printf ("'count_calls' has been called %d times\n",
          ++calls);
endfunction

이 방법은 이 절 맨 앞에 있는 count_calls 예시와 완벽하게 똑같이 작동합니다.

영속 변수의 값은 명시적으로 지우지 않은한 막기억장치에 남습니다. count_calls의 실행이 저장판에 남아있다고 가정하면, 아래와 같은 양상을 볼 수 있습니다.

for i = 1:2
  count_calls ();
endfor
-| 'count_calls' has been called 1 times
-| 'count_calls' has been called 2 times

clear
for i = 1:2
  count_calls ();
endfor
-| 'count_calls' has been called 3 times
-| 'count_calls' has been called 4 times

clear all
for i = 1:2
  count_calls ();
endfor
-| 'count_calls' has been called 1 times
-| 'count_calls' has been called 2 times

clear count_calls
for i = 1:2
  count_calls ();
endfor
-| 'count_calls' has been called 1 times
-| 'count_calls' has been called 2 times

영속 변수는 해당 변수를 담은 함수가 사라져야만 지워집니다. 함수 정의를 옥타브 명령 처리기에 직접 입력하면, 영속 변수는 막기억장치에서 모든 함수 정의를 지워버리는 clear 명령만으로 지워짐에 유의하십시오. 함수가 사라지더라도 영속 변수는 남기려면, mlock 함수를 사용하여야 합니다.(함수 잠그기 참조)


다음: 변수 상태, 이전: 전역 변수, 상위 문서: 변수   [차례][찾아보기]