델리게이트(delegate)는 사전적 의미로 무언가의 일을 대신해 주는 사람, 즉 대리자를 뜻한다. C#에서도 무언가를 대신해 주는 역활을 하는 놈이 바로 델리게이트이다.
1. 메서드 대리자 델리게이트
- C언어에서는 포인터 함수라는 개념이 존재하고 이녀석은 메서드를 대신해서 수행해주는 역활을 해왔다.
하지만 C#에는 포인터라는 개념이 없다. 그 대신 델리게이트라는 문법이 생겨 이를 보완해 줄 수 있게 되었다.
단 중요한 사실은 델리게이트를 인스턴스화 시킬때는 반드시 생성자에서 메서드를 참조 하여야 된다는 사실이다.
예를 들어보자.
class Math
{
public void Intro()
{
Console.WriteLine("계산을 시작합니다");
}
public int Sum(int a, int b)
{
return a + b;
}
}
위와 같은 Math 클래스가 있다가 가정하고 ......Math 클래스 안에는 Intro() 와 Sum()의 두가지 메서드가 존재한다.
이제 델리 게이트를 선언한다.
delegate void dele1();
delegate int dele2(int a, int b);
선언했으니 인스턴스화 시키면...
dele1 Sum1 = new dele1(math.Intro);
dele2 Sum2 = new dele2(math.Sum);
와 같이 꼭 어떠한 메서드를 참조하여 인스턴스화 시킨다.
Sum1();
Console.WriteLine("결과 : {0}", Sum2(10, 30));
와 같이 실행시키면 무언가 값이 나올것이다.
중요한건 다시한번 말하지만 인스턴스화 시킬때는 반드시 생성자에서 메서드를 참조한다는 것이다.
해줘야되는기다.
2. 메서드들의 추가 삭제
델리게이트는 아주 쉬운 방법으로 하나의 메서드 뿐만 아니라 다양한 메서드를 한꺼번에 처리해 낼 수 있다. 또한 더 이상 필요치 않는 메서드를 삭제 시킬수도 있다.
이것은 델리게이트가 여러 메서드의 참조가 가능하다는 것이다.
아주쉽게 + , - 로써.....
다시 한번 예제를 살펴보면....
class Math
{
public int num=30;
public void Sum(int a)
{
num += a;
}
public void Min(int a)
{
num -= a;
}
public void Mul(int a)
{
num *= a;
}
}
위의 클래스에는 하나의 멤버변수와 3가지의 멤버함수가 있다.
한눈에봐도 무슨 일을 하는 함수인지는 알수있기에 설명은 생략한다..
이제 델리게이트를 만들어 본다.
delegate void dele1(int a); // 델리 게이트 선언
// 델리게이트 선언 및 인스턴스화
dele1 Sum1 = new dele1(math.Sum);
위와 같은 방법으로 메서드를 사용해서 델리게이트를 인스턴스화 하였다.
이제 다른 메서드들도 추가를 하고 싶다면...이렇게 하면된다.
// 위임 연산
Sum1 += new dele1(math.Mul);
Sum1 += new dele1(math.Min);
아주 쉽다...아주 쉬워....그냥 보통 연산하듯 하면된다. 반대로 메서드를 빼고자 한다면?.....
그렇다. + 대신 - 를 사용하면 된다.
위의 경우 SUM(10)을 실행하게 되면 최종적으로 Math클래스안의 3가지 멤버함수를 모두 실행한 결과와 같은 값을 얻어낼 수 있다. Sum -> Mul -> Min 순으로....
델리게이트는 스레드, 비동기 처리, 이벤트 등등에서 기본으로 사용되는 아주 중요한 문법이므로 확실히 이해할 수 있도록 해야겠다.