본문 바로가기

.NET/C#

C# Event

728x90
반응형

이번에는 지난번 보았던 델리게이트를 이용하는 Event에 대해서 알아보겠습니다. Event는 많은 분들이 어떤 개념인지 알고 계실겁니다. 우리가 키보드로 입력을 하거나 마우스를 움직이거나 클릭하는 모든 것들이 이벤트입니다. 마우스를 움직일때도 이벤트가 넘어가고 클릭했을 때도 이벤트가 걸려 있어 해당 행동을 하게 되어 클릭이 되고 마우스 커서가 움직이고 키보드로 글씨를 입력할 수 있는 것입니다.

이벤트는 위에서 말했듯이 델리게이트를 통하여서 구현이 됩니다. 이벤튼 여러 개의 작업들이 추가 될 수 있어야 하고 그 작업들은 외부 메서드를 필요로 할 수도 있습니다. 그런 작업을 위해서는 델리게이트가 필요로 하게되죠. 그래서 전에 델리게이트에 대해서 저는 공부를 먼저 했던거죠. 보통 책에서도 이런식으로 나오더군요.  그럼 훈스에서 나온 예제를 통해서 이벤트에 대해서 공부해 보도록 하겠습니다.(이건 강의가 아니고 제가 공부하는 것을 그대로 올릴 뿐입니다. 강의라고 생각하지 마세요. 너무 빈약하고 설명도 제대로 안되어 있어요 ㅜㅜ)

    

    1 delegate void eventDelegate();

    2 class Test

    3 {

    4     public event eventDelegate ckEvent;

    5     public void btnClick()

    6     {

    7         ckEvent();

    8     }

    9 }

   10 class Program

   11 {

   12     private static void Click()

   13     {

   14         Console.WriteLine("클릭 되었습니다.");

   15     }

   16     static void Main(string[] args)

   17     {

   18         Test Etest = new Test();

   19 

   20         Etest.ckEvent += new eventDelegate(Program.Click);

   21 

   22         Etest.btnClick();

   23     }

   24 }

1~9째 줄까지 이벤트를 선언해주는 과정입니다. 우선 eventDelegate라는 델리게이트를 선언해줍니다. 그리고 eventDelegate타입의 delegate들이 이벤트 처리를 하게 한다고 알려주는 것이 4번째 줄입니다. btnClick메소드는 어떤 버튼이 눌렀을 때 호출된다고 가정을 한것입니다.

메인으로 와서는 클릭되었을 때의 처리할 메소드를 선언하고 그 메소드를 ckEvent가 발생한 경우 처리할 수 있게 이벤트로써 지정해주는 작업이 20번째 줄입니다. 22번째 줄에서 버튼이 눌러졌다는 가정을 하고 클릭 이벤트를 발생 시키는 과정이지요. 보시는 봐와 같이 이벤트에 해당하는 모션이 생겼을 때 실행될 메소드들을 여러개 추가할 수가 있습니다. 위에서와 같이 추가를 하면 또 다른 역할을 하는 이벤트를 만들수 있는 것입니다. 실행을 하면 다음과 같은 결과를 내놓습니다.

그럼 이번에는 윈도우 창을 띄워서 한번 실행해보도록 하겠습니다.
우선 디자인 모듈을 이용하지 않고 순수 코딩으로 윈도우 창을 띄우고 버튼과 이벤트를 만들어 보도록하겠습니다.
어려운 작업은 아니니 한번씩 해보시면 나름 괜찮을거 같습니다. 뭐 긴 코드도 아니고요 ^^
    1 namespace EventTest

    2 {

    4     class EventDemo

    5     {

    6         public void ClickHandler(object sender, EventArgs e)

    7         {

    8             MessageBox.Show("클릭되었습니다.");

    9         }

   10     }

   11 }

