무효 클릭 IP 추적 중...
c#

[c#] EventHandler란?

꼬예 2022. 7. 12.

 

(해당 포스팅은 이벤트 포스팅과 이어지는 글입니다.)

 

이번 포스팅에서는 EventHandler에 대해 알아보도록 하겠습니다.

 

1) EventHandler 생김새

 

 

기존에는 이벤트를 사용하기 앞서 델리게이트를 선 정의 해줬는데요.

 

델리게이트 정의 없이 한번에 이벤트를 사용할 수 있게 도와주는 c# 내부 델리게이트EventHandler라고 보시면 됩니다.

 

내부에서 제공하는 만큼 사용 규칙이 존재하는데요.

 

Invoke()부분에 빨간줄로 에러가 뜨는게 보이실거에요.

 

뭐가 잘못되었는지  EventHandler의 원코드로 들어가보겠습니다.

 

 

EventHandler라는 델리게이트가 두개의 인자를 받도록 강제하고 있기 때문에 발생한 에러였습니다.

 

여기서 sender는 해당 이벤트를 실행시키는 객체, e는 이벤트를 발생시킬때 추가적으로 전달하고 싶은 정보를 넣어줄때 사용됩니다.

 

아래 예시와 같이 EventClass를 나타내는 this와, 아무 정보도 넣을 필요 없다는 의미로 넣은 EventArgs.Empty가 두번째 인자로 사용되었습니다.

 

 

뿐만아니라 EventHandler 시그니쳐의 맞춰 구독한 함수들의 시그니쳐도 변경해줘야 합니다.

 

변경하지 않으면 아래와 같이 에러가 뜨겠죠?

 

 

델리게이트 시그니쳐에 맞춰 수정합니다.

 

 

output:

 

 

 

 

앞서 이벤트에 추가적인 정보를 전달하지 않을거니까 EventArgs.Empty를 넣는다고 언급했었는데요.

 

그렇다면 정보를 넣고 싶다면 어떻게 할까요?

 

2) EventArgs에 추가 정보 넣기

먼저 EventArgs를 상속한 클래스를 생성해줍니다.

 

저는 EventData라는 이름을 가진 클래스를 생성했는데요. Name이라는 프러퍼티를 가지고 있습니다.

 

 

EventData 클래스를 아래와 같은 방식으로 넘겨줄 수 있습니다. 

 

 

구독한 함수를 통해 넘겨진 객체의 정보를 뽑아올 수 있습니다. 

 

 

output:

 

 

 

참고로 여기서 (EventDate)타입캐스팅을 해주는 이유는

 

 

EventArgs인자로 데이터가 통과하는 와중 박싱되었기 때문에, 다시 언방식을 하기 위함입니다.

언박싱이 되어야 원정보에 접근가능하니까요.

(해당 개념이 낯선분들은 다형성 포스팅 참조하기 바랍니다.)

 

3) EventHandler의 다른 생김새(add, remove)

 

지금까지 배운 EventHandler와는 조금 다른 형태로 정의할 수도 있는데요.

오른쪽이 지금부터 알아볼 친구입니다.

 

 

상당히 복잡해 보이기 때문에 하나하나 짚어 가도록하겠습니다.

 

 

EventHandler 키워드를 두번이나 사용했습니다.

아래쪽에 있는 녀석은 event키워드를 사용했고 하나는 사용하지 않았네요.

 

event를 사용하지 않은 handlerdoEvent()함수에서 .Invoke()를 하는데 사용되는 친구입니다.

 

 

반면 event를 사용한 SomeEventevent가 없는 handler가 함수들의 구독을 받을 수 있도록 도와주는 통로입니다.

 

+=(구독) 할때는 add안에 들어가고, -=(구독 해제)할때는 remove안에 들어가는 구조입니다.

 

정말 그런지 확인하기 위해 각 구간안에 Console.WriteLine()를 작성해보았고, 구독 후 실행시켜보겠습니다.

 

 

output:

 

 

구독을 하자 add구간에 들어간걸 확인할 수 있습니다.

 

그럼 구독해지도 해볼까요?

 

 

output:

 

 

remove구간에 적혀있던 console 구문이 실행 되었습니다. 

 

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글