이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
이벤트와 리스너 구문
구현할 구성요소
이벤트와 리스너를 구현하는 작업에는 다음과 같은 구성요소가 사용됩니다.
핸들 클래스에서 이벤트의 이름 지정 — 이벤트 이름 지정하기.
동작이 발생할 때 이벤트를 트리거하는 함수 또는 메서드 — 이벤트 트리거하기.
트리거된 이벤트에 대한 응답으로 콜백 함수를 실행하는 리스너 객체 — 이벤트 수신 대기하기.
이벤트가 콜백 함수에 전달하는 디폴트 또는 사용자 지정 이벤트 데이터 — 이벤트 관련 데이터 정의하기.
이벤트 이름 지정하기
events
블록 내에 이벤트 이름을 선언하여 이벤트를 정의할 수 있습니다. 예를 들어, 다음 클래스는 ToggledState
라는 이벤트를 생성합니다.
classdef ToggleButton < handle properties State = false end events ToggledState end end
이벤트 트리거하기
OnStateChange
메서드는 notify
를 호출하여 ToggledState
이벤트를 트리거합니다. 이벤트 소스인 객체의 핸들과 이벤트 이름을 notify
에 전달합니다.
classdef ToggleButton < handle properties State = false end events ToggledState end methods function OnStateChange(obj,newState) if newState ~= obj.State obj.State = newState; notify(obj,'ToggledState'); end end end end
이벤트 수신 대기하기
notify
에 대한 호출에서 이벤트가 트리거되면 MATLAB®이 해당 이벤트와 소스 객체에 정의된 모든 리스너에 메시지를 브로드캐스트합니다. 리스너를 생성하는 방법으로는 핸들 클래스 addlistener
를 사용하거나 listener
메서드를 사용하는 방법, 두 가지가 있습니다.
addlistener를 사용하여 영속 리스너 생성하기
리스너가 정상적인 변수 범위를 넘어 유지되도록 하려면 addlistener
를 사용하여 리스너를 생성하십시오. 이벤트 소스 객체는 리스너 객체에 대한 참조 상태를 유지합니다. 이벤트 소스 객체가 소멸되면 MATLAB이 리스너를 소멸시킵니다.
다음 코드에서는 ToggleState
이벤트에 대한 리스너를 정의합니다.
lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);
addlistener
는 다음 인수를 갖습니다.
obj
— 이벤트 소스인 객체ToggleState
—char
벡터로 전달되는 이벤트 이름@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,'ToggledState',@RespondToToggle.handleEvnt); end end methods (Static) function handleEvnt(src,~) if src.State disp('ToggledState is true') else disp('ToggledState is false') end end end end
RespondToToggle
클래스는 해당 생성자에 리스너를 추가합니다. 이 경우, 이 클래스는 콜백(handleEvnt
)을 두 개의 필수 인수를 받는 정적 메서드로 정의합니다.
src
— 이벤트를 트리거하는 객체의 핸들(즉,ToggleButton
객체임)evtdata
—event.EventData
객체
예를 들어, 다음 코드는 두 클래스의 객체를 생성합니다.
tb = ToggleButton; rtt = RespondToToggle(tb);
ToggleButton
객체의 OnStateChange
메서드를 호출할 때마다 notify
가 이벤트를 트리거합니다. 이 예제에서는 콜백이 State
속성의 값을 표시합니다.
tb.OnStateChange(true)
ToggledState is true
tb.OnStateChange(false)
ToggledState 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,'ToggledState',@RespondToToggle.handleEvnt); obj.ListenerHandle = hl; % Save listener handle end end methods (Static) function handleEvnt(src,~) if src.State disp('ToggledState is true') else disp('ToggledState is false') end end end end
이렇게 코드를 변경하면 RespondToToggle
클래스의 인스턴스에서 리스너를 제거할 수 있습니다. 예를 들면 다음과 같습니다.
tb = ToggleButton; rtt = RespondToToggle(tb);
객체 rtt
는 객체 tb
에 의해 트리거되는 ToggleState
이벤트를 수신 대기합니다. 리스너를 제거하려면 리스너 핸들을 포함하는 속성에 대해 delete
를 호출하십시오.
delete(rtt.ListenerHandle)
리스너를 일시적으로 비활성화하려면 Temporarily Deactivate Listeners 항목을 참조하십시오.
이벤트 관련 데이터 정의하기
이벤트의 결과로 토글 버튼의 상태를 리스너 콜백에 전달한다고 가정하겠습니다. 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,'ToggledState',evtdata);