- delegate ‘대리자’라는 의미. 함수를 타입화 한 것으로, 함수의 주소값을 가지고 함수를 대신 호출할 수 있다. 매개변수와 리턴 타입을 통해서 정의되며, 이후 매개변수, 리턴 타입이 같은 매서드들과 호환하여 이 매서드에 대한 참조를 가질 수 있다. 매서드들을 담아두는 역할을 하는 등 다양한 곳에 사용된다. 하지만, 델리케이트를 가지지 않는 외부 클래스에서도 호출할 수 있다는 점에서 정보 은닉성 문제가 발생할 수 있다.
public delegate void VoidDel();
public VoidDel del;
public void Awake(){
del += Hello;
}
public void Start(){
del?.Invoke();
}
public void Helle(){
Debug.Log("Hello");
}
- delegate chain 하나의 delegate에 여러 개의 함수를 참조 시키는 것.
public delegate void TestDel();
public TestDel testDel;
public void A(){}
public void B(){}
testDel += A;
testDel += B;
testDel = A;
- event 하는 일 자체는 델리케이트와 비슷(거의 동일). 하지만, 이벤트는 해당 이벤트를 가진 클래스만 호출이 가능하다. delegate가 가지는 정보 은닉성의 문제를 보완할 수 있다.
public class TestDelegate{
public delegate void TestDelegate();
public event TestDelegate testEvent;
public void EventStart(){
testEvent += A;
testEvent?.Invoke();
}
}
public class ExternalClass{
void Start(){
TestDelegate del = new TestDelegate();
del.EventStart();
}
public void A(){}
}
이벤트는 외부에서 델리게이트의 사용을 불가능하게 만든다. 객체의 삭제를 다루는데 있어서, 타인이 삭제하면 문제가 발생할 수 있기 때문에, 본인이 삭제하게 하고자 하는 것.