개발 보안

프로그램은 모든 행위가 거의 이벤트로 발생

아엠그라운드 2022. 4. 4. 05:00

 

이벤트 (event)

클래스에서는 이벤트를 통해 특정 상황이 발생할 때 알림을 제공할 수 있다. 예를 들어, 사용자 인터페이스 컨트롤을 캡슐화하는 클래스에서는 사용자가 컨트롤을 클릭할 때 발생할 이벤트를 정의할 수 있다. 클래스에 이벤트를 추가하려면 event 키워드를 사용하고 대리자 형식과 이벤트 이름을 지정해야 합니다. 아래의 예제에서는 대리자를 정의한 다음 SampleEvent 이벤트에 연결한다.

 

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

public class TestEventSource

{

public event TestEventDelegate TestEvent;

}

 

이벤트 선언 시 public, private, protected, internal 또는 protected internal를 사용할 수 있으며 static, virtual, abstract 키워드도 사용 가능하다. 일반적으로 데이터를 생성하지 않는 이벤트인 경우 (: 버튼 클릭 등)는 디폴트 이벤트 대리자 형식인 System.EventHandler를 사용한다. Form 클래스 및 컨트롤 클래스에는 이미 관련된 이벤트들이 선언되어 있는데 그 중 Click 이벤트와 MouseMove 이벤트의 선언은 아래와 같다.

 

public event EventHandler Click;

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

 

public event MouseEventHandler MouseMove

public delegate void MouseEventHandler( object sender, MouseEventArgs e );

 

이벤트에는 이벤트 발생 시 수행할 메소드, 즉 핸들러를 등록할 수 있다. 이벤트 대리자 형식의 메서드 (, 이벤트 핸들러)를 만든 다음 이 메서드에 대한 대리자를 클래스 이벤트 자체에 추가하면 등록이 되는데 아래의 예제처럼 더하기 할당 연산자(+=)를 사용하여 이벤트에 추가하면 된다. 등록된 핸들러를 제거하고자 할 경우는 빼기 할당 연산자(-=)를 사용하여 이벤트에서 이벤트 핸들러에 대한 대리자를 제거하면 된다. 그리고 이벤트에는 여러 개의 이벤트 핸들러를 추가할 수 있는데 이 경우 이벤트가 발생하면 모든 핸들러가 차례로 실행된다.

 

public class Button {

public event EventHandler click;

}

 

Public class example : Form {

public example() { initComponent(); }

 

public void ReceiveTestEvent(object sender, System.EventArgs e) {

System.Console.Write("Event received from ");

System.Console.WriteLine(sender.ToString()); }

}

 

private void initComponent () {

Button clickButton = new Button();

EventHandler temp = new EventHandler(ReceiveTestEvent);

clickButton.click += temp;

}

}

이벤트와 관련된 매개 변수를 전달하여 이벤트를 호출하면 그 자체가 이벤트를 발생시킨 것이다. 이벤트가 발생하면 이벤트에 등록된 핸들러가 실행되는데, 여러 개의 핸들러가 등록되어 있을 경우, 이들을 순차적으로 호출해 준다. 따라서 이벤트가 발생하기 전에 이벤트가 null이 아닌지 확인하여 NullReferenceException이 발생하지 않도록 해야 한다.

 

윈도우즈 응용프로그램에서는 이벤트(광의)가 발생하면 이벤트 발생 개체의 이벤트에 등록된 핸들러가 호출되도록 되어 있다. 따라서 일반 응용프로그램 개발자는 별도로 이벤트를 발생시킬 필요 없다. , 폼 클래스나 컨트롤 클래스를 상속받아 새로운 폼이나 컨트롤 클래스를 만들 경우는 상위 클래스의 이벤트를 발생시킬 필요가 있다. 하지만 이때에도 직접 이벤트를 발생시킬 필요는 없다. 왜냐하면 폼 클래스나 컨트롤 클래스에는 파생 클래스 (derived class)에서 기반 클래스 (base class)에 등록된 이벤트 핸들러들을 수행시킬 수 있도록 하기 위해 Oneventname 이름을 갖는 protedted 메소드를 제공하고 있기 때문이다 (예제 참고). 만약 컨트롤을 상속받아 사용할 경우 이벤트 핸들러를 재정의 할 필요가 있으면 기반클래스의 Oneventname 메서드를 호출하여 기반클래스에 등록된 이벤트 핸들러들을 수행할 수 있게 해주면 된다.

 

Protected virtual void Onclick (EventArgs e)

{

if (click != null) {

click (this, e);

}

}