Main Content

작업 공간(Workspace) 간 데이터 공유하기

소개

여기에서는 작업 공간 간에 변수를 공유하거나 함수 실행 간에 이러한 변수를 유지할 수 있는 방법을 보여줍니다.

대부분의 경우, 함수 내에서 생성되는 변수는 해당 함수 내에서만 인식되는 지역 변수입니다. 지역 변수는 명령줄이나 기타 모든 함수에서 사용할 수 없습니다. 그러나, 함수 또는 작업 공간 간에 데이터를 공유하는 방법에는 여러 가지가 있습니다.

모범 사례: 인수 전달하기

함수 변수의 범위를 확장하는 가장 안전한 방법은 변수의 값을 전달할 수 있는 함수 입력 인수 및 함수 출력 인수를 사용하는 것입니다.

예를 들어, 하나의 입력값을 공유하고 수정하는 두 개의 함수, 즉 update1update2를 생성해 보겠습니다. update2update1.m 파일에 포함된 로컬 함수이거나 자체 파일인 update2.m에 포함된 함수일 수 있습니다.

function y1 = update1(x1)
   y1 = 1 + update2(x1);

function y2 = update2(x2)
   y2 = 2 * x2;

명령줄에서 update1 함수를 호출하고 기본 작업 공간의 변수 Y에 할당합니다.

X = [1,2,3];
Y = update1(X)
Y =
     3     5     7

중첩 함수

중첩 함수는 자신이 중첩되어 있는 모든 함수의 작업 공간에 액세스할 수 있습니다. 그러므로, 예를 들어 중첩 함수는 부모 함수에 정의된 변수(이 경우 x)를 사용할 수 있습니다.

function primaryFx
   x = 1;
   nestedFx

   function nestedFx
      x = x + 1;
   end
end

부모 함수가 지정된 변수를 사용하지 않을 경우 변수는 중첩 함수에 대한 로컬 변수로 유지됩니다. 예를 들어, 아래 버전의 primaryFx에서 두 개의 중첩 함수는 서로 상호 작용할 수 없는 고유한 버전의 x를 가집니다.

function primaryFx
   nestedFx1
   nestedFx2

   function nestedFx1
      x = 1;
   end

   function nestedFx2
      x = 2;
   end
end

자세한 내용은 중첩 함수 항목을 참조하십시오.

영속 변수(Persistent Variable)

함수 내에서 변수를 영속 변수로 선언하면 함수를 호출한 후부터 그 함수를 다시 호출할 때까지 해당 변수가 해당 값을 유지합니다. 기타 지역 변수는 현재 함수 실행 동안만 해당 값을 유지합니다. 영속 변수는 다른 프로그래밍 언어에서의 정적 변수와 동일합니다.

해당 변수를 사용하기 전에 persistent 키워드를 사용하여 변수를 선언합니다. 그러면 MATLAB®이 영속 변수를 빈 행렬 []로 초기화합니다.

예를 들어, findSum.m이라는 파일에, 합계를 0으로 초기화하고 각 반복마다 값을 더하는 함수를 정의합니다.

function findSum(inputvalue)
persistent SUM_X

if isempty(SUM_X)
   SUM_X = 0;
end
SUM_X = SUM_X + inputvalue;

함수를 호출하면 SUM_X의 값이 후속 실행 간에 유지됩니다.

다음 작업을 통해 함수에 대한 영속 변수를 지울 수 있습니다.

  • clear all

  • clear functionname

  • 함수 파일 편집

영속 변수가 지워지지 않도록 방지하려면 mlock을 사용하여 함수 파일을 잠그십시오.

전역 변수(Global Variable)

전역 변수는 여러 함수 또는 명령줄에서 액세스할 수 있는 변수입니다. 전역 변수는 기본 작업 공간 및 함수 작업 공간과 별개인 자신만의 고유한 작업 공간을 가집니다.

그러나 전역 변수는 주의가 필요한 위험을 수반합니다. 예를 들면 다음과 같습니다.

  • 모든 함수가 전역 변수에 액세스하고 업데이트할 수 있습니다. 따라서 이 변수를 사용하는 다른 함수가 예기치 않은 결과를 반환할 수 있습니다.

  • "새" 전역 변수에 의도치 않게 기존의 전역 변수와 동일한 이름을 지정하면 한 함수가 다른 함수에서 예상하는 값을 덮어쓸 수 있습니다. 이러한 오류는 진단하기가 어렵습니다.

가급적이면 전역 변수를 사용하지 마십시오.

전역 변수를 사용하는 경우 특정 위치(함수 또는 명령줄) 내에서 전역 변수에 액세스하기 전에 global 키워드를 사용하여 선언합니다. 예를 들어, falling.m이라는 파일에 함수를 생성해 보겠습니다.

function h = falling(t)
   global GRAVITY
   h = 1/2*GRAVITY*t.^2;

그런 다음, 프롬프트에서 다음 명령을 입력합니다.

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

두 전역 명령문에 의해 명령 프롬프트에서 GRAVITY에 대입된 값을 함수 내에서 사용할 수 있게 되었습니다. 그러나, 더 확실한 대안으로 해당 값을 입력값으로 받도록 함수를 재정의합니다.

function h = falling(t,gravity)
   h = 1/2*gravity*t.^2;

그런 다음, 프롬프트에서 다음 명령을 입력합니다.

GRAVITY = 32;
y = falling((0:.1:5)',GRAVITY);

다른 작업 공간(Workspace)에서 실행하기

evalin 함수 및 assignin 함수를 사용하면 문자형 벡터에서 명령 또는 변수 이름을 평가하고 현재 작업 공간을 사용할지 또는 기본 작업 공간을 사용할지 지정할 수 있습니다.

전역 변수와 마찬가지로, 이러한 함수는 기존 데이터를 덮어쓰는 위험을 수반합니다. 따라서 가급적이면 사용하지 마십시오.

evalinassignin은 경우에 따라 기본 작업 공간에 대해 실행하는 그래픽 사용자 인터페이스의 콜백 함수에 유용합니다. 예를 들어, 기본 작업 공간에서 변수 이름에 대한 목록 상자를 생성해 보겠습니다.

function listBox
figure
lb = uicontrol('Style','listbox','Position',[10 10 100 100],...
              'Callback',@update_listBox);
update_listBox(lb)

function update_listBox(src,~)
vars = evalin('base','who');
src.String = vars;

다른 프로그래밍 응용 기법에 대해서는, eval 함수의 대안에 설명된 인수 전달 및 기법을 사용해 보십시오.

관련 항목