콜백?
- 피호출자가 다시 호출자의 메서드를 호출하는 것
- 콜백의 정의 : 매개변수로 전달되는 함수
- 특정 이벤트나 조건이 발생했을 때 발생하는 함수 => If문도 포함되는 정의라 모호하다
- 서버가 클라이언트에게 비동기적으로 피드백을 주기 위해 사용하는 방법
- 예시1) button.onClick.AddListener의 정의를 살펴보면
public void AddListener(UnityAction call)
{
AddCall(GetDelegate(call));
}
AddListener 자체도 Action을 매개변수로 전달받아 구현된 함수이다.
다음과 같은 방식이 콜백!
- 예시2) 이런 식으로 각 버튼을 객체지향적으로 관리해줄 수도 있다.
public abstract ButtonObj
{
Button button;
Start(){
button.onClick.Addlistener(OnClickEventArgs);
}
abstract void OnClickEventArgs();
}
public class StartButton : ButtonObj
{
OnClickEventArgs()
{
// 로직 작성
}
}
Delegate?
- 델리게이트에 호출할 메서드를 담아 인자로 넘겨준다.
- 델리게이트 변수에 여러 메서드를 담을 수 있다.
- 대입 연산자(=), 증감 연산자를 사용할 수 있다.
C# Event
- 외부에서 이벤트를 구독하면 피호출자가 이벤트를 실행한다.
- 특수한 제약조건(이벤트 실행은 해당 이벤트가 선언된 클래스 내에서만 가능)이 추가된 델리게이트
public "event" Action OnDie;
다른 클래스에서 OnDie?.Invoke(); 사용 불가능
객체지향적인 설계 - 캡슐화? (Call 함수로 사용)
1. 함수를 매개변수로 전달 (ex) 버튼 이벤트
public void CallOnEvent(Action action)
{
// 여러 코드 작성 후 Invoke
action?.Invoke();
}
CallOnEvent(함수 이름); => 다음과 같이 사용 가능
2. 매개변수로 람다식 전달
player.CallOnEvent(() => { });
- 콜백에서 람다를 많이 사용한다
- 식의 값을 계속 들고있을 필요가 없으므로 람다가 많이 사용된다.
- 이벤트에 여러 메서드를 담을 수 있다.
- 증감(+,-) 연산자만 사용할 수 있다.
- 콜백을 안전하고 올바르게 쓸 수있는 방법이다.
Unity Delegate & Event
- OnTriggerEnter, OnCollisionEnter과 같은 충돌 처리 이벤트 (추상 클래스, 실제 event는 따로 존재)
- InputSystem 등
- Delegate, Action, Func, EventHandler 등이 존재한다
예시
using System;
class Program
{
// 델리게이트 정의
public delegate int MyCallback(int a, int b);
// 덧셈 메서드
static int Add(int a, int b)
{
return a + b;
}
// 곱셈 메서드
static int Multiply(int a, int b)
{
return a * b;
}
static void Main(string[] args)
{
MyCallback MathOperation;
MathOperation = Add;
Console.WriteLine(MathOperation(3, 4));
MathOperation = Multiply;
Console.WriteLine(MathOperation(7, 5));
}
}
1. 출력 결과 : 7, 35
2. Main 함수를 아래와 같이 바꾼다면?
static void Main(string[] args)
{
Func<int, int, int> MathOperation;
MathOperation = Add;
Console.WriteLine(MathOperation(3, 4));
MathOperation = Multiply;
Console.WriteLine(MathOperation(7, 5));
}
출력 결과는 같다.
그러나 바뀐 코드는 Func 델리게이트를 사용하고 있다.
Func 델리게이트에서 입력 타입과 리턴 타입을 정의해주어 타입 안정성을 보장해준다.
3. 델리게이트를 사용하여 메서드를 매개변수로 전달하는 장점은?
- 코드의 유연성이 증가한다.
- 코드의 재사용성이 증가한다.
'Study > 개념 정리' 카테고리의 다른 글
[Study] 상속과 인터페이스 (0) | 2024.07.05 |
---|---|
[Study] 스택 메모리 , 힙 메모리 (0) | 2024.07.03 |
[Study] 객체지향 프로그래밍 (0) | 2024.07.02 |
[Study] 객체와 한정자 (0) | 2024.07.01 |
[Study] 응집도 & 결합도 (0) | 2024.05.27 |