델리게이트(delegate)
C#을 배우다 보면 처음에는 함수 호출 방식이 직관적이고 명확해 보이지만, 어느 순간에는 코드를 더 유연하고 모듈화된 방식으로 설계할 필요를 느끼게 된다.
이때 사용하기 좋은 도구가 델리게이트(delegate)이다.
1. 기본 사용 방법
// 1. 델리게이트 선언
public delegate string PrintDelegate(int number);
// 의미 => PrintDelegate는 int를 받아 string을 반환하는 메서드를 참조할 수 있다.
//2. 델리게이트 대상 메서드
private string AddOne(int number) { return (number + 1).ToString(); }
// AddOne 함수는 number를 받아 1을 더한 후, string으로 반환한다.
void Main()
{
PrintDelegate printer = new(AddOne); // printer는 AddOne을 참조한다.
string str = printer(10);
Console.Write(str); // 11출력
}
- 메서드 시그니처가 정확히 일치해야 한다. (위에서는 반드시 매개변수는 int, 반환값은 string으로 일치해야 함.)
- PrintDelegae printer = new (AddOne) 에서 printer는 '델리게이트 인스턴스'이다.
- printer(10) 에서 델리게이트 인스턴스를 호출했다.
2. 이걸 왜 사용하는가?
그냥 Main 에서 AddOne을 사용하지 않고 delegate를 사용하여 AddOne 메서드를 참조이유는 뭘까
(1) delegate는 여러 함수를 호출할 수 있다.
public delegate void PrintDelegate();
static private void printOne()
{
Console.WriteLine("One 출력");
}
static private void printTwo()
{
Console.WriteLine("Two 출력");
}
static void Main(string[] args)
{
PrintDelegate printer = new(printOne);
printer += printTwo;
printer();
}
printer()를 호출하면 "One 출력" "Two 출력"이 모두 출력된다.
3. 함수를 여러개 묶기 위해서 delegate를 사용하나?
여러 함수를 묶어서 호출하는 멀티캐스 기능은 delegate의 일부분일 뿐이다.
delegate는 코드를 유연하게 설계하고 실행 흐름을 동적으로 바꿀 때 진가가 드러난다.
1. 실행 로직을 바꿀 수 있다.
public delegate void AttackType(Player p, Monster m);
- 플레이어의 공격타입을 물리공격으로 할지 마법공격으로 할지 런타임에 교체할 수 있다.
- 조건에 따라 메서드 포인터만 바꾸면, 조건 분기 없이 실행 흐름을 바꿀 수 있다.
2. 옵저버 패턴 구현의 핵심
public event Action OnPlayerDeath;
- 다양한 모듈을 OnPlayerDeath += ( function); 으로 등록하고, OnPlayerDeath?.Invoke로 실행
- 객체 간 느슨한 결합을 만들 수 있다.
- 플러그인 형식으로 확장이 간편하다.
3. 콜백함수 전달
public void LoadEvent(Action<string> onFinish)
{
/** 이벤트 로드 코드*/
onFinish("Load Finished")
}
- delegate를 통해 함수를 매개인자로 전달할 수 있다.
- 동기/비동기 작업 완료 시 결과 처리 로직을 외부에서 넘겨받아 유연하게 실행 가능.
4. 명령 큐나 행동 예약 시스템을 구현하기 좋은 도구
Queue<Action> actionQueue = new();
actionQueue.Enqueue(() => Attack(player, monster));
actionQueue.Enqueue(() => Heal(player));
- 행동을 코드 블록 단위로 큐에 넣고, 나중에 하나씩 실행할 수 있다.
- 적의 AI 설계, 턴제 시스템, 리플레이 등에 유리.
< 참고 >
- Microsoft 공식 문서
https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/delegates/
C#에서 대리자 형식을 사용하는 방법 - C#
C#에서 대리자 형식을 탐색합니다. 대리자는 정의된 매개 변수 목록 및 반환 형식이 있는 메서드를 참조하는 날짜 형식입니다. 대리자를 사용하여 메서드를 다른 메서드에 인수로 전달합니다.
learn.microsoft.com
- 우주로그님 블로그
https://woojoolog.tistory.com/13
C# delegate 개념과 사용 이유
1. delegate 개요 처음 C# delegate를 접했을 때 왜 사용해야 하는지 이해하기가 힘들었습니다. 그래서 왜 사용해야 하는지에 대해 자세히 설명하겠습니다. C#에는 대리자(delegate)라는 개념이 존재합니
woojoolog.tistory.com