[TIL-251228] 델리게이트 / 이벤트

데비·2025년 12월 28일

본과정

목록 보기
19/79

오늘 배운 내용

- 델리게이트

- 이벤트


델리게이트(Delegate)

  • 함수를 명시적으로 호출하지 않아도 조건이 충족되면 대신 함수를 호출해주는 역할을 하는 객체
//	  델리게이트  반환형   이름   (인자)
public delegate void HealthDel(int _health)
public HealthDel OnHealthChanged;
    
    public int Health
    {
        get { return _health; }
        set
        {
            // 체력이 변했다.
            _health = value;
            OnHealthChanged?.Invoke(_health);
            // ? = null이 아닌경우 Invoke
        }
    }

이벤트(Event)

  • 사건과 사건에대한 반응
  • 델리게이트를 사용해 구현된 것으로 객체간의 유연한 통신을 위한 패턴
  • 객체에서 특정 상황 발동시, 등록해놓은 객체에 전달되고, 상황을 전달 받은 객체는 이벤트 핸들러를 호출해 그에 따른 행동을 취한다.
//	  델리게이트  반환형   이름   (인자)
public delegate void HealthDel(int _health)
public event HealthDel OnHealthChanged; // event를 넣어주면 
									 	// 무분별하게 사용하는것을 막아준다.
    
    public int Health
    {
        get { return _health; }
        set
        {
            // 체력이 변했다.
            _health = value;
            OnHealthChanged?.Invoke(_health);
            // ? = null이 아닌경우 Invoke
        }
    }

델리게이트와 이벤트 예시

using System;

public class Tester
{
    public void Run()
    {
        Player player = new();
        GameUI ui = new(player);
        AudioManager audio = new(player);
        
        Console.Clear();
        ui.PrintHealthUI(player.Health);

        while (true)
        {
            ConsoleKey input = Console.ReadKey(true).Key;

            if (input == ConsoleKey.W)
            {
                player.TakeDamage(1);
            }
        }
    }
}

public class Player
{
    private int  _health = 100;
    
    //     델리게이트  반환형   이름  (인자)
    public delegate void HealthDel(int _health);
    public HealthDel OnHealthChanged;
    
    public int Health
    {
        get { return _health; }
        set
        {
            // 체력이 변했다.
            _health = value;
            OnHealthChanged?.Invoke(_health);
            // ? = null이 아닌경우 Invoke
        }
    }

    public void TakeDamage(int damage)
    {
        Health -= damage;
    }

    public delegate void MyDel();
    
    public void GetUserData(AttackDel trueAction, AttackDel falseAction)
    {
        // 만약 공격이 성공했으면 타격음, 실패했으면 휘익? 소리? 출력
        // 모바일 기기 네트워크시
        //
        // 불러오기 요청
            // 대기
        // 유저 정보 찾았으면 trueAction.Invoke();
        // 유저 정보 못 찾았으면 falseAction.Invoke();
    }
}


public class AudioManager
{
    private Player _player;

    public AudioManager(Player player)
    {
        _player = player;
    }

    public void PlaySound(int _)
    {
        Console.WriteLine("사운드 출력");
    }

}


public class GameUI
{
    private Player _player;

    public GameUI(Player player)
    {
        _player = player;
        _player.OnHealthChanged += PrintHealthUI;
        _player.OnHealthChanged += PrintPopUp;
    }

    public void PrintHealthUI(int health)
    {
        Console.WriteLine($"현재 플레이어의 체력 : {health}");
    }
    
    public void PrintPopUp(int damage)
    {
        Console.WriteLine($"플레이어가 데미지를 입었습니다");
        
    }
}

익명함수

  • 특정 이벤트에 따른 동작을 정의하되, 재사용되지 않을 기능들로 구성한다.
voidDel += delegate()
{
	console.WriteLine("익명 함수의 출력")
}
// delegate가 없다면 프로그램 내에서 이 익명함수를 실행할 수 없다.

람다식

voidDel += () => Console.WriteLine("람다의 출력")

0개의 댓글