c# 델리게이트(delegate)의 개념과 사용법

2024. 9. 25. 19:51c#

C# 델리게이트(delegate) 개념과 사용법

C#에서 델리게이트(delegate)메서드를 참조할 수 있는 형식(type)입니다.
델리게이트를 사용하면 메서드를 변수처럼 취급할 수 있으며, 특정 메서드를 동적으로 할당하거나 호출할 수 있습니다. 이 글에서는 델리게이트의 기본 개념, 문법, 사용법 및 실제 응용 예제를 살펴보겠습니다.


1. 델리게이트란?

델리게이트는 메서드를 가리키는 참조 타입으로, 메서드에 대한 참조를 저장하고 이를 호출할 수 있습니다.
간단히 말해, 델리게이트는 포인터와 유사하게 동작하며, 어떤 메서드를 호출할지 동적으로 결정할 수 있게 합니다.

델리게이트의 기본 선언은 다음과 같습니다:

delegate 반환형 델리게이트이름(매개변수);

예를 들어, 두 개의 정수를 더하는 메서드를 참조하는 델리게이트는 다음과 같이 정의할 수 있습니다:

delegate int Operation(int x, int y);

 


2. 델리게이트의 선언과 사용

델리게이트를 사용하려면 먼저 델리게이트를 선언하고, 해당 델리게이트 형식의 인스턴스를 생성한 후 이를 통해 메서드를 호출합니다.

1) 델리게이트 선언

델리게이트는 반환형매개변수가 일치하는 메서드만 참조할 수 있습니다. 아래는 두 개의 정수를 더하는 Operation 델리게이트의 선언입니다.

delegate int Operation(int a, int b);

2) 메서드 참조

델리게이트를 사용하기 위해서는 먼저 참조할 메서드를 정의해야 합니다. 예를 들어, 두 수를 더하는 메서드를 다음과 같이 정의할 수 있습니다:

public static int Add(int x, int y)
{
    return x + y;
}

3) 델리게이트 인스턴스 생성 및 호출

이제 Add 메서드를 델리게이트를 통해 참조하고, 호출할 수 있습니다.

Operation op = Add;
int result = op(5, 10);  // result = 15
Console.WriteLine(result);  // 출력: 15

 


3. 델리게이트의 실제 사용 예시

델리게이트는 C#에서 다양한 용도로 사용됩니다.
대표적으로 이벤트 처리, 콜백 함수 구현, 그리고 동적 메서드 호출에서 자주 활용됩니다.

1) 콜백 함수

델리게이트는 비동기 작업을 처리할 때 콜백 함수로 사용됩니다. 예를 들어, 작업이 완료되면 특정 메서드를 호출하도록 콜백을 설정할 수 있습니다.

public delegate void Notify();  // 반환형이 void인 델리게이트

public static void Process(Notify notifyDelegate)
{
    Console.WriteLine("작업을 처리 중...");
    notifyDelegate();  // 작업 완료 후 콜백 메서드 호출
}

public static void TaskCompleted()
{
    Console.WriteLine("작업이 완료되었습니다!");
}

Process(TaskCompleted);  // TaskCompleted 메서드를 콜백으로 전달

2) 이벤트 처리

델리게이트는 이벤트(event) 처리의 기반으로 사용됩니다.
버튼 클릭과 같은 이벤트 처리에서 델리게이트는 이벤트 핸들러를 참조하고, 특정 이벤트가 발생했을 때 이를 호출합니다.

public delegate void ClickHandler();  // 버튼 클릭 이벤트 델리게이트

public class Button
{
    public event ClickHandler OnClick;

    public void Click()
    {
        if (OnClick != null)
            OnClick();  // 버튼이 클릭되면 OnClick 이벤트 핸들러 호출
    }
}

Button button = new Button();
button.OnClick += () => Console.WriteLine("버튼이 클릭되었습니다!");
button.Click();  // 출력: 버튼이 클릭되었습니다!

 


4. 멀티캐스트 델리게이트

델리게이트는 하나 이상의 메서드를 참조할 수 있습니다.
이러한 델리게이트를 멀티캐스트 델리게이트(Multicast Delegate)라고 합니다.
여러 메서드를 델리게이트에 연결하거나 제거할 수 있습니다.

1) 메서드 추가

여러 메서드를 델리게이트에 추가하려면 += 연산자를 사용합니다.

Notify notify = TaskCompleted;
notify += AnotherTaskCompleted;  // 또 다른 메서드 추가
notify();  // 두 개의 메서드 모두 호출됨

2) 메서드 제거

메서드를 델리게이트에서 제거하려면 -= 연산자를 사용합니다.

notify -= AnotherTaskCompleted;
notify();  // TaskCompleted 메서드만 호출됨

 


5. 델리게이트와 Func, Action 대리자

델리게이트를 사용하여 메서드를 참조할 때는 기본적으로 Func, Action 대리자를 사용할 수 있습니다.
이들은 일반적인 델리게이트 패턴을 보다 쉽게 사용할 수 있도록 제공되는 C#의 기본 대리자입니다.

1) Func 대리자

Func<T1, T2, TResult> 대리자는 매개변수반환형이 있는 메서드를 참조합니다.

Func<int, int, int> add = (x, y) => x + y;
int result = add(3, 4);  // result = 7

2) Action 대리자

Action<T> 대리자는 반환형이 없는 메서드를 참조합니다.

Action<string> print = message => Console.WriteLine(message);
print("Hello, Delegate!");  // 출력: Hello, Delegate!

 


6. 델리게이트의 장단점

장점

  • 유연성: 메서드를 동적으로 호출할 수 있어 코드의 재사용성과 확장성이 높아집니다.
  • 콜백 및 이벤트 처리: 콜백 메서드를 구현하거나 이벤트 기반 프로그래밍에서 유용하게 사용됩니다.
  • 멀티캐스트: 한 델리게이트에 여러 메서드를 연결할 수 있어 이벤트 핸들링에 적합합니다.

단점

  • 복잡성 증가: 여러 델리게이트를 사용하거나 체인으로 연결할 경우 코드가 복잡해질 수 있습니다.
  • 성능 저하: 대규모 프로젝트에서는 델리게이트를 남용할 경우 성능에 영향을 미칠 수 있습니다.

 

C#의 델리게이트는 메서드 참조와 호출을 동적으로 처리할 수 있는 강력한 도구입니다.
특히 이벤트 기반 프로그래밍, 콜백 함수, 멀티캐스트 기능 등에서 유용하게 사용되며, 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다. 그러나 적절한 사용과 설계가 필요하며, 델리게이트의 장단점을 고려하여 효율적인 프로그램을 작성하는 것이 중요합니다.