델리게이트(Delegate)는 '대리자'라는 뜻으로 함수의 포인터처럼 메서드를 안전하게 캡슐화해서 사용하는 형식입니다. 델리게이트는 개체 지향적이고 형식이 안전하며 보안이 유지됩니다.
델리게이트의 기본적인 사용방법을 쉽게 설명하자면 '메소드를 참조하는 변수'라고 할 수 있습니다.
말로만 들으면 어려울수도 있으니, 아래 예제와 함께 다시 설명을 읽어보시면 이해에 도움이 될겁니다.
소스
출력
Hello1
Hello2
A
B
A
위에 '예제2'에서 보이듯이 한 델리게이트에 여러가지 메서드를 저장하여 한번에 호출할 수 있습니다.
이를 '멀티캐스트 델리게이트'이라고 합니다.
여기서 왜 델리게이트를 써야하나?라고 하고 물으시는 분들에게 제가 느낀것을 이야기해보자면
1. 함수의 매개변수에 델리게이트를 이용하여 메서드를 구현할 수 있다
2. 함수들을 호출하기 위한 반복작업을 줄여줄 수 있다.
위 2가지 이유로 'If문 사용 감소, 코드 가독성 증가'에 큰 도움을 줄 수있다고 생각합니다.
또한 배우는 입장에서 델리게이트가 필요한 가장 큰 이유는 델리게이트를 사용한 다른 코드를 이해하고 응용하기 위함이겠죠?
이 다음에는 델리게이트와 함께 따라다니는 '이벤트'라는 개념을 소개하겠습니다.
이벤트는 클래스내에 특정한 일이 일어났음을 외부의 이벤트 가입자들에게 알려주는 기능을 한다고 합니다.
이 설명만 들어서는 코드에서 어떻게 구현되는지 전혀 모르겠네요..
그래서 예제를 준비했습니다!
소스
출력
마치 Multicast Delegate와 비슷한 방식의 코드입니다!
위 예제에서는 EventHandler에 2개의 메소드(PrintA, PrintB)를 등록하여
각 메소드가 "Hello"라는 문자열을 출력하는 코드입니다.
이벤트의 특징을 정리하자면
1. 이벤트로 호출되는 함수들은 리턴값을 갖지 않는다. (이벤트는 알림이기 때문에)
2. 이벤트는 같은 델리게이트형명을 공유하는 델리게이트와 같은 위치에 존재할 수 없다는 것입니다. (아래 사진 참고)
이렇게 선언된 이벤트는 선언된 클래스 외부에서 직접사용할 수 없습니다.
델리게이트와 이벤트의 위치 테스트
어떻게 보면 이벤트는 '델리게이트를 불편하게 쓰는 방법' 이라고도 생각해볼 수 있습니다.
불편하다는것은 코딩의 안정성을 높여준다는 의미로 볼 수도 있죠. (사실 이벤트를 잘 이용하면 더 쉽게 델리게이트를 사용할 수도 있습니다.)
이렇게 만들어진 이벤트는 특정 상황에서 특정 오브젝트가 어떤 메소드를 실행시키게 하기에 적합한 형식이라는 생각이 드네요.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 람다식 (0) | 2020.09.05 |
---|---|
[C#] 널 자료형과 연산자 ( Nullable, Elvis 등 ) (2) | 2020.09.05 |
[C#] LINQ를 이용한 점수순으로 정렬 (0) | 2020.09.05 |
[C#] 배열 (이차원배열, 가변배열, 메서드) (0) | 2020.09.05 |
[C#] C샵 구조체 예제 (0) | 2020.09.05 |