q 메서드의 대리자
 
q 메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화할 있게 만들어 주는 방법

 

Delegate 주는 장점은 메서드 자체가 캡슐화 되어있기 때문에 메서드를 보다 효율적으로 사용할 있게 줍니다. 다음은 Delegate 간단한 구현입니다.

 

using System;

delegate void SimpleDelegate1();

delegate void SimpleDelegate2(int i);

class AType{

     public void F1() {

          System.Console.WriteLine("AType.F1");

     }

     public void F2(int x){

          System.Console.WriteLine("AType.F2 x=" + x);

     }

}

class DeleTest {

       public static void Main(){

          AType atype = new AType();

        SimpleDelegate1 s1 = new SimpleDelegate1(atype.F1);

        SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2);

        s1();

        s2(1000);

    }//main

}//class

 

메서드를 캡슐화하여 사용할 있다는 것은 아주 단순한 기능입니다. 단순한 기능만큼이나 Delegate 파워는 굉장합니다. 다음과 같은 경우를 예를 들어보죠. 만약 하나의 클래스에서 다른 것은 필요 없고 단지 특정객체의 메서드에만 관심이 있다고 가정해보죠. 특정객체의 메서드는 객체의 멤버로 소속되어 있기 때문에 객체의 모든 기능을 사용할 있을 것입니다. 그런데 어떻게 메서드만을 빼올까라는 생각을 하게 것입니다.

 

C#에서 스레드를 실행한다는 것은 이와 비슷합니다. C#에서 사용되는 모든 스레드는 하나의 표준 스레드에 메서드만 추가 시켜주고 스레드를 시작하면 작업을 수행합니다. 만약 메서드 10개가 있다면 표준 스레드 10개를 만들고, 메서드를 표준 스레드에 하나씩 넣어주고 실행하라고 명령을 내리면 10개의 스레드가 동시에 작업을 수행하게 됩니다.

 

스레드와 메서드의 관계는 아주 단순합니다. Main() 메서드도 알고 보면 스레드입니다. 표준 스레드에 Main() 넣어주고 실행해 달라는 것이니까요. , 10개의 Main 동시에 돌린다고 가정해 보죠. 이럴 때는 10개의 표준 스레드가 필요하고 10개의 Main() 메서드를 각각 넣어준 실행을 하면 10개의 스레드는 CPU Time 분할해서 사용하게 되는 것입니다. 너한번 다른 너한번...... 그리고 마지막으로 나한번! , 표준 스레드 입장에서는 항상 스레드가 수행되어지기 전에 어떤 메서드가 들어올지 궁금해 것입니다. 이런 면에서 스레드는 다른 객체의 메서드만을 빼와서 수행하고자 것입니다. 스레드는 메서드를 Delegate 포장해서 메서드만을 달라고 요청하는 것입니다. 실제 스레드를 실행하기 위한 예는 다음과 같습니다.

 

n                  Top t = new Top();

n                  Thread  t = new Thread(new ThreadStart(t.메서드));

n                  thread.Start();

 

C#에서 등장하는 Delegate 스레드, 이벤트에서 아주 중요한 역할을 담당하고 있습니다. 메서드를 캡슐화하여 이용하고자 한다면 어디든 등장하는 놈이 바로 Delegate입니다. 특정 객체에서 메서드를 직접 호출하는 것보다 메서드의 표준틀을 이용하여 사용하는 것이 휠씬 쉬우니까요. 그리고 사실 Delegate C++에서 메서드의 주소호출에 해당합니다. 메서드의 특정 주소를 이용하여 메서드를 더욱 안전하고 쉽게 호출하겠다는 의미를 담고 있습니다. 그대로 Delegate 메서드의 대리자가 되는 것입니다.

 

 

출처 : 소설 같은 C#

신고
Posted by 나비 나비:D

delegate string GetTextCallback();
public string GetText()
{
    if (this.cb_DataSelectTime.InvokeRequired)
    {
        GetTextCallback callback = new GetTextCallback(GetText);
        return (string) this.Invoke(callback, new object[] { });
    }
    else
    {
        return this.cb_DataSelectTime.Text;
    }
}

delegate void SetTextCallback();
public string SetText()
{
    if (this.cb_DataSelectTime.InvokeRequired)
    {
        SetTextCallback callback = new GetTextCallback(SetText);
        return (string) this.Invoke(callback, new object[] { });
    }
    else
    {
        return this.cb_DataSelectTime.Text;
    }
}


일단 Set 과 Get형식의 델리게이트..

UI의 값을 참조시에는 Delegate와 INvokeRequired를 사용하여 호출 해주어야 한다.....

왜?? 아직 잘모르겠따 ㅡㅡ;;;;
생각보다 delegate가 먼말인지 모르겠돠 ㅡㅡ;;; 쟁장..

신고
Posted by 나비 나비:D

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
----------------------------- (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

글 보관함

달력

«   2017/08   »
    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 31    
Total : 870,086
Today : 41 Yesterday : 412