부트캠프 분류/미분류 자료

델리게이트, Event

noc777 2024. 10. 7. 21:50

 

델리게이트는 메서드를 변수처럼 저장하여 사용하기 위한 사용법입니다. 

함수의 복사본을 받아넣어 사용하는데 델리게이트로 선언한 반환형과 매개변수가 같아야만

델리게이트에 전달이 가능합니다.

델리게이트는 델리게이트에 들어가는 메서드의 반환형과 매개변수가 같아야하는 특징이 있습니다.

 

[기본 구조]

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