델리게이트 ( 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 메서드를 참조하는 델리게이트를 선언하고, 이를 통해 각각 문자열을 대문자로 변환하고 접미사를 추가합니다.
'C#' 카테고리의 다른 글
C# - 캐스팅 |업캐스팅(UpCasting), 다운캐스팅(DownCasting) (0) | 2024.05.16 |
---|---|
C# - 상속 ( Inheritance ) (0) | 2024.05.16 |
C# -프로퍼티 ( Property ) (0) | 2024.05.16 |
C# - 이벤트헨들러 ( EventHandler ) (0) | 2024.05.15 |
C# - 람다식 ( Lambda ) (0) | 2024.05.15 |
C# - Static 함수 & Static class (0) | 2024.05.14 |