Main Content

속성값에 대한 변경 사항 수신 대기하기

속성 리스너 생성하기

핸들 클래스에 대해 미리 선언된 속성 이벤트(예: PreSet, PostSet, PreGet, PostGet)에 대한 리스너를 정의할 수 있습니다. 이러한 명명된 이벤트에 대해 리스너를 생성하려면 다음과 같이 하십시오.

  • SetObservable 및/또는 GetObservable 속성 특성을 지정합니다.

  • 콜백 함수를 정의합니다.

  • addlistener 또는 event.proplistener에 대한 호출에 속성 이름과 이벤트를 포함시켜 속성 리스너를 생성합니다.

  • 필요한 경우, event.EventData를 서브클래스로 만들어서 콜백 함수에 전달할 이벤트 데이터 객체를 생성합니다.

  • 새 값이 현재 값과 동일한 경우 콜백이 실행되지 않도록 합니다(Assignment When Property Value Is Unchanged 참조).

속성 특성을 설정하여 속성 이벤트 활성화하기

properties 블록에서 SetObservable 특성을 활성화합니다. 이 블록에 정의된 속성에 대해 PreSet 리스너와 PostSet 리스너를 정의할 수 있습니다.

properties (SetObservable) 
   PropOne
   PropTwo
end

속성 이벤트에 대한 콜백 함수 정의하기

MATLAB®이 속성 이벤트를 트리거하면 리스너가 콜백 함수를 실행합니다. 두 개의 특정 인수를 갖도록 콜백 함수를 정의합니다. 이 두 인수는 함수가 리스너에 의해 호출될 때 함수에 자동으로 전달됩니다.

필요한 경우 추가 인수를 전달할 수 있습니다. 이 두 인수는 속성에 가장 필요한 정보를 포함하므로 대개의 경우 쉽게 이 메서드를 Static으로 정의할 수 있습니다.

예를 들어, handlePropEvents 함수가 또 다른 클래스 객체의 두 속성에 대한 리스너를 생성하는 클래스의 정적 메서드라고 가정하겠습니다.

methods (Static)
   function handlePropEvents(src,evnt)
      switch src.Name 
         case 'PropOne'
            % PropOne has triggered an event
         case 'PropTwo'
            % PropTwo has triggered an event
      end
   end
end

또는 switch 문에 event.PropertyEvent 객체의 EventName 속성을 사용하여 이벤트 이름(이 경우 PreSet 또는 PostSet)을 비활성화할 수 있습니다.

Class Metadatamatlab.metadata.Property 클래스에 대한 자세한 내용이 나와 있습니다.

리스너를 속성에 추가하기

addlistener 핸들 클래스 메서드를 사용하면 리스너 객체를 영속 변수로 저장하지 않고 리스너를 속성에 연결할 수 있습니다. 속성 이벤트에 대해서는 네 개의 인수를 갖는 addlistener 구문을 사용하십시오.

다음은 addlistener에 대한 호출입니다.

addlistener(EventObject,'PropOne','PostSet',@ClassName.handlePropertyEvents);

인수는 다음과 같습니다.

  • EventObject — 이벤트를 생성하는 객체의 핸들

  • PropOne — 수신 대기하려는 속성의 이름

  • PostSet — 수신 대기하려는 이벤트의 이름

  • @ClassName.handlePropertyEvents — 정적 메서드를 참조하는 함수 핸들(클래스 이름을 사용해야 함)

리스너 콜백이 일반 메서드이고 정적 메서드가 아닌 경우 구문은 다음과 같습니다.

addlistener(EventObject,'PropOne','PostSet',@obj.handlePropertyEvents);

여기서 obj는 콜백 메서드를 정의하는 객체의 핸들입니다.

리스너 콜백이 클래스 메서드 유형의 함수가 아니라면 해당 함수에 대한 함수 핸들을 전달해야 합니다. 콜백 함수가 네임스페이스 함수라고 가정하면 다음과 같이 해야 합니다.

addlistener(EventObject,'PropOne','PostSet',@namespace.handlePropertyEvents);

함수를 인수로 전달하는 방법에 대한 자세한 내용은 함수 핸들 생성하기 항목을 참조하십시오.

속성 이벤트 및 리스너 클래스

다음 두 클래스에서는 PropOnePropTwo, 두 속성에 대한 PostSet 속성 리스너를 생성하는 방법을 보여줍니다.

이벤트를 생성하는 클래스

PropEvent 클래스를 사용하면 SetObservable 속성 특성을 지정하여 속성의 PreSetPostSet 이벤트를 트리거할 수 있습니다. 또한 이 속성은 AbortSet 특성을 활성화하며, 이 특성은 속성이 현재 값과 동일한 값으로 설정된 경우 속성 이벤트가 트리거되지 않게 합니다(Assignment When Property Value Is Unchanged 참조).

classdef PropEvent < handle
   properties (SetObservable, AbortSet)
      PropOne
      PropTwo
   end
   methods
      function obj = PropEvent(p1,p2)
         if nargin > 0
            obj.PropOne = p1;
            obj.PropTwo = p2;
         end
      end
   end
end

리스너를 정의하는 클래스

PropListener 클래스는 다음 두 리스너를 정의합니다.

  • 속성 PropOnePostSet 이벤트

  • 속성 PropTwoPostSet 이벤트

비슷한 방법으로 다른 이벤트나 다른 속성에 대한 리스너를 정의할 수 있습니다. 각 리스너에 동일한 콜백 함수를 사용할 필요는 없습니다. 리스너 콜백 함수에 전달된 인수에 포함되는 정보에 대한 자세한 내용은 matlab.metadata.Propertyevent.PropertyEvent 함수 도움말 페이지를 참조하십시오.

classdef PropListener < handle
   % Define property listeners
   methods
      function obj = PropListener(evtobj)
         if nargin > 0
            addlistener(evtobj,'PropOne','PostSet',@PropListener.handlePropEvents);
            addlistener(evtobj,'PropTwo','PostSet',@PropListener.handlePropEvents);
         end
      end
   end
   methods (Static)
      function handlePropEvents(src,evnt)
         switch src.Name
            case 'PropOne'
               sprintf('PropOne is %s\n',num2str(evnt.AffectedObject.PropOne))
            case 'PropTwo'
               sprintf('PropTwo is %s\n',num2str(evnt.AffectedObject.PropTwo))
         end
      end
   end
end

관련 항목