delegate는 대행자를 뜻으로 C#에서는 함수들을 대신 실행시켜주는 기능을 한다.
사용법1
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
|
delegate int myDelegate(int value);
public class GameManager : MonoBehaviour
{
myDelegate tempGate_1;
myDelegate tempGate_2;
myDelegate tempGate_3;
myDelegate tempGate_4;
void Start()
{
tempGate_1 = new myDelegate(Value_A);
tempGate_2 = new myDelegate(Value_B);
tempGate_3 = new myDelegate(Value_C);
tempGate_4 = new myDelegate(Value_F);
}
int Value_A(int value)
{
return value + 10;
}
int Value_B(int value)
{
return value - 10;
}
int Value_C(int value)
{
return value * 10;
}
int Value_F(int value)
{
return value / 10;
}
}
|
4개의 delegate를 만든다음에 각각의 delegate의 함수를 넣어서 사용하는 예제이다
사용법2
delegate체인이다. delegate의 +와-를이용하여 함수를 여러개 추가할수있다 그렇게하면 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
|
delegate void myDelegate(int value);
public class GameManager : MonoBehaviour
{
myDelegate tempGate;
void Start()
{
tempGate = new myDelegate(Value_A);
tempGate += Value_B;
tempGate += Value_C;
tempGate += Value_F;
tempGate(10);
}
void Value_A(int value)
{
}
void Value_B(int value)
{
}
void Value_C(int value)
{
}
void Value_F(int value)
{
}
}
|
delegate와 C의 함수포인터는 서로 비슷하다.
하지만 delegate와 함수포인터는 몇가지 다르다.
첫번째는 클래스의 개념이 없는 C에서의 함수 포인터는 말 그대로 외부의 어떤 함수에 대한 주소값만을 갖는다.
반면 C#의 delegate는 클래스 객체의 인스턴스 메서드에 대한 레퍼런스를 갖기 위해 그 C# 객체의 주소와 메서드 주소를 함께 가지고 있다.
C# delegate는 델리게이트 Type을 정의하는 것으로 이 Type으로부터 델리게이트 객체를 생성할 때, 이 객체가 메서드 정보와 객체 정보를 가진다.
클래스를 사용하는 C++에는 Pointer to member function이 있는데, 이는 한 클래스의 멤버 함수에 대한 포인터로서 '객체'에 대한 컨텍스트를 가지고 있다는 점에서 C#의 delegate와 비슷하다. 단, C#의 delegate는 메서드 Prototype이 같다면 어느 클래스의 메서드도 쉽게 할당할 수 있는데 반해, C++의 Pointer to member는 함수 포인터 선언시 특정 클래스를 지정해주기 때문에 한 클래스에 대해서만 사용할 수 있다.
두번째는 C의 함수 포인터는 하나의 함수 포인터를 갖는데 반해, C# delegate는 하나 이상의 메서드 레퍼런스들을 가질 수 있어서 Multicast가 가능하다.
또한 C의 함수포인터는 Type Safety를 완전히 보장하지 않는 반면, C#의 delegate는 엄격하게 Type Safety를 보장한다.
'Unity(C#)' 카테고리의 다른 글
Unity(C#)무명형식,무명메소드 (0) | 2020.04.22 |
---|---|
Unity(C#) Event (0) | 2020.04.21 |
Inspector에 변수 재목정하기 (0) | 2020.03.05 |
Unity(C#) namespace사용방법 (0) | 2019.11.06 |
Player 이동하기 (0) | 2019.11.05 |