C# 4주차 - 델리게이트

Amberjack·2024년 1월 2일
0

C# 문법

목록 보기
28/44
post-thumbnail

델리게이트(Delegate)

델리게이트?

  • 델리게이트란 메서드를 참조하는 타입! → 메서드를 변수에 저장한다.
  • 다른 프로그래밍 언어의 함수 포인터와 비슷하다.
  • 델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.

델리게이트 구현

  • 메서드 등록해서 사용하기
delegate int Calculate(int x, int y);

// delegate를 사용하고자 하는 메서드는 delegate와 같은 형식의 매개변수를 받아야 한다.
static int Add(int x, int y)
{
    return x + y;
}

class Program
{
    static void Main()
    {
        // 메서드 등록
        Calculate calc = Add;

        // 델리게이트 사용
        // Add(3, 5)를 하는 것과 같다.
        int result = calc(3, 5);
        Console.WriteLine("결과: " + result);
    }
}
  • 하나 이상의 메서드 등록하기
delegate void MyDelegate(string message);

static void Method1(string message)
{
    Console.WriteLine("Method1: " + message);
}

static void Method2(string message)
{
    Console.WriteLine("Method2: " + message);
}

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성 및 메서드 등록
        MyDelegate myDelegate = Method1;
        myDelegate += Method2;

        // 델리게이트 호출
        myDelegate("Hello!");

        Console.ReadKey();
    }
}

사용 예제 - 공격 콜백 받기

  • event : 할당연산자(=)를 사용할 수 없으며, 클래스 외부에서는 직접 event를 호출할 수 없다.
// 델리게이트 선언
public delegate void EnemyAttackHandler(float damage);

// 적 클래스
public class Enemy
{
    // 공격 이벤트
    public event EnemyAttackHandler OnAttack;

    // 적의 공격 메서드
    public void Attack(float damage)
    {
        // 이벤트 호출
        OnAttack?.Invoke(damage);
				// null 조건부 연산자
				// null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
    }
}

// 플레이어 클래스
public class Player
{
    // 플레이어가 받은 데미지 처리 메서드
    public void HandleDamage(float damage)
    {
        // 플레이어의 체력 감소 등의 처리 로직
        Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
    }
}

// 게임 실행
static void Main()
{
    // 적 객체 생성
    Enemy enemy = new Enemy();

    // 플레이어 객체 생성
    Player player = new Player();

    // 플레이어의 데미지 처리 메서드를 적의 공격 이벤트에 추가
    enemy.OnAttack += player.HandleDamage;

    // 적의 공격
    enemy.Attack(10.0f);
}

해당 코드에 대한 설명

  • 회색 선 :
  1. enemy.OnAttack += player.HandleDamage;가 실행되면,
  2. Player 클래스의 public void HandleDamage(float damage)가 Enemy 클래스의 EnemyAttackHandler OnAttack;에 연결된다.
  • 하얀 펜 :
  1. 그 후 맨 마지막 줄의 enemy.Attack(10.0f);가 호출되면 public void Attack(float damage)에 damage가 10.0f가 들어간다.

  2. Enemy 클래스의 OnAttack?.Invoke(damage);의 damage에 10.0f가 할당된다.

  3. 이후, Player의 public void HandleDamage()가 실행된다.

0개의 댓글