본문 바로가기
C#

C# - 델리게이트 함수 ( Delegate )

by Classic Master 2024. 5. 15.
728x90

델리게이트 ( Delegate )

개요

  • 델리게이트(Delegate)는 C#에서 함수 포인터와 유사한 개념으로, 메서드에 대한 참조를 보유하는 형식입니다. 이를 통해 메서드를 변수에 할당하고 다른 메서드에 전달할 수 있으며, 이벤트 처리, 비동기 작업 등 다양한 시나리오에서 유용하게 사용됩니다.

정의

  • 델리게이트는 C#에서 메서드에 대한 참조를 나타내는 형식입니다. 이를 통해 메서드를 변수에 할당하고 다른 메서드에 전달할 수 있습니다. 델리게이트는 메서드의 시그니처를 정의하며, 해당 시그니처와 일치하는 메서드만 참조할 수 있습니다. 델리게이트는 대리자 역할을 수행하며, 이를 통해 이벤트 처리, 비동기 프로그래밍 등 다양한 기능을 구현할 수 있습니다.

표현 방식

델리게이트는 다음과 같은 형식을 따릅니다.

delegate returnType delegateName(parameters);

returnType : 델리게이트가 반환하는 값의 타입을 나타냅니다.
delegateName : 델리게이트의 이름을 나타냅니다.
parameters : 델리게이트가 참조하는 메서드의 매개변수를 나타냅니다.

 

예시
다음은 Calculate라는 델리게이트를 선언하는 예시입니다.

delegate int Calculate(int x, int y);

위의 델리게이트는 int 타입을 반환하고, int 타입의 매개변수를 두 개 가지는 메서드를 참조할 수 있습니다.

반응형

델리게이트 장점 및 단점

장점

유연성

  • 델리게이트를 사용하면 메서드를 다른 메서드에 전달할 수 있으므로, 코드의 유연성이 크게 향상됩니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.

이벤트 처리

  • 델리게이트는 이벤트 처리에 사용됩니다. 이벤트가 발생했을 때 실행될 메서드를 미리 지정해두고, 해당 이벤트가 발생하면 델리게이트에 할당된 메서드가 자동으로 실행됩니다.

비동기 프로그래밍

  • 델리게이트를 사용하여 비동기 작업을 수행할 수 있습니다. 비동기 메서드를 호출하고 완료되면 콜백 델리게이트가 호출되어 작업이 완료됨을 알릴 수 있습니다.


단점

복잡성

  • 델리게이트를 사용하면 코드의 복잡성이 증가할 수 있습니다. 특히 복잡한 콜백 체인이나 이벤트 처리 로직을 구현할 때 코드가 복잡해질 수 있습니다.

성능

  • 델리게이트를 사용하면 메서드 호출 시 추가 오버헤드가 발생할 수 있습니다. 이는 특히 많은 수의 메서드 호출이 발생하는 경우 성능에 영향을 줄 수 있습니다.

* 오버헤드 : 컴퓨터 프로그래밍에서의 오버헤드는 보통 성능 저하를 의미합니다. 즉, 오버헤드가 증가하면 프로그램의 실행 시간이나 메모리 사용량이 늘어나는 경우가 많습니다. 


예시

다음은 간단한 예시들을 작성해보겠습니다.

public delegate void PrintMessage(string message);

public class Program
{
    static void Main()
    {
        PrintMessage print = Console.WriteLine;
        print("Hello, delegates!"); // 출력: Hello, delegates!
    }
}

위 예시에서 PrintMessage 델리게이트는 Console.WriteLine 메서드를 참조하고 있으며, 이를 호출하여 메시지를 출력합니다.

 

숫자를 처리하는 델리게이트
다음은 숫자를 입력받아 처리하는 델리게이트 예시입니다. 이 예시에서는 두 개의 숫자를 더하거나 빼는 메서드를 참조하는 델리게이트를 선언하고 사용합니다.

public delegate int Calculate(int x, int y);

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a - b;
    }
}

class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();

        Calculate addDelegate = calc.Add;
        Calculate subtractDelegate = calc.Subtract;

        int result1 = addDelegate(5, 3);
        int result2 = subtractDelegate(10, 4);

        Console.WriteLine($"Addition result: {result1}"); // 출력: Addition result: 8
        Console.WriteLine($"Subtraction result: {result2}"); // 출력: Subtraction result: 6
    }
}

위 예시에서는 Calculator 클래스의 Add 메서드와 Subtract 메서드를 참조하는 델리게이트를 선언하고, 이를 통해 각각 두 숫자의 덧셈과 뺄셈을 수행합니다.

 

 

문자열 처리 델리게이트
다음은 문자열을 입력받아 처리하는 델리게이트 예시입니다. 이 예시에서는 문자열을 변환하거나 연결하는 메서드를 참조하는 델리게이트를 선언하고 사용합니다.

public delegate string StringOperation(string str);

public class StringProcessor
{
    public string ConvertToUpper(string input)
    {
        return input.ToUpper();
    }

    public string AddSuffix(string input)
    {
        return input + "_suffix";
    }
}

class Program
{
    static void Main()
    {
        StringProcessor processor = new StringProcessor();

        StringOperation toUpperDelegate = processor.ConvertToUpper;
        StringOperation addSuffixDelegate = processor.AddSuffix;

        string result1 = toUpperDelegate("hello");
        string result2 = addSuffixDelegate("world");

        Console.WriteLine($"Uppercase result: {result1}"); // 출력: Uppercase result: HELLO
        Console.WriteLine($"Suffix added result: {result2}"); // 출력: Suffix added result: world_suffix
    }
}

위 예시에서는 StringProcessor 클래스의 ConvertToUpper 메서드와 AddSuffix 메서드를 참조하는 델리게이트를 선언하고, 이를 통해 각각 문자열을 대문자로 변환하고 접미사를 추가합니다.

 

728x90
반응형