Delegate & Event

최정훈·2024년 9월 28일
  • 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; //체인에 A추가
    testDel += B; //체인에 B추가
    
    testDel = A;  //기존에 추가되어 있던 A, B는 삭제하고, 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.testEvent += A;      대입까지는 가능함.
    		//del.testEvent?.Invoke(); 외부 클래스에서 호출이 불가하다.
    		
    		del.EventStart();       // 이렇게 사용할 수 있다. 
    	}
    	
    	public void A(){}
    }
    
    이벤트는 외부에서 델리게이트의 사용을 불가능하게 만든다. 객체의 삭제를 다루는데 있어서, 타인이 삭제하면 문제가 발생할 수 있기 때문에, 본인이 삭제하게 하고자 하는 것.
profile
게임개발자(희망)의 공부일지

0개의 댓글