Main Content

함수 입력값 구문 분석하기

이 예제에서는 필수 입력값과 선택적 입력값을 정의하고, 선택적 입력값에 디폴트 값을 할당하고, 입력값 구문 분석기(Input Parser)를 사용하여 사용자 지정 함수에 대한 모든 입력값을 검증하는 방법을 보여줍니다.

입력값 구문 분석기는 입력값에 대한 유효성을 검사하고 입력값에 디폴트 값을 할당하는 일관된 방법을 제공하여 코드의 견고성 및 유지 관리성을 향상시킵니다. 입력값에 대한 유효성 검사를 위해 기존의 MATLAB® 함수를 활용할 수도 있고, 또는 사용자 자신만의 고유한 유효성 검사 루틴을 작성해 볼 수도 있습니다.

1단계. 함수를 정의합니다.

printPhoto.m이라는 파일에 함수를 생성합니다. printPhoto 함수는 파일 이름에 대한 하나의 필수 입력값과 마감(광택(Glossy) 또는 무광택(Matte)), 컬러스페이스(RGB 또는 CMYK), 너비 및 높이에 대한 선택적 입력값을 가집니다.

function printPhoto(filename,varargin)

함수 선언문에, 먼저 필수 입력값을 지정합니다. 선택적 입력값을 지원하려면 varargin을 사용하십시오.

2단계. InputParser 객체를 생성합니다.

함수 내에서 inputParser를 호출하여 parser 객체를 생성합니다.

p = inputParser;

3단계. 입력값을 체계에 추가합니다.

addRequired, addOptional, addParameter 중 하나를 사용하여 함수의 구문 분석 체계에 입력값을 추가합니다. 선택적 입력값에 대해 디폴트 값을 지정합니다.

각 입력값에 대해, 입력값을 검사하고 스칼라 논리값(true 또는 false)이나 오류를 반환하는 유효성 검사(Validation) 함수에 대한 핸들을 지정할 수 있습니다. 유효성 검사 함수는 기존 MATLAB 함수(예: ischar 또는 isnumeric) 또는 사용자가 생성하는 함수(예: 익명 함수 또는 로컬 함수)일 수 있습니다.

printPhoto 함수에서 filename은 필수 입력값입니다. finishcolor를 선택적 입력값으로 정의하고, widthheight를 선택적 파라미터 값 쌍으로 정의합니다.

defaultFinish = 'glossy';
validFinishes = {'glossy','matte'};
checkFinish = @(x) any(validatestring(x,validFinishes));

defaultColor = 'RGB';
validColors = {'RGB','CMYK'};
checkColor = @(x) any(validatestring(x,validColors));

defaultWidth = 6;
defaultHeight = 4;

addRequired(p,'filename',@ischar);
addOptional(p,'finish',defaultFinish,checkFinish)
addOptional(p,'color',defaultColor,checkColor)
addParameter(p,'width',defaultWidth,@isnumeric)
addParameter(p,'height',defaultHeight,@isnumeric)

addRequired 또는 addOptional을 사용하여 추가하는 입력값은 위치 인수입니다. 위치 입력값을 사용하여 함수를 호출할 때는 구문 분석 체계에 추가된 순서대로 해당 값을 지정해야 합니다.

addParameter로 추가된 입력값은 위치 입력값이 아니므로 사용자는 width의 값 앞이나 뒤에 height의 값을 전달할 수 있습니다. 파라미터 입력값에는 입력값과 함께 입력값 이름(height 또는 width)을 전달해야 합니다.

함수가 선택적 입력 문자열 또는 문자형 벡터와 이름-값 인수를 받도록 하는 경우에는 선택적 입력값에 대한 유효성 검사 함수를 지정해야 합니다. 그러지 않으면 입력값 구문 분석기가 선택적 문자열이나 문자형 벡터를 파라미터 이름으로 해석합니다. 예를 들어, checkFinish 유효성 검사 함수가 있기 때문에 printPhoto'glossy'를 유효하지 않은 파라미터 이름이 아니라 finish의 값으로 해석하게 됩니다.

4단계. 속성을 설정하여 구문 분석을 조정합니다(선택 사항).

