개념공부

델리게이트, 람다, Action,Func

Cadi 2025. 1. 7. 01:23

Delegate

  • 함수에 대한 참조
  • 함수를 대신 호출함
  • "타입"이다.(참조형 타입) // 즉 반환 타입과 매개변수로 넣을 수 있다.
  • 타입이므로 변수도 선언 가능하다
  • 그 자체로 콜백  기능을 해 준다. ( 함수를 먼저 참조하고 나중에 호출한다.)
  • 객체 -> 인스턴스 -> 함수 순으로 발생함.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelegatePractice : MonoBehaviour
{
   public delegate int MyDelegate(int a, int b);
   

   void Start()
   {  
      MyDelegate myDelegate;
      myDelegate = delegate(int a, int b)
      {
          return a + b;
      }; 
      
      int result = myDelegate.Invoke(2,3);
      Debug.Log(result);
   }
}

 

 

DelegateChain

  • 여러 함수를 동시에 참조할 수 있음
  • += , -=, Delegate.Combine() 으로 가능
  • 결국 실행하는 Delegate.Invoke(); 는 변하지 않기에 유지보수에 유리함
  • 그러나 어떤 함수에 대한 기능인지 확실하지 않아 한눈에 알아보기 어렵다는 단점도 있음

 

DelegateEvent

  • event : 객체의 상태 변화나 사건의 발생을 알리는 용도
  • event 키워드를 선언부에서 써 주면 , 그 Delegate는 외부에서 호출되지 않는다. (추가와 제거만 가능)
  • 마찬가지로 대입연산자도 사용할 수 없다.
  • 외부에서 사용하기 위해서는 특정한 방법 (내부에서 호출한 함수를 감싸주는 함수를 호출)을 이용해야함
  • 외부로부터 보호하고 안전하게 지키기 위한 방법.

EventHandle : 자체가 Delegate의 일종, 실행시키는 객체와 EventArgs를 매개변수로 지님

 

 

 

람다

 

public class DelegatePractice : MonoBehaviour
{
   public delegate int MyDelegate(int a, int b);
   void Start()
   {  
      MyDelegate myDelegate;
      myDelegate = (int a, int b) => a + b;
    
      
      int result = myDelegate.Invoke(2,3);
      Debug.Log(result);
   }
}

 

익명메서드 : 델리게이트에 전달되는 메서드가 일회성일 때 사용

델리게이트 변수 = delegate(매개변수 목록) {실행할 코드};

함수 없이 익명 메서드로 이렇게 참조할 수 있다.

 

람다 : 익명 메서드의 형태를 달리한 것.

델리게이트 변수 = (매개변수 목록) => 식;

델리게이트 변수 = (매개변수 목록) =>

{

문장1;

문장2;

};

 

람다식의  단점 : chain 관리가 어렵다 (해제 불가)

 

LINQ에서 자주 활용됨.

 

 

Action, Func

 

  • '미리 선언된' delegate // using.System 사용
  • 반환값이 없는 Action
  • 반환값이 있는 Func
  • Action<매개변수>로 매개변수를 16개까지 받을 수 있음
  • Func<매개변수,반환 타입>으로 매개변수를 16개까지 받을 수 있음
  • Predicate라는 bool값 판단도 있다.

 

 


UnityAction과 UnityEvent라는 이미 만들어진 Delegate 도 있다.