C#에서 델리게이트의 힘을 방금 배웠다
Source: Dev.to

🧠 대리자란 무엇인가?
C#에서 대리자는 형식‑안전하고 객체‑지향적인 메서드 포인터입니다.
간단히 말하면, 대리자를 사용하면 메서드를 다른 메서드의 매개변수로 전달할 수 있습니다. 이는 변수를 통해 함수에 대한 참조를 저장하는 것과 같지만, 구조화되고 안전한 방식입니다.
🏗 대리자 만들기 및 사용
튜토리얼의 첫 번째 부분에서 나는 다음을 배웠습니다:
- 대리자 생성
- 그 서명 정의
- 메서드를 매개변수로 전달
- 대리자 호출
시각적 참고 자료는 다음과 같습니다:
Source: …
⚠️ 중요한 규칙: 매개변수 일치
델리게이트의 매개변수 유형은 할당되는 메서드의 매개변수 유형과 일치해야 합니다.
시그니처가 맞지 않으면 C#은 컴파일‑타임 오류를 발생시키며, 이것이 델리게이트가 타입‑안전성을 유지하는 이유입니다.
public delegate void MyDelegate(string message);
public static void ShowMessage(string text)
{
Console.WriteLine(text);
}
델리게이트는 인스턴스 메서드도 참조할 수 있습니다
아래는 인스턴스 메서드를 참조하는 델리게이트의 예시입니다.
using System;
using System.IO;
namespace DelegateBasicExample
{
delegate void LogText(string text, DateTime datetime);
class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
LogText logTextToConsole = new LogText(logger.LogTextToConsole);
Console.WriteLine("Enter some text: ");
string input = Console.ReadLine();
logTextToConsole(input, DateTime.Now);
}
}
class Logger
{
public void LogTextToConsole(string text, DateTime datetime)
{
Console.WriteLine($"{datetime} : {text}");
}
public void LogTextToFile(string text, DateTime datetime)
{
using (StreamWriter sw = new StreamWriter("log.txt", true))
{
sw.WriteLine($"{datetime} : {text}");
}
}
}
}

📣 멀티캐스트 대리자
여러 메서드를 + 연산자를 사용하여 단일 대리자 인스턴스에 할당할 수 있습니다. 이를 통해 하나의 대리자가 여러 메서드를 순차적으로 호출할 수 있습니다.
using System;
using System.IO;
namespace DelegateBasicExample
{
delegate void LogText(string text, DateTime datetime);
class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
LogText logToFile = new LogText(logger.LogTextToFile);
LogText logToConsole = new LogText(logger.LogTextToConsole);
// 두 대리자를 결합
LogText multiLog = logToConsole + logToFile;
Console.WriteLine("Enter some text: ");
string input = Console.ReadLine();
multiLog(input, DateTime.Now);
}
}
class Logger
{
public void LogTextToConsole(string text, DateTime datetime)
{
Console.WriteLine($"{datetime} : {text}");
}
public void LogTextToFile(string text, DateTime datetime)
{
using (StreamWriter sw = new StreamWriter("log.txt", true))
{
sw.WriteLine($"{datetime} : {text}");
}
}
}
}

📦 메서드 인수로 대리자 전달
A delegate can be passed to another method, which can then invoke it.
using System;
using System.IO;
namespace DelegateBasicExample
{
delegate void LogText(string text, DateTime datetime);
class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
LogText logToFile = new LogText(logger.LogTextToFile);
LogText logToConsole = new LogText(logger.LogTextToConsole);
// Pass the delegate to another method
ProcessLog(logToConsole);
}
static void ProcessLog(LogText logAction)
{
Console.WriteLine("Enter some text: ");
string input = Console.ReadLine();
logAction(input, DateTime.Now);
}
}
class Logger
{
public void LogTextToConsole(string text, DateTime datetime)
{
Console.WriteLine($"{datetime} : {text}");
}
public void LogTextToFile(string text, DateTime datetime)
{
using (StreamWriter sw = new StreamWriter("log.txt", true))
{
sw.WriteLine($"{datetime} : {text}");
}
}
}
}
That’s it for today’s deep dive into delegates. Happy coding!
.LogTextToConsole);
LogText multiLogText = LogTextToConsole + LogTextToFile;
Console.WriteLine("Enter some text: ");
LogWithDelParam(multiLogText, Console.ReadLine());
}
static void LogWithDelParam(LogText logText, string text)
{
logText(text, DateTime.Now);
}
}