기본적으로, 입력값 구문 분석기에는 대/소문자 구분 여부, 함수 이름, 구조체형 배열 입력값, 체계에 없는 추가 파라미터의 이름이나 값 허용 여부를 설정할 수 있습니다. 속성을 사용하면 이러한 동작을 명시적으로 정의할 수 있습니다. 구조체형 배열에 값을 할당하는 방법과 유사하게 점 표기법을 사용하여 속성을 설정합니다.

입력값 구문 분석기의 KeepUnmatched 속성을 설정하여 printPhoto가 입력 체계와 일치하지 않는 추가 파라미터 입력값을 받도록 허용합니다.

p.KeepUnmatched = true;

KeepUnmatchedfalse(디폴트 값)인 경우 입력값이 체계와 일치하지 않을 경우 입력값 구문 분석기가 오류를 발생시킵니다.

5단계. 입력값을 구문 분석합니다.

함수 내에서 parse 메서드를 호출합니다. 함수 입력값 전체에 대한 값을 전달합니다.

parse(p,filename,varargin{:})

6단계. 함수에 입력값을 사용합니다.

inputParser 객체의 아래 속성을 사용하여 구문 분석된 입력값에 액세스합니다.

  • Results — 체계에 포함된 모든 입력값의 이름과 값으로 구성된 구조체형 배열을 반환합니다.

  • Unmatched — 함수에 전달은 되지만 체계에는 없는 파라미터의 이름과 값으로 구성된 구조체형 배열을 반환합니다(KeepUnmatchedtrue인 경우).

  • UsingDefaults — 함수에 전달되지 않아 디폴트 값이 할당된 선택적 입력값의 이름으로 구성된 셀형 배열을 반환합니다.

printPhoto 함수 내에서 일부 입력값에 대한 값을 표시합니다.

disp(['File name: ',p.Results.filename])
disp(['Finish: ', p.Results.finish])

if ~isempty(fieldnames(p.Unmatched))
   disp('Extra inputs:')
   disp(p.Unmatched)
end
if ~isempty(p.UsingDefaults)
   disp('Using defaults: ')
   disp(p.UsingDefaults)
end

7단계. 함수를 호출합니다.

입력값 구문 분석기는 다음과 같이 입력값을 받아야 합니다.

  • 먼저 필수 입력값을 받습니다(addRequired를 사용하여 구문 분석 체계에 추가된 순서대로).

  • 선택적 위치 입력값을 받습니다(addOptional를 사용하여 체계에 추가된 순서대로).

  • 파라미터 이름-값 쌍 입력값 앞에 오는 위치 입력값을 받습니다.

  • Name1,Value1,...,NameN,ValueN 형식의 파라미터 이름 및 값을 받습니다.

printPhoto에 대한 입력값(일부는 유효하고 일부는 유효하지 않음)으로 구성된 여러 조합을 전달합니다.

printPhoto('myfile.jpg')
File name: myfile.jpg
Finish: glossy
Using defaults: 
    'finish'    'color'    'width'    'height'
printPhoto(100)
Error using printPhoto (line 23)
The value of 'filename' is invalid. It must satisfy the function: ischar.
printPhoto('myfile.jpg','satin')
Error using printPhoto (line 23)
The value of 'finish' is invalid. Expected input to match one of these strings:

'glossy', 'matte'

The input, 'satin', did not match any of the valid strings. 
printPhoto('myfile.jpg',height=10,width=8)
File name: myfile.jpg
Finish: glossy
Using defaults: 
    'finish'    'color'

R2021a 이전 릴리스에서 이름-값 인수를 사용할 때는 이름을 string형 또는 문자형 벡터로 전달하고 이름과 값을 쉼표로 구분해야 합니다. 예를 들면 다음과 같습니다.

printPhoto('myfile.jpg','height',10,'width',8)

n번째 위치 입력값에 대한 값을 전달하려면 이전(n – 1) 입력값에 대한 값을 지정하거나, 입력값을 파라미터 이름-값 쌍으로 전달하십시오. 예를 들어, 다음 함수 호출은 동일한 값을 finish(디폴트 값: 'glossy') 및 color에 할당합니다.

printPhoto('myfile.gif','glossy','CMYK')  % positional

printPhoto('myfile.gif',color='CMYK')   % name and value

참고 항목

|

관련 항목