프로그래밍/C#

event 와 delegate

selinatsu 2024. 10. 12. 13:52
반응형

이벤트 (Event)

이벤트는 특정 작업이 발생했을 때 시스템이 알려주는 메커니즘입니다.

일반적으로 사용자 인터페이스에서 많이 사용되며, 사용자가 버튼을 클릭하거나 키보드를 누르는 등의 상호작용이 발생할 때 이벤트가 발생합니다.

이벤트는 델리게이트를 기반으로 구현되며, 특정 동작이 발생했을 때 연결된 메서드들을 실행하는 역할을 합니다.

 

이벤트의 구성 요소

이벤트 선언

이벤트는 클래스 내부에서 델리게이트 타입으로 선언됩니다.

이를 통해 특정 타입의 메서드를 등록할 수 있습니다.

 

이벤트 구독 및 해지

이벤트에 메서드를 등록하여 특정 작업이 발생했을 때 실행될 동작을 정의합니다.

구독은 += 연산자를 사용해 메서드를 추가하며, -= 연산자를 사용해 등록된 메서드를 해제할 수 있습니다.

 

이벤트 발생

특정 조건이 충족되면 이벤트를 발생시켜 등록된 메서드들을 호출합니다.

이벤트는 클래스 내부에서만 호출할 수 있어 외부에서 임의로 호출할 수 없습니다.

 

 

Unity에서의 이벤트 사용 예시

아래는 Unity에서 이벤트를 사용하는 예시입니다:

using UnityEngine;
using System;

public class ButtonClickHandler : MonoBehaviour
{
    // 이벤트 선언
    // OnClicked라는 이벤트를 선언합니다. 이 이벤트는 반환값이 없고 매개변수가 없는 메서드를 참조할 수 있는 Action 델리게이트를 사용합니다.
    public static event Action OnClicked;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 클릭 이벤트 발생
            OnClicked?.Invoke();
        }
    }
}

public class ClickResponse : MonoBehaviour
{
    void OnEnable()
    {
        // OnClicked 이벤트에 ShowMessage 메서드를 등록합니다.
        ButtonClickHandler.OnClicked += ShowMessage;
    }

    void OnDisable()
    {
        // OnClicked 이벤트에서 ShowMessage 메서드를 해제합니다.
        ButtonClickHandler.OnClicked -= ShowMessage;
    }

    void ShowMessage()
    {
        Debug.Log("버튼이 클릭되었습니다!");
    }
}

 

위 코드에서 ButtonClickHandler 클래스는 마우스 클릭을 감지하고 OnClicked 이벤트를 발생시킵니다. ClickResponse 클래스는 OnClicked 이벤트에 ShowMessage 메서드를 등록하여 클릭 이벤트가 발생할 때 메시지를 출력합니다. 여기서 Action 델리게이트는 반환값과 매개변수가 없는 메서드를 참조할 수 있도록 사용됩니다. 중요한 점은 이벤트를 통해 클래스 간의 동작을 유연하게 연결하고 분리할 수 있다는 것입니다.

 

이벤트와 델리게이트의 차이점

이벤트는 델리게이트와 유사하지만, 다음과 같은 차이점이 있습니다:

 

보호 수준

event는 클래스 외부에서 직접 호출될 수 없기 때문에, 다른 프로그래머는 외부에서 이 이벤트를 임의로 발생시키지 않을 것이라는 점을 기대할 수 있습니다.

이는 이벤트가 클래스 내부에서만 발생하도록 안전하게 보호된다는 것을 의미하며, 외부에서 Invoke() 메서드를 사용할 수 없음을 보장합니다.

델리게이트는 직접 호출이 가능하므로 외부에서 호출되어 예기치 않은 동작을 일으킬 수 있지만, 이벤트는 이를 막아줍니다. 따라서 이벤트는 호출의 안전성과 의도를 더 명확하게 합니다.

 

명확한 의도

event로 선언하면 해당 필드가 단순히 메서드를 참조하기 위해 존재하는 것이 아니라 특정 이벤트를 발생시키기 위해 사용된다는 의도를 명확히 드러냅니다.

즉, 이벤트는 특정 작업(예: 버튼 클릭, 데이터 변경 등)이 발생했을 때 연결된 메서드들이 실행되는 것을 목적으로 한다는 것을 다른 프로그래머들이 쉽게 이해할 수 있게 합니다.

델리게이트가 단순히 메서드 포인터 역할을 한다면, 이벤트는 "이 특정 상황에서 이 작업이 수행된다"는 것을 표현하므로 코드의 의도를 더욱 명확히 전달합니다.

 

제어된 접근

이벤트는 +=와 -= 연산자를 통해서만 핸들러(메서드)를 추가하거나 제거할 수 있습니다.

이 점에서 다른 프로그래머는 이벤트 핸들러를 등록하거나 해제할 수 있지만, 이벤트를 직접 호출하거나 수정하는 것과 같은 다른 작업은 할 수 없음을 기대할 수 있습니다. 델리게이트는 자유롭게 접근 가능하기 때문에 호출을 포함한 다양한 작업이 가능하다는 차이가 있습니다.

 

이런 이유로 event로 선언된 경우, 다른 프로그래머들은 이벤트가 클래스 내부에서만 발생할 것이라는 점과 안전하고 통제된 방식으로만 핸들러를 추가하거나 제거할 수 있다는 점을 기대할 수 있습니다.

이러한 점들은 코드의 명확성, 안전성, 유지보수성을 높여주기 때문에 이벤트를 사용하는 것이 더 유리한 상황이 많습니다.

 

 

C#에서 이벤트는 주로 UI 요소나 비동기 작업 등에서 사용되며, 프로그램의 구조를 유연하고 확장 가능하게 만드는 중요한 도구입니다. 

 

 

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

Action  (0) 2024.10.12
Callback  (1) 2024.10.12
delegate  (1) 2024.10.12
Interface  (1) 2024.10.10
var 키워드  (0) 2024.10.08