Delegate는 메서드를 다른 메서드로 전달할 수 있도록 하기 위해 만들어졌습니다. 유니티에서는 여러 함수를 등록을 하고 쉽게 호출하기 위해 사용합니다. 여기서 메서드와 함수는 같은 의미로 해석합니다.
델리게이트 정의에서 중요한 것은 입력 파라미터들과 리턴 타입입니다. 만약 어떤 메서드가 델리게이트 메서드 원형과 일치한다면 그 메서드는 해당 델리게이트에서 사용될 수 있습니다.
함수를 델리게이트에 등록하면 함수 포인터와 비슷하게 그 함수를 가리킵니다. 그리고 델리게이트가 발동이 되면 가리키는 함수를 찾아가서 함수를 발동시킵니다.
간단한 예제
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Calculator : MonoBehaviour
{
public float Sum(float a, float b)
{
Debug.Log(a + b);
return a + b;
}
public float Subtract(float a, float b)
{
Debug.Log(a - b);
return a - b;
}
public float Multiply(float a, float b)
{
Debug.Log(a * b);
return a * b;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
Sum(1, 10);
Subtract(1, 10);
Multiply(1, 10);
}
}
}
간단한 예시를 들어보겠습니다. Calculator 클래스는 더하기, 빼기와 곱하기가 있습니다. 지금 Update 함수에서 스페이스바를 누르면 더하기, 빼기와 곱하기 함수를 호출하도록 되어있습니다.
위 코드에서는 원하는 함수를 호출하려면 원하는 상황마다 코드를 추가해야 합니다. 즉, 더하기 함수를 호출하려면 Sum을 입력해야 하고 곱하기 함수를 호출하려면 Multiply 함수를 호출해야 합니다. 복잡해지면 매우 번거로워지죠.
이런 상황에서 활용할 수 있는 기능이 Delegate입니다. 예제가 적절하지 않지만 참고만 해주세요 🙂
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Calculator : MonoBehaviour
{
//delegate 정의
//Calculate 형 델리게이트임.
delegate float Calculate(float a, float b);
Calculate onCalculate;
void Start()
{
// Sum 함수의 괄호(())를 안붙이면 등록을 하는 것.
onCalculate = Sum;
onCalculate += Subtract;
}
public float Sum(float a, float b)
{
Debug.Log(a + b);
return a + b;
}
public float Subtract(float a, float b)
{
Debug.Log(a - b);
return a - b;
}
public float Multiply(float a, float b)
{
Debug.Log(a * b);
return a * b;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
onCalculate(1, 10);
}
}
}
위 코드를 보면 스페이스바를 누르면 Start 함수에서 delegate에 등록했던 함수들이 모두 실행됩니다. 복잡하게 코드가 추가될 필요 없이 간단하게 여러 함수들을 실행할 수 있습니다. 등록된 함수들이 차례대로 호출되는 것입니다.
그리고 델리게이트는 반환값도 가질 수 있는데 마지막에 등록된 함수의 반환값을 반환합니다. C# 문법상으로는 델리게이트를 활용하여 다른 메서드의 파라미터로 메서드를 받을 수 있기 때문에 메서드를 다른 메서드로 전달하는 용도로 사용합니다만 유니티에서는 용도가 다르죠.