White Whale Studio

Delegate / 대리자 본문

IT Engineering/C#.net

Delegate / 대리자

glorymind 2016. 6. 23. 14:14
반응형

Delegate는 대리, 위임이라는 뜻을 가집니다. 언뜻 뜻과는 잘 부합시키기가 어렵네요.


Delegate와 관련하여 제가 정리한 항목들을 우선 나열해보겠습니다.


1. Delegate는 메서드를 매개인자(Parameter)로 전달할 수 있다.


2. Delegate 자체를 매개인자로 전달할 수 있다.

 

3. 복수의 메서드를 등록하여 사용가능하다. (등록은 +=, 해제는 -=)


4. Event는 특수한 형태의 delegate 이다.

   4.1 Delegate와 Event의 차이점은  delegate는 클래스 외부에서 호출가능하나 event는 불가

   4.2 Event는 메서드 할당 연산자(=) 사용불가 오직 등록은 +=, 해제는 -= 로만 가능


Delegate의 정의에서 중요한 것은 Parameter와 Return Type 입니다.

어떤 메서드가 정의된 Delegate와 동일한 메서드 형식(Parameter, Return Type)을 가진다면 해당 메서드는 이 정의된 Delegate에서 사용될 수 있습니다.


각 항목별로 살펴보겠습니다.

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
    public class DelegateClass
    {
        public delegate int CalcFunctionDelegate(int i);
        
        public int AddMethod(int i)
        {
            return i + 1;
        }
 
        public int SubMethod(int i)
        {
            return i - 1;
        }
                
        public void DoSomething(CalcFunctionDelegate cf_delegate)
        {
            Console.WriteLine(cf_delegate(1)); // == AddMethod(1) 또는 SubMethod(1);            
        }
 
        CalcFunctionDelegate cfd;
        public void CallMethod()
        {
            cfd = new CalcFunctionDelegate(AddMethod);
            DoSomething(cfd); // cfd = AddMethod
            
            cfd = new CalcFunctionDelegate(SubMethod);
            DoSomething(cfd); // cfd = SubMethod
        }
    }    
cs


위의 소스에서는 1, 2번 항목을 확인할 수 있습니다.


우선 Integer 타입의 매개변수를 받는 형태의 CalcFunctionDelegate를 선언했습니다.

이와 동일한 메서드 형식을 가지는 일반 메서드인 AddMethod, SubMethod를 선언했습니다.


또 2번 항목을 확인할 수 있는 부분을 보면 CalcFunctionDelegate를 매개변수로 가지는 메서드 DoSomething을 선언합니다.

DoSomething 메서드는 매개인자로 받은 메서드를 실행해줍니다.


2. Delegate 자체를 매개인자로 전달할 수 있다.(피호출자에게 전달 혹은 호출자에게 리턴값으로 전달)


1번항목은 CallMethod() 메서드에서 확인하실수있습니다.

CalcFunctionDelegate의 인스턴스인 cfd를 초기화할 때 매개인자로 AddMethod와 SubMethod를 넘깁니다.


1. Delegate는 메서드를 매개인자(Parameter)로 전달할 수 있다.


전달된 Delegate로부터 메서드를 호출하는 방법은 다르게도 가능합니다.

        CalcFunctionDelegate cfd;

        cfd.Invoke(1);


위와 같이 Invoke() 메서드를 호출하여 사용하며 파라미터가 필요한 경우 Invoke(parameter a, parameter b); 와 같은 방식으로 호출합니다.

또는 cfd(1); ← 이와 같이 직접 함수처럼 사용하는 방법도 가능합니다.


다음은 3번 항목을 살펴보겠습니다.

3. 복수의 메서드를 등록하여 사용가능하다. (등록은 +=, 해제는 -=)

MulticastDelegate 클래스에서 관리를 하게 되며 추가된 메서드들의 리스트(InvocationList)를 관리합니다.

할당 후에 delegate가 실행되면 InvocationList에서 메서드를 순서대로 가져와서 실행합니다.

아래의 코드를 통해 살펴보겠습니다.

단순 출력을 수행하는 메서드들을 선언했습니다.

또한 이 메서드들을 추가할 printdelegate를 선언하고 인스턴스를 만들었습니다.

14번 라인에 있는 MultiMethod를 보면 printdelegate인 pd에 printA와 printB 메서드를 += 연산자로 추가하는 것을

보실수 있습니다.

후에 delegate를 invoke 하게되면 등록한 순서대로 printA, printB 가 실행됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public delegate void PrintDelegate();
        PrintDelegate pd;
        public void printA()
        {
            Console.WriteLine("A");
        }
 
        public void printB()
        {
            Console.WriteLine("B");
        }
 
        // 외부에서 호출할 메서드
        public void MultiMethod()
        {
            pd += new PrintDelegate(printA);
            pd += new PrintDelegate(printB);
 
            pd.Invoke();
        }
cs


1~3번항목까지 Delegate에 관한 내용을 살펴보았습니다. 


마지막 항목인 Event는 내용이 많고 복잡한 관계로 개별 포스팅으로 진행하겠습니다.

반응형
Comments