Main Content

arguments

함수 인수 유효성 검사 선언

구문

arguments
    argName1 (dimensions) class {validators} = defaultValue
    ...
    argNameN ...
end

arguments (Repeating)
    argName1 (dimensions) class {validators} = defaultValue
    ...
    argNameN ... 
end

arguments (Output)
    argName1 (dimensions) class {validators}
    ...
    argNameN ...
end

arguments (Output,Repeating)
    argName (dimensions) class {validators}
end

설명

입력 인수 블록

예제

arguments ... end는 함수에 대한 입력 인수를 선언합니다. arguments 블록은 선택 사항입니다. arguments 블록을 하나 이상 포함할 경우 함수의 첫 번째 실행 가능한 라인 앞에 와야 합니다. MATLAB®은 명시적으로 Input 또는 Output 레이블이 지정되지 않은 모든 인수 블록을 입력 블록으로 처리합니다.

각 인수는 다음 구문에서 볼 수 있듯이 디폴트 값 또는 하나 이상의 제한 사항을 가질 수 있습니다.

argName (dimensions) class {validators} = defaultValue

  • (dimensions) — 입력 크기로, 둘 이상의 숫자가 쉼표로 구분된 목록으로 지정됩니다(예: (1,2), (3,5,2) 또는 (1,:)). 콜론을 사용하면 해당 차원에서 임의의 길이를 나타낼 수 있습니다. (dimensions)는 표현식을 포함할 수 없습니다.

    입력값의 차원은 (dimensions)와 정확히 일치하거나 (dimensions)로 지정된 크기와 호환되어야 합니다. 예를 들어, (1,:)은 입력값이 1×n 행 벡터여야 함을 지정하지만, n×1 열 벡터도 호환됩니다. 이 함수는 행 벡터 입력값을 열 벡터 입력값으로 형태 변경합니다. 마찬가지로, 크기 (2,3)은 스칼라 입력값을 허용하지만, 이를 2×3 행렬로 확장합니다. 자세한 내용은 기본 연산에 대해 호환되는 배열 크기 항목을 참조하십시오.

  • class — 클래스 또는 MATLAB 데이터형으로, double과 같이 이름으로 지정됩니다. 입력값은 지정된 유형이거나 해당 유형으로 변환될 수 있는 유형이어야 합니다. 예를 들어, double을 지정하는 함수는 single 클래스의 값을 받아서 double형으로 변환합니다. 변환에 대한 자세한 내용은 Implicit Class Conversion 항목을 참조하십시오.

  • {validators}mustBeNumeric, mustBeScalarOrEmpty와 같은 유효성 검사 함수의 쉼표로 구분된 목록으로, 중괄호로 묶습니다. 유효성 검사 함수는 입력 인수가 조건과 일치하지 않는 경우 오류를 발생시킵니다. class와 달리 유효성 검사 함수는 입력 인수를 수정하지 않습니다. 유효성 검사 함수 목록은 인수 유효성 검사 함수 항목을 참조하십시오.

  • defaultValue — 디폴트 값은 지정된 크기, 유형 및 유효성 검사 규칙을 따라야 합니다. 디폴트 값은 표현식일 수도 있습니다. 디폴트 값을 지정하면 해당 인수가 선택 사항이 됩니다. 선택적 인수는 함수 시그니처와 arguments 블록에서 필수 인수 뒤에 위치해야 합니다.

이름-값 인수의 경우, argnv.name 형식을 사용합니다. 여기서 nv는 함수 시그니처의 구조체 이름이고 name은 arguments 블록의 인수 이름입니다. 예를 들어, options라는 구조체를 사용하여 이름-값 인수를 받는 함수를 정의해 보겠습니다.

y = myFunction(x,options)

arguments 블록에 이름-값 인수의 이름을 필드로 지정합니다.

arguments 
    x
    options.Name1
    options.Name2
end 

일반적으로 arguments 블록을 사용하는 방법에 대한 자세한 내용은 arguments 블록 구문 항목을 참조하십시오.

