프로그래밍/.NET

[C#]Delegate

건깡 2013. 2. 10. 14:07

Delegate(대리자)

 대리자 : 무엇인가의 일을 대신해주는 사람

 - 어떠한 기능(메서드)을 대신 수행해주는 역활

 - C언어의 함수 포인터와 비슷 


Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateAnonymousLambda
{
    class BatteryLevel
    {
        int currentBatteryLevel;

        // 델리게이트 선언
        public delegate void BatteryLevelBroadcaster(int batteryLevel);
        public BatteryLevelBroadcaster batteryLevelBroadcaster;

        public int CurrentBatteryLevel
        {
            get
            {
                return currentBatteryLevel;
            }
            set
            {
                currentBatteryLevel = value;

                if (batteryLevelBroadcaster != null)
                {
                    batteryLevelBroadcaster(currentBatteryLevel);
                }
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            BatteryLevel batteryLevel = new BatteryLevel();

            // 현재 클래스가 알고 있는 메서드 위임
            batteryLevel.batteryLevelBroadcaster += new BatteryLevel.BatteryLevelBroadcaster(BatteryLevelIndicator);

            batteryLevel.CurrentBatteryLevel = 35;
            batteryLevel.CurrentBatteryLevel = 30;
            batteryLevel.CurrentBatteryLevel = 25;
            batteryLevel.CurrentBatteryLevel = 20;
            batteryLevel.CurrentBatteryLevel = 15;

            Console.ReadLine();
        }

        public static void BatteryLevelIndicator(int newValue)
        {
            Console.WriteLine("New battery level is: {0}", newValue);
        }
    }
}


위에서 보듯이, Program 클래스가 알고 있는 메서드를 BatteryLevel 클래스에서 호출하였습니다.

그리고 하나의 메서드가 아닌 여러개를 추가하거나 삭제할 수도 있습니다.


Program.cs

         static void Main(string[] args)
         {
            BatteryLevel batteryLevel = new BatteryLevel();

            // 현재 클래스가 알고 있는 메서드 위임
            batteryLevel.batteryLevelBroadcaster += new BatteryLevel.BatteryLevelBroadcaster(BatteryLevelIndicator);
            batteryLevel.batteryLevelBroadcaster += new BatteryLevel.BatteryLevelBroadcaster(BatteryLevelIndicator);