영속 변수

영속 변수 (Persistent Variables)

함수 안에서 영속(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 언어의 정적(static) 변수 동작과 동일해요.

영속 변수에는 제한이 하나 있는데, 함수의 입력이나 출력 인자는 영속일 수 없다는 거예요.

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의 값은 2가 아니라 1이에요.

영속 변수가 특정 값으로 초기화되지 않은 채 선언되면 빈 행렬을 담게 돼요. 그래서 다음 예제처럼 비어 있는지 검사해 영속 변수를 초기화하는 것도 가능해요.

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

즉, 영속 변수는 그 변수를 담고 있는 함수가 제거될 때만 메모리에서 제거돼요. 함수 정의를 Octave 프롬프트에 직접 입력하면, clear 명령 하나로 함수 정의 전체가 메모리에서 제거되므로 영속 변수도 지워져요. 함수가 지워져도 영속 변수를 메모리에서 제거하고 싶지 않다면 mlock 함수를 사용해야 해요.

더 알아보기

  • 함수 잠금(Function Locking)에 대한 내용을 함께 보면 좋아요.
  • 전역 변수와의 차이도 다시 비교해 보세요.