Main Content

함수 인수 유효성 검사

함수 인수 유효성 검사는 함수 인수에 대한 특정 제한을 선언하는 한 가지 방법입니다. 인수 유효성 검사를 사용하면 함수 본문에 테스트를 수행하는 코드를 작성하지 않고도 인수의 클래스, 크기 및 그 밖의 특성을 제한할 수 있습니다.

함수 인수 유효성 검사는 선언적이기 때문에 이 검사를 사용하면 MATLAB® 데스크탑 툴에서 특정 코드 블록을 검토하여 함수에 대한 정보를 추출할 수 있습니다. 인수에 대한 요구 사항을 선언하여 복잡한 인수 확인 코드를 제거하고 코드의 가독성, 견고성 및 유지 관리성을 향상시킬 수 있습니다.

함수 인수 유효성 검사 구문은 선택적 인수 , 반복되는 인수, 이름-값 인수를 정의하는 절차를 간소화합니다. 또한 이 구문은 일관된 방법으로 디폴트 값을 정의할 수 있도록 합니다.

인수 유효성 검사를 사용하는 경우

함수 정의에서 함수 인수 유효성 검사의 사용 여부는 선택 사항입니다. 인수 유효성 검사는 어떤 코드로도 호출할 수 있으며, 함수 코드 실행 전에 인수의 유효성을 확인해야 하는 함수에서 가장 유용합니다. 다른 곳에서 이용할 수 있도록 설계된 함수의 경우, 인수에 대해 적합한 수준의 제한을 적용하고 인수 유효성 검사에 기반하여 특정 오류 메시지를 반환하는 수단으로 이 검사를 활용할 수 있습니다.

유효성 검사가 필요하지 않은 경우

로컬 함수와 프라이빗 함수, 프라이빗 메서드와 보호 메서드에서는 호출자가 입력 요구 사항을 알고 있기 때문에 유효한 인수로 이러한 유형의 함수를 호출할 수 있습니다.

유효성 검사가 허용되지 않는 경우

중첩 함수, 추상 메서드 또는 핸들 클래스 소멸자 메서드에서는 인수 유효성 검사 구문을 사용할 수 없습니다. 메서드에서의 인수 유효성 검사에 대한 자세한 내용은 메서드 구문 항목을 참조하십시오.

arguments 블록 구문

함수는 키워드 argumentsend로 구분된 선택적 코드 블록에 인수 유효성 검사를 정의합니다. 사용할 경우, arguments 블록은 함수의 실행 가능한 첫 번째 라인 전에 시작되어야 합니다.

함수에 여러 개의 arguments 블록을 사용할 수 있지만 모든 블록은 arguments 블록의 일부가 아닌 코드 앞에 있어야 합니다.

다음 코드에서 강조 표시된 영역이 입력 인수 유효성 검사를 위한 구문입니다.

함수 인수 선언에는 다음 종류의 제한 사항이 포함될 수 있습니다.

  • 크기 — 각 차원의 길이로, 괄호로 묶습니다.

  • 클래스 — 단일 MATLAB 클래스의 이름입니다.

  • 함수 — 쉼표로 구분된 유효성 검사 함수 목록으로, 중괄호로 묶습니다.

또한 입력 인수의 디폴트 값을 해당 인수에 대한 함수 유효성 검사 선언에 정의할 수 있습니다. 디폴트 값은 해당 인수에 대해 선언된 제한 사항을 충족해야 합니다.

크기 및 클래스의 유효성 검사하기

크기

유효성 검사 크기는 인수의 차원으로, 음이 아닌 정수 또는 콜론(:)으로 지정됩니다. 콜론은 그 차원에서 임의의 길이가 허용됨을 나타냅니다. 차원에는 표현식을 사용할 수 없습니다. 함수 호출의 인수에 할당된 값은 지정된 크기와 호환되어야 합니다. 그렇지 않으면 MATLAB이 오류를 발생시킵니다.

MATLAB 인덱스 참조 값 할당 규칙이 크기 사양에 적용됩니다. 예를 들어, MATLAB은 스칼라 확장을 적용하기 때문에 1×1 값이 (5,3)으로 지정된 크기와 호환됩니다. 또한 (1,:)으로 지정된 크기가 1×n 및 n×1의 크기를 받을 수 있도록 MATLAB 행-열 변환이 적용됩니다.

다음은 몇 가지 예입니다.

  • (1,1) — 입력값은 정확하게 1×1이어야 합니다.

  • (3,:) — 첫 번째 차원은 3이어야 하고, 두 번째 차원은 어떤 값이든 가능합니다.

크기를 지정하지 않으면 유효성 검사 함수가 제한하지 않는 한 어떤 크기도 허용됩니다.

클래스

