Main Content

속성값 유효성 검사

클래스 정의에서 속성 유효성 검사

MATLAB® 속성 유효성 검사를 통해 속성값에 특정 제한을 적용할 수 있습니다. 유효성 검사를 사용하여 속성값의 클래스와 크기를 제한할 수 있습니다. 또한, 함수를 사용하여 속성값이 따라야 하는 조건을 설정할 수도 있습니다. MATLAB은 유효성 검사 함수 집합을 정의하며 사용자가 직접 자체 유효성 검사 함수를 작성할 수도 있습니다.

클래스 정의에서 속성 유효성 검사를 사용하는 것은 선택 사항입니다.

속성 유효성 검사에 대한 추가 정보

속성 유효성 검사에 대한 자세한 내용은 Property Class and Size Validation, 속성 유효성 검사 함수, Metadata Interface to Property Validation 항목을 참조하십시오.

유효성 검사 구문

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

Properties block with validation syntax

속성 유효성 검사에는 다음이 포함됩니다.

  • 크기 — 각 차원의 길이로, 양의 정수 또는 콜론으로 지정됩니다. 콜론은 그 차원에서 임의의 길이가 허용됨을 나타냅니다. 속성에 할당된 값은 지정된 크기를 따르거나 지정된 크기와 호환되어야 합니다. 자세한 내용은 Property Size Validation 항목을 참조하십시오.

  • 클래스 — 단일 MATLAB 클래스의 이름입니다. 속성에 할당된 값은 지정된 클래스이거나 지정된 클래스로 변환될 수 있어야 합니다. 임의의 MATLAB 클래스 또는 MATLAB이 지원하는 외부에서 정의된 클래스를 사용하십시오. 단, Java® 및 COM 클래스는 예외입니다. 자세한 내용은 Property Class Validation 항목을 참조하십시오.

  • 함수 — 유효성 검사 함수 이름을 쉼표로 구분한 목록입니다. MATLAB은 가능한 클래스 및 크기 변환을 적용한 후 속성에 할당된 값을 각 유효성 검사 함수에 전달합니다. 유효성 검사에 실패하면 유효성 검사기 함수가 오류를 발생시키며, 값을 반환하지는 않습니다. 자세한 내용은 속성 유효성 검사 함수 항목을 참조하십시오.

    MATLAB 유효성 검사 함수 목록은 속성 유효성 검사 함수 항목을 참조하십시오.

속성 유효성 검사 사용하기

퍼블릭 속성에 속성 유효성 검사를 사용하여 사용자 코드가 속성에 할당하는 값을 제어할 수 있습니다.

속성값을 고정된 식별자의 집합으로 제한하려면 이러한 식별자에 대한 열거형 클래스를 생성하고 속성을 이 클래스로 제한하십시오. 열거형 클래스에 대한 자세한 내용은 열거형 클래스 정의하기 항목을 참조하십시오.

MATLAB 데이터형 변환 규칙이 속성 유효성 검사에 적용됩니다. 예를 들어, MATLAB은 한 숫자형에서 다른 숫자형으로 강제 변환할 수 있습니다. 따라서, 속성값을 double형과 같은 특정 숫자형으로 제한해도 다른 숫자형이 속성에 할당되는 것을 차단하지는 않습니다.

속성에 특정 데이터형의 값만 할당될 수 있도록 하려면 원하는 데이터형 변환만을 지원하는 데이터형으로 속성을 제한하거나 유효성 검사 함수를 사용하여 속성 데이터형을 지정하는 대신 속성에 허용되는 정확한 클래스를 지정하십시오. MATLAB은 유효성 검사 함수를 실행하기 전에 데이터형 사양을 평가합니다. 자세한 내용은 유효성 검사 순서 항목을 참조하십시오.

유효한 디폴트 값 지정하기

속성에 할당되는 디폴트 값은 지정된 유효성 검사가 부과하는 제한을 충족해야 합니다. 디폴트 값을 지정하지 않으면 MATLAB이 지정된 클래스의 빈 객체를 할당하거나, 크기 제한으로 인해 빈 디폴트 값을 사용할 수 없는 경우 디폴트 생성자를 호출하여 디폴트 값을 생성합니다. 디폴트 생성자는 올바른 크기의 객체를 반환해야 합니다.

속성 유효성 검사를 사용하는 예제 클래스

