목표

  • Delegate 사용법에 대해 알아보자

지옥문을 이용하면 지옥으로 갈 수 있죠.

Delegate

  • 델리게이트는 메서드에 대한 참조를 나타내는 형식이다.
  • 매개 변수 목록 과 반환 형식을 지정할 수 있다.
  • C++의 함수 포인터와 유사하지만, 함수 포인터와 달리 멤버 함수에 대해 완전히 개체 지향적이다.
  • 따라서 인스턴스 및 메서드를 모두 캡슐화 한다.
  • 일반적으로 함수의 callback을 구현할때 사용한다.

Delegate 연결하기

  • Delegate 1개와 Method 1개를 연결해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateCallback : MonoBehaviour
{
    delegate void MyDelegate(int number, string userId);
    private MyDelegate _myDelegate;

    // Start is called before the first frame update
    void Start()
    {
        // MemberFunc을 델리게이트를 설정한다.
        _myDelegate = MemberFunc;

        // Invoke 함수를 상ㅇ하여 호출할 수 있다.
        _myDelegate.Invoke(0, "apple");
    }

    public void MemberFunc(int number, string userId)
    {
        Debug.Log(number + " : " + userId);
    }
}

Delegate 체인

  • Delegate 1개와 Method n개를 연결해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateCallback : MonoBehaviour
{
    delegate void MyDelegate(int number, string userId);
    private MyDelegate _myDelegate;

    // Start is called before the first frame update
    void Start()
    {
        // MemberFunc을 델리게이트를 설정한다.
        _myDelegate = MemberFunc;

        // MemberFunc2를 델리게이트에 추가로 연결한다.
        _myDelegate += MemberFunc2;

        // Invoke 함수를 상ㅇ하여 호출할 수 있다.
        _myDelegate.Invoke(0, "apple");
    }

    public void MemberFunc(int number, string userId)
    {
        Debug.Log(number + " : " + userId);
    }

    public void MemberFunc2(int number, string userId)
    {
        Debug.Log(number + " : " + userId);
    }
}

무명 메서드(Anonymous Method) Delegate

  • 명칭없이 함수만 존재하는 함수를 무명 메서드라 한다.
  • 무명 메서드도 함수와 동일하므로, 델리게이트와 연결 가능하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateCallback : MonoBehaviour
{
    delegate void MyDelegate(int number, string userId);
    private MyDelegate _myDelegate;

    // Start is called before the first frame update
    void Start()
    {
        // 무명 메서드와 델리게이트 연결
         _myDelegate = delegate (int number, string userId)
        {
            Debug.Log(number + " : " + userId);
        };
    }
}

람다식(Lamda Expression) Delegate

  • 람다식은 현재 가장 많이 사용되는 문법일 것이다.
  • 람다 선언 연산자(=>)를 사용하여 본문에서 람다의 매개 변수 목록을 구별한다.
  • 람다 식을 사용하면 무명 함수를 좀더 간결하게 표현할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateCallback : MonoBehaviour
{
    delegate void MyDelegate(int number, string userId);
    private MyDelegate _myDelegate;

    // Start is called before the first frame update
    void Start()
    {
        // 람다식과 델리게이트 연결
        // 타입은 보통 명시하지 않아도 무방하다.
           _myDelegate = (int number, string userId)=>
        {
            Debug.Log(number + " : " + userId);
        };
    }
}

Delegate 활용 예시

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegateCallback : MonoBehaviour
{
    delegate void MyDelegate(int number, string userId);

    private Dictionary<int, MyDelegate> _callbacks = new Dictionary<int, MyDelegate>();

    void AddCallback(int callbackId, MyDelegate method)
    {

        if(_callbacks.ContainsKey(callbackId))
        {
            _callbacks.Remove(callbackId);
        }

        _callbacks.Add(callbackId, method);
    }

    MyDelegate GetMyDelegate(int callbackId)
    {
        if(!_callbacks.ContainsKey(callbackId))
        {
            return null;
        }

        return _callbacks[callbackId];
    }

    // Start is called before the first frame update
    void Start()
    {
        AddCallback(0, (number, userId) =>
        {
            Debug.Log(number + " : " + userId);
        });

        var method = GetMyDelegate(0);

        if(method != null)
        {
            method.Invoke(0, "kim");
        } 
    } 
}

+ Recent posts