delegate
예시)
void RunA(int i) { ... }
이 함수는 정수 하나를 파라미터로 받아들인다. 이 함수를 호출하기 위해서는 아래와 같이 정수를 메서드 파라미터로 넘기면된다.
int j = 123;
RunA(j);
좀 더 복잡한 경우로서 다음과 같이 클래스 객체를 넘기는 경우를 생각해보자.
void RunB(MyClass c) { ... }
이 경우 MyClass는 위의 int와 같은 Built-in 타입이 아니므로 개발자가 그 타입을 어딘가에서 정의해 주어야 한다.
class MyClass
{
int id; //필드
string name;
public void Display() { } //메서드
}
이 함수(RunB)를 호출하기 위해서는 아래와 같이 클래스 인스턴스를 만들어 이를 메서드 파라미터로 넘기면 된다.
MyClass c = new MyClass();
RunB(c);
그런데 위의 2가지 케이스를 자세히 보면, 파라미터로서 정수 혹은 객체 즉 어떤 "데이타"를 메서드에 보내고 있는 것을 알 수 있다.
그러면, 이러한 통상적인 개념의 물리적 "데이타" 말고, 어떤 "메서드" 자체를 함수(메서드)의 파라미터로 전달할 수 있을까?
(주: 사실 "추상적 개념으로" 클래스 객체는 데이타(필드)와 행위(메서드)를 함께 포함하고 있는 것이고, 이를 메서드 파라미터로 보낼 수 있다는 것은, 클래스의 일부인 메서드만을 보낼 수 있음을 (보낼 수 있게 만들 수 있음을) 의미하기도 한다.)
Delegate는 이렇게 메서드를 다른 메서드로 전달할 수 있도록 하기 위해 만들어 졌다. 숫자 혹은 객체를 메서드의 파라미터로써 전달할 수 있듯이, 메서드 또한 파라미터로서 전달할 수 있다. (주: 복수 개의 메서드들도 전달 가능) Delegate는 메서드의 입력 파라미터로 피호출자에게 전달될 수 있을 뿐만 아니라, 또한 메서드의 리턴값으로 호출자에게 전달 수도 있다.
간단한 delegate 샘플
class Program
{
static void Main(string[] args)
{
new Program().Test();
}
// 델리게이트 정의
delegate int MyDelegate(string s);
void Test()
{
//델리게이트 객체 생성
MyDelegate m = new MyDelegate(StringToInt);
//델리게이트 객체를 메서드로 전달
Run(m);
}
// 델리게이트 대상이 되는 어떤 메서드
int StringToInt(string s)
{
return int.Parse(s);
}
// 델리게이트를 전달 받는 메서드
void Run(MyDelegate m)
{
// 델리게이트로부터 메서드 실행
int i = m("123");
Console.WriteLine(i);
}
}
델리게이트 정의에서 중요한 것은 입력 파리미터들과 리턴 타입이다.
'코린이 부트캠프 일상' 카테고리의 다른 글
유니티 캐릭터 이동 구현하기 (0) | 2023.11.24 |
---|---|
코린이 15일차 팀프로젝트 TextRpgGame (0) | 2023.11.17 |
코린이 13일차 인터페이스 /enum (0) | 2023.11.15 |
코린이 12일차 TextRpgGame 추가구현 (1) | 2023.11.14 |
코린이 11일차 TextRpgGame 기초 (1) | 2023.11.13 |