이벤트를 이해하기 위해선 델리게이트(delegate)를 우선 알아야 한다.

델리게이트에 대해서는 아래 링크를 참조하자.

C# 델리게이트와 함수 포인터 : http://hijuworld.tistory.com/39


이벤트를 발생시키는 것은 델리게이트를 정의해서 메서드를 간접 호출하는 방식이다. 이러면 메서드 호출에 유연성을 가질 수 있기 때문이다.


처음에는 이벤트를 이해하는게 조금 어려울 수 있다.

우선 예제를 보자.

GUI라는 클래스에 버튼을 누르면 이벤트가 발생하게 하는 코드이다.


1
2
3
4
5
6
7
8
9
10
class GUI
{
    public event EventHandler OkButtonClickHandler;
    public void OkButtonClick()
    {
        if ( OkButtonClickHandler != null ) {
            OkButtonClickHandler(this, EventArgs.Empty);
        }
    }
}
cs

event EventHandler 핸들러_이름; 

위와같은 형식으로 핸들러를 선언한다.

그리고 특정 조건에서 해당 이벤트를 호출한다.


public delegate void EventHandler(object sender, EventArgs e);

위는 미리 정의된 델리게이트 원형을 표시한 것이다.

따라서 OkButtonClickHandler(this, EventArgs.Empty); 와 같은 코드로 이벤트를 발생시킨다.


이제 GUI에 객체를 만들고 이벤트 핸드러에 함수를 등록하고 이벤트를 호출시키는 코드를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program
{
    static void Main(string[] args)
    {
        GUI gui = new GUI();
        gui.OkButtonClickHandler += Gui_OkButtonClickHandler; //핸들러에 등록
        //...
        gui.OkButtonClick(); //버튼클릭
        gui.OkButtonClick(); //버튼클릭
        gui.OkButtonClick(); //버튼클릭
    }
    private static void Gui_OkButtonClickHandler(object sender, EventArgs e)
    {
        Console.WriteLine("ok button click ");        
    }
}
cs




+= 연산자를 사용하여 핸들러에 Gui_OkButtonClickHandler() 함수를 정의하고 추가하였다.

반대로 -=연산자를 사용하면 핸들러에 등록한 함수를 제외 시킬 수 있다.

그리고나서 OkButtonClick() 함수를 호출해서 이벤트를 3번 발생시켰다.


- 실행 결과 -

ok button click

ok button click

ok button click




핸들러에 함수를 추가를 할때 visual studio 2017에서 자동으로 함수를 만들어주는 기능이 있다.

아래와 같이 핸들러에 += 를 입력하면 탭키를 누르면 자동삽입을 해준다고 뜬다.



그러면 아래와 같이 함수가 만들어지고 해당 함수가 핸들러에 삽입되는 코드가 자동으로 작성된다.





그리고 핸들러 선언을 public으로 선언 했는데 정보은닉을 위해 private으로 선언도 가능하다.

아래 코드가 그 예시이다. add, remove 키워드로 핸들러에 함수를 추가 및 제거 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class GUI
{
    private EventHandler _okButtonClickHandler;
    public event EventHandler OkButtonClickHandler {
        add
        {
            _okButtonClickHandler += value;
        }
        remove
        {
            _okButtonClickHandler -= value;
        }
    }
    public void OkButtonClick()
    {
        if (_okButtonClickHandler != null )
            _okButtonClickHandler(this, EventArgs.Empty);
    }
}
cs





Posted by 꿈만은공돌
,