프로그래밍

c# 이벤트와 델리게이트

이벤트와 델리게이트의 차이가 너무 궁금합니다.

인터넷 뒤져보니 델리게이트(대리자)는 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개의 댓글

22 일 전

delegate를 활용해 event를 구현하고 있기 때문에, delegate의 확장으로도 볼 수 있을 것 같아요.

delegate는 단순히 메서드에 대한 참조를 할 수 있는 것이고, event는 말 그대로 어떤 행위를 알리는 이벤트를 의미합니다.

event handler가 delegate를 통해 구현되고 있을 뿐이죠.

0
22 일 전
@감귤칩

그럼 event는 델리게이트 말고 어떤 걸로 구현할 수 있나요?

0
22 일 전
@RX7900XTX

Action, Function? 이것도 결국 콜백용 인데 흠....

사실 둘 다 구분 없이 써도 문제가 없지 않을거 같은데 이 모호함이 정말 어렵네요;;;

0
22 일 전

event와 delegate의 차이점은, event는 public으로 선언되어 있어도 자신이 선언된 클래스 외부에서는 호출이 불가능합니다. delegate는 자신이 선언된 클래스 외부에서도 호출이 가능합니다. 라이브러리 같은 것을 만들 때 어떤 중요한 역할을 하는 이벤트가 있다면 이것을 외부에서 마음대로 발생시킬 수 있게 하고싶지는 않겠죠. 라이브러리 사용자는 단지 event에 handler 함수를 부착할 수 있기만 하고, event를 호출하지는 못해야 합니다. 그래서 event를 사용합니다.

0
22 일 전
@무쳐

하지만 event 위어 선언되는건 main 함수에서 호출되던데요?

0
21 일 전
@RX7900XTX

뭔말이죠?

0
21 일 전
@무쳐

아 이벤트는 외부에서 바인드가 가능하지만 해당 클래스 내부에서만 호출이 가능하네요

외부에서 호출하는 건 줄 알 았는데 확인해보니 바인드만 가능하군요?

0
ye
20 일 전
@RX7900XTX

넹 클래스 외부에서는 add/remove 밖에 안돼오

0
ery
22 일 전

Delegate : functuon pointer

Event : callback

 

완전히 같은건 아니지만 대강 이런 느낌

1
ye
22 일 전
@ery

기존 개념에 대입하면 얼추 이게 맞음

0
ery
22 일 전
@ye

야너두?

0
ye
22 일 전
@ery
0

델리게이트는 변수이고 이벤트는 프로퍼티의 개념임. 프로퍼티와 동일하게 외부에서 델리게이트를 직접 호출하지 못하도록 하는 접근제한, 그리고 메소드화를 통한 캡슐화에 의의가 있음.

 

이벤트는 델리게이트로 만들어 진다는 건 틀린 생각임. 델리게이트를 통하지 않더라도 이벤트를 만들고 커스텀 add/remove 를 정의하는 게 가능함. 기본 이벤트는 델리게이트를 backing field로 가진 오토프로퍼티로 보면 되고.

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5721 [프로그래밍] gcs 써본사람있어 ? 2 쿠키맛난다 0 1 시간 전 45
5720 [프로그래밍] 초보개발자 질문 두개있음 1 애플훈타 0 4 시간 전 80
5719 [프로그래밍] 하이브리드 웹뷰기반 앱은 rn이 정석이야? 3 잠적자 0 1 일 전 188
5718 [프로그래밍] c# webview2 도움요청함.. 7 carpediem 0 1 일 전 132
5717 [프로그래밍] 현업 개발자형들 맥씀? 11 이또히로부미 0 1 일 전 256
5716 [프로그래밍] libtorch에서 cuda 안불러와지는거 도움! 2 Hakat 0 3 일 전 131
5715 [프로그래밍] 뭔가 게시판이 애매해서 그런데 gis 잘아는 사람? 1 하늘늑대 0 4 일 전 168
5714 [프로그래밍] 컴포즈가 프리뷰랑 폰에서 다르게 동작해요 1 집에가게해줘 0 4 일 전 118
5713 [프로그래밍] 난바보다) 크로미움 램사용량 문제 일단 해결 2 ye 0 5 일 전 286
5712 [프로그래밍] k8s DNS 이슈는 해결이 안되나보다. 잉텔 0 6 일 전 173
5711 [프로그래밍] 분노) 진짜 유튜브 구글 패악질 토나오네 씨발 17 ye 0 7 일 전 773
5710 [프로그래밍] 프론트엔드 공부하려는데 언어 추천좀 7 스트리플 0 8 일 전 357
5709 [프로그래밍] 객체지향 뽕에 취하지마라 8 69746974 2 9 일 전 420
5708 [프로그래밍] 요즘 앱개발 인력시장 어떰..3년차 2 센치해요 0 12 일 전 393
5707 [프로그래밍] 컴포즈 Box 컴포넌트가 안 나와... 1 집에가게해줘 0 13 일 전 149
5706 [프로그래밍] 아 ssl 적용햇는데 개정신없네 9 넌또화나있네 0 14 일 전 306
5705 [프로그래밍] 패스트 캠퍼스 <---- 얘내는 가격 인상 원툴임? 5 조강현 0 17 일 전 398
5704 [프로그래밍] 클라가 파이썬 셀레니움같은거 써서 클릭하고 그러는걸 감지 ... 5 리옴므 0 18 일 전 266
5703 [프로그래밍] leetcode 50일 달성 1 JimmyMcGill 1 18 일 전 240
5702 [프로그래밍] 그냥 개인공부용 git 만들건데 5 년째재수강 0 18 일 전 336