델리게이트(Delegate) 란 ?
델리게이트라는 단어는 대리자, 대표자라는 뜻을 가진 단어다.
C#에서는 함수를 참조할때 사용하는데 함수를 참조 한다는 것은 함수의 주소 값을 저장하고 이 주소 값을 이용해서 해당 함수를 호출한다는 의미이다. 즉 C++에서 함수 포인터를 사용해 함수를 호출하는것과 유사한 개념이다.
델리게이트를 사용하면 메서드를 변수처럼 저장하고, 이를 통해 메서드를 실행하거나 다른 메서드에 전달할 수 있으며 심화 과정으로는 이벤트 처리, 콜백 메서드, 멀티캐스팅(여러 메서드를 호출하는 기능)등도 수행할 수 있다.
델리게이트를 정의하는 법
델리게이트는 위에서 말한것 처럼 함수를 참조하는 형태로 정의해야 한다.
즉 함수에서 사용하는 형식과 매개변수를 똑같이 참조해 주어야 한다는 건데, 함수 형태가 void이며 매개변수가 없는 함수를 참조하는 델리게이트는 다음과 같이 선언할 수 있다.
public delegate void MyDelegate();
위와 같이 델리게이트를 선언하고 사용 예시를 만들어보자
using System;
public class Program
{
// 델리게이트 정의
public delegate void MyDelegate(string message);
// 델리게이트가 참조할 함수
public static void ShowMessage(string message)
{
Console.WriteLine(message);
}
public static void Main()
{
// 델리게이트 생성, 함수 참조
MyDelegate del = new MyDelegate(ShowMessage);
// 델리게이트를 통해 함수 호출
del("Hello, World!");
}
}
함수의 형식을 맞춰주고 매개변수로 값으로 위와 같이 string 값을 입력한다면 쉽게 델리게이트를 사용할 수 있다.
멀티캐스트
델리게이트에는 멀티캐스트라는 기능이 있다.
쉽게 정리하면 하나의 델리게이트의 여러개의 메서드를 연결해서 사용하는것인데 델리게이트를 호출할 때 연결된 메서드들이 모두 호출된다.
델리게이트에 연결된 메서드들은 원할때 언제든 더하고 뺄 수 있다.
using System;
public class Program
{
public delegate void MyDelegate(string message);
public static void ShowFirstMessage(string message)
{
Console.WriteLine("Message No.1 : " + message);
}
public static void ShowSecondMessage(string message)
{
Console.WriteLine("Message No.2 : " + message);
}
public static void Main()
{
MyDelegate del = ShowFirstMessage;
del += ShowSecondMessage; // 메서드 추가
del("델리게이트 수행 중 !");
Console.WriteLine("---------------------");
del -= ShowFirstMessage; // 메서드 제거
del("델리게이트 하나 제거 완료 !");
}
}
MyDelegate로 구현한 del에 메서드를 두개를 연결하고 이후에 하나를 제거하고 출력했다.
제거 후에는 남은 하나의 메서드만 정상적으로 출력한다.
Action, Func, Predicate 델리게이트
Action, Func, Predicate는 C#에서 제공하는 기본적인 델리게이트이다.
.NET 프레임워크에서 제공하는 델리게이트이며 여러 상황에서 자주 사용되는 패턴을 일종의 프리셋처럼 가져다 쓰기 쉽게 만들어 놓은 델리게이트이다.
위 델리게이트들의 특징은 다음과 같다.
Action 델리게이트
- 반환형이 void인 메서드를 참조한다. (반환값이 없는 메서드)
- 입력 매개변수를 0개부터 여러 개까지 가질 수 있다.
- 예: Action, Action<int>, Action<string, int> 등 과 같은 형태로 사용한다.
사용 예시
public static void DisplayMessage(string message)
{
Console.WriteLine(message);
}
public static void Main()
{
// Action<string> 델리게이트 생성 및 메서드 할당
Action<string> action = DisplayMessage;
// 델리게이트를 통해 메서드 호출
action("액션 소환!");
}
Func 델리게이트
- 반환형이 있는 메서드를 참조한다. (int, double, string, bool 등)
- 마지막 타입 매개변수는 반환형을 나타내며, 그 앞의 매개변수들은 메서드의 입력 매개변수를 나타낸다.
- 예: Func<int>, Func<int, string>, Func<int, string, bool> 등과 같은 형태로 사용한다.
사용 예시
public static int Add(int a, int b)
{
return a + b;
}
public static void Main()
{
// Func<int, int, int> 델리게이트 생성 및 메서드 할당
Func<int, int, int> func = Add;
// 델리게이트를 통해 메서드 호출
int result = func(10, 20);
Console.WriteLine("결과 : " + result);
}
Predicate 델리게이트
- 반환형이 bool인 메서드를 참조한다.
- 하나의 입력 매개변수를 가지며, 주로 조건 검사를 위한 메서드를 참조하는 데 사용한다.
- 예: Predicate<int>, Predicate<string> 등과 같은 형태로 사용한다.
사용 예시
public static bool IsPositive(int number)
{
return number > 0; // 양수인지 아닌지 검사
}
public static void Main()
{
// Predicate<int> 델리게이트 인스턴스 생성 및 메서드 할당
Predicate<int> predicate = IsPositive;
// 델리게이트를 통해 메서드 호출
bool result = predicate(5);
Console.WriteLine("Is Positive: " + result);
}
델리게이트의 장점
델리게이트를 사용하면 얻을 수 있는 대표적인 장점은 다음과 같다.
- 캡슐화: 델리게이트는 메서드의 세부 구현을 숨기고, 호출자에게는 메서드 이름만 알려주면 된다.
- 유연성: 메서드를 동적으로 교체하거나 런타임에 할당할 수 있어 코드실행의 유연성이 올라간다.
- 확장성: 이벤트 처리와 같은 상황에서 여러 메서드를 연결해 코드의 확장성이 올라간다.
'C#' 카테고리의 다른 글
C# - 예외 처리 (try ~ catch) (1) | 2024.09.19 |
---|---|
C# - 이벤트(Event) / 델리게이트와 이벤트의 차이점 (0) | 2024.08.21 |
C# - 인터페이스(Interface) (0) | 2024.07.19 |
C# - 라이브러리 vs 프레임워크 (2) | 2024.07.11 |
C# - Struct 와 Class의 차이점 (0) | 2024.06.21 |