Unity & C#/Scripting

Delegate, Event (1) - C# Delegate

coucou3 2020. 7. 8. 00:24
반응형

대리자 Delegate

Microsoft Docs - 대리자 사용(C# 프로그래밍 가이드)

대리자는 C 및 C++의 함수 포인터처럼 메서드를 안전하게 캡슐화하는 형식입니다.
함수 포인터와는 달리 대리자는 개체 지향적이고 형식이 안전하며 보안이 유지됩니다.

 

대리자에 대한 호출은 대리자를 통해 해당 메서드로 전달된다.

매개변수가 있을 경우 호출자의 매개변수는 대리자에 의해 해당 메서드로 전달되고, 반대로 반환값이 있을 경우 대리자에서 호출자로 반환된다.

 

 

# DelegateTest.cs

string 매개변수를 받는 delegate를 선언하고,

동일하게 string 매개변수를 받는 메서드를 delegate 객체에 넣어줬다.

public class DelegateTest : MonoBehaviour
{
    private delegate void MyDelegate(string message);


    private void DelegateMethod(string message)
    {
        Debug.Log(message);
    }


    private void Start()
    {
        MyDelegate delegateInstance = DelegateMethod;
        delegateInstance("Hello world!");
    }
}

 

string value "Hello world!"는 delegateInstance에서 DelegateMethod로 전달되어 콘솔에 출력된다.

 

 

 

Delegate는 인스턴스화된 객체이므로 메서드의 매개변수로 전달할 수 있다. 비동기 콜백에 이용되는 방식이다.

# DelegateTest.cs

public class DelegateTest : MonoBehaviour
{
    private delegate void MyDelegate(string message);


    private void DelegateMethod(string message)
    {
        Debug.Log(message);
    }


    private void Start()
    {
        MyDelegate delegateInstance = DelegateMethod;
        MethodWithCallback(1, 2, delegateInstance);
    }


    // delegate instance를 매개변수로 받는다.
    private void MethodWithCallback(int a, int b, MyDelegate callback)
    {
        callback("a + b : " + (a + b).ToString());
    }
}

 

 

 

멀티 캐스트

Delegate에는 여러 개의 메서드를 넣어줄 수 있고, 들어있는 메서드를 한 번에 호출할 수 있다.

 

# DelegateTest.cs

public class DelegateTest : MonoBehaviour
{
    private delegate void MyDelegate(string message);

    
    private void DelegateMethod(string message)
    {
        Debug.Log("DelegateMethod : " + message);
    }
    
    private void DelegateMethodSecond(string message)
    {
        Debug.Log("DelegateMethodSecond : " + message);
    }
    
    private void DelegateMethodThird(string message)
    {
        Debug.Log("DelegateMethodThird : " + message);
    }


    private void Start()
    {
        MyDelegate delegateInstance = DelegateMethod;
        // MethodWithCallback(1, 2, delegateInstance);
        
        // 넣어줄 땐 + operator를 사용한다
        delegateInstance += DelegateMethodSecond;
        delegateInstance += DelegateMethodThird;
        
        delegateInstance.Invoke("Hello world!");
        
        // 빼줄 땐 - operator를 사용한다.
        // delegateInstance -= DelegateMethodThird;
        // delegateInstance -= DelegateMethodSecond;
    }
}

 

 

 

반응형

'Unity & C# > Scripting' 카테고리의 다른 글

Data based structure - ScriptableObject  (0) 2020.11.06
C# Extension Method(확장 메서드)  (0) 2020.08.14
Delegate, Event (2) - UnityEvent  (0) 2020.07.09