포스트를 만든 목적
- 공부하려고!!
관련 링크
- http://msdn.microsoft.com/ko-kr/library/8627sbea%28VS.80%29.aspx // 무엇이 이벤트 인가?
- http://www.gpgstudy.com/forum/viewtopic.php?t=18988 // Event, Delegate 차이점
- http://blog.naver.com/silent1002/10086120655 // Event, Delegate 차이점
내용
delegate과 event는 사실 전혀 다른 것인데, 사용상 무척 혼동을 준다. delegate는 type 이고, event는 속성이다. 즉, int == delegate 이고 virtual == event 이다. event 는 delegate에 특정한 속성을 부여하는 것인데, event delegate 와 일반 delegate는 다음과 같은 차이점을 갖게 된다.
- event는 Interface에 포함 시킬 수 있고, delegate는 포함 시킬 수 없다.
- event는 event 소유자 내에서만 호출 할 수 있고, delegate는 아무곳에서나 호출 할 수 있다.
- event는 delegate를 private으로 만들며, public method add 와 remove를 property에 추가 시킨다.
샘플 코드를 컴파일하고, IL 코드를 보면 private 만들고 add, remove 코드를 생성 하는 것을 확인 할 수 있다.
그렇다면 왜 event를 이용하여 외부로 노출할 인터페이스를 정의하는게 좋은가?
.. 질문이 멍청하다. 아니 이 단원의 제목이 이상하다. 외부 인터페이스를 내부 인터페이스로 끌어들일 때 event를 사용하라. 가 더 적절하며, 질문은 "왜 event를 사용하여, 외부 인터페이스를 내부 인터페이스로 가지고 와야 하는가?"가 적절하다.
event 속성이 부여된 delegate는 객체 외부에서 호출하는 것을 막아주기 때문에, 그만큼 의존도를 낮춘다. 이는 프로그래머가 봐야할 장소를 더 단축시킬 수 있으므로, 더 가독성 좋은 코드를 만들 수 있게 된다. 인데... event를 사용해도, 의존도를 충분히 높일 수 있다. 왜냐하면 event delegate가 복사 생성 될 수 있기 때문이다. : )
결론
- 인터페이스를 내부로 끌어 들일 땐, event delegate를 사용하자.
여담
- event delegate가 복사 생성 할 수 있기 때문에, 의존도를 낮출 수 있다고 보지 않는다. 나는...
'책 정리 > Effective C#' 카테고리의 다른 글
item 27, ICloneable의 구현을 피하라 (4) | 2010.07.20 |
---|---|
item 26, IComparable과 IComparer를 이용하여 순차관계를 구현하라 (6) | 2010.07.19 |
item 25, serializable 타입이 더 좋다. (0) | 2010.07.18 |
item 24, 명령적 프로그래밍보다 선언적 프로그래밍이 더 좋다. (0) | 2010.07.14 |
item 23, 클래스 내부 객체에 대한 reference 반환을 피하라. (0) | 2010.07.11 |
item 21, delegate를 이용하여 콜백을 표현하라. (1) | 2010.07.10 |
item 20, interface의 구현과 virtual 메서드의 overriding을 구분하라. (0) | 2010.07.10 |
item 19, 상속보다는 interface를 정의하고 구현하는 것이 좋다. (1) | 2010.07.07 |
item 18, 표준 Dispose 패턴을 구현하라. (2) | 2010.07.06 |
item 17, boxing과 unboxing을 최소화하라 (0) | 2010.07.04 |
최근댓글