delegate는 함수를 담을 수 있는 자료형이라고 생각하면된다.
delegate void MyDelegate();
delegate int IntDelegate();
delegate int IntDelegate2(int i, int j);
이렇게 사용한다.
앞에 선언한 자료형이 void면 void만 담을 수 있다.
public static void TestFunc()
{
Console.WriteLine("1");
}
public static void TestFunc2()
{
Console.WriteLine("2");
}
이런 함수가 있을 때
MyDelegate myDelegate = TestFunc;
delegate를 선언하고 함수를 담을 수 있다.
myDelegate += TestFunc2;
함수를 여러개 담을 수 있는데 첫번째 함수가 실행되고 두번째 함수가 실행된다.
출력은 1 > 2 순서로 된다.
쉽게 말하면 delegate로 함수를 실행할 때 불러온 함수로 또 다른 함수를 불러올 수 있는데 그걸 callback이라고 한다.
예시를 보자
delegate static void BuyCallback();
static void Main()
{
BuyCallback buyCallback = ShowPopup;
BuyItem(buyCallback);
}
static void BuyItem(BuyCallback callback)
{
Console.WriteLine("아이템 구매");
callback();
}
static void ShowPopup()
{
Console.WriteLine("팝업 보여주기");
}
buyItem을 실행했을 때, 아이템 구매를 출력후, callback을 한번 더 실행하는데 callback에는 ShowPopup() 함수가 들어있기 때문에 ShowPopup()도 실행하게 된다.
이것이 callback이다.
delegate를 편하게 쓰기위해 만들어진 것.
사용법은
Action action;
action = A;
static void A() // 함수 반환형이 void
{
}
이렇게 사용한다.
Action은 반환형이 void일 때 사용할 수 있다.
Func<int> func;
func = F;
static int F()
{
return 0;
}
Func은 반환형을 다양하게 사용할 수 있다.
Func은 다르게도 사용 가능하다.
Func<float, int> func1;
func1 = F2;
static int F2(float i)
{
return (int)i;
}
설명을 하자면, 반환형이 int고 매개변수가 float일 때 이다.
매개변수는 너무 많이는 안되지만 여러개 가능하다.
Func<int, float, int> func2;
func2 = F3;
static int F3(int a, float b)
{
return 1;
}
이렇게도 가능하다.
Predicate<int> predicate;
반환형이 bool일때 사용가능하다.
Func<int, bool> f;
이것과 동일하다.
public event Action<int> action;
//event가 붙으면 값을 더하거나 빼기 밖에 안된다.
//player.action = null;
//player.action(); 두개는 안됌.
이벤트는 외부에서 직접 호출 / 초기화 방지, 등록만 허용 되기 때문에 더하거나 빼기 밖에 안된다.
그래서 event가 선언된 클래스 내에서만 Invoke를 해줄 수 있다.
player.action?.Invoke();
이렇게 사용해야한다.
?는 무엇이냐면 만약null일 경우 함수를 사용하지 않겠다는 의미이다.