유효성 검사 클래스는 단일 클래스의 이름입니다. 함수 입력값에 할당된 값은 지정된 클래스이거나 지정된 클래스로 변환될 수 있어야 합니다. 임의의 MATLAB 클래스 또는 MATLAB이 지원하는 외부에서 정의된 클래스를 사용하십시오. 단, Java, COM 클래스 및 classdef 키워드를 사용하지 않는 MATLAB 클래스 정의(MATLAB 버전 7.6 이전에 정의된 클래스)는 예외입니다.

다음은 몇 가지 예입니다.

  • char — 입력값은 char 클래스 또는 MATLAB이 char형으로 변환할 수 있는 값(예: string형)이어야 합니다.

  • double — 입력값은 모든 정밀도의 숫자형 값일 수 있습니다.

  • cell — 입력값은 셀형 배열이어야 합니다.

  • 사용자 정의 클래스

클래스를 지정하지 않으면 유효성 검사 함수가 제한하지 않는 한 어떤 클래스도 허용됩니다.

예제: 기본 인수 유효성 검사

다음 arguments 블록은 입력값 3개의 크기와 클래스를 지정합니다.

function out = myFunction(A, B, C)   
    arguments
        A (1,1) string 
        B (1,:) double
        C (2,2) cell
    end

    % Function code
    ...
end

이 함수에서 변수는 다음과 같은 유효성 검사 요구 사항을 충족해야 합니다.

  • A는 string형 스칼라입니다.

  • B는 1×임의 길이의 double형 벡터입니다.

  • C는 2×2 셀형 배열입니다.

유효성 검사 함수

유효성 검사 함수는 특정 요구 사항이 인수 값으로 충족되지 않으면 오류를 발생시키는 MATLAB 함수입니다. 유효성 검사 함수는 값을 반환하지 않으며, 클래스 및 크기와 달리 유효성을 검사하는 인수의 값을 변경할 수 없습니다.

유효성 검사 과정에서 MATLAB은 해당 인수에 대해 나열된 각각의 유효성 검사 함수에 인수 값을 전달합니다. 유효성 검사 함수에 전달되는 값은 클래스 및 크기 사양에 의한 변환의 결과입니다. MATLAB은 왼쪽부터 오른쪽으로 각 함수를 호출하고 첫 번째로 만나는 오류를 발생시킵니다.

미리 정의된 유효성 검사 함수 표는 인수 유효성 검사 함수 항목을 참조하십시오.

예제: 유효성 검사 함수를 사용한 구체적인 제한 설정하기

유효성 검사 함수는 보다 구체적인 방법으로 인수를 제한할 수 있습니다. 다양한 종류의 일반적인 유효성 검사를 위해 미리 정의된 유효성 검사 함수를 사용할 수 있으며, 특정 요구 사항을 충족하도록 사용자 고유의 유효성 검사를 정의할 수도 있습니다.

예를 들어, 이 함수는 mustBeNumeric, mustBeReal, mustBeMember 및 로컬 함수 mustBeEqualSize를 사용하여 다음 유효성 검사를 지정합니다.

  • 입력값 x는 임의의 길이를 갖는 실수 숫자형 행 벡터여야 합니다.

  • 입력값 vx와 동일한 크기를 갖는 실수 숫자형 행 벡터여야 합니다.

  • 입력값 method는 허용된 선택 옵션 3개 중 하나인 문자형 벡터여야 합니다. method는 디폴트 값을 지정하기 때문에 이 인수는 선택 사항입니다.

function myInterp(x,v,method)
    arguments
        x (1,:) {mustBeNumeric,mustBeReal}
        v (1,:) {mustBeNumeric,mustBeReal,mustBeEqualSize(v,x)}
        method (1,:) char {mustBeMember(method,{'linear','cubic','spline'})} = 'linear'
    end
    % Function code
    ....
end

% Custom validation function
function mustBeEqualSize(a,b)
    % Test for equal size
    if ~isequal(size(a),size(b))
        eid = 'Size:notEqual';
        msg = 'Size of first input must equal size of second input.';
        error(eid,msg)
    end
end

사용자 지정 유효성 검사 함수 내에는 함수 인수 유효성 검사를 사용하지 마십시오. 유효성 검사 함수 정의에 대한 자세한 내용과 미리 정의된 유효성 검사 함수 목록은 인수 유효성 검사 함수 항목을 참조하십시오.

디폴트 값

입력 인수의 디폴트 값은 크기, 클래스 및 유효성 검사 함수 요구 사항을 충족하는 임의의 상수 또는 표현식이 될 수 있습니다. 인수 선언에서 디폴트 값을 지정하면 인수는 선택 사항이 됩니다. 인수가 함수 호출에 포함되어 있지 않으면 MATLAB은 디폴트 값을 사용합니다. 디폴트 값이 사용될 때마다 디폴트 값 표현식이 실행됩니다.