예제

arguments (Repeating) ... end는 반복되는 입력 인수를 선언합니다.

예를 들어, 반복 인수 X, Y, style을 갖는 함수 myplot을 만들 경우, 이 함수는 myplot(x1,y1,style1,x2,y2,style2)와 같이 3개 인수의 여러 세트를 받습니다. MATLAB은 해당 인수에 대해 전달된 모든 값을 포함하는 셀형 배열을 만듭니다.

함수는 repeating input arguments 블록을 하나만 포함할 수 있습니다. 함수가 반복 인수와 이름-값 인수를 모두 포함할 경우, repeating arguments 블록 뒤에 이름-값 인수를 위한 별도의 블록으로 선언합니다.

반복 인수에 대한 자세한 내용은 반복되는 인수 항목을 참조하십시오.

출력 인수 블록

예제

arguments (Output) ... end는 함수에 대한 출력 인수를 선언합니다. output arguments 블록은 선택 사항입니다. 하나 이상의 출력 arguments 블록을 포함할 경우 모든 입력 블록 뒤에 오되 함수의 첫 번째 실행 가능한 라인 앞에 와야 합니다. 함수에 입력과 출력 블록을 모두 포함할 경우 가독성을 위해 명시적으로 (Input)(Output) 특성을 포함하는 것이 좋습니다. 예제는 인수 유효성 검사를 포함한 반복되는 출력 항목을 참조하십시오.(R2022b 이후)

이 구문에서 볼 수 있듯이 출력 인수는 입력 인수와 마찬가지로 하나 이상의 제한 사항을 가질 수 있습니다.

argName (dimensions) class {validators}

자세한 내용은 arguments ... end에 대한 설명을 참조하십시오. 입력 인수와 달리 출력 인수는 디폴트 값을 정의할 수 없으며 출력 인수에 적용된 유효성 검사 함수는 이전 출력 인수를 참조할 수 없습니다.

예제

arguments (Output,Repeating) ... end는 함수에 대해 반복되는 출력 인수를 선언합니다. 반복되는 출력 인수에 대한 인수 유효성 검사를 사용할 수 있지만 반복되는 출력 인수는 함수당 하나만 정의할 수 있습니다. 단일 출력 인수인 경우 varargout은 repeating output arguments 블록에 나타날 수 있습니다.(R2022b 이후)

예제

모두 축소

입력값의 크기를 임의 길이의 행 벡터로 제한하는 함수를 작성합니다. 유효성 검사 함수를 사용하여 해당 벡터의 요소를 숫자형 값으로 제한합니다.

function [m,s] = twoStats(x)
    arguments
        x (1,:) {mustBeNumeric}
    end
    m = mean(x,"all");
    s = std(x,1,"all");
end

요소를 3개 가진 행 벡터에 대해 함수를 호출합니다.

a = [1 3 5];
[m,s] = twoStats(a)
m =

     3


s =

    1.6330

행 벡터와 열 벡터는 호환되기 때문에 열 벡터를 사용하여 함수를 호출하는 것도 유효합니다.

a = [1 3 5]';
[m,s] = twoStats(a)
m =

     3


s =

    1.6330

숫자가 아닌 값을 포함하는 벡터를 사용하여 함수를 호출할 경우 mustBeNumeric 유효성 검사 함수가 오류를 발생시킵니다.

a = ["1" "3" "5"];
[m,s] = twoStats(a)
Error using twoStats
Invalid argument at position 1. Value must be numeric.

함수에 대해 선택적인 이름-값 인수를 선언하려면 함수 선언에 구조체 이름을 포함하고, arguments 블록 내에서 인수 이름을 해당 구조체의 필드로 정의하십시오.

options를 구조체 이름으로 사용하여 myRectangle 함수를 선언합니다. options의 두 필드인 LineStyleLineWidth는 함수의 이름-값 인수의 이름입니다.

