[NEW] 프로젝트 수행 일지 : 초보 탈출기 | 이벤트 핸들러 – Pickpeup

이벤트 핸들러: คุณกำลังดูกระทู้

약간 순서가 바뀐 느낌이지만 어쨋든 지엽적인 문제에서 시작하다가 꼬리물기를 하니 이벤트에 대한 근본적 공부에 도착하게 되었다. 역시 MSDN에 있는 내용이지만 편역할 예정이다.

 

이벤트 발생과 처리(Handling and Rasing Events)

 

.NET에서는 델리게이트 모델에 기초해 이벤트가 처리된다. 여기서는 델리게이트 모델을 설명하고 응용 프로그램에서 이벤트를 사용하는 방법과 그리고 클래스에서 이벤트를 발생시키는 방법을 다루게 된다.

 

목차는 다음과 같다.

  • 이벤트와 델리게이트
  • 이벤트와 이벤트 핸들러와 연결 방법
  • 이벤트 사용하기
  • 윈도우 폼 형태의 응용프로그램에서 이벤트 사용하는 방법
  • 이벤트 발생
  • 클래스에서 이벤트 생성하기
  • 이벤트 발생과 이벤트 사용

위의 목차에서 이벤트와 델리게이트는 이미 포스팅하였다. 지금 약간 고민이 되는데 Visual Basic에 특화된 포스트가 있긴 하다. 그냥 간단히 이걸로 할까도 생각했지만 그건 별도의 포스트로 처리하고 그냥 전반적 공부로 가기로 한다.

 

위의 목차를 따라 공부하다 보니……역시 순서가 바뀐 것 같다. 이벤트의 발생을 먼저 공부해야 하겠다.

 

 

이벤트 발생(Raising an Event)

 

이벤트를 발생시키는 클래스를 만든다고 하면 다음의 세가지 요소는 반드시 갖추어야 한다.

  • 이벤트 정보(data)를 제공하는 클래스
  • 이벤트 대리자(delegate) 즉, 이벤트 처리기(handler)
  • 이벤트를 발생시키는 클래스

이벤트 정보를 제공하는 클래스 정의하기

 

.NET 에서는 통상적으로 이벤트 발생시 이벤트 데이터(정보)를 이벤트 처리기에 넘겨준다. 그리고 이 이벤트 정보는 System.EventArgs라는 클래스나 사용자가 만든 파생 클래스가 제공하는 것이다.

 

많은 경우에 이벤트가 특별한 정보를 가지지 않는데, 이런 경우 그냥 이벤트가 발생했다는 것 자체가 정보의 전부다. 이런 경우 이벤트는 EventArgs(클래스다)의  오브젝트를 이벤트 처리기에 넘기며 이런 경우, EventArgs 클래스는 Empty라는 멤버 하나만 있다.

 

만약 이벤트가 특별한(custom) 정보를 가지고 있다면, EventArgs로 부터 파생된 파생클래스의 어떤 하나의 인스턴스(객체)를 이벤트 처리기에 넘긴다. 이게 뭔 소린인가? 읽고도 뭔 소리인지. 그래서 다시 EventArgs로 꼬리물기를 했다. 근데 꼬리인줄 알고 따라 갔는데 이건 바로 내가 원하던 머리였다. 여기에 이벤트 생성, 발생, 처리가 모두 정리되어 있다. 즉 event class생성, delegate와 연결, 그리고 eventhandler까지 일목요연하게 다루고 있다. 그래서 지금 하고 있는 포스트는 잠시 중단하고 EventArgs로 건너 가겠다. 다시 와서 계속 하도록 하자. 드디어 머리를 발견했다. 확실히 MSDN의 순서는 초보자에게 친절하지가 않다. 따라 오셔서 같이 보자.

 

 

잠깐 갔다 다시 왔다. 예제를 분석해보면 윗 단락의 첫 문장의 의미를 알게 된다. 그런데 예제를 따라 가던 중 이벤트 발생에 관해 모르는 것이 생겨서 다시 돌아왔다. 

 

만약 이벤트가 특별한 정보를 가지고 있다면, EventArgs의 파생 클래스의 인스턴스(객체)가 이벤트 처리기에 이벤트 상황정보를 넘긴다. 그런데 이벤트가 넘긴 자료에 따라서는 기존의 존재하는 이벤트 정보 클래스를 이용할 수도 있다. 예를 들어, 만약 이벤트 처리기가 이벤트와 관련된 행동을 하지 못하게 한다면 CancelEventArgs라는 기존 클래스를 사용할 수 있다.

 

