프로그래밍 언어/C & C++ 정리

상황에 맞는 키워드 (Context-Sensitive Keywords)

게임 개발 2023. 11. 21. 20:16

 

  상황에 맞는 키워드(Context-Sensitive Keywords)

 상황에 맞는 키워드는 오직 특정 문맥에서만 인식할 수 있는 언어 요소이다.

특정 맥락을 벗어나면, 상황에 맞는 키워드는 유저가 정의하는 기호가 될 수 있다.

( =

Context-sensitive keywords are language elements that are recognized only in specific contexts.

Outside the specific context, a context-sensitive keyword can be a user-defined symbol.)

 

 

키워드 목록

  • abstract
  • delegate
  • event
  • finally
  • for each, in
  • initonly
  • internal
  • literal
  • override
  • property
  • sealed
  • where (제네릭에 포함)

 

 

abstract

 

 

abstract 키워드는 다음 중 하나를 선언한다

 

1. 형식은 기본 형식으로 사용될 수 있지만 형식 자체는 인스턴스화될 수 없다.

2. 형식 멤버 함수는 파생된 형식에서만 정의될 수 있다.

 

 

 

event (C++ /CLI 및 C++/CX)

 

event 키워드 

 

 C++/CX에서는 '이벤트 멤버' 또는 '이벤트 블록' 선언을 지원한다.

이벤트 멤버는 이벤트 블록을 선언하기 위한 약칭이다.

기본적으로는 이벤트 멤버는 이벤트 블록에서 명시적으로 선언된 add, remoce 및 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);
}

 

 

매개변수

 

modifier ( 수식어 ) 

 modifier은 event declaration(이벤트 선언) 또는

envent accessor method(이벤트 엑서스 메서드)에서 사용할 수 있다.

해당 변수는 static 과 virtual이 가능하다.

 

 

delegate ( 대표자 = 대리 )

 delegat는 이벤트 처리자가 서명해야 하는 일을 대신하여 처리한다.

 

 

event_name

 event 이름이다.

 

return_value

 이벤트 접근자 메서드의 반한 값으로,

검증이 가능하려면, 반환 타입을 반드시 void로 해야한다.

 

parameters 

 선택 사항으로, delegate 매개 변수의 시그니처와 일치하는

raise(예외 처리에 관련된) 매서드의 매개변수이다.

 

 

설명

 

이벤트는 delegate 와 event handler 사이의 연결을 나타낸다.

event handler는 멤버 함수이며, 이벤트가 트리거될 때 응답한다.

모든 클래스의 클라이언트가

delegate의 signature 및 반환 타입과 일치하는 메서드를 등록할 수 있다.

 

이벤트 선언에는 다음과 같은 두 가지의 종류가 있다.

 

'이벤트 데이터 멤버'

 

'이벤트 블록'

 

 

1. 이벤트 데이터 멤버

 

 컴파일러에서는 delegate 타입의 멤버 타입으로 이벤트에 대한 스토리지를 자동으로 만들고

내부 add, remove 및 raise 멤버 함수를 만든다.

이벤트 데이터 멤버는 클래스 내에 선언되어야 한다.

delegate의 반환 형식은 이벤트 처리기의 반환 형식과 일치해야 한다.

 

 

2. 이벤트 블록

 

이벤트 블록을 사용하면, add, remove, raise 메서드를 구현하여,

add, remove, raise 동작을 사용자가 지정할 수 있다.

remove 메서드 및 add 와 raise의 메서드 signature는 반드시 delegate의 signature와 일치해야 한다. 

이벤트  블록 이벤트는 데이터 멤버가 이니다.

데이터 멤버로 사용하려면 컴파일 오류가 발생한다.

 

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

 

.NET Framework에서 데이터 멤버를 메서드 (즉, 해당 대리자의 invoke 메서드) 자체인 것처럼 취급할 수 있다.

이렇게 하려면 관리되는 이벤트 데이터 멤버를 선언하기 위한 delegate 형식을 미리 정의해야 한다.

