Delegate
메소드에 대한 참조 델리게이트도 하나의 데이터 형식으로 인스턴스 메소드 , 정적 메소드 모드 참조가능하다 델리게이트는 값이 아닌 “코드”자체를 넘기고 싶을때 사용한다
예를 들어 어떤 데이터들을 정렬 해야 할 때 다양한 정렬 조건이 있을 수 있는데 이때 원하는 정렬 조건에 대한 메소드만 꺼내주면 된다
void RunA(int i)
{
......
}
위와 같이 하나의 함수가 있다고 가정하면 이 함수는 정수 하나를 파라미터로 받아들인다 이 함수를 호출하기 위해서는 다음과 같이 정수를 메서드 파라미터로 넘기면 된다
int j = 1234;
RunA(j);
더 복잡한 경우로는 다음과 같이 클래스 객체를 넘기는 경우를 생각해 볼 수 있다
void RunB(TestClass c)
{
.....
}
이 경우는 위의 int 와 같은 Built-in 타입이 아니므로 개발을 할 때 그 타입을 어딘가 에서 정의해 주어야 한다
class TestClass
{
int id; // 필드
string name;
public void Display(){} // 메서드
}
이 함수 (RunB) 를 호출하기 위해서는 아래와 같이 클래스 인스턴스 를 만들어 이를 메서드 파라미터로 넘기면 된다
TestClass c = new TestClass();
RunB(c);
위의 두 가지 케이스를 보면 파라미터로서 정수 혹은 객체 즉 어떤 데이터를 메서드 에 보내고 있는 것을 알 수 있다
Delegate는 메서드 를 다른 메서드 로 보내기 위해 만들어졌다 숫자 혹은 객체를 메서드 의 파라미터로써 전달 할 수 있듯이 메서드 또한 파라미터로 전달 할 수 있다
Delegata는 메서드의 입력 파라미터로 피 호출자 에게 전달될 수 있을 뿐만 아니라 또한 메서드의 리턴 값으로 호출자에게 전달 될 수도 있다
void Run(exDelegate method)
{
....
}
위와 같은 함수를 가정했을때 exDelegate가 델리게이트 타입이라고 가정했으래 이 함수는 어떤 메서드 Run() 메서드에 전달하고 있는것이다
델리게이트 타입 정의
delegate int exDelegate(string s);
위의 예제의 경우 C# 키워드 class 를 사용하여 해당 클래스를 정의 하였는데 델리게이트 타입을 정의 하기 위해선 delegate 를 사용한다
델리게이트 정의에서 중요한것은 입력 파라미터와 리턴 타입이다
어떤 메서드가 이러한 델리게이트 메서드 원형과 일치한다면 즉 입력 파라미터 타입 및 갯수 리턴 타입이 동일하다면 그 메서드는 해당 델리게이트 에서 사용 될 수 있다
델리게이트 정의는 마치 하나의 함수를 정의하는 Prototype 선언식 처럼 보이는데 사실 내부적으로 이 선언식은 컴파일러에 의해 특별한 클래스로 변환된다
이렇게 C# delegate 식을 클래스가 아닌 함수 선언식 처럼 정의하게 한 것은 내부의 복잡한 설계를 숨기고 메서드를 전달하는 본연의 의도를 더 직관적으로 표현하기 위한 것으로 볼수있다
델리게이트가 이렇게 정의된 후에는 클래스 객체를 생성한것과 비슷한 방식으로 new 를 써서 델리게이트 객체를 생성한다
델리게이트를 써서 다른 메서드에 전달하는 방식은 델리게이트 객체를 메서드 호출 파라미터에 넣으면 된다 이는 메서드 정보를 갖는 Wrapper 클래스의 객체를 다른 메서드의 입력 파라미터로 전달하는 것이 된다
// int StringToInt(string s)
{
....
}
ExDelegate m = new exDelegate(StringToInt);
Run(m);
전달된 델리게이트로 부터 실제 메서드를 호출 하는 것은 델리게이트 객체의 .Invoke() 메서드나 .BeginInvoke() 메서드를 써서 호출한다
i = m.Invoke("1234");
//Invoke 생
i = m("123");
예제
class Program
{
static void Main(string[] args)
{
new Program().Test();
}
// 델리게이트 정의
delegate int ExDelegate(string s);
void Test()
{
//델리게이트 객체 생성
ExDelegate m = new ExDelegate(StringToInt);
//델리게이트 객체를 메서드로 전달
Run(m);
}
// 델리게이트 대상이 되는 어떤 메서드
int StringToInt(string s)
{
return int.Parse(s);
}
// 델리게이트를 전달 받는 메서드
void Run(ExDelegate m)
{
// 델리게이트로부터 메서드 실행
int i = m("123");
Console.WriteLine(i);
}
}
'개발일지 > C#' 카테고리의 다른 글
회계 관리 프로그램 예제 (1) | 2024.11.09 |
---|---|
인사 급여 관리 프로그램 예제 (0) | 2024.11.08 |
C# Indexer (0) | 2024.10.02 |
yield (5) | 2024.10.01 |
C#) ref (0) | 2024.10.01 |