동적 속성 — 인스턴스에 속성 추가하기

동적 속성이란?

dynamicprops 클래스에서 파생되는 클래스의 인스턴스에 속성을 추가할 수 있습니다. 이러한 동적 속성을 인스턴스 속성이라고도 합니다. 동적 속성을 사용하면 객체에 임시 데이터를 연결할 수 있고 또한 클래스의 모든 객체가 아니라 클래스의 특정 인스턴스와 연결할 데이터를 할당할 수 있습니다.

둘 이상의 프로그램이 동일한 객체에 대해 동적 속성을 정의할 수 있습니다. 이러한 경우 이름이 충돌되지 않게 하십시오. 동적 속성 이름은 유효한 MATLAB® 식별자(변수 이름 참조)여야 하고 클래스의 메서드와 동일한 이름이 아니어야 합니다.

동적 속성의 특징

동적 속성이 정의되면 다음과 같이 클래스로 정의된 속성과 매우 비슷하게 동작합니다.

  • 점 표기법을 사용하여 동적 속성의 값을 설정하고 쿼리합니다. 동적 속성에 데이터 할당하기 항목을 참조하십시오.

  • 동적 속성이 연결된 객체를 저장하고 불러오면 MATLAB이 동적 속성을 저장하고 불러옵니다. Dynamic Properties and ConstructOnLoad 항목을 참조하십시오.

  • 동적 속성에 대한 특성을 정의합니다. 동적 속성 특성 설정하기 항목을 참조하십시오.

  • 기본적으로 동적 속성에는 NonCopyable 특성이 true로 설정됩니다. 동적 속성을 포함하는 객체를 복사하는 경우 동적 속성이 복사되지 않습니다. Objects with Dynamic Properties 항목을 참조하십시오.

  • 속성 set 및 get 액세스 메서드를 추가합니다. 종속 속성에 대한 set 메서드 및 get 메서드 항목을 참조하십시오.

  • 동적 속성 이벤트를 수신 대기합니다. Dynamic Property Events 항목을 참조하십시오.

  • 제한된 구문을 사용하여 객체 배열에서 동적 속성값에 액세스합니다. Accessing Dynamic Properties in Arrays 항목을 참조하십시오.

  • isequal 함수가 동적 속성이 있는 객체를 비교할 경우 속성의 이름과 값이 동일하더라도 항상 false를 반환합니다. 동적 속성을 포함하는 객체를 비교하려면 클래스에 대한 isequal을 오버로드하십시오.

동적 속성 정의하기

dynamicprops 클래스(handle 클래스의 서브클래스)의 서브클래스인 클래스는 모두 addprop 메서드를 사용하여 동적 속성을 정의할 수 있습니다. 구문은 다음과 같습니다.

P = addprop(H,'PropertyName')

여기서

Pmeta.DynamicProperty 객체로 구성된 배열입니다.

H는 핸들로 구성된 배열입니다.

PropertyName은 각 객체에 추가하는 동적 속성의 이름입니다.

동적 속성 이름 지정하기

동적 속성의 이름을 지정할 때에는 유효한 이름만 사용해야 합니다(변수 이름 참조). 또한, 다음과 같은 이름은 사용하지 마십시오.

  • 클래스 메서드의 이름과 동일한 이름

  • 클래스 이벤트의 이름과 동일한 이름

  • 점(.)을 포함하는 이름

  • 배열 기능을 지원하는 함수 이름. empty, transpose, ctranspose, permute, reshape, display, disp, details 또는 sort.

동적 속성 특성 설정하기

속성 특성을 설정하려면 동적 속성과 연결된 meta.DynamicProperty 객체를 사용하십시오. 예를 들어, Paddprop에서 반환된 객체이면 다음 명령문이 속성의 Hidden 특성을 true로 설정합니다.

P.Hidden = true;

속성 특성 ConstantAbstract는 동적 속성과 관련하여 아무런 의미가 없습니다. 따라서 이러한 특성의 값을 true로 설정해도 아무런 영향이 없습니다.

동적 속성 제거하기

meta.DynamicProperty 객체를 삭제하여 동적 속성을 제거할 수 있습니다.

delete(P);

동적 속성에 데이터 할당하기

미리 정의된 일련의 사용자 인터페이스 위젯 클래스(버튼, 슬라이더, 체크박스 등)를 사용한다고 가정하겠습니다. 사용자는 위젯 클래스의 각 인스턴스에 대한 위치를 저장하고자 합니다. 여기서는 위젯 클래스가 위치 데이터를 저장할 때 특정 레이아웃 스키마를 따르도록 설계되지 않았다고 간주합니다. 또한 사용자는 이 정보를 별도로 관리하기 위해 맵이나 해시 테이블을 생성하는 것을 원하지 않습니다.

button 클래스가 dynamicprops의 서브클래스라고 가정하면 레이아웃 데이터를 저장하는 동적 속성을 추가해야 합니다. 다음은 uicontrol 버튼을 생성하는 단순한 클래스입니다.

classdef button < dynamicprops
   properties
      UiHandle
   end
   methods
      function obj = button(pos)
         if nargin > 0
            if length(pos) == 4
               obj.UiHandle = uicontrol('Position',pos,...
                  'Style','pushbutton');
            else
               error('Improper position')
            end
         end
      end
   end
end

button 클래스의 인스턴스를 생성하고, 동적 속성을 추가한 후 해당 값을 설정합니다.

b1 = button([20 40 80 20]);
b1.addprop('myCoord');
b1.myCoord = [2,3];

속성에 액세스하는 일반적인 방법으로 동적 속성에 액세스하되, 동적 속성을 정의한 객체에서 액세스합니다.

b1.myCoord
ans =

     2     3

동적 속성의 특성에 액세스하기

동적 속성이 속해 있는 인스턴스는 클래스 메서드 외부에서 생성되는 경우가 자주 있으므로 동적 속성에 퍼블릭이 아닌 액세스를 사용하는 것은 권장되지 않습니다. 동적 속성의 Access 특성은 동적 속성을 포함하는 인스턴스의 클래스에 적용됩니다. 동적 속성의 Access 특성은 그 동적 속성을 추가한 메서드의 클래스에 반드시 적용되는 것은 아닙니다.

예를 들어, 어떤 기본 클래스 메서드가 프라이빗 액세스를 갖는 동적 속성을 인스턴스에 추가했을 경우 이 프라이빗 액세스는 그 인스턴스의 클래스에만 적용됩니다.

동적 속성 특성에 대한 자세한 내용은 meta.DynamicProperty 항목을 참조하십시오. meta.DynamicProperty 객체를 가져오려면 핸들 findprop 메서드를 사용하십시오.

관련 항목