다음을 통해 공유


event(C++ 구성 요소 확장)

event 키워드는 관심 있는 일이 발생한 등록된 구독자(이벤트 처리기)에 대한 알림인 이벤트를 선언합니다.

모든 런타임

C++/CX는 event member 또는 event block 선언을 지원합니다.이벤트 멤버는 이벤트 블록을 선언하기 위한 간단한 방법입니다.기본적으로 이벤트 멤버는 이벤트 블록에서 명시적으로 선언되는 add(), remove() 및 raise() 함수를 선언합니다.이벤트 멤버에서 함수를 사용자 지정하려면 대신 이벤트 블록을 선언한 다음 필요한 함수를 재정의합니다.

구문

// event data member
modifier event delegate^ event_name;   

// event block
modifier event delegate^ event_name 
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

매개 변수

  • 한정자
    이벤트 선언 또는 이벤트 접근자 메서드에 사용할 수 있는 한정자입니다.가능한 값은 static과 virtual입니다.

  • 대리자
    시그니처가 이벤트 처리기와 일치해야 하는 대리자입니다.

  • event_name
    이벤트의 이름입니다.

  • return_value
    이벤트 접근자 메서드의 반환 값입니다.안정성을 확인할 수 있으려면 반환 형식이 void이어야 합니다.

  • parameters
    (선택 사항) delegate 매개 변수의 서명과 일치하는 raise 메서드에 대한 매개 변수입니다.

설명

이벤트는 대리자와 멤버 함수(이벤트 처리기) 간의 관계로서, 이벤트 트리거에 응답하며 모든 클래스의 클라이언트가 내부 대리자의 시그니처 및 반환 형식을 준수하는 메서드를 등록할 수 있습니다.

이벤트 선언에는 다음 두 가지 종류가 있습니다.

  • 이벤트 데이터 멤버
    컴파일러는 대리자 형식의 멤버 형식으로 이벤트에 대한 저장소를 자동으로 만들거나 내부 add(), remove() 및 raise() 멤버 함수를 만듭니다.이벤트 데이터 멤버는 클래스 내에 선언되어야 합니다.대리자의 반환 형식은 이벤트 처리기의 반환 형식과 일치해야 합니다.

  • 이벤트 블록
    이벤트 블록을 사용하면 add(), remove() 및 raise() 메서드의 동작을 명시적으로 선언 및 사용자 지정할 수 있습니다.

operators+= 및 operator-=을 사용하여 이벤트 처리기를 추가하고 제거하거나 add() 및 remove() 메서드를 명시적으로 호출할 수 있습니다.

event는 대/소문자를 구분하는 키워드입니다. 자세한 내용은 상황에 맞는 키워드(C++ 구성 요소 확장)를 참조하십시오.

Windows 런타임

4b612y2s.collapse_all(ko-kr,VS.110).gif설명

자세한 내용은 이벤트(C++/CX)를 참조하십시오.

이벤트 처리기를 추가한 다음 제거하려는 경우 추가 작업에서 반환한 EventRegistrationToken 구조체를 저장해야 합니다.그런 다음 원격 작업에서 저장된 EventRegistrationToken 구조를 사용하여 제거할 이벤트 처리기를 식별해야 합니다.

4b612y2s.collapse_all(ko-kr,VS.110).gif요구 사항

컴파일러 옵션: /ZW

공용 언어 런타임

event 키워드는 이벤트를 선언합니다.이벤트는 관심 사항이 발생할 때 클래스에서 알림을 제공하는 방법입니다.

구문

// event data member
modifier event delegate^ event_name; 

// event block
modifier event delegate^ event_name 
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

매개 변수

  • 한정자
    이벤트 선언 또는 이벤트 접근자 메서드에 사용할 수 있는 한정자입니다.가능한 값은 static과 virtual입니다.

  • 대리자
    시그니처가 이벤트 처리기와 일치해야 하는 대리자입니다.

  • event_name
    이벤트의 이름입니다.

  • return_value
    이벤트 접근자 메서드의 반환 값입니다.안정성을 확인할 수 있으려면 반환 형식이 void이어야 합니다.

  • parameters
    (선택 사항) delegate 매개 변수의 서명과 일치하는 raise 메서드에 대한 매개 변수입니다.

설명

이벤트는 대리자와 멤버 함수(이벤트 처리기) 간의 관계로서, 이벤트 트리거에 응답하며 모든 클래스의 클라이언트가 내부 대리자의 시그니처 및 반환 형식을 준수하는 메서드를 등록할 수 있습니다.

대리자는 코드에 이벤트가 발생했음이 나타날 때 호출될 하나 이상의 관련 메서드를 가질 수 있습니다.한 프로그램의 이벤트를 .NET Framework 공용 언어 런타임을 대상으로 하는 다른 프로그램에서도 사용할 수 있습니다.샘플은 다른 어셈블리에 정의된 이벤트 발생을 참조하십시오.

이벤트 선언에는 다음 두 가지 종류가 있습니다.

  • 이벤트 데이터 멤버
    대리자 형식의 멤버 형태로 된 이벤트 저장소는 데이터 멤버 이벤트를 위해 컴파일러에 의해 만들어집니다.이벤트 데이터 멤버는 클래스 내에 선언되어야 합니다.이는 간단한 이벤트라고도 합니다(아래의 코드 샘플 참조)

  • 이벤트 블록
    이벤트 블록을 사용하여 add, remove 및 raise 메서드를 구현하면 add, remove 및 raise 메서드의 동작을 사용자 지정할 수 있습니다.add, remove 및 raise 메서드의 시그니처는 대리자의 시그니처와 일치해야 합니다.이벤트 블록 이벤트는 데이터 멤버가 아니며 데이터 멤버로 사용하면 컴파일러 오류가 발생합니다.샘플은 이벤트 접근자 메서드 정의를 참조하십시오.

