ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 델리게이트
    C# 2023. 8. 25. 15:00

    I. 델리게이트

      : 메서드를 변수처럼 전달하고 호출할 수 있게 하여, 메서드를 참조할 수 있는 형식.

      : 대리자와 호출할 메서드는 데이터 형식과 매개변수를 통일시켜야함.

      : 실제로는 접근이 불편한 상황일 때, 메서드를 델리게이트로 연결함.

     

    정적 메서드 (Static Method)

     

       : 클래스의 인스턴스 없이 호출이 가능.

       : 클래스의 인스턴스에서는 호출이 불가능, 반드시 클래스명과 함께 호출.

     

    class Methods
    {
        public static Method2(string message)                   
        {
            Console.WriteLine("Method2: " + message);
        }
    }
    
    internal class Program
    {
        static void Main(string[] args)
        {
            Methods.Method2("Hi");              // Method2를 사용하기 위해 클래스도 같이 호출함.
        }
    }

     

     

    하나의 델리게이트는 복수의 메서드를 참조할 수 있다.

     

    using System;
    
    namespace DelegateExercise
    {
        delegate void MyDelegate(string message);
    
        internal class Program
        {
            static void Main(string[] args)
            {
                Methods methods = new Methods();
                // 인스턴스 메서드를 호출할 시, 객체를 만든 후, 호출해야함.
                MyDelegate myDelegate = methods.Method1; // 델리게이트에 메서드 추가
                // 정적 메서드는 바로 호출 가능.
                myDelegate += Methods.Method2;           // 델리게이트에 메서드 추가
    
                myDelegate("Hello!");                    // 델리게이트 실행
    
                Console.ReadKey();
            }
        }
    
        class Methods
        {
            public void Method1(string message)                           // 인스턴스 메서드 선언
            {
                Console.WriteLine("Method1: " + message);
            }
    
            public static void Method2(string message)                    // 정적 메서드 선언
            {
                Console.WriteLine("Method2: " + message);
            }
        }
    }

    >

     

     

    II. 이벤트

      : 클래스 혹은 개체에서 발생하는 특정 상황이 발생했을 때 알리기 위한 메커니즘

    public delegate void EnemyAttackHandler(float damage);
    
    public class Enemy
    {
        public event EnemyAttackHandler OnAttack;
    
        public void Attack(float damage)
        {
            OnAttack?.Invoke(damage);
        }
    }
    
    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);
    }

     

     이벤트를 발생시키는 클래스를 게시자, 이벤트를 받거나 처리하는 클래스를 구독자.

     

     : 클래스 내부에서 이벤트를 발생시키고, 외부에서 이를 구독하여 특정 동작을 수행할 수 있게 함.

     

    public class Enemy
    {
        public event EnemyAttackHandler OnAttack;      // 이벤트 선언 : 게시자
    
        public void Attack(float damage)               
        { // 이벤트가 발생된다면, 발행자 OnAttack에 연결된 메서드들을 실행.
            OnAttack?.Invoke(damage);
        }
    }

     

    public class Player
    {
        public void HandleDamage(float damage)          // 게시자의 이벤트에 연결시킬 메서드
        {
            // 플레이어의 체력 감소 등의 처리 로직
            Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
        }
    }

     

    static void Main()
    {
        Enemy enemy = new Enemy();
        Player player = new Player();
        
        // 게시자의 이벤트(OnAttack)에 외부(Player 클래스의 인스턴스)에서 구독.
        // 델리게이트의 메서드 등록과 동일.
        enemy.OnAttack += player.HandleDamage; 
    
        enemy.Attack(10.0f);    // 이벤트 발생. 이벤트에 등록시킨 메서드 수행.
    }

     

    델리게이트에서 보안성 증가 + 캡슐화 를 한 느낌.

       : 델리게이트는 클래스 외부에서 호출할 수 있는데 반해, 이벤트는 클래스 외부에서 호출할 수 없다.

       : = 연산자로 할당할 수 없다. += 과 -= 으로 추가와 삭제를 할 수 있다.

     

     

     

    'C#' 카테고리의 다른 글

    값형과 참조형  (0) 2023.08.24
    예외 처리  (1) 2023.08.24
    인터페이스와 열거형  (0) 2023.08.24
    텍스트 던전 콘솔로 구현하기 - 작업중 학습(2)  (0) 2023.08.23
    스네이크 게임 만들기 (수정예정)  (0) 2023.08.21
Designed by Tistory.