이벤트 처리기에 특별한 이벤트 상황정보를 넘겨 주어야 되는데 기존의 클래스가 존재하지 않는다면 사용자 본인의 이벤트 정보 클래스를 정의할 수도 있다. 근데 이것은 System.EventArgs의 파생 클래스여야 한다. 규칙상 이 파생클래스의 작명은 EventNameEventArgs 으로 한다. 다시 말하지만 이것은 이벤트 정보를 가지고 있는 클래스이다. 아래 예문에서는 이벤트 처리기에 2가지 이벤트 정보를 제공하는, 클래스명이 AlarmEventArgs인 파생클래스를 보여주고 있다. 그 두가지 정보란 알람이 울린 시간을 나타내는 Time 속성과 정해진 시간이 지난후 알람이 다시 울려야 하는지 혹은 다음번 알람이 취소되어야 하는지를 알려주는 Snooze 속성이다. 여기서 Alarm은 화재경보 같은 것이 아니고–사실 처음에는 화재 경보인줄 알고 있었다. 왜냐면 MSDN의 다른 포스트에서는 화재 경보였기 때문이다. 아…..왜 비슷한 이름을 해서 날 헷갈리게 하는지…사실 이것때문에 반나절을 소비했다. 여기서의 알람은 자명종 시계의 알람을 말한다. 역시 너무 불친절하다. 예문은 다음과 같다.

READ  [Update] Park Shin Hye Boyfriend, Ex-Boyfriend and Husband (2021) | park shin hye - Pickpeup

 

Public Class

AlarmEventArgs

: Inherits EventArgs

 

◀◀

 파생 클래스이고 이벤트 정보를 제공한다.

   Private alarmTime As Date

   Private snoozeOn As Boolean = True

   Public Sub New(time As Date)
      Me.alarmTime = time
   End Sub

   Public ReadOnly Property Time As Date
      Get
         Return Me.alarmTime
      End Get
   End Property

   Public Property Snooze As Boolean
      Get
         Return Me.snoozeOn
      End Get
      Set
         Me.snoozeOn = value
      End Set  
   End Property  
End Class

 

자! 3가지 요소중 첫번째가 마무리 되었다. 그런데 또 모르는 것이 등장했다. 클래스 선언 초반에 Sub New이다. 또 꼬리물기를 하여 포스트하고 다시 와야 하겠다.

돌아와서 두번째 요소는 이벤트 대리자이다. 즉 이벤트 처리기이다.

 

이벤트 대리인(Delegate) 정의하기

 

이벤트 대리인(델리게이트)을 이용하여 이벤트의 고유표식(signature)을 정의한다. 즉 특정 이벤트 대리인이 특정 이벤트 정보 클래스와 고유표식이 일치한다. 통상, .NET 환경에서의 이벤트는 EventName(sender, e)라는 표식을 가진다. 여기서 sender는 Object로서 이벤트를 일으킨 당사자가 되겠다. 그리고 e는 이벤트 정보를 제공하는 EventArgs의 오브젝트이거나 그 파생 오브젝트가 된다. 따라서 대리자 정의는 전형적으로 EventNameHandler(sender, e)라는 형식을 가지게 된다. 표식이 같아야 하니까.

 

만약 사용자 지정(custom) 이벤트 정보 클래스를 정의하였으면 또한 같은 표식을 지닌 그에 맞는 사용자 지정 대리인을 정의할 수 있다.

 

반복되지만, 다음 예는 AlarmEventHandler라는 이벤트 대리자를 정의하는 것이다.

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEvetnArgs)

 

이제 마지막 요소가 남았다.

 

이벤트를 발생시키는 클래스 정의하기

 

이벤트를 발생시키는 클래스는 이벤트 선언과 함께 이벤트를 일으키는 메서드도 정의해 주어야 한다. 또한 그 클래스의 속성이나 메서드가 이벤트를 발생시키는 방법도 보여주어야 한다.

 

비주얼 베이직에서는 Event라는 키워드를 사용하여 이벤트 멤버를 정의한다. 컴파일러가 클래스에서 이벤트 정의를 마주치면 자동적으로 다음과 같은 private 멤버를 만든다.

 

아래 내용은 아직 필요하지 않아서 담에 정리하자. 전문가도 아닌데….근데 뭔 말인지??

 

Copy

private EventNameHandler eh = null;

The compiler also creates the two public methods, add_EventName and remove_EventName. These methods are event hooks that allow delegates to be combined or removed from the event delegate eh. The details are hidden from the programmer.

 

다음 예문은 AlarmEvent라는 이름의 이벤트를 선언하고 있다. 이것은 아래에 있는 Alarm이라는 클래스의 일부이다. 주목할 점은 AlarmEventHandler 대리자라는 표식을 가지고 있다는 것이다.

 

READ  [NEW] Vip'dOut | US-VIP Cars | VIPStyleCars | VIP Style Cars, | vip japan shop - Pickpeup

Event AlarmEvent As AlarmEventHandler

 

