Main Content

R2019b 함수 우선 순위 변경에 따른 코드 업데이트

R2019b부터 MATLAB에서 변수, 중첩 함수, 로컬 함수 및 외부 함수의 우선 순위에 영향을 주는 이름 확인 규칙이 변경되었습니다. 새 규칙은 이름 확인 절차를 간소화 및 표준화합니다. 자세한 내용은 함수 우선 순위(Function Precedence Order) 항목을 참조하십시오.

이러한 변경 사항은 import 함수의 동작에 영향을 미칩니다. 이에 따라 코드를 분석하고 가능한 경우 업데이트해야 합니다. 코드에서 import 문부터 검색해 보십시오. 예를 들어, 파일 찾기를 참조하여 텍스트 import가 포함된 .m 파일과 .mlx 파일을 검색합니다. 다음 변경 사항의 영향을 평가할 때 이 검색 결과를 참조하십시오.

식별자는 함수 내에서 두 가지 용도로 사용할 수 없음

R2019b부터는 식별자를 먼저 로컬 함수 또는 가져온 함수로 사용한 후 변수로 사용하면 오류가 발생합니다. 이전 릴리스에서는 함수 범위 내에서 서로 다른 용도로 식별자를 사용할 수 있었지만 이로 인해 코드가 모호해졌습니다.

이러한 동작 변경으로 인해 코드가 영향을 받으면 변수와 함수가 다른 이름을 갖도록 변수 또는 함수의 이름을 바꾸십시오.

R2019b 이상 릴리스업데이트된 코드R2019a 이하 릴리스

이름 locallocal 함수로 사용된 후, 변수로 사용됩니다. 다음 코드를 실행하면 오류가 발생합니다.

function myfunc
% local is an undefined variable
local(1); % Errors
local = 2; 
disp(local);
end

function local(x)
disp(x)
end

함수 local의 이름을 localFcn으로 바꾸십시오.

function myfunc
localFcn(1);
local = 2; 
disp(local);
end

function localFcn(x)
disp(x)
end

다음 코드는 1을 표시한 다음, 2를 표시합니다.

function myfunc
local(1); % local is a function
local = 2; 
disp(local);
end

function local(x)
disp(x)
end

명시적으로 선언하지 않은 식별자는 변수로 취급되지 않을 수 있음

R2019b부터 MATLAB®은 인덱싱 연산자를 사용하여 프로그램에서 변수를 식별하지 않습니다. 이전에는 명시적으로 선언하지 않은 식별자는 콜론, end 또는 중괄호를 사용하여 인덱싱될 때 변수로 취급되었습니다. 예를 들어, xx(a,b,:), x(end)x{a}에서 변수로 취급되었습니다.

다음 코드를 살펴보겠습니다. MATLAB은 콜론 인덱싱으로 인해 x를 변수로 취급했습니다. R2019b부터는 경로에 동일한 이름의 함수가 있으면 MATLAB은 x를 함수로 취급합니다.

function myfunc
load data.mat; % data.mat contains variable x
disp(x(:))
end

x를 함수 대신 data.mat의 변수로 사용하려면 명시적으로 선언하십시오. 마찬가지로 식별자 x를 스크립트에서 가져온 변수로 사용하려면 변수를 선언한 후 스크립트를 호출하십시오. 함수 sim, eval, evalcassignin에서 이 변수를 묵시적으로 도입하는 경우에도 이 새 동작이 적용됩니다.

다음 표에서는 코드를 업데이트할 수 있는 방법에 대한 일부 예제를 보여줍니다.

이전이후
function myfunc
load data.mat;
disp(x(:))
end
function myfunc
load data.mat x;
disp(x(:))
end
function myfunc2
myscript; % Contains variable x
disp(x(:))
end
function myfunc2
x = [];
myscript;
disp(x(:))
end

변수는 부모 함수와 중첩 함수 간에 묵시적으로 공유할 수 없음

R2019b부터 식별자가 부모 함수에서 명시적으로 변수로 선언된 경우에만 식별자를 중첩 함수와 부모 함수 간에 변수로 공유할 수 있습니다.

예를 들어, 다음 코드에서 myfunc의 식별자 x는 중첩 함수의 변수 x와 다릅니다. x가 경로에 있는 함수인 경우 MATLAB은 myfuncx를 함수로 취급하며 코드가 실행됩니다. 그렇지 않으면 MATLAB은 오류를 발생시킵니다.

function myfunc
nested;
x(3) % x is not a shared variable
    function nested
    x = [1 2 3];
    end
end

