Main Content

MATLAB 코드의 투명도

MATLAB®이 주석, 문자형 벡터 및 문자열 리터럴을 무시하면서 코드를 스캔하여 모든 변수 액세스를 식별할 수 있다면, 그 코드는 변수 액세스가 투명한 것입니다. 변수 액세스에는 작업 공간 변수의 읽기, 추가, 제거 또는 수정이 포함됩니다.

다음과 같은 코딩 컨텍스트에서 MATLAB은 투명한 변수 액세스를 필요로 합니다.

이러한 컨텍스트에서 변수 액세스가 투명하지 않으면 런타임 오류가 발생합니다.

투명한 코드 작성하기

투명한 코드는 변수 이름을 명시적으로 참조합니다. 예를 들어, 다음 코드에서 MATLAB은 Xii를 변수로 식별할 수 있습니다.

X = zeros(1,10);
for ii = 1:10
    X(ii) = randi(9,1);
end

하지만 eval 함수에 대한 다음 호출에서는 입력값이 문자열이기 때문에 MATLAB은 eval에 전달된 명령문에 있는 변수를 인식할 수 없습니다.

X = zeros(1,10);
for ii = 1:10
    eval('X(ii) = randi(9,1);')
end

이 코드를 실행하기 전에 MATLAB은 한 개의 인수(문자형 벡터 'X(ii) = randi(9,1);')가 포함된 eval 함수에 대한 호출을 발견하게 됩니다.

코드가 투명하려면 MATLAB이 검사 또는 정적 분석을 통해 변수를 식별할 수 있도록 코드가 변수 이름을 명시적으로 참조해야 합니다. 문자형 벡터 'X(ii) = randi(9,1);'을 대상으로 eval 함수를 사용한다는 것은 MATLAB이 코드를 실행해야만 Xii를 변수로 식별할 수 있다는 의미입니다.

다음은 투명한 변수 액세스가 이루어지지 않는 함수 및 코딩을 일부 나열한 것입니다.

  • eval, evalc, evalin 또는 assignin

  • 스크립트

  • 동적으로 작업 공간 변수에 액세스하는 MEX 함수(예: mexGetVariable 사용)

  • whowhos 같은 내부 검사 함수

  • save 명령과 load 명령(load의 결과가 명시적으로 할당된 경우는 제외)

  • 모든 동적 이름 참조

명령 형식을 사용하여 함수에 변수를 전달하는 방법은 인수를 문자열로 전달하는 방법과 동일하기 때문에 투명하지 않습니다. 예를 들어, clear 함수에 대한 다음 호출은 모두 투명하지 않습니다.

clear X
clear('X')

코드가 작업 공간 변수를 생성해도 MATLAB이 코드를 실행한 후에만 이 새 변수를 식별할 수 있다면 이 코드의 변수 액세스는 투명하지 않은 것입니다. 예를 들어, MATLAB은 MAT 파일에서 어떤 변수를 불러왔는지 확인할 수 없기 때문에 다음 명령문은 투명하지 않습니다.

load foo.mat

하지만 불러온 변수를 이름에 명시적으로 할당하는 코드의 경우에는 왼쪽의 이름이 작업 공간 변수를 참조한다는 것을 MATLAB이 인식할 수 있기 때문에 투명합니다. 예를 들어, 다음 명령문은 MAT 파일의 변수 X를 이름이 X인 변수의 작업 공간으로 불러옵니다.

X = load('foo.mat','X');

변수에 대한 액세스는 작업 공간 내에서 투명해야 합니다. 예를 들어, 코드는 다른 작업 공간에 변수를 생성하려면 투명도가 요구되는 작업 공간에서 evalin 함수 또는 assignin 함수를 사용할 수 없습니다.

관련 항목