본문 바로가기

프로그래밍/C#

[C#] Csharp 델리게이트와 이벤트

반응형

델리게이트(Delegate)는 '대리자'라는 뜻으로 함수의 포인터처럼 메서드를 안전하게 캡슐화해서 사용하는 형식입니다. 델리게이트는 개체 지향적이고 형식이 안전하며 보안이 유지됩니다.

델리게이트의 기본적인 사용방법을 쉽게 설명하자면 '메소드를 참조하는 변수'라고 할 수 있습니다.

말로만 들으면 어려울수도 있으니, 아래 예제와 함께 다시 설명을 읽어보시면 이해에 도움이 될겁니다.

소스

출력

Hello1

Hello2

A

B

A

위에 '예제2'에서 보이듯이 한 델리게이트에 여러가지 메서드를 저장하여 한번에 호출할 수 있습니다.

이를 '멀티캐스트 델리게이트'이라고 합니다.

여기서 왜 델리게이트를 써야하나?라고 하고 물으시는 분들에게 제가 느낀것을 이야기해보자면

1. 함수의 매개변수에 델리게이트를 이용하여 메서드를 구현할 수 있다

2. 함수들을 호출하기 위한 반복작업을 줄여줄 수 있다.

위 2가지 이유로 'If문 사용 감소, 코드 가독성 증가'에 큰 도움을 줄 수있다고 생각합니다.

또한 배우는 입장에서 델리게이트가 필요한 가장 큰 이유는 델리게이트를 사용한 다른 코드를 이해하고 응용하기 위함이겠죠?


이 다음에는 델리게이트와 함께 따라다니는 '이벤트'라는 개념을 소개하겠습니다.

이벤트는 클래스내에 특정한 일이 일어났음을 외부의 이벤트 가입자들에게 알려주는 기능을 한다고 합니다.

이 설명만 들어서는 코드에서 어떻게 구현되는지 전혀 모르겠네요..

그래서 예제를 준비했습니다!

소스

출력

마치 Multicast Delegate와 비슷한 방식의 코드입니다!

위 예제에서는 EventHandler에 2개의 메소드(PrintA, PrintB)를 등록하여

각 메소드가 "Hello"라는 문자열을 출력하는 코드입니다.

이벤트의 특징을 정리하자면

1. 이벤트로 호출되는 함수들은 리턴값을 갖지 않는다. (이벤트는 알림이기 때문에)

2. 이벤트는 같은 델리게이트형명을 공유하는 델리게이트와 같은 위치에 존재할 수 없다는 것입니다. (아래 사진 참고)

이렇게 선언된 이벤트는 선언된 클래스 외부에서 직접사용할 수 없습니다.

 

 

델리게이트와 이벤트의 위치 테스트

어떻게 보면 이벤트는 '델리게이트를 불편하게 쓰는 방법' 이라고도 생각해볼 수 있습니다.

불편하다는것은 코딩의 안정성을 높여준다는 의미로 볼 수도 있죠. (사실 이벤트를 잘 이용하면 더 쉽게 델리게이트를 사용할 수도 있습니다.)

이렇게 만들어진 이벤트는 특정 상황에서 특정 오브젝트가 어떤 메소드를 실행시키게 하기에 적합한 형식이라는 생각이 드네요.

 

대리자 사용 - C# 프로그래밍 가이드

대리자를 사용하는 방법을 알아봅니다. 대리자는 메서드를 안전하게 캡슐화하는 개체 지향적이고 형식이 안전하며 보안이 유지되는 형식입니다.

docs.microsoft.com

 

EventHandler Delegate (System)

Represents the method that will handle an event that has no event data.

docs.microsoft.com

반응형