카테고리 없음

[C#] 델리게이트와 이벤트 / action과 func

빛하_ 2024. 1. 29. 21:41

 

기술면접 대비하기 #6

 

델리게이트(Delegate)란?

델리게이트는 메서드를 다른 메서드/클래스로 전달하기 위해 만들어졌다. 반환 타입과 매개변수 타입이 같은 메서드의 포인터를 가리킬 수 있는 C#의 기능이다. 델리게이트는 메서드의 입력 파라미터로 전달될 수 있으며, 메서드의 리턴값으로 전달 받을수도 있다. 델리게이트 정의에서 중요한 것은 입력 파라미터와 리턴 타입이다. 어떤 메서드가 델리게이트 메서드의 입력 파라미터 타입/개수, 리턴 타입이 동일하다면 그 메서드는 해당 델리게이트에서 사용할 수 있다. 델리게이트는 컴파일러에서 클래스로 변환되므로 클래스와 비슷하게 new를 사용해 객체를 생성할 수 있다. 호출할 때에는 Invoke 메서드를 주로 사용하지만, invoke 없이 바로 함수처럼 사용할 수도 있다.

 

델리게이트 체인이란, 같은 타입의 메서드를 여러 개 등록해 invoke 시 등록된 메서드들을 일제히 호출시키는 방법이다.  

특정 시점에서 호출해야할 여러 개의 메서드들을 미리 구독시켜둔 다음 한 번에 호출하거나, 델리게이트 인스턴스를 다른 메서드의 매개변수로 넘겨서 콜백하는 방식으로 많이 사용한다. 델리게이트를 이용한 클래스 간 결합은 캡슐화에 도움이 된다. 특정 시점에 델리게이트를 invoke하는 A라는 클래스는 델리게이트에 어떤 메서드들이 들어있는지 알지 못하고, 알 필요도 없다. A라는 클래스의 델리게이트에 메서드를 등록한 다른 클래스들도 A라는 클래스와 느슨한 결합 관계를 가질 수 있다.

 

 

'delegate', 'event', 'action', 'func' 간의 차이?

(1) delegate 와 event

델리게이트는 메서드에 대한 참조를 저장하는 객체이다.

델리게이트 타입은 메서드의 매개변수 타입, 반환타입 을 기반으로 정의된다.

 

이벤트는 델리게이트의 특별한 형태로 [특정 클래스 내에서만] 발생하도록 제한된 델리게이트이다.

클래스 외부에서 직접 호출되는 것을 방지하고, 전달/호출 간 안전성을 향상시킬 수 있다. 

게임 내에서 어떤 사건이 발생했을 때, 이를 여러 클래스에 알릴 필요가 있다면 event를 사용한다.

 

 - delegate와 event의 차이

이벤트는 interface 내부에서도 선언할 수 있다.

이벤트는 public으로 선언되어 있어도 클래스 외부에서 호출할 수 없다. (안정성 추구)

따라서 delegate는 callback 용도로 쓰이고, event는 객체의 상태변화/사건 발생을 알리는 용도로 쓰인다.

 

(2) action 과 func

action과 func는 c#에서 미리 정의한 delegate 변수이다. 

action은 반환값이 없는 메서드를 참조하는 델리게이트이다. 이 때 제네릭을 사용해 참조하는 메서드의 매개변수 타입을 지정할 수 있다.

func는 반환값이 있는 메서드를 참조하는 델리게이트이다. 제네릭을 사용해 참조하는 메서드의 매개변수 타입과 반환타입을 지정할 수 있다.

action과 func를 활용함으로써 객체에서 delegate를 매번 선언하는 번거로움을 덜 수 있다.