C#에서 델리게이트의 힘을 방금 배웠다

발행: (2026년 2월 25일 오후 02:45 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

Just learned the Power of Delegates in C#의 표지 이미지

BALIGUAT, JUSTINE JERALD Y.

🧠 대리자란 무엇인가?

C#에서 대리자는 형식‑안전하고 객체‑지향적인 메서드 포인터입니다.
간단히 말하면, 대리자를 사용하면 메서드를 다른 메서드의 매개변수로 전달할 수 있습니다. 이는 변수를 통해 함수에 대한 참조를 저장하는 것과 같지만, 구조화되고 안전한 방식입니다.

🏗 대리자 만들기 및 사용

튜토리얼의 첫 번째 부분에서 나는 다음을 배웠습니다:

  1. 대리자 생성
  2. 그 서명 정의
  3. 메서드를 매개변수로 전달
  4. 대리자 호출

시각적 참고 자료는 다음과 같습니다:

Delegates Example

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);
}
}

이미지 설명

0 조회
Back to Blog

관련 글

더 보기 »

Diun vs Cosmos Cloud: 비교

빠른 판단: 이들은 서로 다른 규모에서 다른 문제를 해결합니다. Cosmos Cloud는 컨테이너 관리, 리버스 프록시, 그리고 인증 등을 갖춘 완전한 자체 호스팅 플랫폼입니다.