우선 클래스를 구현하시고요.

    1 class Program

    2 {

    3     static void Main(string[] args)

    4     {

    5         Form form = new Form();                              //폼을 만드는 부분

    6         form.Width = 500;

    7         form.Height = 400;

    8         form.BackColor = Color.Orange;

    9 

   10         Button btn = new Button();                                 //버튼 생성 부분

   11         btn.Text = "눌러주세요";

   12         Font font = new Font("맑은고딕", 50, FontStyle.Bold);

   13         btn.Font = font;

   14         btn.Width = 300;

   15         btn.Height = 200;

   16         btn.BackColor = Color.White;

   17         int x = form.Width / 2 - btn.Width / 2;

   18         int y = form.ClientRectangle.Height / 2 - btn.Height / 2;

   19         btn.Location = new Point(x, y);                                //버튼의 위치

   20         EventDemo demo = new EventDemo();

   21         btn.Click += new EventHandler(demo.ClickHandler);

   22 

   23         form.Controls.Add(btn);

   24         form.ShowDialog();

   25     }

   26 }

   EventTest 클래스에는 MessageBox를 사용하기 위해서 System.Windows.Forms 네임스페이스를 참조해야 하고, 메인도 마찬가지로 System.Windows.Forms를 쓰고 Color클래스를 추가하기 위해 System.Drawing을 추가해야합니다. 이것을 추가 되지 않으면 컴파일이 되지 않으니 꼭 명심하고 추가 하시길 바랍니다~~^^
직접 만든 EventDemo 클래스를 보시면 ClickHandler라는 메소드 하나만 달랑 있고 아무것도 없습니다. 그리고 메인에 보시면 폼을 만드는 부분, 버튼의 생성 및 위치 색, 글자 생성 등 많은 부분을 볼 수 있습니다. 메인 20줄에서 EventDemo 클래스를 선언, 인스턴스화 시키고요 btn.Click 에 클래스의 유일한 메소드를 추가 시키는 것을 볼 수 있습니다. 눈치 빠르신 분들은 이미 보셨을 것입니다. 저기에는 지금 Delegate가 없는데 저렇게 메소드를 추가하는 모습을 볼수 있죠. 이게 가능한 이유는 버튼에 Click에 이미 델리게이트로 이벤트를 추가 시킬수 있게 미리 해놓았기 때문에 가능한 것입니다. 그래서 간단히 메소드를 추가 할 수 있는 것이지요. 실행을 해보면 이쁘지는 않지만 윈도우 폼이 뜨고 그 가운데 버튼의 모습을 볼 수 있습니다 ^^

위와 같은 모습을 한 폼이에요. 그리고 가운데의 버튼을 클릭하게 되면 윈도우에서나 볼 수 있는 경고창이 하나 띄게 되지요. 바로 eventDemo에서 ClickHandler에서 선언한 MessageBox의 내용이 나타나게 되는 것입니다.

이벤트 또한 델리게이트를 잘 알지 못한다면 상당히 이해하기 어렵다고 생각합니다. 저 또한 상당히 고생을 했죠. 그나마 델리게이트에 비해서는 고생을 조금 덜 한 것 같습니다. 이벤트를 공부하다가 보니 델리게이트에 대해서도 어느정도 이해가 가게 되었고요. 이글을 보시는 분들에게 조금이나마 도움이 되었으면 하는 바램입니다.

허접한 글 봐주시느라 감사합니다 ^ㅡ^

728x90
반응형

'.NET > C#' 카테고리의 다른 글

스레드 정보 알아오기...  (0) 2010.10.12
C# 소수(Prime Number) 찾기  (0) 2010.10.12
C# 프로세스 목록 알아오기  (1) 2010.10.11
Thread 란?  (0) 2010.10.10
Windows Forms의 시작  (2) 2010.01.19
C# delegate  (0) 2010.01.14
FileAndDirectory  (0) 2010.01.12
C# File Input/Output  (1) 2009.12.24
C# Collection  (0) 2009.12.21
Interface  (0) 2009.12.18