일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- MVC
- MDB Connect
- TDD
- solid
- DrawRectangle
- 공공 데이터 포털
- eventhandler
- C# MDB
- C# 파일 암/복호화
- Json.NET
- Cell Border Style
- eventargs
- C# MDB Handle
- Excel Cell Format
- c#
- sqlite3
- DrawEllipse
- 경기도 버스정보시스템
- 객체지향
- MDB Select
- Winform
- JSON
- WPF
- NUnit
- delegate
- 버스 API
- GDI+
- 시
- 디자인 패턴
- 경기도 버스
- Today
- Total
White Whale Studio
Delegate & Event / 델리게이트와 이벤트 본문
이전에 포스팅한 Delegate에 이어 Event에 대해서 살펴보겠습니다.
Event와 함께 밀접한 관계에 있는 EventHandler 또한 함께 다루어보겠습니다.
문법적인 Event의 사용법에 들어가기에 앞서 이벤트를 살펴보면
이벤트는 동작의 발생을 알리기위해 개체에서 보내는 메시지입니다. 예를 들면, 마우스 클릭, 키보드 입력등의 사용자 입력으로 인해
발생하여 다른 프로그램논리에 의해 트리거 될수 있는 거죠.
이벤트를 발생시키는 개체는 이벤트 전송자, 이벤트를 캡쳐하고 응답하는 개체를 이벤트 수신자라고 합니다.
이벤트 통신에서 이벤트 전송자 클래스와 수신자 사이에 어떤 대상이 되는지를 서로 확인하기 위해 C의 포인터 같은 매커니즘이 필요한데
이것이 바로 delegate 입니다. delegate에서 설정하는 시그니처에 맞는 전송자와 수신자끼리 서로 상호통신하게 되는 거죠.
MSDN에 따르면
Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class).
이벤트는 이벤트가 선언된 클래스나 구조체에서만 호출할 수 있는 특수한 형태의 Delegate 입니다.
Delegate같은 경우에는 클래스 외부에서 직접 호출이 가능하지만 event는 불가하므로 event를 발생시킬수있는 메서드를 만들어서 호출합니다.
또한 event에 추가되는 메서드는 할당 연산자(=)를 사용할수 없고 += 또는 -= 만 사용하여 추가/삭제가 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class SampleEventArgs { public SampleEventArgs(string s) { Text = s; } public String Text {get; private set;} // readonly } public class Publisher { // Declare the delegate (if using non-generic pattern). public delegate void SampleEventHandler(object sender, SampleEventArgs e); // Declare the event. public event SampleEventHandler SampleEvent; // Wrap the event in a protected virtual method // to enable derived classes to raise the event. protected virtual void RaiseSampleEvent() { // Raise the event by using the () operator. if (SampleEvent != null) SampleEvent(this, new SampleEventArgs("Hello")); } } | cs |
MSDN에 있는 event의 샘플 코드를 보시겠습니다.
기본적으로 이벤트를 생성하려면 EventHandler가 필요합니다.
--------- MSDN 발췌 --------
.NET Framework의 이벤트 모델은 이벤트와 이벤트 처리기를 연결하는 이벤트 대리자가 있다는 사실을 기초로 만들어졌습니다. 이벤트를 발생시키려면 다음과 같은 두 가지 요소가 필요합니다.
이벤트에 응답하는 메서드를 식별하는 대리자입니다.
이벤트 데이터가 있는 클래스입니다.
--------- MSDN 발췌 --------
(상세 내용은 하단의 EventHandler에 대한 MSDN 문서 참조)
위의 코드에서는 사용자 정의 Delegate를 선언했으므로 이벤트 생성시에
public event SampleEventHandler SampleEvent;
이와 같은 방식으로 선언을 하였습니다. 만약 특수한 이벤트 데이터(EventArgs)가 필요치 않은 경우
EventHandler Delegate의 표준 형태는 값을 반환하지 않는 메서드를 정의합니다.
기본형태로 첫번째 매개변수는 Object 형식이고(이벤트의 소스), 두번째 매개변수는 EventArgs(다른 포스팅 참조, 이벤트 데이터)입니다.
데이터를 생성하지 않는 이벤트의 이벤트 처리기 메서드만 나타내는 미리 정의된 Delegate 입니다.
만약 EventArgs를 상속받은 사용자 정의 이벤트 데이터가 필요하다면 EventHandler<TEventArgs> Delegate 클래스를 사용하면 됩니다.
즉, 사용자가 직접 정의하는 거죠.
사용자 이벤트 핸들러를 선언을 살펴보겠습니다.
public delegate void SomeEventHandler(object sender, MyEventArgs e);
위의 선언에서 object sender는 이벤트가 발생하는 소스, MyEventArgs는 전달할 이벤트 데이터를 뜻합니다.
실제적으로 사용방법은 Delegate와 동일하며, 생성시에 EventHandler와 EventArgs의 추가 설정에 대한 부분을 염두해주시면 될것같습니다.
이벤트에 등록된 메서드들은 추가 후 제거하지 않으면 이벤트가 발생할때마다 이벤트 처리기가 호출이 됩니다.
'IT Engineering > C#.net' 카테고리의 다른 글
[GDI] C# GDI 탐구 - 도형 그리기 (0) | 2016.08.03 |
---|---|
[GDI] C# GDI 탐구 - 시작 (0) | 2016.07.12 |
Delegate / 대리자 (0) | 2016.06.23 |
EventArgs (0) | 2016.06.23 |
StyleCop - Coding Guide / 스타일콥 코드 분석기 for C# (0) | 2016.06.22 |