이벤트
- 어떤 사건이 발생했을 때 호출되어야 하는 메소드의 목록
- 이벤트에 의해 호출되는 메소드를 특별히 이벤트 핸들러라고 부른다
- 지정자 event 델리게이트 이름; < 선언 형식
- 이벤트는 델리게이트 내부적으로 구현, 먼저 선언 해둬야 한다

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
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
 
namespace CompleteEvent
{
    delegate void Notice();
 
    class Printer
    {
        public void Print() // 수신완료라는 사건에 대한 이벤트 핸들러
        {
            Console.WriteLine("수신된 데이터를 인쇄합니다");
        }
    }
 
    class Receiver // 수신완료 시 호출할 메소드를 저장하기 위해 OnComplete 이벤트 소유
    {
        public event Notice OnComplete;
 
        public void Receive() // 네트워크에서 데이터를 수신하는 동작
        {
            for(int i=0;i<100;i++)
            {
                Console.WriteLine(i + "%수신중");
                System.Threading.Thread.Sleep(50);
            }
 
            if(OnComplete  != null)
                OnComplete();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Printer P = new Printer();
            Receiver R = new Receiver();
 
            R.OnComplete += P.Print; // OnComplete 이벤트후에 호출하고 싶은 메소드 등록
            R.Receive();
         // P.Print();
        }
    }
}




- 이벤트 발생기는 단순히 사건 발생을 알릴뿐이지 핸들러에게 어떤 요청이나 질문은 하지 않는다

- 이벤트는 델리게이트에 비해 훨씬 더 제한적인 동작만 가능
- 이벤트는 델리게이트의 복잡한 문법을 숨김으로써 사용자들이 훨씬 더 간단하게 이벤트를 다룰수 있게 한다


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
 
namespace ClickEvent
{
    public delegate void deleClick();
 
    class Button // Click이벤트 선언
    {
        public event deleClick Click;
 
        public void Draw()
        {
            Console.WriteLine("나는 버튼");
        }
 
        public void OnClick() // Click에 저장되어있는 메소드 호출
        {
            if(Click !=null)
                Click();
        }
    }
 
    class Program
    {
        static void GameStart()
        {
            Console.WriteLine("게임시작");
 
            for(int i=0; i<5;i++)
            {
                Console.WriteLine('.');
                System.Threading.Thread.Sleep(50);
            }
            Console.WriteLine("\n 게임 끝");
        }
 
        static void Main(string[] args) // 이벤트에 GameStart라는 핸들러 할당
        {
            Button BtnStart = new Button();
            BtnStart.Draw();
            BtnStart.Click += GameStart;
            Console.WriteLine("S:게임시작. E:끝");
            for (; ; )
            {
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo cki;
 
                    cki = Console.ReadKey();
 
                    if (cki.Key == ConsoleKey.S)
                    {
                        BtnStart.OnClick();
                    }
 
                    if (cki.Key == ConsoleKey.E)
                    {
                        break;
                    }
                }
            }
        }
    }
}


Posted by 코딩하는 야구쟁이
,