[C#] delegate (델리게이트 / 대리자)와 Invoke
마이크로소프트에서는 delegate를 '특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타내는 형식'이라고 소개한다. 맞는 말이기는 한데 글로만 봐서는 delegate를 왜 사용하는지 전혀 알 수가 없다. delegate를 직접 사용하면서 함께 알아보자.
delegate는 메서드를 다른 메서드에 인수로 전달하는 용도다. 특히 함수 자체를 인수로 전달할 수도 있다.
using System;
namespace Study
{
delegate void Test(); // Test는 함수가 아니라 '형식'임. 함수 자체를 인자로 넘겨주는 형식.
class Program
{
static void Button(Test testFunc)
{
testFunc(); // testFunc 함수 실행
}
static void Hi()
{
Console.WriteLine("안녕");
}
static void Main(string[] args)
{
Button(Hi);
}
}
}
결국 우리가 하고 싶었던 건 Hi()라는 함수를 실행하는 일이었다. 우리는 함수를 바로 실행하지 않고 Button 함수에 Hi를 넘겨주고 그 안에서 Hi를 실행시켰다. 이렇게 우리가 원하는 내용을 다른 함수에게 실행시켜 달라고 요청하여 실행시키는 일을 CallBack(콜백)방식이라 한다. delegate는 C#에서 CallBack을 담당한다.
복잡한 코드를 진행할 경우에는 함수를 바로 실행할 수 없는 상황이 있다. 함수 자체를 수정할 수 없는 상황이거나, 설계적인 문제로 코드를 분리시켜야 할 경우 delegate를 활용하여 함수 자체를 그 함수를 인자로 넘겨주고 실행시키는 등 delegate는 중요하게 사용된다.
그런데 testFunc를 실행시킬 때 Invoke라는 것을 추가해서 실행시켜도 같은 값이 출력된다.
testFunc.Invoke(); // testFunc 함수 실행
Invoke는 메소드를 호출하는 메서드다. 멀티 스레드 환경에서 일어나는 문제인 크로스 스레드를 해결할 때도 사용된다. 일반적으로 Invoke없이 메소를 실행해도 내부적으로 Invoke가 실행된다. delegate와 함께 사용하는 경우 delegate와 일반 함수를 구분할 수 있어 가독성이 높아지기 때문에 선호하는 사람이 있다.