Main Content

이벤트와 리스너 구문

구현할 구성요소

이벤트와 리스너를 구현하는 작업에는 다음과 같은 구성요소가 사용됩니다.

이벤트 이름 지정하기

events 블록 내에 이벤트 이름을 선언하여 이벤트를 정의할 수 있습니다. 예를 들어, 다음 클래스는 ToggleState라는 이벤트를 생성합니다.

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggleState
   end
end

이벤트는 이벤트를 정의하는 클래스와 동일한 이름을 가질 수 없습니다.

이벤트 트리거하기

OnStateChange 메서드는 notify를 호출하여 ToggleState 이벤트를 트리거합니다. 이벤트 소스인 객체의 핸들과 이벤트 이름을 notify에 전달합니다.

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggleState
   end
   methods
      function OnStateChange(obj,newState)
         if newState ~= obj.State
            obj.State = newState;
            notify(obj,'ToggleState');
         end
      end
   end
end

이벤트 수신 대기하기

notify에 대한 호출에서 이벤트가 트리거되면 MATLAB®이 해당 이벤트와 소스 객체에 정의된 모든 리스너에 메시지를 브로드캐스트합니다. 리스너를 생성하는 방법으로는 핸들 클래스 addlistener를 사용하거나 listener 메서드를 사용하는 방법, 두 가지가 있습니다.

addlistener를 사용하여 영속 리스너 생성하기

리스너가 정상적인 변수 범위를 넘어 유지되도록 하려면 addlistener를 사용하여 리스너를 생성하십시오. 이벤트 소스 객체는 리스너 객체에 대한 참조 상태를 유지합니다. 이벤트 소스 객체가 소멸되면 MATLAB이 리스너를 소멸시킵니다.

다음 코드에서는 ToggleState 이벤트에 대한 리스너를 정의합니다.

lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);

addlistener는 다음 인수를 갖습니다.

  • obj — 이벤트 소스인 객체

  • ToggleStatechar 벡터로 전달되는 이벤트 이름

  • @RespondToToggle.handleEvnt — 콜백 함수에 대한 함수 핸들(리스너 정의하기의 정의 참조).

handle.listener를 사용하여 리스너와 소스 분리하기

리스너의 라이프사이클을 관리해야 하고 이벤트 소스와 리스너 객체 사이를 연결하고 싶지 않으면 listener 메서드를 사용하여 리스너를 생성하십시오. listener를 사용하여 리스너를 생성한 경우에는 이벤트 소스가 소멸되더라도 MATLAB이 해당 리스너를 소멸시키지 않습니다. 하지만 listener를 사용하여 리스너를 생성할 때는 리스너 객체 핸들이 범위 내에 유지되도록 코드를 작성해야 합니다.

listener 메서드에는 addlistener와 동일한 인수(이벤트 명명 객체, 이벤트 이름 및 콜백에 대한 함수 핸들)가 필요합니다. listener는 리스너 객체에 대한 핸들을 반환합니다.

lh = listener(obj,'EventName',@callbackFunction)

예를 들어, 다음 코드에서는 앞에서 설명한 ToggleState 이벤트를 사용합니다.

lh = listener(obj,'ToggleState',@RespondToToggle.handleEvnt)

콜백 함수

리스너 콜백 함수는 최소 두 개의 인수를 받아야 하며, 이 두 인수는 MATLAB이 자동으로 콜백에 전달합니다. 필요한 인수는 다음과 같습니다.

  • 이벤트 소스 — 즉, addlistener 또는 event.listener에 대한 호출에 있는 obj입니다.

  • event.EventData 객체 또는 event.EventData의 서브클래스(예: ToggleEventData 객체). 이에 대한 설명은 이벤트 관련 데이터 정의하기에 나와 있습니다.

소스 객체와 이벤트 데이터 인수를 받도록 콜백 함수를 정의합니다.

function callbackFunction(src,evtdata)
   ...
end

콜백 구문에 대한 자세한 내용은 리스너 콜백 구문 항목을 참조하십시오.

리스너 정의하기

RespondToToggle 클래스는 ToggleButton 클래스에 정의된 ToggleState 이벤트를 수신 대기하는 객체를 정의합니다.

classdef RespondToToggle < handle
   methods
      function obj = RespondToToggle(toggle_button_obj)
         addlistener(toggle_button_obj,'ToggleState',@RespondToToggle.handleEvnt);
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggleState is true')
         else
            disp('ToggleState is false')
         end
      end
   end
end

RespondToToggle 클래스는 해당 생성자에 리스너를 추가합니다. 이 경우, 이 클래스는 콜백(handleEvnt)을 두 개의 필수 인수를 받는 정적 메서드로 정의합니다.

  • src — 이벤트를 트리거하는 객체의 핸들(즉, ToggleButton 객체임)

  • evtdataevent.EventData 객체

예를 들어, 다음 코드는 두 클래스의 객체를 생성합니다.

tb = ToggleButton;
rtt = RespondToToggle(tb);

ToggleButton 객체의 OnStateChange 메서드를 호출할 때마다 notify가 이벤트를 트리거합니다. 이 예제에서는 콜백이 State 속성의 값을 표시합니다.

tb.OnStateChange(true)
ToggleState is true
tb.OnStateChange(false)
ToggleState is false

리스너 제거하기

리스너 객체의 핸들에 대해 delete를 호출하여 리스너 객체를 제거합니다. 예를 들어, RespondToToggle 클래스가 리스너 핸들을 속성으로 저장한 경우 리스너를 삭제할 수 있습니다.

classdef RespondToToggle < handle
   properties
      ListenerHandle % Property for listener handle
   end
   methods
      function obj = RespondToToggle(toggle_button_obj)
         hl = addlistener(toggle_button_obj,'ToggleState',@RespondToToggle.handleEvnt);
         obj.ListenerHandle = hl; % Save listener handle
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggleState is true')
         else
            disp('ToggleState is false')
         end
      end
   end
end

이렇게 코드를 변경하면 RespondToToggle 클래스의 인스턴스에서 리스너를 제거할 수 있습니다. 예를 들면 다음과 같습니다.

tb = ToggleButton;
rtt = RespondToToggle(tb); 

객체 rtt는 객체 tb에 의해 트리거되는 ToggleState 이벤트를 수신 대기합니다. 리스너를 제거하려면 리스너 핸들을 포함하는 속성에 대해 delete를 호출하십시오.

delete(rtt.ListenerHandle)

리스너를 일시적으로 비활성화하려면 일시적으로 리스너 비활성화하기 항목을 참조하십시오.

이벤트 관련 데이터 정의하기

이벤트의 결과로 토글 버튼의 상태를 리스너 콜백에 전달한다고 가정하겠습니다. event.EventData 클래스를 서브클래스화하고 원하는 정보를 포함하는 속성을 추가하면 디폴트 이벤트 데이터에 다른 데이터를 추가할 수 있습니다. 그런 다음 이 객체를 notify 메서드에 전달할 수 있습니다.

참고

ToggleEventData와 같이 event.EventData의 서브클래스인 객체를 저장하고 불러오려면 이 서브클래스에 대해 ConstructOnLoad 클래스 특성을 활성화하십시오.

classdef (ConstructOnLoad) ToggleEventData < event.EventData
   properties
      NewState
   end
   
   methods
      function data = ToggleEventData(newState)
         data.NewState = newState;
      end
   end
end

notify에 대한 호출에서는 ToggleEventData 생성자를 사용하여 필요한 인수를 생성할 수 있습니다.

evtdata = ToggleEventData(newState);
notify(obj,'ToggleState',evtdata);

관련 항목