티스토리 뷰
이벤트는 개체에 의해 발생되며, 그를 처리하기 위한 코드를 제공해야 한다는 점에서 예외와 비슷하다. 그러나 몇가지 중요한 차이들이 존재한다. 가장 중요한 차이는 이벤트에는 try...catch 에 해당하는 구조가 없다는 점이다. 이벤트의 경우에는 반드시 이벤트를 등록해야 한다. 이벤트를 등록한다는 것은 이벤트가 발생했을 때 실행될 코드를 이벤트 처리기(event handler)라는 형태로 작성한다는 의미이다.
하나의 이벤트에는 여러개의 처리기들이 등록될 수 있으며, 그 이벤트가 발생하면 등록된 모든 이벤트 처리기들이 호출된다. 이벤트 처리기는 그 이벤트를 발생시킨 개체의 클래스의 일부일 수 도 있으나, 다른 클래스들 안에 존재하는 경우가 많다.
이벤트 처리기 자체는 그냥 함수이다. 이벤트 처리기 함수의 유일한 조건은 함수의 서명이 해당 이벤트가 요구하는 서명(반환 형식과 매개변수들)과 일치해야 한다는 것이다. 이 서명은 이벤트 정의의 일부이며, 대리자에 의해 지정된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using System;
using System.Timers;
namespace ConsoleApp2
{
internal class Program
{
static int count = 0;
static string displayString = "This is string will apper one letter at a time. ";
static void Main(string[] args)
{
Timer myTimer = new Timer(100);
myTimer.Elapsed += new ElapsedEventHandler(WriteChar);
myTimer.Start();
Console.ReadLine();
}
static void WriteChar(object source, ElapsedEventArgs e)
{
Console.Write(displayString[count++ % displayString.Length]);
}
}
}
|
cs |
이벤트를 발생시키기 위해 사용한 개체는 System.Timers.Timer 클래스의 인스턴스이다.
Timer 개체에 대해 Start() 메서드를 호출하면 타이머가 시작되며, 그 메서드에 지정한 주기마다 일련의 이벤트들이 발생된다. Main() 에서는 Timer 개체의 주기를 100ms 로 설정하므로, 타이머 이후 초당 10번의 이벤트들이 발생하게 된다. (위 코드 12행)
Timer 개체는 Elpased 라는 이벤트를 발생시키는데, 개체 브라우저로 확인할 수 있다.
또는 아래 Timer 도움말(https://learn.microsoft.com/ko-kr/dotnet/api/system.timers.timer?view=netframework-4.7.2&f1url=%3FappId%3DDev16IDEF1%26l%3DKO-KR%26k%3Dk(System.Timers.Timer)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue) 에서 확인 가능하다.
이 이벤트가 요구하는 이벤트 처리기 서명은 System.Timers.ElpasedEventHandler 대리자 형식인데, 이 형식은 .Net Framework 에 정의되어 있는 표준 대리자들 중 하나이다. 이 대리자는 위 코드 18행과 같은 서명과 일치하는 함수들에 쓰인다.
Timer 개체는 자신에 대한 참조를 첫번째 매개변수로 넘겨주며, 두 번째 매개변수로는 ElapsedEventArgs 개체의 인스턴스를 넘겨준다.
20행 : Program 의 정적 필드 counter 와 displayString 을 사용해서 문자 하나씩 콘솔에 출력한다. 이 메서드가 호출될때마다 출력되는 문자가 다르다.
13행 : 이벤트 처리기 메서드를 생성한 대리자 인스턴스를 += 연산자로 타이머 개체(이벤트를 발생시킬 개체)에 추가하는 형태이다.
이 명령은 Elapsed 이벤트가 발생했을때 호출될 처리기들의 목록에 WriteChar() 를 추가하는 것이다. 처리기 목록에는 얼마든지 많은 처리기들을 등록할 수 있다. (물론, 그 처리기들은 필요한 조건들을 만족해야 한다) 이벤트가 발생하면 등록된 모든 처리기들이 호출된다.
14행 : 타이머를 시작한다.
<실행화면>