델리게이트
- 메소드를 가리키는 참조형으로서 메소드의 번지를 저장하거나 다른 메소드의 인수로 메소드 자체를 전달하고 싶을 때 사용
- 메소드의 코드들도 메모리상에 존재하므로 그 시작 위치를 가리킬수 있다
지정자 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 | using System; namespace Delegate { delegate void dele( int a); class Program { public static void Method1( int a) { Console.WriteLine( "Method1 " + a); } public static void Method2( int a) { Console.WriteLine( "Method2 " + a); } static void Main(string[] args) { dele d; d = new dele(Method1); d(12); d = new dele(Method2); d(34); } } } |
- dele 타입은 정수 인수 하나를 취하고 리턴값이 없는 메소드를 가리키는 타입으로 정의
- dele 자체가 클래스 선언문과 대등한 자격을 가지므로 네임스페이스에 곧바로 선언할수 있다
- 두개의 메소드는 델리게이트를 통해 간접적으로 호출되었다
특정 형태의 메소드를 가리킬 수 있는 델리게이트는 공식으로 선언한다
- 대상 메소드를 적어 놓고 다음 순서대로 델리게이트 선언문으로 바꾼다
int method(string s)
↓ ↓ ↓
delegate int dele(string s)
1. 리턴 타입과 인수는 그대로 옮겨적고
2. 메소드 이름을 델리게이트 이름으로 바꾸고
3. 앞에 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 30 31 32 33 34 35 36 37 38 39 40 | using System; namespace Delegates { delegate int delea(string s); delegate double deleb( int i, long l); delegate void delec( char ch); class Program { public static int a(string s) { Console.WriteLine(s); return 0; } public static double b( int i, long l) { Console.WriteLine(i); return 1.0; } public static void c( char ch) { Console.WriteLine(ch); } static void Main(string[] args) { delea da = a; da( "a 메소드" ); deleb db = b; db(1234,5678); delec dc = c; dc( '델' ); } } } |
- 형태가 다른 세개의 메소드 선언
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System; namespace DeleToMember { delegate void dele(string s); class Outer { public static void m3(string s) { Console.WriteLine(s); } public void m4(string s) { Console.WriteLine(s); } } class Program { public static void m1(string s) { Console.WriteLine(s); } public void m2(string s) { Console.WriteLine(s); } static void Main(string[] args) { dele d = m1; d( "정적 메소드" ); Program P = new Program(); d = P.m2; d( "인스턴스 메소드" ); d = Outer.m3; d( "외부 정적 메소드" ); Outer O = new Outer(); d = O.m4; d( "외부 인스턴드 메소드" ); } } } |
- 클래스 내,외부에 정적, 비정적으로 4개 정의해놓고 dele타입의 d로 호출
- 소속된 클래스를 가리지 않으며 정적, 비정적을 구분하지 않는다 - 객체 지향적
'Study > C#' 카테고리의 다른 글
C# 델리게이트 - 1. 델리게이트 (활용) (0) | 2012.01.09 |
---|---|
C# 델리게이트 - 1. 델리게이트 (공변성) (0) | 2012.01.06 |
C# 인터페이스 - 2. 인터페이스 활용 (깊은 복사) (0) | 2012.01.06 |
C# 인터페이스 - 2. 인터페이스 활용 (반복기) (0) | 2012.01.06 |
C# 인터페이스 - 2. 인터페이스 활용 (열거하기) (0) | 2012.01.05 |