Delegate, Event , Ramda

2013. 7. 4. 18:03Java

 

 

A.     Delegate : 대리, 위임, 할당 이라는 뜻을 가지고 있는 명사

 

A.     메서드의 실행을 대행하는 역할

B.     위임 객체 : 클래스와 마찬가지로 선언 후 객체 생성을 통해 사용

C.     위임의 형식은 호출할 메서드의 형식과 동일하게 선언

D.     객체 메서드 or 정적 메서드 모두 가능

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

 

B.      위임 선언

 

A.     Public delegate 반환형 위임명(인자 리스트);

B.     위의 위임 객체는 동일한 형식의 메서드를 대신 호출 한다.

C.     public delegate void SampleDelegate(int a);

                i.         public static void M1(int a);   // 해당 메서드는 호출 가능

               ii.         public void M2(int a);     // 해당 메서드도 호출 가능

              iii.         public int M3(int a);  // 불가 반환타입이 다름.

              iv.         Public void M4(int a, int b);    //불가 인자 개수 다름

               v.         Public void M5(string a);                  //불가 인자 타입 다름.

 

C.      예제


public delegate void Sample(int a);                //
델리게이트 선언
class TestDelegate
{
   static void Main(string[] args)
   {
      Test t = new Test(10);
      // +5 plus()
객체 메서드 호출
      t.plus(5);
      Console.WriteLine(t.N);    //value = 15
    
     //
델리게이트 객체 생성, 메서드 이름을 인자 값으로 넣는다.
    Sample s = new Sample(t.plus);
   
     //
델리 게이트 호출(대리 실행

     s(5);
     Console.WriteLine(t.N); //value = 20

    Sample s2 = new Sample(t.minus);
    s2(10);  
    Console.WriteLine(t.N); //value = 10

    Test.hello(100);
    Sample s3 = new Sample(Test.hello);
    s3(200); 
   }

// Part 2 (
위임 연산 (delete + delete)
   static void Main(string[] args)
   {
      Test t = new Test(10);
      Sample s = new Sample(t.plus);
      s(10);  // 10
à
20;
      //
위임 연산
(delete + delete);
      Sample s2 = new Sample(t.Minus);
      s2(5);      //20
à
15
      Sample s3 = s + s2;
      s3(10);    // 15
à
15
      // 1.
기존에 위임객체에 메서드를 추가하려면
,
      s3 += new Sample(Test.Hello); 
      s3(10); //
가지고 있는 메서드들이 차례대로 진행됨
.
      s3 -= new Sample(t.plus);
      s3(10);   // minus
하고 test.Hello 만 호출됨
.
   }

}

//
일반 메서드는 객체 메서드로 들어감

//
정적 메서드는 클래스로

class Test
{
   private int n;
   public int N
   {
     get{ return this.n; }
   }
   public Test(int n)
   {
     this.n = n;
   }
   public void plus(int n)
   {
     this.n += n;
   }
   public void minus(int n)
   {
     this.n -= n;
   }
   public static void hello(int n)
   {
     Console.WriteLine(n);
     // static method
에서는 this 를 사용할 수 없다.
   }  
}

 

D.     Event( 객체에서 일어날 수 있는 사건) 과 이벤트 구조

 

A.     동작을 수행하는 방식

B.     Publisher (출판자) : 이벤트를 발생하여 특정 구독자에게 이벤트 발생을 알려준다.

C.     Subscriber(구독자) : 특정 이벤트 발생 통보를 받고, 출판자로부터 호출되어질 메서드를 미리 등록한 객체.

D.     Event Handler(이벤트 핸들러) : 호출 되어지는 메서드

E.      클래스의 멤버로 들어감.

F.      사건이 발생하면 à 준비된 코드 실행(메서드 호출)à Delegate 위임 호출 à 메서드를 대리호출

                i.         예제
class Example
{
 static void Main(stirng []  args)
 {
  MyButton btn1 = new MyButton(“
버튼1”);
 // click
발생 -> 호출될 메서드

 // click – delegate – method
연결 작업
 // btn
객체에 click 이벤트를 등록완료
  btn1.Click += new ClickEvent(ButtonClick);
 }

 public static void ButtonClick(object sender, MyEventArgs args)
 {
  MyButton btn = (MyButton)sender;
  Console.WriteLine(btn.Text);
 }
}

//
위임 선언

public delegate void ClickEvent(object sender, MyEventArgs args);

//EventArgs :
사건이 터졌을 때 사건과 관련된 정보를 가지는 클래스
public class MyEvenetArgs : EventArgs
{
  private int clickCount;
  public MyEventArgs(int count)
  {
    this.clickCount = count;
  }
  public int ClickCount
  {
   get { return this.clickCount ; }
  }
}

public class MyButton
{
 private string text; //
버튼의 라벨
// public event
델리게이트 click;
 pubilc event ClickEvent click;

 public MyButton() : this(“”) { } //
생성자 초기리스트
.
 public MyButton(string text)
 {
  this.text = text;
 }
 public string Text
 {
   get { return text; }
   set { text = value; }
 }
}

 

               ii.         람다 :  “=>” 요 표시가 들어가면 람다라고 한다.

1.      예제 1

A.     Public delegate int Alpha(int GIVEN);

B.     Alpha a = x => x*x ;  //간단하게 x 라는 인수를 x*x 로 리턴한다라는 의미

C.     Console.WriteLine(a(10));  // 요러면 100이 나옴.

D.     Alpha a = x => { return x*x; };  //위와 동일한 결과, return을 써도 되고..

E.      Alpha a = x => {console.WriteLine(“TEST”); return x*x; };  // 더 추가해도 되고, Alpha a = (x,y) => x*y;  // 요건 파라미터가 2개 이상일 때