이벤트와 델리게이트의 차이가 너무 궁금합니다.
인터넷 뒤져보니 델리게이트(대리자)는 callback 용으로 사용하는데
사실 이벤트도 델리게이트로 만드는 거니 뭔 차이가 있나 싶습니다.
public delegate void EventHandler();
public event EventHandler Click;
인터넷에서 뒤져보니깐 인터페이스는 델리게이트는 못 가지지만
이벤트는 가질 수 있다고 해서 해보니 자식에서 반드시 재정의 해야 하는 구조이던데요
// 예시
public delegate void EventHandler();
public interface ITestInterface
{
public event EventHandler Click; // 가능
//public EventHandler temp; // 컴파일 에러
}
public class Base : ITestInterface
{
public event EventHandler OnClick; // 반드시 정의 필요(abstract 함수처럼 자식에서 재정의가 필요)
}
뭐 더 다른거는 없나요?
13개의 댓글
무분별한 사용은 차단될 수 있습니다.
감귤칩
delegate를 활용해 event를 구현하고 있기 때문에, delegate의 확장으로도 볼 수 있을 것 같아요.
delegate는 단순히 메서드에 대한 참조를 할 수 있는 것이고, event는 말 그대로 어떤 행위를 알리는 이벤트를 의미합니다.
event handler가 delegate를 통해 구현되고 있을 뿐이죠.
RX7900XTX
그럼 event는 델리게이트 말고 어떤 걸로 구현할 수 있나요?
RX7900XTX
Action, Function? 이것도 결국 콜백용 인데 흠....
사실 둘 다 구분 없이 써도 문제가 없지 않을거 같은데 이 모호함이 정말 어렵네요;;;
무쳐
event와 delegate의 차이점은, event는 public으로 선언되어 있어도 자신이 선언된 클래스 외부에서는 호출이 불가능합니다. delegate는 자신이 선언된 클래스 외부에서도 호출이 가능합니다. 라이브러리 같은 것을 만들 때 어떤 중요한 역할을 하는 이벤트가 있다면 이것을 외부에서 마음대로 발생시킬 수 있게 하고싶지는 않겠죠. 라이브러리 사용자는 단지 event에 handler 함수를 부착할 수 있기만 하고, event를 호출하지는 못해야 합니다. 그래서 event를 사용합니다.
RX7900XTX
하지만 event 위어 선언되는건 main 함수에서 호출되던데요?
무쳐
뭔말이죠?
RX7900XTX
아 이벤트는 외부에서 바인드가 가능하지만 해당 클래스 내부에서만 호출이 가능하네요
외부에서 호출하는 건 줄 알 았는데 확인해보니 바인드만 가능하군요?
ye
넹 클래스 외부에서는 add/remove 밖에 안돼오
ery
Delegate : functuon pointer
Event : callback
완전히 같은건 아니지만 대강 이런 느낌
ye
기존 개념에 대입하면 얼추 이게 맞음
ery
야너두?
ye
넥슨은다람쥐를뿌려라
델리게이트는 변수이고 이벤트는 프로퍼티의 개념임. 프로퍼티와 동일하게 외부에서 델리게이트를 직접 호출하지 못하도록 하는 접근제한, 그리고 메소드화를 통한 캡슐화에 의의가 있음.
이벤트는 델리게이트로 만들어 진다는 건 틀린 생각임. 델리게이트를 통하지 않더라도 이벤트를 만들고 커스텀 add/remove 를 정의하는 게 가능함. 기본 이벤트는 델리게이트를 backing field로 가진 오토프로퍼티로 보면 되고.