본문 바로가기
유니티/개념 정리

대리자

by fore4022 2024. 4. 23.

Delegate

  • 메서드를 참조하는 객체로, 참조하는 메서드의 입력 매개변수와, 반환 타입을 포함한다
  • 델리게이트는 명시적으로 정의되어야 하며, 호출하려는 메서드의 입력 매개변수와 반환 타입을 가져야 한다.
  • 반환값은 마지막으로 호출된 메서드가 돌려준 값을 받는다, 이전 메서드들의 반환값은 폐기된다.
  • 모든 대리자는, 대리자 체인을 만들 수 있다

Func

  • 반환 타입이 void가 아닌 0 ~ n개의 매개변수인 메서드를 포함하는 제네릭 델리게이트이다
  • 여러 개의 메서드를 한 번에 실행시킬 수 있다

Action

  • 반환 타입이 void인 메서드를 위해 설계된 제네릭 델리게이트이다
  • 여러 개의 메서드를 한 번에 실행시킬 수 있다

Lamda

  • 원하는 기능의 메서드를 직접 선언하지 않고도 만들 수 있다
  • 대리자를 간단하게 만들 수 있다

콜백

  • 함수에서 인자로 다른 함수를 전달 받아서 실행하는 것이다.
  • 특정 함수가 그때마다 지정된 기능을 하도록 한다.(시간이 지난후에 호출 가능)

Call Back

 

Call Back

하나의 함수를 다른 함수 실행의 인자로 전달한다. 구현하고자 하는 기능에 따라서 전달 받은 함수의 호출 시점을 지정할 수 있다.기본적인 Call Back 구현using UnityEngine;public class Test : MonoBehaviour{ p

fore4022.tistory.com

대리자 체인

  • 여러가지 메서드를 등록, 삭제 할 수 있다
  • 등록된 메서드를 순서대로 호출한다, 먼저 호출된 메서드가 종료된 후에 다음 메서드가 실행된다

대리자 이벤트

  • 작업의 실행을 알린다
  • 사용자 조작 또는 속성의 값 변경이 일어났을 때, 상태들의 변화가 필요한 외부 함수에 전달해 주는데 유용하다
  • 할당 연산자 사용 불가

코드


delegate

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

public class Base : MonoBehaviour
{
	public delegate void MyDelegate();//델리게이트 선언
	MyDelegate myDelegate;
	
  private void Start()
  { 
	  myDelegate += Print;//메서드 등록
	  myDelegate();
	}
	
  public void Print()
  {
	  Debug.Log(”hello, world”);
  }
}//실행 결과 : hello, world

func

using System;
using UnityEngine;
public class Test : MonoBehaviour
{
    Func<bool> myFunc;//대리자 선언

    private void Start()
    {
        myFunc += Func1;//메서드 등록

        if (myFunc())
        {
            Debug.Log("Func True");
        }

        myFunc -= Func1;//메서드 해제

        myFunc();
        
        myFunc += Func2;//오류 발생 -> 반환 형식이 일치하지 않음
    }

    public bool Func1()
    {
        return true;
    }

    public void Func2()
    {
        Debug.Log(", Func2");
    }
}//실행 결과 : Func True가 출력되는 것을 확인할 수 있다.

action

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

public class Base : MonoBehaviour
{
	Action myAction;//대리자 선언

	private void Start()
	{
		myAction += Action_A;//메서드 등록
		myAction += Action_B;//메서드 등록
		myAction += Action_C;//메서드 등록

		myAction();
	}

	public void Action_A()
	{
		Debug.Log(”Action_A”);
	}

	public void Action_B()
	{
		Debug.Log(”, Action_B”);
	}

	public void Action_C()
	{
		Debug.Log(”, Action_C”);
	}
}//실행 결과 : Action_A, Action_B, Action_C

lamda

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

public class Base : MonoBehaviour
{
	delegate int MyDelegate(int x, int y);
	
	private void Start()
	{
		MyDelegate myDelegate = (x, y) ⇒ x + y;
		
		int a = myDelegate(1, 1);

		Debug.Log(a);
	}
}//실행 결과 : 2

'유니티 > 개념 정리' 카테고리의 다른 글

Generic  (0) 2024.07.22
New Input System  (0) 2024.07.19
Indexer  (0) 2024.05.09
Type  (0) 2024.03.26
async, await란?  (0) 2024.03.21