이전 릴리스에서는 x가 경로에 있는 함수인 경우, MATLAB은 이를 myfunc의 함수와 nested의 변수로 취급했습니다. x가 경로에 있는 함수가 아닌 경우 MATLAB은 이를 myfuncnested 간에 공유하는 변수로 취급했습니다. 이로 인해 코드의 출력값이 경로 상태에 따라 달라졌습니다.

식별자를 부모 함수와 중첩 함수 간에 공유하는 변수로 사용하려면 코드를 업데이트해야 할 수 있습니다. 예를 들어, 식별자를 부모 함수에서 빈 배열로 초기화할 수 있습니다.

이전이후
function myfunc
nested;
x(3)
    function nested
    x = [1 2 3];
    end
end
function myfunc
x = [];
nested;
x(3)
    function nested
    x = [1 2 3];
    end
end

와일드카드 기반 가져오기의 우선 순위 변경

R2019b부터 와일드카드 기반 가져오기에서 가져온 함수는 변수, 중첩 함수 및 로컬 함수보다 우선 순위가 낮습니다. R2019a 이하 릴리스에서는 함수의 가져오기가 로컬 함수와 중첩 함수를 가렸습니다.

예를 들어, 다음 코드에서 명령문 local()은 와일드카드 기반 가져오기의 pkg1.local 대신 myfunc/local을 호출합니다. 명령문 nest()pkg1.nest 대신 myfunc/nest를 호출합니다.

R2019b 이상 릴리스R2019a 이하 릴리스
function myfunc
% Import includes functions local and nest
import pkg1.* 
local()   % Calls myfunc/local 

    function nest
    end

nest();   % Calls myfunc/nest 
end

function local
end
function myfunc
% Import includes functions local and nest
import pkg1.* 
local()   % Calls pkg1.local and 
          % displays warning since R2018a

    function nest
    end

nest();   % Calls pkg1.nest
end

function local
end

import에 대한 검색 결과에서 와일드카드 문자(*)가 포함된 명령문을 찾아보십시오.

정규화된 가져오기 함수는 중첩 함수와 동일한 이름을 가질 수 없음

R2019b부터 동일한 범위의 중첩 함수와 이름을 공유하는 정규화된 가져오기는 오류를 발생시킵니다.

R2019b 이상 릴리스업데이트된 코드R2019a 이하 릴리스

이 함수는 동일한 범위의 중첩 함수와 이름을 공유하기 때문에 오류를 발생시킵니다.

function myfunc
import pkg.nest  % Errors 
nest();          

    function nest
    end
end

import 문에서 함수 nest를 호출하려면 로컬 함수 myfunc/nest의 이름을 바꾸십시오.

function myfunc
import pkg.nest 
nest();          

    function newNest
    end
end

이 함수는 import 문에서 함수 nest를 호출합니다.

function myfunc
import pkg.nest   
nest();  % Calls pkg.nest

    function nest
    end
end

가져온 함수 nest와 이름이 동일한 변수를 선언하는 기능이 지원되지 않기 때문에 이 함수는 오류를 발생시킵니다.

function myvarfunc
import pkg.nest  % Errors 
nest = 1
end

변수 nest의 이름을 바꾸십시오.

function myvarfunc
import pkg.nest  % Errors 
thisNest = 1
end

이 함수는 변수 nest를 수정합니다.

function myvarfunc
import pkg.nest
nest = 1  % Modifies variable nest and
          % displays warning since R2018a
end

정규화된 가져오기는 동일한 이름의 외부 범위 정의를 가림

R2019b부터 정규화된 가져오기는 항상 동일한 이름의 외부 범위 정의를 가립니다. R2019a 이하 릴리스에서는 정규화된 가져오기가 외부 범위에 있는 식별자를 가릴 경우 이 가져오기는 무시되었습니다.

R2019b 이상 릴리스업데이트된 코드R2019a 이하 릴리스

로컬 함수 nest는 가져온 패키지에서 함수 x를 호출합니다.

function myfunc
x = 1;

    function nest
        % Import function x
        import pkg1.x 
        % Calls pkg1.x 
        x()
    end
end

로컬 함수 nest에서 변수 x를 사용하려면 변수를 인수로 전달하십시오.

function myfunc
x = 1;
nest(x)

    function nest(x1)
        % Import function x
        import pkg1.x 
        % Calls pkg1.x with 
        % variable x1
        x(x1)
    end
end

다음 코드에서 함수 nest는 가져온 함수 x를 무시합니다.

function myfunc
x = 1;

    function nest
        % Import function x
        import pkg1.x
        % x is a variable
        x()
    end
