본문 바로가기
게임 개발 일지/내일배움캠프 TIL

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

by 빛하_ 2024. 2. 1.
기술면접 대비하기 #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 : 펑션은 반환값이 있는 메소드를 참조하는 델리게이트입니다. 펑션 또한 제네릭을 사용하여 참조하는 메소드의 매개변수 타입과 반환타입을 지정할 수 있습니다.

 

 

댓글