참고

MATLAB은 함수가 인수 값 없이 호출될 때만 디폴트 값의 유효성을 검사하기 때문에, 함수가 해당 인수 없이 호출되는 경우에만 유효하지 않은 디폴트 값으로 인해 오류가 발생합니다.

선택적 인수는 함수 시그니처와 arguments 블록에서 필수 인수 뒤에 위치해야 합니다. 선택적 인수에 대한 자세한 내용은 필수 위치 인수와 선택적 위치 인수의 유효성 검사하기 항목을 참조하십시오.

선언된 클래스 및 크기로의 변환

클래스 유효성 검사와 크기 유효성 검사 모두 인수 값을 변경할 수 있습니다. 다음은 MATLAB이 수행할 수 있는 변환의 몇 가지 예입니다.

클래스 제한 사항을 충족하기 위해:

  • char형 값을 string형 값으로 변환할 수 있습니다.

  • single형 값을 double형으로 변환할 수 있습니다.

크기 제한 사항을 충족하기 위해:

  • 스칼라 확장을 통해 입력값 크기를 스칼라에서 비 스칼라로 변경할 수 있습니다.

  • 열 벡터를 행 벡터로 변환할 수 있습니다.

그 결과, 함수 본문에 있는 유효성이 검사된 값은 함수 호출 시 전달된 값과 다를 수 있습니다. 클래스 변환에 대한 자세한 내용은 Implicit Class Conversion 항목을 참조하십시오. 유효성 검사 동안 클래스와 크기 변환을 방지하려면 인수 유효성 검사 함수를 대신 사용하십시오. 자세한 내용은 Use Validation Functions to Avoid Unwanted Class and Size Conversions 항목을 참조하십시오.

예제: 값 변환

다음 함수에서는 arguments 블록에 지정된 클래스와 일치시키기 위해 입력값이 어떻게 변환될 수 있는지를 보여줍니다. SpeedEnum 클래스는 세 번째 인수에 허용되는 값을 정의하기 위해 생성한 열거형 클래스입니다.

function forwardSpeed(a,b,c)
    arguments
        a double
        b char
        c SpeedEnum
    end

    % Function code
    disp(class(a))
    disp(class(b))
    disp(class(c))
end

열거형 클래스는 다음과 같습니다.

classdef SpeedEnum < int32
    enumeration
        Full   (100)
        Half   (50)
        Stop   (0)
    end
end

함수에 대한 이 호출은 MATLAB이 선언된 유형으로 변환할 수 있는 입력값을 사용합니다. 함수 내에서의 실제 인수 유형이 출력값으로 표시됩니다.

forwardSpeed(int8(4),"A string",'full')
double
char
SpeedEnum

출력 인수 유효성 검사

R2022b부터 출력 인수에 인수 유효성 검사를 사용할 수 있습니다. 입력 인수와 마찬가지로, 출력 인수의 클래스와 크기에 대해 유효성을 검사하고 유효성 검사 함수도 적용할 수 있습니다. 그러나 출력 인수의 디폴트 값을 지정하거나 이전에 선언된 인수를 참조할 수 없습니다. 출력 인수 유효성 검사는 항상 선택 사항입니다. 출력 인수 유효성 검사를 추가하면 코드 가독성이 높아지고, 코드에서 시간에 따라 변할 수 있는 출력값이 일관되게 유지됩니다.

입력 인수와 출력 인수에 대한 유효성을 검사할 때는 별도의 arguments 블록을 사용해야 합니다. arguments 명령문 다음에 arguments 블록 (Input) 또는 (Output)의 유형을 정의하십시오. (Input) arguments 블록과 (Output) arguments 블록이 모두 사용되는 경우, (Output) 블록은 (Input) 블록을 따라야 합니다. 지정된 유형이 없는 경우 MATLAB은 블록에 입력 인수가 포함되어 있다고 간주합니다.

자세한 내용은 arguments 항목을 참조하십시오.

예제: 출력 인수의 유효성 검사하기

R2022b부터 출력 인수에 인수 유효성 검사를 사용할 수 있습니다.

예를 들어, 다음 함수는 별개의 arguments 블록을 사용하여 3개 입력 인수와 한 개 출력 인수의 크기와 클래스에 대한 유효성을 검사합니다. 참고로, (Input) 블록은 (Output) 블록 앞에 와야 합니다.

function out = myFunction(A, B, C)   
    arguments (Input)
        A (1,1) string 
        B (1,:) double
        C (2,2) cell
    end

    arguments (Output)
        out (1,:) double
    end

    % Function code
    ...
end

인수 종류