이벤트 처리기의 반환 형식은 대리자의 반환 형식이 일치해야 합니다.

.NET Framework에서 데이터 멤버가 메서드 자체인 것처럼 취급할 수 있습니다(즉, 해당 대리자의 Invoke 메서드).관리되는 이벤트 데이터 멤버를 선언하는 데 대리자 형식을 미리 정의해야 합니다.반면, 관리되는 이벤트 메서드는 해당 관리되는 대리자(이미 정의되지 않은 경우)를 암시적으로 정의합니다.코드 샘플은 이 항목의 끝 부분에 있는 예제를 참조하십시오.

관리되는 이벤트를 선언할 때 += 및 -= 연산자를 사용하여 이벤트 처리기를 추가하거나 제거하는 경우에 호출되는 추가 및 제거 접근자를 지정할 수 있습니다.메서드의 추가, 제거 및 발생은 명시적으로 호출할 수 있습니다.

Visual C++에서 이벤트를 만들고 사용하기 위해 다음 단계를 수행해야 합니다.

  1. 대리자를 만들거나 식별합니다.사용자 지정 이벤트를 정의하는 경우 event 키워드와 함께 사용할 대리자도 있어야 합니다.이벤트가 사전 정의된 경우, .NET Framework를 예를 들면 이벤트 소비자는 대리자의 이름만 알면 됩니다.

  2. 다음이 포함된 클래스를 만듭니다.

    • 대리자에서 만든 이벤트입니다.

    • (선택 사항) event 키워드로 선언된 대리자의 인스턴스가 있는지 확인하는 메서드입니다.그렇지 않으면 이벤트가 발생하는 코드에 이 논리를 두어야 합니다.

    • 이벤트를 호출하는 방법.이러한 메서드는 몇 가지 기본 클래스 기능의 재정의가 될 수 있습니다.

    이 클래스는 이벤트를 정의합니다.

  3. 메서드를 이벤트에 연결하는 하나 이상의 클래스를 정의합니다.각 클래스는 기본 클래스의 이벤트와 하나 이상의 메서드를 연결합니다.

  4. 이벤트를 사용합니다.

    • 이벤트 선언이 포함된 클래스의 개체를 만듭니다.

    • 이벤트 정의가 포함된 클래스의 개체를 만듭니다.

C++/CLI 이벤트에 대한 자세한 내용은 다음을 참조하십시오.

4b612y2s.collapse_all(ko-kr,VS.110).gif요구 사항

컴파일러 옵션: /clr

4b612y2s.collapse_all(ko-kr,VS.110).gif예제

예제

다음 코드 예제에서는 대리자, 이벤트 및 이벤트 처리기 쌍을 선언하고, 이벤트 처리기를 구독(추가)하고 이벤트 처리기를 호출한 다음 이벤트 처리기를 구독 취소(제거)하는 것을 보여줍니다.

// mcppv2_events.cpp
// compile with: /clr
using namespace System;

// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);

// class that defines events
ref class EventSource {
public:
   event ClickEventHandler^ OnClick;   // declare the event OnClick
   event DblClickEventHandler^ OnDblClick;   // declare OnDblClick

   void FireEvents() {
      // raises events
      OnClick(7, 3.14159);
      OnDblClick("Hello");
   }
};

// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
   void OnMyClick(int i, double d) {
      Console::WriteLine("OnClick: {0}, {1}", i, d);
   }

   void OnMyDblClick(String^ str) {
      Console::WriteLine("OnDblClick: {0}", str);
   }
};

int main() {
   EventSource ^ MyEventSource = gcnew EventSource();
   EventReceiver^ MyEventReceiver = gcnew EventReceiver();

   // hook handler to event
   MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);

   // invoke events
   MyEventSource->FireEvents();

   // unhook handler to event
   MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}

Output

  
  

예제

다음 코드 예제에서는 사소한 이벤트의 raise 메서드를 생성하는 데 사용되는 논리를 보여 줍니다. 이벤트에 하나 이상의 구독자가 있는 경우 raise 메서드를 암시적이거나 명시적으로 호출하면 대리자가 호출됩니다.대리자의 반환 형식이 void가 아니고 이벤트 가입자 수가 0인 경우 raise 메서드에서 대리자 형식의 기본값을 반환합니다.이벤트 구독자가 없을 경우 raise 메서드를 호출하면 반환하고 예외가 발생하지 않습니다.대리자 반환 형식이 void가 아닌 경우 대리자 형식이 반환됩니다.

// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
   int i;
   event Del^ MyEvent;

   void FireEvent() {
      i = MyEvent();
   }
};

ref struct EventReceiver {
   int OnMyClick() { return 0; }
};

int main() {
   C c;
   c.i = 687;

   c.FireEvent();
   Console::WriteLine(c.i);
   c.i = 688;

   EventReceiver^ MyEventReceiver = gcnew EventReceiver();
   c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
   Console::WriteLine(c.i);   
}

Output

  
  

참고 항목

개념

런타임 플랫폼의 구성 요소 확장