ITEM 7 :: EFFECTIVE C#
안녕하세요, 행운이 있을 것 같은 일곱번째 시간입니다. 하하!
이번 챕터에는 델리게이트라는 C#만의 생소한 기능에 대한 내용이 나옵니다. 델리게이트라는 말 뜻은 대리자라는 뜻으로, C++에서의 함수포인터와 비슷한 개념의, 함수를 대신해서 실행해주는, 특정 메소드를 참조하는 변수입니다. 델리게이트는 해당 메소드를 대신하여 호출하는 역할을 합니다. WPF나 WinForm 둘 다, 클래스 간의 데이터 교환이 필요한 경우가 많은데, 인터페이스를 사용하게되면 클래스의 결합도가 높아진다는 단점이 있는데요, 그럴 경우, 결합도를 높이지 않으면서 데이터 교환을 부드럽게 할 수 있는, 이 델리게이트가 사용되면 아주 좋을 것 같습니다. 자, 간단한 설명은 여기까지 하고, 델리게이트의 디테일한 설명을 시작하겠습니다.
설명
델리게이트의 선언과 그 사용방법은 아래의 순서를 따른다.
- 우선 그 대신 호출하려는 메소드와 동일한 타입의 델리게이트 타입을 선언해야 한다는 것! 메소드 타입은 매개변수와 반환타입에 의해 결정되기 때문에, 델리게이트 타입도 그 메소드와 동일한 매개변수, 반환타입으로 선언해줘야 한다.
- 그리고 선언한 델리게이트 타입으로 델리게이트 변수를 생성하고, 생성한 델리게이트 변수에 해당 메소드를 참조시킨다.
//선언부 delegate 반환타입 델리게이트이름( 매개변수 );
delegate void deleA(void); // void functionA(void)
delegate void deleB(int); // void functionB(int)
delegate float deleC(float); // float functionC(float)
delegate string deleD(float); // string functionD(float)
// delegate 변수 생성
deleA delegate0;
deleB delegate1;
deleC delegate2;
deleD delegate3;
//메소드 참조
delegate0 = new deleA( functionA );
delegate1 = new deleB( functionB );
delegate2 = new deleC( functionC );
delegate3 = new deleD( functionD );
- 사실 위에까지만 해도 델리게이트 변수를 통해 해당 함수를 호출할 수 있게 된다. 하지만, 그러면 델리게이트의 의미가 없다. 직접 호출할 수 있는데 굳이 델리게이트로 호출할 필요가 없기 때문이다. 델리게이트는 콜백함수에서 진정한 빛을 발한다.
즉, 콜백메서드에서는 A라는 메서드를 호출할 때에 B라는 메서드를 넘겨주어 A 메서드로 하여금 B 메서드를 호출하게 할 텐데, 이 때 B 메서드를 넘기는 것이아니라, 델리게이트를 넘김으로써, A메서드는 매개변수로 받은 델리게이트를 사용하여 B 메서드를 호출하는 구조가 된다!
그리고 이 부분이 바로, Effective C# 에서 권하는 방식이다!
정리
델리게이트는 각 클래스별 데이터를 교환하는데에 아주 유용하며 클래스간의 결합도를 높이지 않는다는 장점이 있어 아주 좋다. 거기다 콜백함수를 구현할 때 간편하게 사용할 수 있다는 장점이 있으니, 이 델리게이트를 사용하여 콜백을 표현하도록 하자!