개념공부
델리게이트, 람다, 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 도 있다.