R2019b 함수 우선 순위 변경에 따른 코드 업데이트
R2019b부터 MATLAB에서 변수, 중첩 함수, 로컬 함수 및 외부 함수의 우선 순위에 영향을 주는 이름 확인 규칙이 변경되었습니다. 새 규칙은 이름 확인 절차를 간소화 및 표준화합니다. 자세한 내용은 함수 우선 순위(Function Precedence Order) 항목을 참조하십시오.
이러한 변경 사항은 import
함수의 동작에 영향을 미칩니다. 이에 따라 코드를 분석하고 가능한 경우 업데이트해야 합니다. 코드에서 import 문부터 검색해 보십시오. 예를 들어, 파일 찾기를 참조하여 텍스트 import
가 포함된 .m
파일과 .mlx
파일을 검색합니다. 다음 변경 사항의 영향을 평가할 때 이 검색 결과를 참조하십시오.
식별자는 함수 내에서 두 가지 용도로 사용할 수 없음
R2019b부터는 식별자를 먼저 로컬 함수 또는 가져온 함수로 사용한 후 변수로 사용하면 오류가 발생합니다. 이전 릴리스에서는 함수 범위 내에서 서로 다른 용도로 식별자를 사용할 수 있었지만 이로 인해 코드가 모호해졌습니다.
이러한 동작 변경으로 인해 코드가 영향을 받으면 변수와 함수가 다른 이름을 갖도록 변수 또는 함수의 이름을 바꾸십시오.
R2019b 이상 릴리스 | 업데이트된 코드 | R2019a 이하 릴리스 |
---|---|---|
이름 function myfunc % local is an undefined variable local(1); % Errors local = 2; disp(local); end function local(x) disp(x) end | 함수 function myfunc localFcn(1); local = 2; disp(local); end function localFcn(x) disp(x) end | 다음 코드는 function myfunc local(1); % local is a function local = 2; disp(local); end function local(x) disp(x) end |
명시적으로 선언하지 않은 식별자는 변수로 취급되지 않을 수 있음
R2019b부터 MATLAB®은 인덱싱 연산자를 사용하여 프로그램에서 변수를 식별하지 않습니다. 이전에는 명시적으로 선언하지 않은 식별자는 콜론, end
또는 중괄호를 사용하여 인덱싱될 때 변수로 취급되었습니다. 예를 들어, x
는 x(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
, evalc
및 assignin
에서 이 변수를 묵시적으로 도입하는 경우에도 이 새 동작이 적용됩니다.
다음 표에서는 코드를 업데이트할 수 있는 방법에 대한 일부 예제를 보여줍니다.
이전 | 이후 |
---|---|
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은 myfunc
의 x
를 함수로 취급하며 코드가 실행됩니다. 그렇지 않으면 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은 이를 myfunc
와 nested
간에 공유하는 변수로 취급했습니다. 이로 인해 코드의 출력값이 경로 상태에 따라 달라졌습니다.
식별자를 부모 함수와 중첩 함수 간에 공유하는 변수로 사용하려면 코드를 업데이트해야 할 수 있습니다. 예를 들어, 식별자를 부모 함수에서 빈 배열로 초기화할 수 있습니다.
이전 | 이후 |
---|---|
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 |
function myfunc import pkg.nest nest(); function newNest end end | 이 함수는 function myfunc import pkg.nest nest(); % Calls pkg.nest function nest end end |
가져온 함수 function myvarfunc import pkg.nest % Errors nest = 1 end | 변수 function myvarfunc import pkg.nest % Errors thisNest = 1 end | 이 함수는 변수 function myvarfunc import pkg.nest nest = 1 % Modifies variable nest and % displays warning since R2018a end |
정규화된 가져오기는 동일한 이름의 외부 범위 정의를 가림
R2019b부터 정규화된 가져오기는 항상 동일한 이름의 외부 범위 정의를 가립니다. R2019a 이하 릴리스에서는 정규화된 가져오기가 외부 범위에 있는 식별자를 가릴 경우 이 가져오기는 무시되었습니다.
R2019b 이상 릴리스 | 업데이트된 코드 | R2019a 이하 릴리스 |
---|---|---|
로컬 함수 function myfunc x = 1; function nest % Import function x import pkg1.x % Calls pkg1.x x() end end | 로컬 함수 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 | 다음 코드에서 함수 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이 다르게 동작했습니다. 오류 메시지를 사용자 지정하는 데 javachk
와 usejava
같은 함수를 사용하지 마십시오.
R2019b 이상 릴리스 | 업데이트된 코드 | R2019a 이하 릴리스 |
---|---|---|
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 |
function myfunc import java.lang.String % Errors % Do something with java String class end |
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 이하 릴리스 |
---|---|
익명 함수의 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은 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 |