이번 포스팅에서는 델리게이트와 같은듯 다른 이벤트에 대해 알아보도록 하겠습니다.
이 글을 읽기 전 선수 지식 포스팅
1) 이벤트 정의 / 델리게이트와의 비교(1)
이벤트를 정의하는 방법은 간단합니다.
기존 델리게이트를 정의하는 방법에 event 키워드만 추가 해주면 됩니다.
여기서 조금 특이한 게 SomeEvent 이벤트를 발생시키는데, 굳이 doEvent()라는 함수 안에 감싼 형태로 작성을 하였다는 것인데요.
왜 그랬을까요?
private필드에 접근하기 위해 public 프러퍼티를 이용하는것과 같은 결이라고 보시면 됩니다.
이벤트는 public으로 정의해도 외부에서 해당 이벤트로 접근이 불가하다는 특징이 있습니다.
그렇기 때문에 이벤트에 접근 하도록 도와주는 함수가 필요한 것이죠.
실제로 그런지 확인해볼까요?
이벤트가 등록되어 있는 클래스(여기선 EventClass)를 객체화하고, 객체를 통해 이벤트에 접근하려고 하자 아래와 같은 에러가 발생됩니다.
그렇다면 델리게이트로 바꿔본다면 어떻게 될까요?
이벤트 키워드를 지웁니다.
기존 발생했던 에러가 사라지는걸 알 수 있습니다.
여기서 첫번째 델리게이트와 이벤트의 차이점을 알 수 있었습니다.
2) 이벤트 실행 / 델리게이트와의 비교(2)
이번에는 이벤트에 함수들을 구독시켜 보겠습니다.
우리 예시는 3개의 함수를 멀티캐스팅 시킨 케이스입니다.
doEvent() 함수를 통해 이벤트를 발생시켜보겠습니다.
(참고로 doEvent() 함수는 이벤트를 발생시키는 목적으로 만든 임의의 함수입니다.)
output:
이벤트가 발생되자 구독한 함수들이 정상적으로 출력되는 걸 알 수 있습니다.
여기서 약간의 코드 변경을 해보겠습니다.
EventHandler3함수를 구독시킬때 +=가 아닌 =로 변경해보았는데요.
어떤 결과가 나올까요?
output:
앞서 구독했던 메소드들이 다 날라 가버리는 사태가 발생하였습니다.
그렇다면 이벤트 키워드를 사용하면 어떨까요?
이벤트 키워드를 사용하면 애초부터 = 사용이 불가합니다.
그렇기 때문에 앞서 구독한 함수들이 날라갈 일이 없습니다.
즉, 더 안정적이라 할 수 있죠.
정리
1) 이벤트로 정의된 필드에는 외부에서 다이렉트로 접근하는 것이 불가 하기 때문에 캡슐화(encapsulation)가 가능합니다.
2) 이벤트 키워드 사용시 = 를 통해 기 구독된 함수들이 오버라이딩될 걱정할 필요가 없습니다.
'c#' 카테고리의 다른 글
[c#] string format ### 000 차이 (0) | 2022.07.13 |
---|---|
[c#] EventHandler란? (0) | 2022.07.12 |
[c#] 이메일 자동으로 보내기 (gmail smtp 이용) 최신 + 파이썬 (3) | 2022.07.08 |
[c#] sql 연결 오류(CS1069) (0) | 2022.06.27 |
[c#] Action, Func, Predicate 개념/ 차이 (0) | 2022.06.16 |
댓글