본문 바로가기
Study/개념 정리

[Study] 콜백, delegate, event

by chobbo 2024. 7. 3.

콜백?

- 피호출자가 다시 호출자의 메서드를 호출하는 것

 

- 콜백의 정의 : 매개변수로 전달되는 함수

- 특정 이벤트나 조건이 발생했을 때 발생하는 함수 => 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