end

가져오기를 찾을 수 없을 때의 오류 처리

R2019b부터는 확인할 수 없는 정규화된 가져오기가 Java®와 무관하게 오류를 발생시킵니다. R2019a 이하 릴리스에서는 -nojvm 옵션을 사용하여 MATLAB을 시작했는지에 따라 MATLAB이 다르게 동작했습니다. 오류 메시지를 사용자 지정하는 데 javachkusejava 같은 함수를 사용하지 마십시오.

R2019b 이상 릴리스업데이트된 코드R2019a 이하 릴리스

-nojvm 옵션을 사용하여 MATLAB을 시작할 경우 다음 코드는 오류를 발생시킵니다.

function myfunc 
import java.lang.String % Errors

if ~usejava('jvm') 
    % Statement never executes
    disp('This function requires Java'); 
else 
    % Do something with Java String class 
end 
end

usejava에 대한 호출을 제거하십시오.

function myfunc 
import java.lang.String % Errors
% Do something with java String class 
end

-nojvm 옵션을 사용하여 MATLAB을 시작할 경우 다음 코드는 메시지를 표시합니다.

function myfunc 
import java.lang.String 

if ~usejava('jvm') 
    % Display message
    disp('This function requires Java'); 
else 
    % Do something with Java String class 
end 
end

중첩 함수는 부모 함수에서 import 문을 상속함

R2019b부터 중첩 함수는 부모 함수에서 import 문을 상속합니다. R2019a 이하 릴리스에서는 중첩 함수가 부모 함수에서 import 문을 상속하지 않았습니다.

R2019b 이상 릴리스R2019a 이하 릴리스
function myfunc

% Package p1 has functions plot and bar
import p1.plot 
import p1.*
nest

    function nest
        plot   % Calls p1.plot
        bar    % Calls p1.bar
    end
end
function myfunc

% Package p1 has functions plot and bar
import p1.plot 
import p1.*
nest

    function nest
        plot   % Calls plot function on path
        bar    % Calls bar function on path
    end
end

복합형 이름 확인의 우선 순위 변경

R2019b부터 MATLAB은 다른 방식으로 복합형 이름을 확인합니다. 복합형 이름은 점으로 결합된 여러 부분으로 이루어진 이름(예: a.b.c)으로, 패키지 멤버를 참조하는 데 사용할 수 있습니다. R2019b에서 MATLAB은 일치하는 가장 긴 접두사에 우선 순위를 두는 방식으로 복합형 이름을 확인합니다. 이전 릴리스의 경우, 우선 순위에 적용되는 규칙이 훨씬 복잡했습니다.

예를 들어, 패키지 pkg에 정적 메서드 bar가 있는 클래스 foo와 함수 bar가 있는 서브패키지 foo가 포함되어 있다고 가정해 보겠습니다.

+pkg/@foo/bar.m % bar is a static method of class foo
+pkg/+foo/bar.m % bar is a function in subpackage foo

R2019b에서 which pkg.foo.bar를 호출하면 패키지 함수에 대한 경로가 반환됩니다.

which pkg.foo.bar
+pkg/+foo/bar.m

이전에는 패키지와 클래스가 동일한 이름을 갖는 경우 정적 메서드가 패키지 함수보다 우선했습니다.

익명 함수에는 확인된 식별자와 확인되지 않은 식별자가 포함될 수 있음

R2019b부터 익명 함수에 확인된 식별자와 확인되지 않은 식별자가 모두 포함될 수 있습니다. 이전 릴리스에서는 생성 시 익명 함수의 식별자가 확인되지 않으면 해당 익명 함수의 모든 식별자가 확인되지 않았습니다.

R2019b 이상 릴리스R2019a 이하 릴리스

익명 함수의 lf는 로컬 함수로 확인되기 때문에 익명 함수를 실행하기 위해 MATLAB은 myscript에 정의된 x를 사용해 로컬 함수 lf를 호출합니다.

function myfun
myscript; % Includes x = 1 and lf = 10
f = @()lf(x);
f()       % Displays 'Inside lf'
end

% Local function to myfun
function lf(y) 
disp('Inside lf');
end 

MATLAB은 lfx와 함께 확인되지 않은 식별자로 간주하고 x를 사용하여 myscript에서 변수 lf의 요소를 참조합니다.

function myfun
myscript; % Includes x = 1 and lf = 10
f = @()lf(x);
f()       % Displays 10
end

% Local function to myfun
function lf(y) 
disp('Inside lf');
end 

참고 항목

관련 항목