개발자 성장일지

Part Delegate 본문

인프런/C# 프로그래밍 기초

Part Delegate

hdigimon 2023. 12. 7. 15:21

1. Method를 값으로 갖는 타입

  • int a = 3 (3이라는 값을 갖는 타입)
  • Student st = new Student(); (Student 객체를 갖는 타입)
  • delegate void MyDelegate(int a); (함수를 값으로 갖는 타입)

코드

더보기
namespace Chapter17_1
{
    internal class Exam17_1
    {
        delegate void MyDelegate(int val);
        delegate int MyDelegate1(int val);
        public void Run()
        {
            int a = 3;
            Console.WriteLine(a);
            Student st = new Student();
            st.Name = "rkdrkd";
            Console.WriteLine(st);

            DelegateTest(3);
            MyDelegate date = new MyDelegate(DelegateTest) ;
            MyDelegate1 date1 = new MyDelegate1(DeleteTest1) ;
            
        }

        private void DelegateTest(int myVal)
        {
            Console.WriteLine($"DelegateTest() Called {myVal}");
        }

        private int DeleteTest1(int myVal)
        {
            return myVal = 1;
        }
    }
}

 

2.  ConsoleMenu

 

   1. callback

  • 프로그래밍에서 한 함수(메서드)를 다른 함수의 인수로 전달하여, 어떤 이벤트가 발생했을 때, 시스템이나 라이브러리에서 호출되도록 하는 매커니즘

Delegate를 활용한 ConsoleMenu 실습

더보기

Exam17_2.cs

namespace Chapter17_2
{
    internal class Exam17_2
    {
        ConsoleMenu Menu;
        public Exam17_2() 
        {
            Menu = new ConsoleMenu();
        }
        public void Run()
        {
            CreateMenu();
            for(; ; )
            {
                Menu.Show();
                Menu.Read();
            }
        }

        private void CreateMenu()
        {
            Menu.MenuList.Add(new MenuItem("1", "Menu_Title1", Menu_1_callback));
            Menu.MenuList.Add(new MenuItem("2", "Menu_Title2", Menu_2_callback));
            Menu.MenuList.Add(new MenuItem("q", "프로그램 종료", Quit_Callback));
        }

        private void Quit_Callback(object sender, MenuArgs args)
        {
            Console.WriteLine($"Menu_1_Callback() 호출됨 sender = {sender.ToString()} args = {((MenuKeyPressArgs)args).MenuChar}");
            Console.WriteLine("bye!!");
            Environment.Exit(0);

        }

        private void Menu_1_callback(object sender, MenuArgs args)
        {
            Console.WriteLine($"Menu1_Callback() 호출됨 sender = {sender.ToString()} args = {((MenuKeyPressArgs)args).MenuChar}");
        }

        private void Menu_2_callback(object sender, MenuArgs args)
        {
            Console.WriteLine($"Menu2_Callback() 호출됨 sender = {sender.ToString()} args = {((MenuKeyPressArgs)args).MenuChar}");
        }
    }
}

 

ConsoleMenu.cs

namespace Chapter17_2
{
    internal class ConsoleMenu
    {
        public List<MenuItem> MenuList { get; set; }
        public ConsoleMenu() 
        {
            MenuList = new List<MenuItem>();
        }

        public void Show()
        {
            foreach (MenuItem item in MenuList) 
            { 
                Console.WriteLine($"{item.MenuChar},  {item.MenuTitle}");
            }
            Console.WriteLine();
        }

        public void Read()
        {
            Console.WriteLine("메뉴선택 : ");
            string reVal = Console.ReadLine();  //1,2,q
            foreach (MenuItem item in MenuList) 
            {
                if (item.MenuChar == reVal && item.MenuKeyPress != null)
                    item.MenuKeyPress(this, new MenuKeyPressArgs(reVal));   // delegate 호출
            }
        }
    }
}

 

MenuArgs.cs

namespace Chapter17_2
{
    internal class MenuArgs
    {
    }

    class MenuKeyPressArgs : MenuArgs 
    {
        public string MenuChar { get; set; }

        public MenuKeyPressArgs(string menu_char)
        {
            MenuChar = menu_char;
        }
    }

}

 

MenuItem.cs

namespace Chapter17_2
{
    internal class MenuItem
    {
        public delegate void MenuKeyPressDelegate(object sender, MenuArgs args);
        public string MenuChar {  get; set; }   //1
        public string MenuTitle { get; set; }   //Menu1
        public MenuKeyPressDelegate MenuKeyPress { get; set; }  //func{sender, args}

        public MenuItem(string menu_char, string menu_title, MenuKeyPressDelegate dele) 
        {
            MenuChar = menu_char;
            MenuTitle = menu_title;
            MenuKeyPress = dele;
        }

        public MenuItem() : this(null, null, null)
        {

        }
    }
}

'인프런 > C# 프로그래밍 기초' 카테고리의 다른 글

Part BCL(Base Class Library) - 2  (0) 2023.12.13
Part BCL(Base Class Library) - 1  (0) 2023.12.09
Part 제네릭, GENERICS  (0) 2023.12.06
Part 구조체  (1) 2023.12.05
Part 인터페이스 - 2  (0) 2023.12.04