대리자(Delegate)란?
특정 매개 변수 목록과 반환 형식이 있는 매서드에 대한 참조를 나타내는 형식
대리자를 인스턴스화할 때 호환되는 매개변수 및 반환 형식을 가지는 모든 메서드와 연결할 수 있다.
대리자(Delegate)의 속성
- 대리자는 C++ 함수 포인터와 유사하지만 C++ 함수 포인터와 달리 멤버 함수에 대해 완전히 객체 지향이다. delegate는 인스턴스 및 메서드를 모두 캡슐화한다.
- 대리자를 통해 메서드를 매개 변수로 전달할 수 있다.
- 대리자를 사용하여 콜백 메서드를 정의할 수 있다.
- 여러 대리자를 연결할 수 있다. 예를 들어 단일 이벤트에 대해 여러 메서드를 호출 할 수 있따.
- 메서드는 대리자 형식과 정확히 일치하지 않아도 된다. 자세한 내용은 대리자의 가변성 사용을 참조
- 람다 식은 인라인 코드 블록을 작성하는 대단히 간단한 방법이다. 특정 컨텍스트에서는 람다 식이 대리자 형식으로 컴파일 된다.
기본 형태
delegate 반환형식 델리게이트명 (매개변수)
public delegate void Del(string message);
대입 연산자를 통한 멀티캐스트
=, +=, -=
위에 3가지 할당 연사자를 통해서 delegate와 동일할 형식의 메서드를 할당, 추가, 삭제할 수 있다.
var obj = new MethodClass();
Del d1 = obj.Method1;
Del d2 = obj.Method2;
Del d3 = DelegateMethod;
Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;
allMethodsDelegate -= d3;
예제 코드
using System;
namespace DelegateTestProject
{
class Program
{
delegate void MyDelegate();
class MyClass
{
public void MyFunction()
{
Console.WriteLine("Hello, World");
}
public void MyFunction2()
{
Console.WriteLine("Hello, New World");
}
}
static void Main(string[] args)
{
MyClass A = new MyClass();
MyDelegate myDel1 = new MyDelegate(A.MyFunction);
MyDelegate myDel2 = delegate() { Console.WriteLine("Anonymous Delegate"); };
myDel2 += A.MyFunction2; // 멀티 캐스트
MyDelegate myDel3 = () => { Console.WriteLine("Lambda"); };
myDel1();
myDel2();
myDel3();
}
}
}
이벤트(Event)와의 차이점
- 대리자(Delegate)는 클래스 외부에서 직접 호출할 수 있다. 이벤트는 내부에서만 호출 가능
- 이벤트는 이름처럼 특정 조건(사건)이 발생했을 때 메소드를 자동으로 호출하는 용도로 사용한다.
- 이에 반해 Delegate는 C++의 함수 포인터라고 생각하면 편하다.
함께 읽으면 좋은 글
참조 사이트
'프로그래밍 > C#' 카테고리의 다른 글
C# 네이밍 규칙에 대해서 (1) | 2023.03.15 |
---|---|
C# Ceiling(), Floor(), Round(), Truncate() 올림 내림 반올림 버림 (4) | 2023.03.14 |
C# 상속 관련 키워드 정리 (0) | 2023.02.27 |
C# 숫자 서식 지정자(Number Format Specifier) (0) | 2023.02.21 |
C# 커맨드 라인(CommandLine) 파싱 라이브러리 소개 (0) | 2023.02.17 |
댓글