본문 바로가기
개발일지/Unity 3D&C#

[C#] 델리게이트(delegate) - 델리게이트, 콜백 사용 방법 및 사용 이유

by 쫌눈 2022. 6. 16.
반응형

델리게이트란?

대리자 라는 뜻으로 c++의 함수 포인터와 비슷한 개념을 가지고 있다.

단톡방에서 주어온 그림이라 출처를 모른다 ㅠ,,, 아시는분은 댓글로 알려주세요.

포인터의 설명은 위와 같다고 보면된다. 솔직히 정말 잘 정리한듯,,,

함수 포인터는 함수식을 인스턴스의 포인터처럼 인식을 해서 변수에 값을 저장하거나 파라미터로 넘겨서 실행하는 대리자이다.

그리고 델리게이트는 자체적으로 리스트 기능이 있다.
+=, -=같은 대입연산자를 통해 추가 및 제거가 가능하다.

선언 방법은 다음과 같다

delegate 반환타입 델리게이트이름 (매개변수)

함수 선언 방법과 동일하게 선언을 한다.

델리게이트 사용방법은 아래와 같다.

델리게이트 샘플 코드

using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        public delegate void Test(string msg); //델리게이트 선언

        public void DelegateTestA(string msg)
        {//참조 메서드 생성
            Console.WriteLine("Call DelegateTestA, param is " + msg);
        }

        public void DelegateTestB(string msg)
        {
            Console.WriteLine("Call DelegateTestB, param is " + msg);
        }

        public Program()
        {
            Test test;

            test = new Test(DelegateTestA);
            test("A");

            test = new Test(DelegateTestB);
            test("B");
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}

 

샘플 코드 실행 결과

샘플코드를 보면 알 수 있듯이 델리게이트가 참조하는 메서드는 반환타입과 매개변수가 델리게이트와 일치해야 한다.

 

그런데, 여기서 하나의 의문점이 생긴다.

그냥 바로 DelegateTestA("A"); 이렇게 호출하면 되는데 왜 굳이 코드를 몇 줄 더 적어가면서 델리게이트를 사용할까?

델리게이트 사용 이유는 다음과 같다.

  • A클래스를 구현하고 B클래스를 구현하는데, A클래스에서는 B클래스가 구현되기 전까지 B클래스의 함수를 알 수 있는 방법이 없으므로 매개변수로 함수 자체를 받아 사용할 수 있다.(콜백함수로 사용할 수 있다.)
    B클래스의 This함수를 사용한다 라고 명시해놓는다면 병목현상이 생기지 않아 구현에 좋다.
  • A클래스에서 B클래스로의 직접적 접근을 할 필요도 없고, 함수 이름도 알 필요가 없다.(델리게이트에 등록이 되어 있기 때문.)

그렇다면 콜백함수로 사용할 수 있는 방법을 알아보자.

콜백함수로 사용할 수 있는 샘플코드

using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        public delegate void Callback();

        public void CallbackFunc()//콜백으로 등록할 메서드
        {
            Console.WriteLine("Call CallbackFunc");
        }

        public void DelegateTestCallback(Callback callback)
        {
            Console.WriteLine("Call DelegateTestCallback");

            callback();//콜백 메서드 호출
        }

        public Program()
        {
            Callback callback = CallbackFunc; //콜백 메서드 등록

            DelegateTestCallback(callback); //함수 실행
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}

샘플코드 실행 결과

 

다음 델리게이트 포스트에는 Func 델리게이트 뿐만 아니라 Action델리게이트, Predicate 델리게이트를 포스팅해야겠다.

포스팅에 오류가 있거나 오타가 있다면 댓글로 알려주시기 바랍니다.

도움이 되셨다면 공감버튼을 눌러주세요.🥰

반응형

댓글