2019년 9월 16일 월요일

C# Event vs Delegate, 이벤트와 델리게이트 차이점.

이벤트는 델리게이트와 동일하게 +, -의 조합 연산자를 지원하고, 실제 동작도 거의 같아 보이지만 이벤트엔 컴파일러가 적용하는 몇가지 사양이 있고, 속성에 대한 두가지 접근자가 추가된다는 차이점이 있다.

디자인 상 가장 큰 차이점은 이벤트는 인터페이스 내부에 선언할 수 있지만 델리게이트는 선언할 수 없다는 점이다. 이는 프로퍼티를 인터페이스 내부에 선언할 수 있지만 필드는 선언할 수 없는 C#의 디자인과 관련이 있다. 어떤 얘기인가 하면,

public event EventHandler SomeEvent;

코드는 다음과 같이 변환된다.

private EventHandler _SomeEvent;

public event SomeEvent {
    add { _SomeEvent += new EventHandler(value); }
    remove { _SomeEvent -= new EventHandler(value); }
}

위 코드 변환의 영향으로 이벤트는 클래스 내부에서만 호출할 수 있게 된다. 반면 델리게이트는 public인 경우 클래스 외부에서도 제약없이 호출할 수 있다.

차이점이 있다 하더라도 이 둘은 거의 같다. 알다시피 EventHandler도 델리게이트다. (.Net에서 이벤트는 event 키워드만 붙이면 어떤 형식의 delegate도 허용하긴 하지만 표준은 아래의 형식을 따르는게 맞다.)

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

개인적인 생각으론 통지 구조를 인터페이스에 드러내거나 publish 동작을 클래스 내부에 감추는 목적으로 이벤트와 델리게이트를 구분해서 쓰면 될 것 같다.

댓글 없음:

댓글 쓰기