function myRectangle(X,Y,options)
    arguments
       X double
       Y double
       options.LineStyle (1,1) string = "-" 
       options.LineWidth (1,1) {mustBeNumeric} = 1
    end
    % Function code
    ...
end

두 인수 이름 모두 정의된 디폴트 값을 가지므로 둘 다 선택 사항입니다. 다음 구문은 모두 이 함수를 호출할 수 있는 유효한 방법입니다.

myRectangle(4,5)
myRectangle(4,5,LineStyle=":",LineWidth=2)
myRectangle(4,5,LineWidth=2,LineStyle=":")
myRectangle(4,5,LineStyle=":")
myRectangle(4,5,LineWidth=2)

R2021a 이전 릴리스에서는 이름을 string형 또는 문자형 벡터로 전달하고 이름과 값을 쉼표로 구분해야 합니다. 두 구문 모두 이후 릴리스에서 유효합니다.

반복 인수란 함수 호출에서 0번 이상 반복될 수 있는 단일 인수 또는 인수 그룹입니다. fRepeat 함수는 인수 x, y, style의 반복되는 그룹을 받습니다. 입력 인수 xy를 double형 값으로 구성된 벡터 또는 double형으로 변환할 수 있는 값으로 구성된 벡터로 제한합니다. style을 문자열 "--"":"으로 제한합니다.

function fRepeat(x,y,style)
    arguments (Repeating)
        x (1,:) double
        y (1,:) double
        style {mustBeMember(style,["--",":"])}       
    end
    
    % Reshape the cell arrays of inputs and call plot function
    z = reshape([x;y;style],1,[]);
    if ~isempty(z)
        plot(z{:});
    end
end

fRepeat를 입력값 2개 그룹을 사용하여 호출합니다. MATLAB은 x에 대해 전달된 모든 값을 포함하는 셀형 배열, y의 값에 대한 또 다른 배열, 그리고 style의 값에 대한 세 번째 배열을 만듭니다. 그런 다음 함수는 이 배열들을 1×6 셀형 배열 z로 형태 변경하여 plot으로 전달합니다.

x1 = 1:10;
y1 = 1:10; 
s1 = ":"; 
x2 = 1:7;
y2 = 1:1.5:10;
s2 = "--";
fRepeat(x1,y1,s1,x2,y2,s2)

Plot showing two lines

점 (0.4, 0.4)를 기준으로 사용자가 지정한 각도만큼 2차원 정사각형 패치를 회전하는 함수를 작성합니다. 최종 이미지의 x 좌표와 y 좌표를 출력 인수로 반환하고 이러한 값을 양수로 제한합니다. 즉, 함수는 회전의 최종 결과가 완전히 첫 번째 사분면에 있을 때만 좌표를 반환해야 합니다.

function [xfinal,yfinal] = rotatePatch(angle)
    arguments (Output)
        xfinal {mustBePositive}
        yfinal {mustBePositive}
    end
    x = [0.1 0.1 0.7 0.7];
    y = [0.1 0.7 0.7 0.1];
    p = patch(x,y,"red");
    rotate(p,[0 0 1],angle,[0.4 0.4 0])
    xfinal = p.Vertices(:,1);
    yfinal = p.Vertices(:,2);
end

15도 각도를 사용하여 함수를 호출합니다. 이 회전은 꼭짓점을 첫 번째 사분면 바깥으로 이동시키지 않으므로 함수는 오류 없이 값을 반환합니다.

[x1,y1] = rotatePatch(15)
x1 =

    0.1879
    0.0326
    0.6121
    0.7674


y1 =

    0.0326
    0.6121
    0.7674
    0.1879

Plot of red square rotated counterclockwise 15 degrees

35도 각도를 사용하여 함수를 호출합니다. 이 경우 왼쪽 아래 꼭짓점이 첫 번째 사분면 바깥으로 이동합니다. 음의 x 좌표는 출력 인수 유효성 검사를 충족하지 않으므로 함수는 오류를 반환합니다.

[x2,y2] = rotatePatch(35)
Invalid output 'xfinal'. Value must be positive.

