개발자 성장일지
Part Delegate 본문
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 |