📒 갈무리 - delegate
📌 delegate란?
- 메소드의 참조를 포함하는 영역
- 메소드 참조를 위해서는 선언한 delegate와 참조할 메소드의 반환형, 매개 변수의 개수, 타입이 같아야 한다.
- 클래스간 통신에 자주 활용한다.
- 함수의 파라미터로 사용하면 결합도를 낮출 수 있어, 자주 사용한다.
📌 delegate 선언
delegate void DelegateTest(int a, int b);
static void Sum(int a, int b)
{
Console.WirteLine("a + b = " + (a + n));
}
DelegateTest delegate1 = new DelegateTest(Sum);
DelegateTest delegate2 = Sum;
DelegateTest delegate3 = delegate(int a, int b)
{
Console.WirteLine("a + b = " + (a + b));
};
DelegateTest delegate4 = (a, b)
{
Console.WirteLine("a + b = " + (a + b));
};
📌 delegate 사용
// C#
// 반환형 void, 파라미터 없는 delegate 생성
delegate void delegateFunc();
class MessageProcess
{
// delegate 선언
delegateFunc OkFunc;
delegateFunc CancelFunc;
// 파라미터로 delegate 메소드를 받음
public void ShowMessage(string msg, delegateFunc okFunc, delegateFunc cancelFunc)
{
OkFunc = okFunc;
CancelFunc = cancelFunc;
Console.WriteLine("Message : " + msg + " (0 : OK, else : Cancel)");
string inputStr = Console.ReadLine();
if (inputStr.Equals("0"))
{
OkFunc();
}
else
{
CancelFunc();
}
}
}
class Program
{
static void CallOK()
{
Console.WriteLine("Call OK");
}
static void CallCancel()
{
Console.WriteLine("Call Cancel");
}
static void Main(string[] args)
{
MessageProcess msg = new MessageProcess();
msg.ShowMessage("Test Message", CallOK, CallCancel);
// 파라미터에 익명 함수로 구현과 전달을 한번에
msg.ShowMessage("Test Message",
delegate ()
{
Console.WriteLine("Call InDelegate");
}
, CallCancel);
}
}
📌 delegate chain
delegate void ShowMessage();
class Message
{
public void FirstMessage()
{
Console.WriteLine("First Message");
}
public void SecondMessage()
{
Console.WriteLine("Second Message");
}
pubilc void Main()
{
ShowMessage message = new ShowMessage(FirstMessage);
message += SecondMessage;
message();
}
}
📌 event란?
- 하는 일은 delegate와 유사하다.
delegate와 차이점
- 할당 연산자(=) 사용 불가
- 클래스 외부 호출 불가
- 클래스 멤버 필드에서 사용
- delegate를 event 변수로 사용한다.
📌 event 사용
delegate void delegateEvent(string message);
class InDelegate
{
public delegateEvent myDelegate;
public event delegateEvent myEvent;
public void DoEvent(int a, int b)
{
if (myEvent != null)
{
myEvent("Event : " + (a + b));
}
}
}
class Program
{
static public void ConsoleFunc(string message)
{
Console.WriteLine("ConsoleFunc : " + message);
}
static void Main(string[] args)
{
InDelegate id = new InDelegate();
id.myEvent += ConsoleFunc;
for (int i = 0; i < 10; i++)
{
if (i == 9)
{
id.myEvent -= ConsoleFunc;
}
id.DoEvent(i + 1, i + 2);
}
}
}
💡 TIP
클래스 내에서 처리할 때는 event를 활용
콜백을 처리할 때는 메소드의 파라미터로 delegate를 활용