[C#] 자습서 10장 - 델리게이트
델리게이트(Delegate)
델리게이트(Delegate)는 메서드를 가리키는 참조형이다. C++의 함수 포인터에 대응하는 개념이되 타입 체크가 더 엄격하고 클래스 소속의 메서드도 가리킬 수 있어 객체지향적이다.
지정자 delegate 리턴타입 이름(인수목록);
키워드 delegate로 선언하며 이름은 원하는대로 붙인다. 가리킬 메서드의 리턴 타입과 인수 목록을 모두 밝혀야 델리게이트로부터 메서드를 정확히 호출할 수 있다. 완전한 형식을 요구하기 때문에 별 의미는 없지만 인수 목록의 형식 인수 이름도 다 적어야 한다.
delegate void deleA(int, string, double); // 에러
delegate void deleA(int a, string b, double c); // 이렇게 형식 인수의 이름이 필요하다.
new 연산자로 객체를 생성하며 가리킬 메서드를 인수로 전달한다. 대상 메서드는 델리게이트와 타입이 정확히 일치해야 한다. 델리게이트를 통해 인수를 전달하면 메서드가 호출되고 실행 결과를 리턴한다. 메서드를 직접 호출하는 방식에 비해 가리킬 대상을 바꿔가며 호출할 수 있다는 점이 다르다.
//Dele라는 자료형으로 델리게이트 변수를 만들겠다.
//이 변수에 담을 수 있는 메서드의 형태는 리턴은 void, 매개변수는 int 1개이다.
delegate void Dele(int a);
internal 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 = Method1;
d(12);
d = Method2;
d(34);
}
}
예제에서는 d = Method1 식으로 간단히 대입했는데 생성자의 인수로 메서드를 전달하는 것이 더 원칙적이다. 예제를 보면 Dele 타입은 int 인수를 취하고 리턴값이 없는 메서드를 가리키는 타입이다. Program 클래스 안에는 Dele와 타입이 일치하는 두 개의 메서드가 선언되어 있다. Dele 타입의 d 객체를 선언하고 Method1 을 대입하면 이후 d가 이 메서드를 가리킨다.
Reference
SoEn:소프트웨어 공학 연구소
www.soen.kr