티스토리 뷰

C#

10. 델리게이트

루체도 2020. 2. 6. 21:05

델리게이트

 C#에서 이 델리게이트는 콜백을 구현하기 위해 사용이 된다.

 델리게이트는 메소드에 대한 참조이다. 델리게이트에 메소드의 주소를 할당한 후

 델리게이트를 호출하면 이 델리게이트가 메소드를 호출해준다.

   한정자 delegate 반환형식 델리게이트명(매개변수);

 델리게이트는 delegate 키워드를 제외하고는 메소드와 매우 유사하다.

 메소드의 참조이기 때문에 자신이 참조할 메소드의 반환 형식매개 변수를 명시해줘야 한다.

 한가지 알아둬야 할 것은 델리게이트는 인스턴스가 아닌 형식(Type)이라는 것이다.  int, string과 같은 형식이다.

 따라서 메소드를 참조하기 위해서는 인스턴스를 따로 만들어야 한다.

delegate double TestDelegate(double num1, double num2);

double Plus(double num1, double num2)
{
  return num1 + num2;
}

double Minus(double num1, double num2)
{
  return num1 - num2;
}

TestDelegate test;
test = new TestDelgate(Plus);
Console.WriteLine(test(10.2, 30.1));

test를 선언할 때 Plus() 메소드를 매개 변수로 넘겨주면 Plus() 메소드를 콜백하고

Minus를 넘겨주면 Minus() 메소드를 콜백해준다.

 

델리게이트 체인

 델리게이트 하나가 여러 개의 메소드를 동시에 참조하는 것이다.

delegate void Order(string menu);

void CallServer(string menu)
{
  Console.WriteLine("{0} 하나 주세요", menu);
}

void TellMenuForChef(string menu)
{
  Console.WriteLine("{0} 하나요", menu);
}

void GiveMenu(string menu)
{
  Console.WriteLine("{0} 나왔습니다", menu);
}

 이렇게 선언한 메소드들은 Order 델리게이트의 인스턴스가

 자신들을 동시에 참조하도록 다음처럼 += 연산자를 이용해 결합시킬 수 있다.

Order please = new Order( CallServer);
please += new Order(TellMenuForChef);
please += new Order(GiveMenu);

please("햄버거");
//
햄버거 하나 주세요
햄버거 하나요
햄버거 나왔습니다.

이렇게 델리게이트를 한번만 호출하면 자신이 참조하고 있는 메소드 모두를 호출하게 된다.

여러 개의 콜백을 동시에 호출해야 할 때 유용하다.

이 외의 방법도 있는데 이 방법이 제일 사용하기 편해서 이 방법만 작성해 놓으려고 한다.

특정 델리게이트를 끊어내야 할 때는 -= 연산자를 이용하면 된다.

 

이벤트

 이벤트는 델리게이트에 event 키워드로 수식한 것이다.

 델리게이트와의 차이점으로는 이벤트는 public으로 선언되어 있어도 자신이 선언되어 있는 클래스 외부에서는

 호출이 불가능 하다는 것이다.

delegate void EventHandler(string msg);

class Notifi
{
  public event EventHandler Something;
}

class MainApp
{
  static void Main(string[] args)
  {
    Notifi noti = new Notifi();
    noti.Something("Hello"); // Error!
  }
}

 

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

11. 람다식  (0) 2020.02.06
9. 컬렉션  (0) 2020.02.05
8. 컬렉션  (0) 2020.02.03
7. 프로퍼티  (0) 2020.02.03
6. 인터페이스와 추상클래스  (0) 2020.01.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함