반면, 관리되는 이벤트 메서드는 아직 정의되지 않은 경우 해당 괸리되는 대리자를 암시적으로 정의해야 한다.

이 예제는 해당 게시글의 끝 부분에 있는 코드 샘플을 참조해보자.

 

이벤트 블록을 사용하여 add, remove 및 raise 메서드의 동작을

명시적으로 선언 및 사용자 지정할 수 있다.

이벤트 처리기를 사용하여 operator += 및 operator -= event handler를 추가 및 제거하거나

또는 add 와 remove 메서드를 명시적으로 불러올 수 있다.

 

Microsoftt C++에서 이벤트를 만들고 사용하려면

다음 단계를 수행해야 한다.

 

1. 대리자를 만들거나 식별한다.

고유한 이벤트를 정의하는 경우 키워드를 사용할 event delegate가 있는지 확인해야 한다.

예를 들어 이벤트가 미리 정의되어 있으면 .NET Framework에서 이벤트 소비자는

delegate 이름을 알면 된다.

 

2. 다음을 포함하는 클래스를 만든다.

  • delegate에서 생성된 이벤트

  • (선택사항) 키워드 선언된 delegate의 인스턴스가
    event에 있는지 확인하는 메서드로,
    그렇지 않으면 해당 로직을 반드시 이벤트를 시작하는 코드에 넣어야 한다.

  • 이벤트를 호출하는 메서드,
    이러한 메서드는 몇몇의 기반 클래스의 기능을 재정의(override)할 수 있다.

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

 

3. 메서드를 이벤트에 연결하는 하나 이상의 클래스를 정의한다.

이러한 각 클래스는 하나 이상의 메서드를 기본 클래스의 이벤트와 연결한다.

 

4. 이벤트를 사용한다.

  • 이벤트 선언을 포함하는 클래스의 개체를 만든다.
  • 이벤트 정의를 포함하는 클래스의 개체를 만든다.

 

 

 

요구 사항

 

컴파일러 옵션 : /clr

 

 

예제

 

 다음 코드 예제에서는 delegate, event 및 event handlers의 처리기의 쌍을 선언하는 방법을 보여준다.

이벤트 처리기를 추가, 호출 및 제거하는 방법을 보여주고 있다.

 

// 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

OnClick: 7, 3.14159

OnDblClick: Hello

 

 다음 코드 예제에서는 간단한 이벤트의 메서드를 raise 생성 하는 데

사용되는 논리를 보여준다.

이벤트에 하나 이상의 구독자가 있는 경우, raise 메서드를 명시적 또는 암시적으로 호출하면 delegate가 호출된다.

delegate의 반환 타입이 void가 아니고, 만약 이벤트 구독자가 0인 경우인 메서드는

raise delegate 타입의 기본값을 반환한다.

이벤트 구독자가 없는 경우에 메서드를 호출하면 raise는 즉시 반환되고

예외처리를 하지 않는다.

delegate 반환 타입이 void가 아닌 경우 delegate 타입을 반환한다. 

// 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

0

688

 

 

 

 

참고 사이트

https://learn.microsoft.com/ko-kr/cpp/extensions/abstract-cpp-component-extensions?view=msvc-170

https://learn.microsoft.com/ko-kr/cpp/extensions/event-cpp-component-extensions?view=msvc-170

 

문서 정리할 때 추천 방법

1. ko로 설명 한 번 보고

 

2. en로 나머지 이해 안가는 부분은 보면서 이해하기

 

자신에게 가까운 국가의 언어로 도메인 메타 언어가 만들어지면,

도메인 지식과 단어를 습득하면서 다른 국가의 언어를 얹는다는 느낌

즉 다른 국가의 언어로 된 문서를 보거나 대화하기가 쉬워진다.

 

 

'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글

모던 C++ 함수형 프로그래밍 decltype  (0) 2023.12.16
모던 C++ 함수형 프로그래밍 auto  (0) 2023.12.16
C++/ CX 와 C++/ CLI 의 차이  (0) 2023.11.21
C++ 오류 처리  (0) 2023.11.17
effective c++  (0) 2023.11.05