Delegate
정의
델리게이트는 메서드를 참조하기 위한 형식.
다른 메서드를 가리킬 수 있으며, 이를 통해 메서드를 파라미터로 전달하거나 메서드를 변수에 할당 할 수 있음. (메서드를 변수처럼 사용하는 것을 의미)
델리게이트는 대리자라는 의미이며, 메서드의 대리자 역할을 수행함.
델리게이트는 보통 이벤트 처리, 콜백 함수 등의 상황에서 사용하고 이를 통해 코드의 유연성과 재사용성을 높일 수 있음.
특정 조건에 따라 실행할 메소드를 동적으로 변경할 수 있으며 인터페이스와 함께 사용하여 콜백 패턴을 구현할 수 있음.
사용이유
콜백 기능
델리게이트를 사용하면 메서드를 다른 메서드의 인자로 전달할 수 있음.
이것은 콜백 함수를 구현하는데 매우 유용함. 비동기 작업이 완료되면 특정 메서드를 호출하도록 콜백 처리 가능.
이벤트 처리
클래스 내부 또는 외부에서 발생하는 작업을 처리하기 위해 사용함.
이벤트를 통해 하나 이상의 메서드를 이벤트에 연결하고 이벤트가 발생할 때 해당 메서드를 실행함.
쉽게말해서 연계 작업임. 하나가 호출되면 관련된 다른 메서드 단위의 이벤트들이 발생하는 것.
느슨한 결합
델리게이트를 사용하면 코드 간의 의존성을 줄일 수 있음.
한 클래스에서 다른 클래스의 메서드를 직접 호출하는 대신에 델리게이트를 사용하여 해당 클래스의 인스턴스를 전달할 수 있음.
이렇게 하면 클래스 간의 결합도가 낮아지고 재사용성이 향상.
다른 클래스에 존재하는 메서드가 반환해주는 데이터를 통해서 연잔 작업을 실핼할 때, 요긴할 것 같음.
콜백 기능에 특정 메서드를 호출한다
예제
델리게이트를 선언할 때는 앞에 delegate라고 써주면 됌.
여기서 주의해야할 부분은 사용하려는 델리게이트의 형식과 파라미터 형식이 사용하려는 메서드와 동일해야 함.
메서드와 델리게이트의 형식이 다르면 사용할 수 없음.
델리게이트에 메서드를 담으면 해당 메서드의 기능을 델리게이트 인스턴스를 통해서 사용할 수 있음.
Taco taco = new Taco();
taco.DelegateStart();
delegate void GetName(string param); // 델리게이트 선언
class Taco
{
public void DelegateStart()
{
GetName getName = new GetName(MethodA); // 파라미터가 동일한 메서드를 인자로 받음.
getName("타코");
GetName getName2 = new GetName(MethodB); // MethodB 메소드의 인자가 int형으로 타입이 다름. 에러
getName2("타코2");
}
public static void MethodA(string a)
{
Console.WriteLine("MethodA" + a);
}
public void MethodB(int b)
{
Console.WriteLine("MethodB" + b);
}
}
델리게이트를 파라미터로 사용할 수 있어요.
Method.Name 프로퍼티를 사용하면 현재 델리게이트에 적용된 메서드명을 알 수 있어요.
파라미터로 전달 받은 델리게이트 comp에 배열의 값을 넣고 return 된 값에 따라서 연산을 적용해요.
int[] a = { 1, 2, 7, 5, 9, 3 };
Taco.CompareDelegate compare = Taco2.Asc;
Taco.Sort(a, compare);
compare = Taco2.Desc;
Taco.Sort(a, compare);
class Taco
{
public delegate int CompareDelegate(int a, int b);
public static void Sort(int[] arr, CompareDelegate comp)
{
Console.WriteLine(comp.Method.Name);
int ret;
for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < arr.Length; j++)
{
ret = comp(arr[i], arr[j]);
if (ret == -1)
{
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
}
Display(arr);
static void Display(int[] arr)
{
foreach (var item in arr)
{
Console.Write(item);
Console.WriteLine();
}
}
}
}
class Taco2
{
public static int Asc(int a, int b)
{
if (a == b)
{
return 0;
}
else
{
return (b - a) > 0 ? 1 : -1;
}
}
public static int Desc(int a, int b)
{
if (a == b)
{
return 0;
}
else
{
return (a - b) > 0 ? 1 : -1;
}
}
}
결론
델리게이트는 메서드를 복사한다고 할 수 있어요.
가장 강력한 기능은 델리게이트를 파라미터로 전달 가능하다는 거에요.
이말은 즉 메서드 단위를 파라미터로 주고 받을 수 있다는 것을 의미해요.