[C#] 10. 델리게이트(Delegate)

Connected Brain·2025년 4월 24일

면접 질문 대비

목록 보기
10/60

델리게이트(delegate; 대리자)란 무엇인가요?

한 줄 요약

델리게이트 : 함수를 저장하는 변수. 저장된 함수들을 Invoke를 통해 호출. 저장 시에는 매개변수와 반환 형식이 일치해야함

델리게이트

  • 메서드에 대한 참조를 저장하고 있는 변수, 반환 타입과 매개 변수가 일치하는 함수를 델리게이트에 등록하여 해당 델리게이트를 Invoke();함으로써 등록된 함수를 호출할 수 있다.
  • 반환 타입이 있는 델리게이트는 Func<> 형식을 사용하고, 반환 타입이 없는 델리게이트는 Action<> 형식을 사용한다.
[델리게이트] += [메서드] // 메서드 등록
[델리게이트] -= [메서드] // 메서드 등록 해제
  • 기능이 적절하게 동작하기 위해서 뿐만 아니라 성능을 위해서도 메서드의 등록 해제 관리는 중요

    객체 A가 객체 B의 메서드를 자신의 델리게이트에 등록
    A는 B를 참조하지않으면 델리게이트를 실행할 때 오류가 생기므로 B에 대한 참조를 유지
    만약에 B를 더이상 아무 것도 참조하지 않아도 A에 등록된 메서드 때문에 B가 메모리 상에 유지
    (= 가비지 컬랙션 방해)

  • 이러한 문제가 발생할 수 있기 때문에 적절하게 등록/해제 해주는 것이 중요

사용 예시

  • 버프/디버프의 적용에 델리게이트를 활용하였다. 해당 효과가 있을 때는 효과를 관리하는 클래스의 델리게이트에 버프의 효과적용 함수를 등록하고, 효과의 적용이 끝났을 때 등록을 해제하도록 한다.
/// <summary>
/// 턴이 종료될 때 스택만큼 독 데미지 적용
/// (Bio 타입은 30%)
/// </summary>
public class PoisonEffect : BaseEffect
{
    public PoisonEffect(EffectData effectData, EffectController effectController) : base(effectData, effectController)
    {
        EffectController.OnActionStart += Apply;
    }

    public override void Apply()
    {
        base.Apply();
        ...(데미지를 주는 로직)...
    }

    public override void Exit()
    {
        base.Exit();
        EffectController.OnActionStart -= Apply;
    }
}
  • 해당 독 효과의 클래스에서는 생성될 때 효과를 관리하는 클래스의 델리게이트에 효과 적용 함수를 등록한다.
    (효과 관리 클래스에서는 적용 시점에 따라 여러 델리게이트를 가진다.)
  • Apply에서는 대상에게 데미지를 주는 로직을 실시하는데, 이는 OnActionStart.Invoke()가 호출되는 시점에 실행된다.
  • 효과 적용이 끝날 때는 Exit();을 호출해 델리게이트 연결을 해제한다.

0개의 댓글