본문 바로가기
프로그래밍/C#

C# 대리자(Delegate)에 대해서

by bantomak 2023. 3. 13.

대리자(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# event에 대해서 알아보자

event란 무엇인가 C#에서 모든 이벤트(event)는 특수한 형태의 delegate이다. (delegate에 대해서 알고 싶거나 복습하고 싶다면 해당 링크 클릭) 이벤트는 단지 특수한 제약조건이 추가된 delegate라고 생각

jettstream.tistory.com

 

참조 사이트

 

대리자 - C# 프로그래밍 가이드

C#의 대리자는 매개 변수 목록 및 반환 형식이 있는 메서드를 나타내는 형식입니다. 대리자는 메서드를 다른 메서드에 인수로 전달하는 데 사용됩니다.

learn.microsoft.com

댓글