델리게이트는 메서드를 변수처럼 저장하여 사용하기 위한 사용법입니다.
함수의 복사본을 받아넣어 사용하는데 델리게이트로 선언한 반환형과 매개변수가 같아야만
델리게이트에 전달이 가능합니다.
델리게이트는 델리게이트에 들어가는 메서드의 반환형과 매개변수가 같아야하는 특징이 있습니다.
[기본 구조]
delegate 반환형 이름(매개변수)
delegate int Calculation(int i)
[델리게이트 변수 선언]
public int Add(int x, int y) 라는 메서드가 있다면
델리게이트이름 변수이름 = new 델리게이트이름(Add); //델리게이트에서 Add를 참조를 한후 선언
Calculation addCal = new Caculation(Add);
[델리게이트를 호출하여 참조한 메소드 호출]
int result = addCal(4,3); 과 같이 사용이 가능하다. Add함수가 합을 계산하여 result에 반환한다.
[델리게이트 활용법]
public delegate int Caculation(int x, int y ); //델리게이트 선언
Calculation calc = Add; // 델리게이트 calc에 Add 메서드를 할당
Console.WriteLine(calc(4,5)); // 9
calc = Subtract; //Subtract로 바꾸어 메서드 할당 (Add는 제거된다)
Console.WriteLine(calc(4,5)); // -1
[여러개의 메서드를 한번에 사용하고 싶다면]
Calculation calc = Add;
calc += Subtract; //Add가 할당된 델리게이트에 Subtract도 할당함
Console.WriteLine(4,3); // 7과 1이 출력됨 (두 메서드가 전부 사용된 것)
calc -= Subtract; //거꾸로 Subtract를 제거도 가능하다.
Event는 델리 게이트의 일종 중 하나입니다. 델리게이트에 기반이 되어 있지만
옵저버 패턴 처럼 사용이 가능합니다.
옵저버 패턴을 먼저 알아보자면 특정 오브젝트에 상호작용이 일어났는지 지켜보는 관측자(옵저버)가
해당 상호작용을 발견하면 이 정보를 원하는 곳에 전달해주는 방식입니다.
해당 상호작용을 발견하여 전달하더라도 전달하는 과정에 모든 객체에 전달을 한다면 매우 비효율적이라고 할 수 있기에
이 상호작용을 원하는 객체에게만 전달하는 것이 옵저버 패턴입니다. 그런 특징을 지니기에 객체가 이벤트를 사용하는 행위를 구독이라고도 부릅니다.
[이벤트의 구조]
event 델리게이트이름 변수이름;
event Caculation calc;
그리고 Action에 대해서 살펴보면 이건 c#에서 제공되는 event라고 보면될 것같습니다. 매우 편리하고 객체지향적으로
유리하기에 많이 사용되는 방식입니다. 기본 이벤트는 메서드가 추가될 때마다 매번 델리게이트를 추가하지만
Action은 그 과정이 생략되었습니다.
Action은 반환자가 없어 값을 반환하는 용도로 사용을 못하기에 이 부분으로 사용하고 싶다면 Function을 사용하면 됩니다.
저번 시간에 우린 이것을 InputSystem과 연계하여 특정 키가 눌렸을 때
연쇄적으로 메서드가 실행되게 만들었습니다.
[액션 기본 설정]
public event Action<Vector2> OnMoveEvent;
evemt Action<매개변수> 이벤트 이름;
[사용방식]
OnMoveEvent?.Invoke(direction);
//nullable(null값을 허용) Invoke로 해당하는 OnMoveEvent에 해당하는 함수를 전부 호출한다.
[함수 구독]
OnMoveEvent += OnMove; // 벡터2를 사용하는 함수를 구독중이다. 이벤트의 매개변수에 맞는 함수를 등록할 수 있다.
델리게이트와 이벤트 둘의 차이점을 살펴 보자면 델리게이트는 함수를 저장해두었다가 사용하는 것이 목적이고 해당 요청을 하였을 때 실행하는 것이 목적이라면 이벤트는 구독한 함수들을 특정 조건에 한번에 실행시킵니다.
델리게이트가 외부에서 직접 호출이 가능하다면 이벤트로 등록을 해둔다면 이것이 불가능합니다.
따라서 우리는 때에 따라 다르게 사용할 수 있는 방법을 길러야할것입니다.
'부트캠프 분류 > 미분류 자료' 카테고리의 다른 글
유니티 인풋 필드(Input Field) (1) | 2024.10.12 |
---|---|
캐스팅 연산자 as (1) | 2024.10.10 |
Send Messages (0) | 2024.10.07 |
(Unity 2D) 기본 컴포넌트 (0) | 2024.10.06 |
C# 코딩 스탠다드 (0) | 2024.10.02 |