Error in rotatePatch (line 12)
end

Plot of two red squares rotated counterclockwise 15 and 35 degrees

반복 벡터 쌍을 수락하고 각 쌍의 합을 반환하는 함수를 작성합니다. 입력값과 출력값을 행 벡터로 제한합니다.

function vectorSum = repeatSum(a,b)
  arguments (Input,Repeating)
    a (1,:)
    b (1,:)
  end
  arguments (Output,Repeating)
    vectorSum (1,:)
  end

  n = numel(a);
  vectorSum{n} = a{n} + b{n};
  for i = 1:n-1
    vectorSum{i} = a{i} + b{i};
  end
end

for 루프 전에 최종 출력값을 계산하고 이 값을 vectorSum{n}에 할당하면 셀형 배열을 위한 공간이 사전할당됩니다. 사전할당 없이 루프에서 셀형 배열을 확장하면 성능에 부정적인 영향을 미칠 수 있습니다.

두 쌍의 벡터를 정의합니다. 두 쌍을 입력값으로 하여 repeatSum을 호출합니다. 열 벡터와 행 벡터의 크기가 서로 호환되므로 입력 인수 블록 유효성 검사에서 열 벡터를 행 벡터로 변환합니다.

x1 = [1 2];
y1 = [3 4];
x2 = [1; 0];
y2 = [0; 1];
[sum1,sum2] = repeatSum(x1,y1,x2,y2)
sum1 =

     4     6


sum2 =

     1     1

입력값은 행 벡터로 제한되기 때문에 각 벡터 쌍의 합은 항상 행 벡터입니다. 하지만 출력 유효성 검사는 함수가 나중에 수정되더라도 해당 함수가 행 벡터를 생성하도록 지원합니다. 예를 들어, 입력 유효성 검사를 mustBeVector 함수로 변경한 경우 변환 없이 행 벡터 1개와 열 벡터 1개로 쌍을 구성할 수 있습니다. 이런 경우 x1y2의 합은 행렬입니다.

x1 + y2
ans =

     1     2
     2     3

행렬이 출력 유효성 검사를 통과하지 못하기 때문에 수정된 repeatSum 출력에 오류가 발생합니다.

제한 사항

  • 중첩 함수, 추상 메서드, 핸들 클래스 소멸자 메서드에서는 인수 블록이 지원되지 않습니다.

세부 정보

모두 축소

지원되는 데이터형

인수 선언에서는 임의의 MATLAB 클래스 또는 MATLAB이 지원하는 외부에서 정의된 클래스를 지정할 수 있습니다. 단, Java 클래스, COM 클래스, MATLAB 버전 7.6 이전에 정의된 MATLAB 클래스(즉, classdef 키워드를 사용하지 않는 클래스 정의)는 예외입니다.

  • 데이터형 제한을 사용하면 입력 인수가 암시적으로 변환될 수 있습니다. 예를 들면 다음과 같습니다.

    function y = myFunction(inputArg1)
        arguments
            inputArg1 (1,1) double
        end
        ...
    이 함수의 경우, 문자열 "123"을 입력 인수로 전달하면 MATLAB은 문자열을 double형 숫자 값 123으로 변환합니다.

    유효성 검사 함수는 어떠한 방식으로도 입력값을 변경하지 않으므로, 데이터형 변환을 피하려면 데이터형 대신 하나 이상의 유효성 검사 함수를 사용하여 입력값을 제한하십시오. 예를 들면 다음과 같습니다.

    • 문자열이 숫자형 값으로 변환되지 않도록 하려면 mustBeA, mustBeFloat 또는 mustBeNumeric을 사용하십시오.

    • 숫자형 값이 문자열로 변환되지 않도록 하려면 mustBeText, mustBeTextScalar 또는 mustBeNonZeroLengthText를 사용하십시오.

    • 크기 변환을 방지하려면 mustBeVector 또는 mustBeScalarOrEmpty를 사용하십시오.

버전 내역

R2019b에 개발됨

모두 확장