이벤트 구현을 정의했다면 이제는 이벤트 발생시기를 정해야 한다. 이벤트를 정의한 클래스나 그 파생 클래스에서 OnEventName이라는 메서드를 호출할 때 이벤트는 발생한다. 아래 예문을 보자. 여기서는 AlarmEvent라는 이벤트를 발생시키는 OnAlarmEvent 메서드를 정의한다. 여기서 RaiseEvent 키워드는 뒤이어 오는 이벤트를 촉발시키는 기능을 가집니다. MSDN의 원 예문에서는 RaisedEvent라고 되어 있는데 오자를 여겨진다.

 

Protected Sub onAlarmEvent(e As AlarmEventArgs)

RaiseEvent AlarmEvent(Me, e)

End Sub

 

아래 예문에서는 Set이라는 메서드를 정의하는데, 이것은 OnAlarmEvent 메서드를 호출하여 이벤트를 일으키는 방식이 들어있다. 만약 지금 시간이 알람(자명종 알람!)이 울려야 하는 시간과 같게 되면, Set 메서드는 AlarmEventArgs 오브젝트(이벤트 상황 정보를 제공)를 생성하고 알람이 켜진 시간(currentTime)을 제공한다. 이벤트 처리가 끝난 후, 이벤트 처리기는 Snooze 프라퍼티(property)의 값을 체크한다. 만약 값이 false이면 더 이상 자명종은 울리지 않고 그러면 Set 메스드는 종료된다. 만약 Snooze가 true면 알람이 울려야하는 시간이 순차적으로 Interval 만큼 증가된다. 

Public Sub [Set]()

Do

System.Threading.Thread.Sleep(2000)

Dim currentTime As DateTime = Date.Now

If currentTime.Hour = alarmTime.Hour And currentTime.Minute = AlarmTime.Minute Then

Dim args As New AlarmEventArgs(currentTime)

OnAlarmEvent(args)

If args.Snooze = False Then

Exit Sub

Else

Me.alarmTime = Me.alarmTime.AddMinute(Me.interval)

End If

End If

Loop

End Sub

 

자! 3가지 요소를 다 공부했다. 정리하면 이벤트 정보를 가지는 클래스, 이것을 처리하는 처리기(대리자), 그리고 이벤트 발생시키는 클래스가 필요하다. 다음 예문이 바로 Alarm 클래스이다.

 

 

Public Class Alarm

Public Class Alarm

   Private alarmTime As Date

   Private interval As Integer = 10

   Event AlarmEvent As AlarmEventHandler

   Public Sub New(time As Date)
      Me.New(time, 10)
   End Sub

   Public Sub New(time As Date, interval As Integer)
      Me.alarmTime = time
      Me.interval = interval
   End Sub

   Public Sub [Set]()
      Do
         System.Threading.Thread.Sleep(2000)
         Dim currentTime As DateTime = Date.Now
         ‘ Test whether it is time for the alarm to go off.
         If currentTime.Hour = alarmTime.Hour And _
            currentTime.Minute = AlarmTime.Minute Then
            Dim args As New AlarmEventArgs(currentTime)
            onAlarmEvent(args)
            If args.Snooze = False Then
               Exit Sub
            Else
               Me.alarmTime = Me.alarmTime.AddMinutes(Me.interval)
            End If     
         End If         
      Loop
   End Sub

   Protected Sub onAlarmEvent(e As AlarmEventArgs)
      RaiseEvent AlarmEvent(Me, e)
   End Sub 
End Class

 

자 너무나 많은 내용을 했다. 이벤트에 관해서 간략하게 정리할 필요가 있다. 그래서 간략한 예제와 함께 포스트하기로 한다. 참고하세요.

 

 

이벤트와 이벤트 핸들러 연결법

 

다른 클래스에서 정의된 이벤트를 사용하기위해서는 따로 이벤트 처리기(핸들러)를 정의하고 등록해야 한다. 이때 주의해야 하는 것이 있는데, 이벤트 처리기와 이벤트용으로 선언된 델리게이트(대리인)이 같은 고유표식을 가져야 한다는 것이다. 고유표식에 대해서는 저의 글을 참고하세요. 그럼 등록은 어떻게 하느냐? 그건 이벤트 처리기(handler)를 추가하면 된다. 이벤트 처리기를 추가하면 클래스가 이벤트가 발생시킬 때마다 이벤트 처리기 메서드가 호출된다. 다시 강조하자면 이 글에서의 이벤트는 다른 클래스에서 정의되어 있다.

READ  [NEW] 두번째 청춘,주인 | 드루피 - Pickpeup

 

이벤트를 발생시키고 처리하는 예문은 이벤트 발생 및 사용이라는 포스트를 참고하세요.

 

이벤트 처리기 메서드를 추가하기

 

