본문 바로가기
3.2 .net/C#

[.net /C#] 대리자(delegate)

by Dohi._. 2024. 9. 19.
728x90

대리자라는 개념은  C#에서는 메서드를 변수처럼 다룰 수 있는 게 해주며,

메서드의 시그니처를 정의하고, 이를 통해 특정 메서드를 참조할 수 있게 합니다.

주로 대리자는 이벤트와 비동기 프로그래밍에서 주로 사용되며, 코드의 유연성과 가독성을 높이는 데 기여합니다.

대리자 정의

대리자는 특정 메서드 시그니처(매개변수와 반환형)를 정의하는 타입입니다.

기본적인 문법은 다음과 같습니다

public delegate void MyDelegate(string message);

위의 예제에서 MyDelegate는 문자열 매개변수를 받고 반환값이 없는 메서드를 참조할 수 있는 대리자입니다.

다음과 같이 사용합니다 .

void PrintMessage(string message)
{
    Console.WriteLine(message);
}

MyDelegate del = PrintMessage;
del("Hello, Delegates!"); // "Hello, Delegates!" 출력

 

대리자의 용도

 

1. 이벤트 핸들링

대리자는 C#에서 이벤트를 구현하는 데 필수적입니다. 특정 이벤트가 발생했을 때 호출될 메서드를 등록할 수 있습니다. 예를 들어, 버튼 클릭 이벤트와 같은 사용자 인터페이스 이벤트에 대리자를 사용할 수 있습니다.

 

2. 콜백 메커니즘

대리자는 비동기 작업을 수행할 때 특정 작업이 완료된 후 호출될 메서드를 지정하는 데 사용할 수 있습니다. 이를 통해 비동기 프로그래밍에서 코드의 흐름을 제어할 수 있습니다.

 

3. LINQ 및 고차 함수

LINQ(언어 통합 쿼리)에서도 대리자를 사용하여 데이터를 필터링, 정렬 및 변환하는 데 사용됩니다. 이러한 기능은 고차 함수를 사용하여 메서드를 매개변수로 전달하는 방식으로 구현됩니다.

 

대리자 예제

1. 이벤트 예제

다음은 대리자를 사용하여 이벤트를 구현하는 간단한 예제입니다:

public delegate void Notify(string message);

public class Publisher
{
    public event Notify OnNotify;

    public void TriggerEvent(string message)
    {
        OnNotify?.Invoke(message); // 이벤트 발생
    }
}

public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnNotify += HandleNotification; // 메서드 구독
    }

    private void HandleNotification(string message)
    {
        Console.WriteLine($"Received notification: {message}");
    }
}

실제 적용예시

class Program
{
    static void Main(string[] args)
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();
        
        subscriber.Subscribe(publisher);
        publisher.TriggerEvent("Hello, World!"); // "Received notification: Hello, World!" 출력
    }
}

 

2. 비동기 콜백 예제

비동기 작업에서 대리자를 사용하는 방법은 다음과 같습니다:

public delegate void CallbackDelegate(int result);

public class Calculator
{
    public void Add(int a, int b, CallbackDelegate callback)
    {
        int result = a + b;
        callback(result); // 계산 결과를 콜백 메서드에 전달
    }
}

실제 사용 예시

class Program
{
    static void Main(string[] args)
    {
        Calculator calculator = new Calculator();
        calculator.Add(5, 10, DisplayResult);
    }

    static void DisplayResult(int result)
    {
        Console.WriteLine($"Result: {result}"); // "Result: 15" 출력
    }
}

대리자의 이점

대리자를 사용하는 주요 이점은 다음과 같습니다:

  1. 유연성: 다양한 메서드를 이벤트에 등록할 수 있어, 동일한 이벤트에 여러 메서드를 연결할 수 있습니다.
  2. 느슨한 결합: 발행자는 구독자에 대해 아무것도 알지 못하며, 이를 통해 코드의 모듈화가 향상됩니다.
  3. 타입 안전성: 대리자는 특정 시그니처를 가지므로, 잘못된 메서드가 등록되는 것을 방지할 수 있습니다.
  4. 가독성: 대리자를 사용하면 코드가 간결해지고 이해하기 쉬워집니다.

결론

대리자는 C#에서 메서드를 동적으로 처리할 수 있는 강력한 도구라고 이해하면 좋을 것 같습니다:) 

 

 

+) 메서드 시그니처란

메서드의 정의에서 메서드 이름과 매개변수 리스트의 조합을 의미함

728x90

'3.2 .net > C#' 카테고리의 다른 글

[C#] Linq (Language Integrated Query)  (0) 2024.10.22
[C#] using에 대해서  (0) 2024.10.21
[C#] 두개의 Switch (스위치문, 스위치식)  (0) 2024.10.21
[C#] C#이벤트종류 (제가보려고 정리)  (0) 2024.10.08
[.net/C#] CallerMemberName  (0) 2024.09.19

댓글