* 델리게이트(위임) 정의
메서드를 간접적으로 호출.
메서드 호출에 대한 참조를 가짐
인스턴스 메서드 뿐만 아니라 스태틱 메서드에 대한 참조를 가질수 있음
* 델리케이드 선언하기
delegate 메서드의 시그너쳐(메서드명,반환타입,전달파라메타)
delegate void TestDelegate()
* 델리케이트형 변수 선언
TestDelegate testDelegate
* 델리케이트 생성
testDelegate = new TestDelegate(this.Method)
* 델리게이트 호출(메서드 호출과 동일)
TestDelegate()
====================================================================
* delegate
delegate 는 특정 Method 의 참조를 가짐으로써 그 Method 의 간접 호출을 가능케 한다.
이는 닷넷의 여러 타입 중 하나이다. 우리가 알고 있듯이 클래스 역시 타입이다. 더 자세히는 사용자 정의 타입이라고 한다. delegate 는 클래스와 유사한 점이 많다. 클래스의 정의, 선언, 생성 의 과정은 delegate 와 거의 유사하다.
단, delegate 는 메서드를 간접 호출을 위임 받는 만큼 선언과 사용에 있어서 일반 메서드와의 유사성도 가지고 있다
* delegate 사용하기
앞서 delegate 와 클래스의 유사성에 대해 언급하였다. 아래의 delegate 사용하기 코드에서 그 유사성이 입증된다
- class 사용 -
1. class 정의
public class TempClass{…}
2. class타입 객체변수 선언
TempClass tc;
3. class 타입 객체 생성
tc = new TempClass();
- delegate 사용 -
1. delegate 정의
public delegate void TempDelegate();
2. delegate 타입 참조변수 선언
TempDelegate td;
3. delegate 생성
td = newTempDelegate(AnotherMethod);
4. delegate 호출
td();
1.2.3 번의 과정을 보면 클래스와 delegate 는 아주 유사함을 알 수 있다.
그럼, 이제 delegate 만의 특이한 사항을 살펴 보자
3번 delegate 생성을 보면 AnotherMethod 를 가지고 생성됨을 알 수 있다.
delegate 는 메서드의 참조를 가져 그 메서드를 실행한다고 앞서 언급했다.
즉, AnotherMethod는 호출대상이 되는 메서드인 것이다. 결과적으로 4번과정의 delegate 호출을 하면 AnotherMethod 라는 임의의 메서드가 실행된다는 것이다. 여기서 한가지 주의해야 할 사항이 있다.
delegate 는 임의의 메서드의 간접호출 하는 것이므로 호출대상이 되는 메서드의 시그너처를 동일하게 맞추어 주어야 한다. (메서드의 시그너처란 메서드의 반환 타입과 전달 매개변수들을 의미한다.)
ex> void Method(int i , int j) <- 메서드 스그너쳐
위의 예에서 AnotherMethod 는 void AnotherMethod() 형태의 시그너쳐임을 의미하는 것이다
만일 AnotherMethod 가 int AnotherMethod(int i , int j) 와 같은 스거너쳐를 가진다면 우리가 정의하는 delegatge 는 아래와 같아야 할 것이다.
public delegate int TempDelegate(int i , int j);
* delegate 장점
1. 메서드에 대한 간접 참조를 가진 delegate 타입의 변수를 이용하여 실행 시 메서드 호출을 결정할 수 있다.
2. 유사한 일을 하는 서로 다른 이름의 메서드를 동일한 방법으로 호출 할 수 있다.
* 정리
1. delegate 는 임의의 메서드의 간접호출을 가능케 한다.
2. delegate 는 메서드의 참조를 가진다.
3. 시그너쳐(매개변수,리턴값)가 같은 모든 메서드는 하나의 delegate 로 호출될 수 있다
4. 인스턴스 메서드 뿐만 아니라 static 메서드에 대한 참조도 가능하다