오늘 배운 내용
- 델리게이트
- 이벤트
델리게이트(Delegate)
- 함수를 명시적으로 호출하지 않아도 조건이 충족되면 대신 함수를 호출해주는 역할을 하는 객체
public delegate void HealthDel(int _health)
public HealthDel OnHealthChanged;
public int Health
{
get { return _health; }
set
{
_health = value;
OnHealthChanged?.Invoke(_health);
}
}
이벤트(Event)
- 사건과 사건에대한 반응
- 델리게이트를 사용해 구현된 것으로 객체간의 유연한 통신을 위한 패턴
- 객체에서 특정 상황 발동시, 등록해놓은 객체에 전달되고, 상황을 전달 받은 객체는 이벤트 핸들러를 호출해 그에 따른 행동을 취한다.
public delegate void HealthDel(int _health)
public event HealthDel OnHealthChanged;
public int Health
{
get { return _health; }
set
{
_health = value;
OnHealthChanged?.Invoke(_health);
}
}
델리게이트와 이벤트 예시
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);
}
}
public void TakeDamage(int damage)
{
Health -= damage;
}
public delegate void MyDel();
public void GetUserData(AttackDel trueAction, AttackDel falseAction)
{
}
}
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("익명 함수의 출력")
}
람다식
voidDel += () => Console.WriteLine("람다의 출력")