반응형
델리게이트(delegate) 목록에 실행할 함수들을 등록해 놓으면, 등록된 함수들을 연쇄적으로 대신 실행시켜준다!

1. 델리게이트(delegate)에 함수를 등록하면 그 함수들의 포인터(주소)들이 등록된다.
2. 델리게이트(delegate)가 실행될 땐 등록된 함수들을 전부 실행시켜주는데, 이 때 등록된 주소들을 참조하여 함수들을 차례로, 연쇄적으로 실행시킨다.

 

1. 선언 및 정의
deleagte float Calculate(float a, float b);
Calculate onCalculate;​


Calculate 이라는 이름의 delegate형, 리턴타입 float, 매개 변수 float 2개인 함수만 등록 가능하도록 제한한 상태. 
• Calculate 형인 델리게이트 onCalculate 를 정의.
onCalculate에 대행할 함수들을 등록할 수 있다. 단, 리턴 타입이 float이고, 매개 변수가 float 2개인 함수만 등록 가능!

 

 

2. 예시
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Caculator : MonoBehaviour
{
    // Calculate 라는 이름의 delegate 형을 선언
    delegate float Calculate(float a, float b);

    // Calculate 형인 델리게이트 onCalculate를 정의
    Calculate onCalculate;

    void Start()
    {
    	// 함수 등록
        onCalculate = Sum;
        onCalculate += Subtract;
        onCalculate -= Subtract;
        onCalculate += Multiply;
    }

    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))
        {
            Debug.Log("결과값: " + onCalculate(1, 10));
        }
    }
}​

델리게이트 형 선언: delegate float Calculate(float a, float b);

델리게이트 정의: Calculate onCalculate;

 

3. 함수 등록/실행하기

2. 글 예시로 설명하겠다.

[함수 등록]

함수의 포인터를 등록해주어야 하기 때문에 함수의 이름을 +,- 연산으로 추가/삭제를 해준다.
  void Start()
  {
      onCalculate = Sum;
      onCalculate += Subtract;
      onCalculate -= Subreact;
      onCalculate += Multiply;
  }​

 

실행결과:
• Sum과 Multiply가 연쇄적으로 실행된다. 다시 말해, onCalculate가 Sum(1, 10)와 Multiply(1, 10)을 대행해준다!


[함수 실행]
Debug.Log("결과값: " + onCalculate(1, 10));​
• 스페이스 키를 누를 때마다 다음과 같이 출력
10
11
• Debug.Log 출력으로 11과 10을 볼 수 있지만, 최종 반환값은 10이다. 멀티캐스트 델리게이트의 특성!
• 만약 모든 함수의 결과를 사용하고 싶다면, 델리게이트(delegate) 대신 이벤트(event)를 사용하거나, 반환값을 저장하는 별도의 로직을 구현해야 한다!

 

반응형

+ Recent posts