Delegate, event
개요
Delegate, 익명함수
- Delegate는 대리자로 함수를 담을 수 있는 자료형으로, 대리자는 매개변수로 매소드자체를 넘겨주기 때문에 필요한 함수를 빠르고 간결하게 불러올 수 있습니다.
- 객체관 상호작용에 이용되며, 특정 함수가 호출 되었을 때 연계되어, 호출 되야하는 함수가 있는 경우에 호출을 하기 위해 사용됩니다.
void Main()
{
MyDel mydel = new MyDel();
Triger triger = new Triger(mydel);
Console.WriteLine(mydel.delg);
while(true)
{
if(Console.ReadKey() == ConsoleKey.W)
mydel.DelTest(-10);
}
}
class MyDel
{
public int delg {get; protected set } = 100;
public delegate void delgDelegate(int value);
public delDelegate OnChanged;
public void DelTest(int value)
{
delg += value;
OnChanged?.Invoke(delg);
}
}
class Triger
{
MyDel deleg;
public Triger(MyDel _delg)
{
deleg = _delg;
deleg.OnChanged = Printer;
}
public Printer(int value)
{
Console.WriteLine($"지정된 함수가 호출 되었습니다. {value}");
}
}
100
지정된 함수가 호출 되었습니다. 90
지정된 함수가 호출 되었습니다. 80
- 위와 같이 함수를 넣어줘서 필요할 때마다 호출 되게 만들 수 있습니다.
- 다수의 함수를 호출해야 하는 경우
deleg.OnChanged += 함수명을 통해 다수의 함수를 지정할 수 있습니다.
- 문제는 익명 함수와 함수 할당 후 해제 하지 않는 경우 입니다.
- 익명 함수의 경우 delegate가 익명 함수가 더 이상 참조하지 않을 때까지 메모리에서 할당 해제 되지 않습니다.(메모리 누수), 할당 해제 또한 위와 같지만, 익명 함수와 다르게 직접 해제 전까지 할당 해제 되지 않습니다.
deleg.OnChanged += delegate ()
{
}
- 익명 함수 사용은 선택 사항이며, 편의성에 초점이 맞춰서 있고 위에 언급 하였 듯, 위험요소가 존재하기 때문에 가급적 사용하지 않는 것이 좋습니다.
event
event 는 대리자 함수를 지정할때 접근 제한자를 private로 선언하면 외부에서 사용하기 힘들기 때문에 접근만 가능하게 만들어야 할때 사용합니다
public delegate void delgDelegate(int value);
public event delDelegate OnChanged;