출처 : http://cafe.naver.com/cccculb/148


Delegate(대리자)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

장에서는 5장에서 언급한 대리자(Delegate) 대해서 보다 심도 깊게 다루게 것입니다. Delegate 메서드의 기능을 대신해 주는 대리자라고 배웠습니다. 메서드를 보다 효율적으로 사용하기 위하여 메서드 자체를 캡슐화하는 기능입니다. 그래서, 메서드를 대신하는 대리자를 호출하면 메서드를 직접 호출하지 않고도 메서드를 호출할 있습니다.

 

중요 !! 대리자(Delegate)

메서드의 대리자(Delegate)

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

 

Delegate 주는 장점은 메서드 자체를 캡슐화하기 때문에 메서드를 보다 효율적으로 사용할 있게 해준다는 것입니다. 메서드를 어떻게 Delegate 하는지에 대해서 알아보겠습니다.

 

1단계 Delegate 메서드를 정한다.

여러분이 Delegate 만들기 위해서는 제일 먼저, Delegate 메서드를 정해야 합니다. Delegate 메서드를 정한다는 것은 어떠한 메서드가 대리자를 통해서 호출될 것인지의 문제입니다. Delegate 메서드는 다음과 같습니다.

 

Delegate 메서드 정하기

using System;

class 
AType{
  
public void F1() { //Delegate
 메서드 1
    
System.Console.WriteLine("AType.F1"
);
  }
  
public void F2(int x){ //Delegate
 메서드 2
    
System.Console.WriteLine("AType.F2 x=" 
+ x);
  }
}

12-1 Delegate 메서드 선택

 

void F1() void F2(int x) 메서드를 Delegate 것입니다. 메서드의 형태가 다르기 때문에 각각 Delegate 다르게 만들어 주어야 합니다. , 대리자 2개를 만들어야 하는 것입니다. Delegate 사용할 메서드가 정해졌다면 Delegate 선언해야 합니다. 다음은 Delegate 선언하는 방법입니다.

 

2단계 메서드에 맞는 Delegate 선언하기

Delegate 선언하려면 일단 메서드의 시그너쳐(Signature) 정확하게 일치시켜야 합니다. 그래서, 아래와 같이 Delegate 메서드의 리턴타입과 매개변수를 정확하게 일치시키고 있는 것입니다.

 

Delegate 선언하기

using System;

delegate void SimpleDelegate1(); 

//Delegate 선언 1  void F1()
delegate void SimpleDelegate2(int i); 

//Delegate 선언 2 void F2()

class 
AType{
  
public void 
F1() {
    System.Console.WriteLine(
"AType.F1"
);
  }
  
public void F2(int 
x){
    System.Console.WriteLine(
"AType.F2 x=" 
+ x);
  }
}

12-2 Delegate 선언하기

 

메서드의 시그너쳐

여러분은 메서드 오버로딩을 공부할 오버로딩 메서드를 만드는 방법에 대해서 배웠습니다. 오버로딩 메서드를 만드는 방법은 메서드의 시그너쳐(Signature) 다르게 해주어야 합니다. , 메서드의 매개변수와 매개변수의 데이터타입을 다르게 해주어야 하는 것입니다. 오버로딩에서는 메서드의 반환형은 시그너쳐로 이용되지 않지만 Delegate에서는 반환형도 시그너쳐에 포함됩니다.

 이름은 상관없지만 Delegate 선언할 메서드의 시그너쳐와 Delegate 시그너쳐는 반드시 일치시켜야 합니다.

 

3단계 임의의 객체 만들기

Delegate 메서드를 정하고 Delegate 선언했다면 이제 메서드가 포함된 클래스의 객체를 만들어야 합니다. 그래야 특정 객체의 메서드가 하나의 독립적인 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

class 
DeleTest {
  
public static void 
Main(){
    AType atype = 
new AType(); //
객체 생성
  
}
//class

12-3 임의의 객체 생성

 위와 같이 F1() F2() 메서드가 포함된 AType 클래스의 객체 atype 선언했습니다. 다음은 atype 객체의 메서드를 실제 Delegate 만드는 작업을 하셔야 합니다.

 

4단계 Delegate 생성과 호출

마지막으로 Delegate 생성하여 해당 Delegate 호출해 주면 됩니다. 일반 메서드를 호출하듯이 간단하게 Delegate 이용하여 메서드를 호출할 있습니다.

 

&

DeleTest.cs

Ü 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

class 
DeleTest {
  
public static void 
Main(){
    AType atype = 
new 
AType();
    SimpleDelegate1 s1 = 
new SimpleDelegate1(atype.F1); //Delegate 
생성
    
SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2); //Delegate 
생성
    
s1(); //Delegate
 이용한 호출 1
    
s2(1000); //Delegate
 이용한 호출 2
  
//main
//class

C:\C#Example\12>csc DeleTest.cs

C:\C#Example\12>DeleTest

AType.F1

AType.F2 x=1000

 

Delegate 만들 해당 Delegate 매개변수로 메서드의 이름을 넣어 주게 됩니다. 메서드를 매개변수로 넣어 주면 모든 Delegate 만들기 작업은 끝납니다. 그리고, 이제부터는 메서드를 호출할 객체를 이용하는 것이 아니라 대리자를 이용하여 호출이 가능한 것입니다. 물론, 대리자라 할지라도 메서드에 일치하는, 대리자에 맞는 매개변수를 넣어서 대리자를 호출하셔야 합니다.

 

절에서는 대리자(Delegate) 만드는 기본적인 방법에 대하여 알아보았습니다. 다음 절에서는 대리자를 이용한 실제 구현을 알아보도록 하겠습니다.


'Programming' 카테고리의 다른 글

C#, 크로스 스레드 작업이 잘못되었습니다.  (0) 2015.03.19
VC++ 단축키  (0) 2015.03.05
[펌] VC++ : error LNK2026 해결책  (0) 2015.03.05
Posted by 세모아
,