[C#동영상]C# 델리게이트(Delegate), 델리게이트는 언제 필요할까?, 윈도우 이벤트, 콜백구현시 사용, C#학원, C#교육, C#자바교육, C#자바학원
http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=410
ojc.asia
https://www.youtube.com/watch?v=HqxRtDmyErg&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=18

https://www.youtube.com/watch?v=p9H3cDRjS7M&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=17

https://www.youtube.com/watch?v=z2pVtukbe_o&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=19

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=410
ojc.asia

델리게이트(Delegate)
델리게이트는 언제 필요할까?
델리데이트는 언제 필요할까?
⓵ 윈도우 프로그램에서 이벤트에 가입할 때 델리게이트로 가입하고 이벤트가 호출되면 델리게이트가 참조하는 메서드가 실행된다.
⓶ 델리게이트(Delegate)는 자기 자신이 실제 하는 일은 없고 단지 가리키고 있는 메소드를 호출하여 실행시키는 역할을 한다. 이러한 메서드에 대한 참조를 가리키고 있으므로 불가능한 작업 등이 가능해 지는데, Delegate 다른 함수의 인자로 넘겨주게 되면 그 함수는 델리게이트가 던지는 함수의 참조를 이용하여 실행 시점에 호출될 함수를 결정 할 수 있다.
아래와 같은 버블정렬이 있다고 하자.

for (int i = 1; i < obj.Length; i++) {
for (int j = 0; j < i; j++) {
//비교대상 둘중 i는 뒤에 있는것, j는 앞에 있는것
//뒤집을지 말지를 결정하는 부분, 앞의것이 크면 바꾸므로 현재는 오름차순
if (obj[j] > obj[i]) {
int temp = obj[i]; // i 와 j 바꾸기
obj[i] = obj[j];
obj[j] = temp;
}
}
}
만약 버블정렬의 데이터가 위와 같은 숫자가 아니고 객체라면 현재와 같은 구조에선 곤란하다. 이는 사용자가 어떤 식으로 클래스등을 정의해 놓았는지 알수가 없기 때문이다. 사용자에게 여러분이 만든 버블정렬 컴포넌트를 판매한다고 가정한다면 각 사용자를 위해 다른 프로그램을 만든다는 건 말도 안 되는 이야기 이다. 이럴 때 필요한 것이 바로 델리게이트이다.
우리가 만든 버블 소트기가 범용의 소트기가 되기 위해서 소트기를 구매한 사용자는 ❶정렬을 원하는 대상과 어떻게 정렬할지를 버블 소트기에 알려주도록 델리게이트가 ➋참조할 메소드를 만들어야 한다. 예를들면 사원들을 급여오름차순으로 정렬할지, 이름 오름차순으로 정렬할지등은 구매자가 작성을 해야 하는 부분이다.
namespace Deletest
{
//우리의 버블 소트기를 구매한 사용자는 OjcDelegate가 참조하는 메소드를 만들어서
//정렬의 기준을 제공하도록 한다.
delegate bool OjcDelegate(object obj1, object obj2);
//---------------------------------
//우리가 만든 버블 소트기
//---------------------------------
class OjcSorter
{
//obj는 정렬 대상, 정렬의 타겟
//deli는 뒤집을지 말지를 결정하는 메소드를 참조하는 델리게이트
public static void BubbleSort(object[] obj, OjcDelegate deli)
{
object tmp;
for (int i = 1; i < obj.Length; i++)
{
for (int j = 0; j < i; j++)
{
//사용자가 작성한 정렬의 기준이되는 메소드를 호출하여 뒤짚을지를 결정
//비교대상 둘중 i는 뒤에 있는것, j는 앞에 있는것
if (deli(obj[j], obj[i]))
{
tmp = obj[i];
obj[i] = obj[j];
obj[j] = tmp;
}
}
}
}
//----------------------------------------------------------------------------------------
class Dog
{
string name;
public Dog(string name) => this.name = name;
public static bool MySort(object d1, object d2)
{
//이름순 오름차순정렬을 위해
//앞에 있는 d1.name이 크면 뒤집으라고 true를 리턴
//return String.Compare(d1.ToString(), d2.ToString()) > 0 ? true : false;
return ((((Dog)d1).name.CompareTo(((Dog)d2).name) > 0) ? true : false);
}
public override String ToString()
{
return "Dog : " + name;
}
}
//--------------------------------------------------------------------------------------
class Emp
{
string name;
int sal;
public Emp(string name, int sal)
{
this.name = name;
this.sal = sal;
}
public static bool MySort(object e1, object e2)
{
//급여순 오름차순정렬을 위해
//앞에 있는 e1.sal이 크면 뒤집으라고 true를 리턴
return ((((Emp)e1).sal > ((Emp)e2).sal) ? true : false);
}
public override String ToString()
{
return "Emp : " + name + ", " + sal;
}
}
//---------------------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
Dog[] d = new Dog[4];
d[0] = new Dog("멍멍이"); d[1] = new Dog("푸들이");
d[2] = new Dog("진도이"); d[3] = new Dog("삽살이");
OjcDelegate deli = new OjcDelegate(Dog.MySort);
//d:정렬대상, deli:뒤집을기준을정의한 메소드를 참조하는 델리게이트
OjcSorter.BubbleSort(d, deli);
Console.WriteLine("<<<<<<<<< Dog 정렬된 후 >>>>>>>");
foreach (Dog dog in d)
{
Console.WriteLine(dog);
}
Console.ReadLine();
Emp[] e = new Emp[4];
e[0] = new Emp("홍길이", 900); e[1] = new Emp("남길이", 800);
e[2] = new Emp("오라클자바커뮤니티", 5000); e[3] = new Emp("김길동", 100);
deli = new OjcDelegate(Emp.MySort);
//e:정렬대상, deli:뒤집을기준을정의한 메소드를 참조하는 델리게이트
OjcSorter.BubbleSort(e, deli);
Console.WriteLine("<<<< Emp 급여순 정렬된 후 >>>>");
foreach (Emp emp in e)
{
Console.WriteLine(emp);
}
}
}
}
}
#델리게이트, #Delegate, #콜백, #콜백이란, #시샵교육, #닷넷교육, #시샵학원, #닷넷학원, #시샵동영상, #닷넷동영상, 델리게이트, Delegate, 콜백, 콜백이란, 시샵교육, 닷넷교육, 시샵학원, 닷넷학원, 시샵동영상, 닷넷동영상,
댓글 없음:
댓글 쓰기