기술면접 대비하기 #6
델리게이트(Delegate)란?
델리게이트는 메서드를 다른 메서드/클래스로 전달하기 위해 만들어졌다. 델리게이트는 메서드의 입력 파라미터로 전달될 수 있으며, 메서드의 리턴값으로 전달 받을수도 있다. 델리게이트 정의에서 중요한 것은 입력 파라미터와 리턴 타입이다. 어떤 메서드가 델리게이트 메서드의 입력 파라미터 타입/개수, 리턴 타입이 동일하다면 그 메서드는 해당 델리게이트에서 사용할 수 있다. 델리게이트는 컴파일러에서 클래스로 변환되므로 클래스와 비슷하게 new를 사용해 객체를 생성할 수 있다. 호출할 때에는 Invoke 메서드를 주로 사용하지만, invoke 없이 바로 함수처럼 사용할 수도 있다.
위와 같은 특성 덕분에 특정 시점에서 호출해야할 여러 개의 메서드들을 미리 구독시켜둔 다음 한 번에 호출한다거나, 델리게이트 인스턴스를 다른 메서드의 매개변수로 넘겨서 콜백으로 사용하는 방식으로 많이 사용된다. 델리게이트를 이용해 클래스끼리 통신한다면 캡슐화에 도움이 된다. 특정 시점에 델리게이트를 invoke하는 A라는 클래스는 델리게이트에 어떤 메서드들이 들어있는지 알지 못하고, 알 필요도 없기 때문이다. 또, A라는 클래스의 델리게이트에 메서드를 등록한 다른 클래스들도 A라는 클래스와 느슨한 결합 관계를 가질 수 있다.
delegate와 event / action과 func 간의 차이는?
(1) delegate 와 event
게임 내에서 어떤 사건이 발생했을 때, 이를 여러 클래스에 알릴 필요가 있다면 event를 사용한다.
delegate와의 차이로 이벤트는 interface 내부에서도 선언할 수 있다. 또한 이벤트는 public으로 선언되어 있어도 클래스 외부에서 호출할 수 없다. (안정성 추구)
따라서 delegate는 callback 용도로 쓰이고, event는 객체의 상태변화/사건 발생을 알리는 용도로 쓰인다.
(2) action 과 func
action과 func는 c#에서 미리 정의한 delegate 변수이다.
delegate를 매번 선언하기 어려울 때, 반환 타입이 없을 경우 action을 사용하고, 반환 타입이 있다면 func를 사용한다.
Action : 액션은 반환값이 없는 메소드를 참조하는 델리게이트입니다. 다만, 액션은 제네릭을 사용하여 참조하는 메서드의 매개변수 타입을 지정할 수 있습니다.
Func : 펑션은 반환값이 있는 메소드를 참조하는 델리게이트입니다. 펑션 또한 제네릭을 사용하여 참조하는 메소드의 매개변수 타입과 반환타입을 지정할 수 있습니다.
'게임 개발 일지 > 내일배움캠프 TIL' 카테고리의 다른 글
[Unity] 런타임 로드 방식의 차이 (resource폴더, 어드레서블, 에셋번들) (1) | 2024.02.05 |
---|---|
[C#] 스택과 힙, 값과 참조, 동적/정적 할당 (0) | 2024.02.02 |
[Unity] 게임 진행에 따라 round 표시하기 (1) | 2024.01.31 |
[Unity] 2가지 타이머 적용하기(코루틴) (0) | 2024.01.30 |
[C#] 인터페이스와 추상클래스 / 스택과 큐의 차이 (1) | 2024.01.26 |
댓글