함수 인수 유효성 검사는 네 가지 종류의 인수를 선언할 수 있습니다. 함수는 다음과 같은 인수를 정의할 수 있지만 아래 순서대로 인수를 정의해야 합니다.

인수 유형추가 정보

1. 필수 위치 인수

필수 위치 인수와 선택적 위치 인수의 유효성 검사하기

2. 선택적 위치 인수

3. 반복되는 위치 인수

반복되는 인수의 유효성 검사하기

4. 선택적 이름-값 인수

이름-값 인수의 유효성 검사하기

인수 유효성 검사 순서

함수가 호출되면 MATLAB은 arguments 블록에 선언된 순서대로 위에서 아래로 인수의 유효성을 검사합니다. 각 인수의 유효성을 완전히 검사한 후에 다음 인수의 유효성을 검사합니다. 따라서 이전에 선언된 인수에 대한 참조는 유효성이 검사된 값을 사용하게 됩니다. 함수는 첫 번째 유효성 검사 실패의 결과로 오류를 발생시킵니다.

유효성을 검사한 값은 함수가 호출될 때 입력값으로 전달된 원래 값과 다를 수 있습니다. 예를 들어, 다음 함수는 입력값을 uint32형 클래스 값으로 선언합니다. 세 번째 입력값 선언은 처음 두 개 입력값의 곱에 해당하는 디폴트 값을 할당합니다.

function c = f(a, b,c)
    arguments
        a uint32
        b uint32
        c uint32 = a.* b
    end

    % Function code
    ...
end

다른 숫자형 클래스(예: double형)의 입력값을 사용하여 함수를 호출하면 uint32형으로 변환됩니다.

c = f(1.8,1.5)

함수 호출에 선택적 인수 c가 지정되지 않았기 때문에 MATLAB은 abuint32형으로 변환한 후 디폴트 값을 계산하고 c에 할당합니다. 이 경우, 두 입력값을 변환하면 값 2가 됩니다. 따라서 ab의 곱은 4입니다.

c =

  uint32

   4

세 번째 입력값에 값을 지정하면 함수는 c에 값을 할당하고 디폴트 값 표현식을 실행하지 않습니다.

c = f(1.8,1.5,25)
c =

  uint32

   25

변수와 함수 액세스에 대한 제한

arguments 블록은 함수 작업 공간에 존재합니다. import 명령을 사용하여 함수의 범위에 추가되는 모든 패키지, 클래스 또는 함수는 arguments 블록의 범위에 추가됩니다.

유효성 검사기 함수와 디폴트 값 표현식이 볼 수 있는 변수는 이미 선언된 입력 변수뿐입니다. 다음 함수에서 디폴트 값 cab에서 도출됩니다.

function c = f(a,b,c)
    arguments
        a uint32
        b uint32
        c uint32 = a * b
    end
 
    % Function code
    ...
end

하지만 arguments 블록에 아직 선언되지 않은 입력 변수는 참조할 수 없습니다. 예를 들어, 위에 나온 함수의 인수 a에 대해 다음과 같은 선언을 사용하는 것은 bc가 아직 선언되지 않았기 때문에 유효하지 않습니다.

arguments
    a uint32 = b * c
    b uint32
    c uint32
end

인수 유효성 검사 표현식은 이전에 선언되어 유효성 검사를 마친 인수만 참조할 수 있습니다. 이름-값 인수에 대한 유효성 검사 함수와 디폴트 값은 다른 이름-값 인수에 액세스할 수 없습니다.

arguments 블록의 함수에 대한 제한

앞서 선언된 인수에 대한 참조가 유효성 검사 함수 및 디폴트 값의 입장에서 가시적이어야 합니다. 코드 투명도를 보장하려면 함수 작업 공간과 상호 작용하는 함수를 사용하지 마십시오. 특히, 중첩 함수 또는 다음 표에 나열된 함수를 arguments 블록에서 사용하지 마십시오.

assigninbuiltinclear
dbstackevalevalc
evalinexistfeval
inputinputnameload
narginnarginchknargoutchk
savewhoswho

이 제한 사항은 arguments 블록 내에만 적용되고 함수 본문의 변수 또는 함수에는 적용되지 않습니다.

arguments 블록 디버그하기

arguments 블록 내부를 디버그할 때 작업 공간은 읽기 전용입니다. 즉, 작업 공간을 검사하고 변수에 할당된 값을 확인할 수 있습니다. 그러나 작업 공간이 읽기 전용 상태인 동안 새로운 변수를 만들거나 기존 변수에 할당된 값을 변경할 수는 없습니다. 디버거가 arguments 블록 외부로 이동하면 다시 변수를 만들거나 편집할 수 있게 됩니다.

참고 항목

|

관련 항목