이벤트 대리인(델리게이트)과 동일한 고유표식을 가진 이벤트 처리기 메서드를 정의하면 된다. 어??? 이벤트 처리기가 이벤트 대리자가 아니었나요??? 이벤트 처리기 메서드는 뭘까?  사실 이벤트를 정의할때 이벤트 처리기를 만들어야 한다. 즉 이벤트 클래스내에 이벤트 처리기 즉 델리케이트가 정의된다. 위의 이벤트 발생이라는 제목의 글을 참고하면 말이다. 그런데 여기서의 이벤트는 다른 클래스에서 정의된 이벤트이고 이걸 사용하기 위해서는 다른 방식이 필요하다. 즉 이벤트 처리기 메스드(event handler method)가 필요하다.

 

Public Class WakeMeUp

‘AlarmRang이 AlarmEventHandler와 같은 고유표식을 가지고 있다.

Public Sub AlarmRang(sender As Objec, e As AlarmEventArgs)

……….

End Sub

……

End Calss

 

위의 예문에서 보면 WakeMeUp이라는 클래스에서 알람이 울리는 이벤트가 필요하다. 근데 알람이 울리는 이벤트는 다른 클래스에서 정의되어 있다. 즉 Alarm Class에서.

 

<<<< <<<<<<계속>>>>>>>>>>>>

 

 

 

 

 

 

저작자표시

비영리

변경금지


이차는 모두가 만족할수 밖에 없다?! 옵션, 승차감, 디자인, 내구성 이모든게 1000만원대?! 일단 타보세요?! feat.이건 반칙아니야?!


카카오톡플러스 친구 http://pf.kakao.com/_wcZyK
🚗더 많은 매물 http://안녕마이카.net​
인스타그램 안녕마이카 검색
☎ 문의전화 ( 010 2278 9414 )
※ 광고, 협찬, 인터뷰, 합동촬영 문의
정PD : 13pur@naver.com
이PD : b.brook@daum.net
수수료
국산차 30만원
수입차 40만원
매도비 33만원
중고차 전액할부가능(저신용자 할부가능합니다)
카카오톡 오픈채팅 https://open.kakao.com/o/suZ5z2wc​

오시는길
수원점 : 경기도 수원시 권선구 권선로 3085, 도이치 오토월드 312호
수원역2번출구 픽업가능 수원버스터미널픽업가능
르노삼성 중고차 1000만원대중고차 SM6 르노 수입차

นอกจากการดูบทความนี้แล้ว คุณยังสามารถดูข้อมูลที่เป็นประโยชน์อื่นๆ อีกมากมายที่เราให้ไว้ที่นี่: ดูเพิ่มเติม

이차는 모두가 만족할수 밖에 없다?! 옵션, 승차감, 디자인, 내구성 이모든게 1000만원대?! 일단 타보세요?! feat.이건 반칙아니야?!

[C# 강좌] 29. 이벤트와 이벤트핸들러


[C# 강좌] 29. 이벤트와 이벤트핸들러

Rotary Telehandler Launch Event


Join us for the online launch of the new Bobcat Rotary Telehandler range:
10 Stage V models from 18 to 39 meters in Europe
4 Stage IIIA models from 18 to 25 meters in MEA, RUS, CIS region
Check back here for the live video of the event on 2. 12. 14:00 CET.
Content will be presented in English with subtitles in French, German, Spanish, Italian, Dutch, Russian, Czech and English language.

Rotary Telehandler Launch Event

Webjjang Web ver.2021.02 07-06 JS – 이벤트 핸들러 02 / 이벤트 리스너 01(웹짱과 함께하는 웹표준-화면구현)


웹짱과 함께하는 웹표준화면구현
07. JS 기초와 이벤트, 함수
0706 JS 이벤트 핸들러 02 / 이벤트 리스너 01

Webjjang Web ver.2021.02 07-06 JS - 이벤트 핸들러 02 / 이벤트 리스너 01(웹짱과 함께하는 웹표준-화면구현)

[C# 기초] C# 이벤트(event) 활용 사례


[C 기초] 파일을 복사 진행율을 표시하는 샘플 프로그램을 들어 C 이벤트(event)의 개념과 활용 과정을 자세히 소개합니다.
참고아티클 : http://www.csharpstudy.com/CSharp/CSharpevent.aspx

[C# 기초] C# 이벤트(event) 활용 사례

นอกจากการดูบทความนี้แล้ว คุณยังสามารถดูข้อมูลที่เป็นประโยชน์อื่นๆ อีกมากมายที่เราให้ไว้ที่นี่: ดูบทความเพิ่มเติมในหมวดหมู่Music of Turkey

ขอบคุณมากสำหรับการดูหัวข้อโพสต์ 이벤트 핸들러

Leave a Comment