Main Content

이벤트 및 리스너 개념

이벤트 모델

이벤트는 객체 내에서 발생하는 변경 사항 또는 동작을 나타냅니다. 예를 들면 다음과 같습니다.

  • 클래스 데이터 수정

  • 메서드 실행

  • 속성값 쿼리 또는 설정

  • 객체 소멸

기본적으로, 프로그래밍 방식으로 탐지할 수 있는 활동은 이벤트를 생성할 수 있으며 다른 객체에 정보를 전달할 수 있습니다.

MATLAB® 클래스는 이벤트에 응답하는 객체에게 이벤트 발생을 전달하는 절차를 정의합니다. 이벤트 모델은 다음과 같이 동작합니다.

다음 도식에서는 이벤트 모델을 보여줍니다.

Model of events and listeners

제한 사항

이벤트 사용에는 다음과 같은 일부 제한 사항이 있습니다.

  • 이벤트 소스는 이벤트를 트리거할 때 리스너가 존재한다고 보장할 수 없습니다.

  • 리스너는 다른 리스너가 이벤트가 발생했다는 알림을 받지 못하게 차단할 수 없습니다.

  • 리스너가 실행되는 순서는 정의되지 않습니다.

  • 리스너가 리스너 콜백에 전달되는 이벤트 데이터 객체를 수정하지 않아야 합니다. 그 이유는 다른 리스너에 이 동일한 핸들 객체가 전달되기 때문입니다.

디폴트 이벤트 데이터

이벤트는 이벤트 데이터 인수를 콜백 함수에 전달하여 리스너 콜백에 정보를 제공합니다. 기본적으로, MATLAB은 event.EventData 객체를 리스너 콜백에 전달합니다. 이 객체는 다음 두 개의 속성을 가집니다.

  • EventName — 클래스의 event 블록에 정의된 이벤트 이름

  • Source — 이벤트 소스인 객체

MATLAB은 필요한 이벤트 데이터 인수의 리스너 콜백에 소스 객체를 전달합니다. 소스 객체를 사용하여 리스너 콜백 함수 내에서 객체의 퍼블릭 속성에 액세스할 수 있습니다.

이벤트 데이터 사용자 지정하기

event.EventData 클래스의 서브클래스를 생성하여 추가 정보를 리스너 콜백 함수에 제공할 수 있습니다. 서브클래스는 속성을 정의하여 추가 데이터를 포함하고 메서드를 제공하여 파생된 이벤트 데이터 객체를 생성할 수 있습니다. 그러면 이러한 데이터 객체가 notify 메서드에 전달될 수 있습니다.

이벤트 관련 데이터 정의하기에 이러한 데이터를 사용자 지정하는 방법을 보여 주는 예제가 나와 있습니다.

핸들 클래스에서만 이벤트 정의 가능

핸들 클래스에서만 이벤트를 정의할 수 있습니다. 이러한 제한이 존재하는 이유는 값 클래스가 단일의 MATLAB 작업 공간에서만 표시되므로 콜백이나 리스너가 이벤트를 트리거한 객체에 액세스할 수 없기 때문입니다. 콜백은 객체의 복사본에 액세스할 수 있습니다. 하지만 콜백이 이벤트를 트리거한 객체의 현재 상태에 액세스할 수 없거나 해당 객체의 변경 사항을 적용할 수 없기 때문에 복사본에 액세스하는 것은 유용하지 않습니다.

핸들 클래스와 값 클래스 비교에 핸들 클래스에 대한 일반적인 정보가 나와 있습니다.

이벤트와 리스너 구문에서는 핸들 클래스와 이벤트를 정의하기 위한 구문을 보여줍니다.

속성 설정 및 쿼리 이벤트

속성과 관련하여 미리 정의된 이벤트는 다음 네 가지가 있습니다.

  • PreSet — 속성값이 설정되기 직전, set 액세스 메서드를 호출하기 전에 트리거됨

  • PostSet — 속성값이 설정된 직후에 트리거됨

  • PreGet — 속성값 쿼리가 처리되기 직전, get 액세스 메서드를 호출하기 전에 트리거됨

  • PostGet — 쿼리에 속성값을 반환한 직후에 트리거됨

이 이벤트는 미리 정의되어 있으므로 클래스의 events 블록에 나열할 필요가 없습니다.

속성 이벤트가 발생하면 콜백에 event.PropertyEvent 객체가 전달됩니다. 이 객체는 다음 세 개의 속성을 가집니다.

  • EventName — 이 데이터 객체로 설명되는 이벤트의 이름

  • Source — 데이터 객체로 설명되는 이벤트를 정의하는 클래스를 갖는 소스 객체

  • AffectedObject — 이 이벤트의 소스인 속성을 갖는 객체(즉, AffectedObject가 속성이 액세스되거나 수정된 객체를 포함함).

event.EventData 클래스를 서브클래스화하여 사용자만의 속성 변경 이벤트 데이터를 정의할 수 있습니다. event.PropertyEvent 클래스는 event.EventData의 봉인된 서브클래스입니다.

속성 리스너를 생성하는 절차에 대한 설명은 속성값에 대한 변경 사항 수신 대기하기 항목을 참조하십시오.

예제는 The PostSet Event Listener 항목을 참조하십시오.

속성값에 대한 액세스를 제어하는 메서드에 대한 자세한 내용은 속성 get 및 set 메서드 항목을 참조하십시오.

리스너

리스너는 이벤트에 대한 응답을 캡슐화합니다. 리스너 객체는 event.listener 클래스에 속하며, 이 클래스는 다음 속성을 정의하는 핸들 클래스입니다.

  • Source — 이벤트를 생성한 객체의 핸들 또는 이러한 핸들로 구성된 배열입니다.

  • EventName — 이벤트 이름입니다.

  • Callback — 활성화된 리스너가 이벤트 알림을 수신할 때 실행되는 함수입니다.

  • EnabledEnabledtrue인 경우에만 콜백 함수가 실행됩니다. 예제는 Enable and Disable Listeners 항목을 참조하십시오.

  • Recursive — 리스너가 콜백의 실행을 일으킨 동일한 이벤트를 트리거할 수 있도록 허용합니다.

    Recursive는 기본적으로 false입니다. 콜백이 콜백으로 정의된 이벤트를 트리거하면 리스너가 재귀적으로 실행될 수 없습니다. 따라서 콜백이 자신의 이벤트를 트리거해야 하는 경우에는 Recursivetrue로 설정하십시오. Recursive 속성을 true로 설정하면 무한 재귀가 재귀 제한에 도달하고 오류를 트리거하는 상황이 발생할 수 있습니다.

리스너 라이프사이클 제어하기에 더욱 구체적인 정보가 나와 있습니다.