2024. 9. 25. 19:51ㆍc#
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#의 델리게이트는 메서드 참조와 호출을 동적으로 처리할 수 있는 강력한 도구입니다.
특히 이벤트 기반 프로그래밍, 콜백 함수, 멀티캐스트 기능 등에서 유용하게 사용되며, 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다. 그러나 적절한 사용과 설계가 필요하며, 델리게이트의 장단점을 고려하여 효율적인 프로그램을 작성하는 것이 중요합니다.
'c#' 카테고리의 다른 글
C# 람다 표현식(Lambda Expression)의 사용법 (1) | 2024.09.25 |
---|---|
c# 이벤트(Event) 생성 및 구독 (0) | 2024.09.25 |
c# 람다(Lambda) 표현식 (0) | 2024.09.25 |
c# JSON, XML 데이터 처리 (0) | 2024.09.20 |
c# 파일 입출력의 파일 읽기 및 쓰기 or 파일과 디렉터리 관리(StreamReader, StreamWriter) (0) | 2024.09.20 |