ValidateProps 클래스는 유효성 검사가 부과된 세 개의 속성을 정의합니다.

classdef ValidateProps
   properties
      Location(1,3) double {mustBeReal, mustBeFinite}
      Label(1,1) string {mustBeMember(Label,["High","Medium","Low"])} = "Low"
      State(1,1) matlab.lang.OnOffSwitchState
   end
end
  • Location은 값이 유한한 실수인 double형 클래스로 구성된 1×3 배열이어야 합니다.

  • Label"High", "Medium" 또는 "Low"string형 스칼라여야 합니다.

  • Statematlab.lang.OnOffSwitchState 클래스의 열거형 멤버여야 합니다(off 또는 on).

인스턴스화할 때 유효성 검사

ValidateProps 클래스의 객체를 생성할 때 묵시적 디폴트 값 및 명시적 디폴트 값에 대한 유효성 검사가 수행됩니다.

a = ValidateProps
a = 

  ValidateProps with properties:

    Location: [0 0 0]
       Label: "Low"
       State: off

객체를 생성할 때 MATLAB은 다음 작업을 수행합니다.

  • 크기 및 클래스 요구 사항을 충족하도록 Location 속성값을 [0 0 0]으로 초기화합니다.

  • Label 속성을 디폴트 값인 "Low"로 설정합니다. 디폴트 값은 허용되는 값 집합의 멤버여야 합니다. 빈 string형 디폴트 값은 오류를 일으킬 수 있습니다.

  • State 속성을 matlab.lang.OnOffSwitchState 클래스에서 정의된 off 열거형 멤버로 설정합니다.

MATLAB이 디폴트 값을 선택하는 방법에 대한 자세한 내용은 Default Values Per Size and Class 항목을 참조하십시오.

유효성 검사 순서

클래스 정의에 지정된 디폴트 값을 포함해 값이 속성에 할당되면 MATLAB이 다음 순서로 유효성 검사를 수행합니다.

  • 클래스 유효성 검사 — 이 유효성 검사가 실행되면 다른 클래스로의 변환이 수행될 수 있습니다(예: char형을 string형으로 변환). 속성에 값을 할당하는 작업은 배열에 대한 MATLAB 변환 규칙을 따릅니다.

  • 크기 유효성 검사 — 이 유효성 검사가 실행되면 크기 변환이 수행될 수 있습니다(예: 스칼라 확장 또는 열 벡터를 행 벡터로 변환). 크기 유효성 검사를 지정한 속성에 값을 할당하는 작업은 MATLAB 배열에 값을 할당하는 작업과 동일하게 동작합니다. 인덱스 참조 값 할당에 대한 자세한 내용은 배열 인덱싱 항목을 참조하십시오.

  • 유효성 검사기 함수 — MATLAB이 클래스 및 크기 유효성 검사 결과를 왼쪽에서 오른쪽 순서로 각 유효성 검사 함수에 전달합니다. 모든 유효성 검사 함수가 호출되기 전에 오류가 발생할 수 있으며, 이 경우 유효성 검사 프로세스가 종료됩니다.

  • set 메서드 — 속성에 대해 set 메서드가 정의된 경우 MATLAB은 해당 속성에 대한 set 메서드를 호출하기 전에 속성 유효성 검사를 수행합니다. 속성 set 메서드 또는 get 메서드 내에서 속성에 값을 할당할 때 유효성 검사가 다시 적용되지는 않습니다. 속성 유효성 검사를 사용하여 속성 set 메서드를 대체할 수 있는 경우가 많습니다.

속성 유효성 검사 오류

ValueProp 클래스는 크기, 클래스, 함수 유효성 검사를 사용하여 Value 속성에 할당되는 값이 음수가 아닌 double형 스칼라인지 확인합니다.

classdef ValueProp
   properties
      Value(1,1) double {mustBeNonnegative} = 0
   end
end

다음 명령문은 속성에 셀형 배열을 할당하려고 합니다. 이 할당은 클래스 유효성 검사를 위반합니다.

a.Value = {10,20};
Error setting property 'Value' of class 'ValueProp':
Invalid data type. Value must be double or be convertible to double.

다음 명령문은 1×2 double형 배열을 속성에 할당하려고 합니다. 이 할당은 크기 유효성 검사를 위반합니다.

a.Value = [10 20];
Error setting property 'Value' of class 'ValueProp':
Size of value must be scalar.

