CH.개인기록 노트

C#은 처음이라

C# 이벤트(Event)와 델리게이트(Delegate)

amckdgjs 2024. 3. 11. 16:42

델리게이트

델리게이트(Delegate)는 대리자 라고도 하며 특정 매개 변수 목록 및 변환 형식이 있는 함수에 대한 참조이다.

  • 대리자 인스턴스를 통해 함수를 호출할 수 있다.
  • 델리게이트에 메소드의 주소를 할당 한 후 델리게이트를 호출하면 이 델리게이트가 메소드를 호출해준다.
  • 델리게이트는 메소드에 대한 참조이기 때문에 자신이 참조할 반환형식과 매개변수를 명시해야 한다.

요약하자면 

1.델리게이트 선언

2.선언한 델리게이트가 참조할 메서드 선언

3.델리게이트의 인스턴스를 만들고 델리게이트가 참조할 메서드를 매개변수로 넘김

4.호출

이 순서로 흘러간다고 생각하면 된다.

using System;


namespace _0311
{

    internal class CalC
    {
        public delegate void TestDel(int a, int b);//delegate  선언

        public static void SumNumber(int a, int b)
        {
            Console.WriteLine($"두 수의 합은 {a + b}");
        }
        public static void MinusNumber(int a, int b)
        {
            Console.WriteLine($"두 수의 차이는 {a - b}");
        }
        public static void MulNumber(int a, int b)
        {
            Console.WriteLine($"두 수의 곱은 {a * b}");
        }
        public static void NNumber(int a, int b)
        {
            Console.WriteLine($"두 수의 나누기 {a / b}");
        }
        static void Main()
        {
            TestDel testdel = SumNumber;
                testdel += MinusNumber;
                testdel += MulNumber;
                testdel += NNumber;
                testdel.Invoke(20, 10);
            
            
            
        }
    }
}

델리게이트 체인은 델리게이트 하나가 여러개의 메서드를 동시에 참조할 수 있도록 한다. +=기호를 통해 선언할 수 있다.

이벤트(Event)

이벤트는 일련의 사건이 발생했다 라는 사실을 다른 객체한테 전달한다.이를 통해 객체 간 느슨한 결합(Loose coupling)을 유지할 수 있따.일반적으로 이벤트는 이벤트를 발생시키는 객체를 선언하고,이를 처리할 수 있는 다른 객체(이벤트 헨들러)는 이벤트에 대한 구독을 등록한다.특수한 제약조건이 추가된 델리게이트 라고 생각하자.

  • 이벤트는 +=와 -=를 사용해야한다.직접 호출은 불가능하다.
  • += -> 이벤트에 반응할 객체의 추가할 함수이다 = 참조 추가
  • -= -> 이벤트에 반응할 객체의 제거할 함수이다 = 참조 제거

이벤트는 'event'라는 키워드를 사용하여 선언된다. EventHandler라는 이름의 델리게이트를 선언해서 정의한다.

이벤트핸들러는 이벤트가 발생했을 때 호출될 메서드를 정의한다.

 

이벤트의 활용?

  • UI 이벤트 처리 
  • 상태 변경 감지
namespace _03_11_homework
{
    
    public class Player {
        public event Action StartAttack;

        public void Attack()
        {
            Console.WriteLine("공격을 시작한다!");
            if (StartAttack != null) StartAttack();
        }
        
    }
    public class  SwordSkill
    {
        public void PowerSkill()
        {
            Console.WriteLine("파워 스트라이크!");
        }

    }
    public class MagicSkill
    {
        public void IntSkill()
        {
            Console.WriteLine("매직 클로!");
        }
    }
    public class ThiefSkill
    {
        public void LukSkill()
        {
            Console.WriteLine("럭키 세븐 !");
        }
    }

    internal class Program
    {
       
        static void Main(string[] args)
        {
            Player player = new Player();
            SwordSkill sword = new SwordSkill();
            MagicSkill magic = new MagicSkill();
            ThiefSkill thief = new ThiefSkill();

            player.StartAttack += sword.PowerSkill;
            player.StartAttack += magic.IntSkill;
            player.StartAttack += thief.LukSkill;

            player.Attack();
            Console.WriteLine("플레이어가 공격을 종료합니다");
            

           
        }
    }
}

 

'C#은 처음이라' 카테고리의 다른 글

C# 자료구조 (큐Queue)  (0) 2024.03.12
C# 자료구조(스택)  (0) 2024.03.12
C# 일반화(Generic)  (1) 2024.03.08
C# 문자열(string)  (0) 2024.03.07
C# 가상함수  (0) 2024.03.06