[C#] delegate

Min·2024년 8월 14일
0

CSharp

목록 보기
14/25
post-thumbnail

delegate

C++의 함수포인터를 생각하면 쉽다. 코드영역에 저장되어있는 함수를 참조하기 위해 사용하는 문법이다. 다만, delegate는 함수포인터의 시그니처(반환형과 매개변수 타입)를 정의하는 클래스라고 생각하면 된다.

delegate int MyDelegate(int a, string b); //int를 리턴하고, 매개변수로 int와 string을 받는 함수 정의

internal class Program
{
    static void Main(string[] args)
    {
        MyDelegate DelegateInst = (int a, string b) =>
        {
        	return 10;
        }; // 람다 등 시그니처가 일치하는 함수를 담을 수 있음. 
    }
}

완전 개체지향

MSDN - delegate
MSDN에서는 델리게이트를 다음과 같이 설명한다
대리자는 C++ 함수 포인터와 유사하지만 C++ 함수 포인터와 달리 멤버 함수에 대해 완전히 개체 지향입니다. 대리자는 개체 인스턴스 및 메서드를 모두 캡슐화합니다.

이 말을 C++로 따지면 함수포인터 보단 std::function과 가깝다고 할 수 있다.


multicast delegate

MSDN - MulticastDelegate
멀티캐스트 델리게이트는 하나의 델리게이트 인스턴스 안에 여러 함수를 저장해놓고 사용하는 것을 의미한다. 간단하게 LinkedList<MyDelegate> Funcs라고 생각하면 쉽다.

추상화가 잘되어있어 함수를 여러개 호출할수 있다는 인터페이스를 바깥에 보여주진 않는다. +=연산자를 통해 함수를 추가하는것이 가능하다. 함수를 여러개 저장해놓고 Funcs()를 통해 호출하면 인스턴스에 저장된 함수들이 순차적으로 실행된다.

delegate void TestDelegate();

namespace Delegate
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestDelegate MuliCast = new TestDelegate(() =>
            {
                Console.WriteLine("Test0");
            });
            
            MuliCast += () =>
            {
                Console.WriteLine("Test1");
            };

            MuliCast += () =>
            {
                Console.WriteLine("Test2");
            };

            MuliCast += () =>
            {
                Console.WriteLine("Test3");
            };

            MuliCast();
            
            //출력
            //Test0
			//Test1
			//Test2
			//Test3
        }
    }
}

사용처

multicast delegate을 알고있었다면, 이번에 프로젝트를 진행하면서 관찰자패턴을 사용했던 몬스터의 DeathBroadCast나, 마우스의 ReleaseClickEvents를 이 방법으로 관리하지 않았을까 생각이 든다. 관찰자 패턴이나 발행 구독 패턴을 구현하기 좋은 기능이라고 생각한다.

profile
티내는 청년

0개의 댓글

관련 채용 정보