다음 명령문은 double형 스칼라를 속성에 할당하려고 합니다. 이 할당은 음이 아닌 수를 요구하는 함수 유효성 검사에 실패합니다.

a.Value = -10;
Error setting property 'Value' of class 'ValueProp':
Value must be nonnegative.

첫 번째 오류가 발생하고 유효성 검사 프로세스가 종료됩니다.

추상 속성 유효성 검사

추상 속성에 대한 속성 유효성 검사를 정의할 수 있습니다. 유효성 검사는 속성을 구현하는 모든 서브클래스에 적용됩니다. 하지만 서브클래스는 자신의 속성 구현에 유효성 검사를 사용할 수 없습니다. 여러 클래스로부터 한 속성에 대한 유효성 검사를 상속 받는 경우, 한 슈퍼클래스에 있는 단 하나의 추상 속성만 유효성 검사를 정의할 수 있습니다. 어떤 슈퍼클래스도 해당 속성을 구체 속성으로 정의할 수 없습니다.

유효성 검사 변경 시 업데이트되지 않은 객체

클래스의 객체가 존재하는 동안 속성 유효성 검사를 변경할 경우 MATLAB은 새 유효성 검사를 기존 속성값에 적용하려고 시도하지 않습니다. 하지만 기존 객체의 속성에 값을 할당할 때는 MATLAB이 새 유효성 검사를 적용합니다.

불러오기 작업 중 유효성 검사

객체를 MAT 파일에 저장할 때 MATLAB은 객체와 함께 디폴트가 아닌 속성값을 모두 저장합니다. 객체를 불러올 때 MATLAB은 새로 생성된 객체에서 이러한 속성값을 복원합니다.

클래스 정의에 의해 속성 유효성 검사가 변경됨에 따라 불러온 속성값이 더 이상 유효하지 않게 된 경우 MATLAB이 해당 속성에 대해 현재 정의된 디폴트 값을 대체합니다. 하지만 load 함수는 현재 클래스 정의에 따른 디폴트 값을 할당하기 전에 발생하는 유효성 검사 오류를 표시하지 않습니다. 따라서, 불러오기 작업 도중에는 유효성 검사 오류가 표시되지 않고 무시됩니다.

이 동작을 설명하기 위해 이 예제에서는 MonthTemp 클래스의 객체를 생성하고 저장한 후 불러옵니다. 이 클래스는 AveTemp 속성을 셀형 배열로 제한합니다.

classdef MonthTemp
   properties
      AveTemp cell 
   end
end

MonthTemp 객체를 생성하고 AveTemp 속성에 값을 할당합니다.

a = MonthTemp;
a.AveTemp = {'May',70};

save를 사용하여 객체를 저장합니다.

save TemperatureFile a

속성 정의를 편집하여 AveTemp 속성에 대한 유효성 검사 클래스를 셀형 배열에서 containers.Map으로 변경합니다.

classdef MonthTemp
   properties
      AveTemp containers.Map
   end
end

MATLAB 경로에 있는 새 클래스 정의를 사용하여 저장된 객체를 불러옵니다. 셀형 배열 {'May',70}이 속성값이 containers.Map 객체여야 한다는 현재 요구 사항과 맞지 않기 때문에 MATLAB에서 저장된 값을 AveTemp 속성에 할당할 수 없습니다. MATLAB은 셀형 배열을 containers.Map으로 변환할 수 없습니다.

이 비호환성 문제를 해결하기 위해 MATLAB은 불러온 객체의 AveTemp 속성을 빈 containers.Map 객체인 현재 디폴트 값으로 설정합니다.

load TemperatureFile a
 a.AveTemp

ans = 

  Map with properties:

        Count: 0
      KeyType: char
    ValueType: any

저장된 값이 이제 유효하지 않기 때문에 불러온 객체의 AveTemp 속성에 다른 값이 할당됩니다. 하지만 불러오기 프로세스에서는 유효성 검사 오류를 표시하지 않습니다.

클래스 정의를 변경하고 객체를 다시 불러올 때 데이터가 손실되지 않도록 하려면 저장된 값이 현재 속성 유효성 검사를 충족할 수 있게 해주는 loadobj 메서드나 클래스 변환기 메서드를 구현하십시오.

객체를 저장하고 불러오는 방법에 대한 자세한 내용은 객체에 대한 저장 및 불러오기 프로세스 항목을 참조하십시오.

관련 항목