Func, Action, Predicate

이정은·2025년 8월 5일

C#

목록 보기
5/8

Func

: 여러 개의 매개변수를 넣을 수 있고 반환타입이 있는 Delegate

→ 마지막에 적은 타입이 반환타입

접근제한자 Func<매개변수1, 매개변수2, 반환타입> 변수명;
public Func<int, int, int> myFunc;

using System;
using UnityEngine;

public class StudyFunc : MonoBehaviour
{
    public Func<int, int, int> myFunc;

    void Start()
    {
        myFunc = AddMethod;

        int result = myFunc.Invoke(10, 7);
        
        Debug.Log(result);
    }

    private int AddMethod(int num1, int num2)
    {
        return num1 + num2;
    }
}
  • Func는 델리게이트 체인 사용 ❌

using System;
using UnityEngine;

public class StudyFunc : MonoBehaviour
{
    public enum Buff { A, B, C }
    public Buff buff;

    public Buff currentBuff;
    public float currentDmg;
    
// 접근제한자 Func<매개변수, 매개변수, 반환타입> 변수명 
    public Func<Buff, float, float> myFunc;
    
    void Start()
    {
        myFunc?.Invoke(currentBuff, currentDmg);
    }

    private float CalculationDamage(Buff buff, float dmg)
    {
        int result = 0;
        switch (buff)
        {
            case Buff.A:
                result = 10;
                break;
            case Buff.B:
                result = -20;
                break;
            case Buff.C:
                result = 100;
                break;
        }

        return dmg * result;
    }
}







Action

: 여러 개의 매개변수를 넣을 수 있고 반환타입이 없는 Delegate

  • Action 형식으로 제네릭 사용 가능


Action의 다양한 모습

using System;
using UnityEngine;

public class StudyAction : MonoBehaviour
{
    public delegate void MyDelegate();
    public MyDelegate myDelegate;
    
    public Action action;
    
    
    public delegate void MyDelegate2(string s);
    public MyDelegate myDelegate2;
    
    public Action<string> action2;

    public Action<string, int, float, bool> action3;
}

커플링된 싱글톤

using System;
using UnityEngine;

public class ButtonManager : Singleton<ButtonManager>
{
  public bool isSingleton = false;
  
  private void StopMessage()
  {
      Debug.Log("긴급 정지 실행");
  }

  void Update()
  {
      if (Input.GetKeyDown(KeyCode.Space))
      {
          isSingleton = true;
      }
  }
}
using UnityEngine;

public class ExternalClass : MonoBehaviour
{
    void Update()
    {
        if (ButtonManager.Instance.isSingleton)
        {
            TimerView();
        }
    }

    private void TimerView()
    {
        
    }
}

디커플링된 Action

using System;
using UnityEngine;

public class ButtonManager : MonoBehaviour
{
  public static Action emergencyStopButton;
  
  void Start()
  {
      emergencyStopButton += StopMessage;
  }
  
  private void StopMessage()
  {
      Debug.Log("긴급 정지 실행");
  }

  void Update()
  {
      if (Input.GetKeyDown(KeyCode.Space))
      {
          emergencyStopButton?.Invoke();
      }
  }
}
using UnityEngine;

public class ExternalClass : MonoBehaviour
{
    void Start()
    {
        ButtonManager.emergencyStopButton += TimerView;
    }
    
    private void TimerView()
    {
        
    }
}







Predicate

: 한 개의 매개변수를 넣을 수 있고 반환타입이 bool인 Delegate

  • 주로 조건 검사에서 사용 (true/false 반환)
using System;
using UnityEngine;

public class StudyPredicate : MonoBehaviour
{
  // 접근제한자 Predicate<매개변수> 변수명 
    public Predicate<int> myPredicate;
    
    // 매개변수 1개만 사용 가능

    public int level = 10;

    void Start()
    {
        LevelCheck(level);
    }

    private void LevelCheck(int level)
    {
        if (level <= 10)
        {
            Debug.Log("초보자 사냥터 입장 가능");
        }
        else
        {
            Debug.Log("초보자 사냥터 입장 불가능");
        }
    }
}
using System;
using UnityEngine;

public class StudyPredicate : MonoBehaviour
{
    public Predicate<int> myPredicate;
    
    public int level = 10;

    void Start()
    {
        myPredicate = n => n <= 10;
        string msg = myPredicate(level) ? "초보자 사냥터 입장 가능" : "초보자 사냥터 입장 불가능";
        Debug.Log(msg);
    }
}







요약

  • Action → “실행” (결과 없음)

  • Predicate → “조건 검사” (bool 반환)

  • Func → “계산” (결과 반환)

  • EventHandler → “이벤트” (sender + EventArgs 전달)







0개의 댓글