" /> 글로벌 객체지향 프로그래밍 14주차 - C# Delegate 이벤트 | BlackWerf's Blog
포스트

글로벌 객체지향 프로그래밍 14주차 - C# Delegate 이벤트

Delegate

정의

  • 메소드를 대신하여 호출하는 기법
  • 선언을 위해서는 delegate 키워드를 사용

사용 방법

선언방법

1
접근제한자 delegate 반환타입 대리자 이름(매개변수 목록);

예시

1
public delegate void MyTestDelegate(string value);

호출 방법

1
2
3
4
5
//메소드가 여러번 사용되는 경우
대리자이름(매개변수 );

//메소드가 한번만 사용되는 경우
대리자이름 객체이름 = delegate 반환타입(매개변수);

사용 예시

1
2
3
4
5
6
7
8
9
public static void MyTestVoid(string value)
{
  Console.WriteLine(value);
};

MyTestDelegate delegate1 = MyTestVoid; // MyTestVoid 메소드를 del1에 할당
delegate1("Method A Called");
MyTestDelegate delegate2 = delegate void (string value); //한번만 사용되는 메소드에 델리게이트 하는 경우


주의 사항

  • Delegate에 할당할 메소드 만들기 - 반환타입과 메소드가 Delegate 선언과 동일해야 됨.

사용 이유

  • 메소드의 매개변수에 메소드를 전달하거나, 메소드를 조합해야하는 경우에 유용

    • 델리게이트를 사용하지않는 경우, 수많은 메소드나 로직을 작성해야 함

      -> 코드 길이 증가

Action

개념

  • 입력(매개변수)와 출력(반환형)이 없는 메소드를 가르킬 수 있는 델리게이트

사용방법

선언

1
Action 변수;

할당

1
변수 += 메소드 이름;

호출

1
변수();

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ActionTest : MonoBehaviour
{
    private Action action;
    
    // Start is called before the first frame update
    void Start()
    {
        action += Alpha;
        action += Beta;

        action(); //등록된 모든 메소드가 일괄 실행
    }
    void Alpha() => Debug.Log("Alpha");
    void Beta() => Debug.Log("Beta");
}

이벤트

개념

  • 연쇄 동작을 이끌어내는 사건

  • 어떤 일을 실행하지는 않지만, 이벤트가 발생하면 등록된 처리들이 연쇄적으로 실행됨

  • 이벤트는 이벤트리스너가 어떤 처리를 실행하는지 상관 X

  • 이벤트는 자신에게 등록된 메소드들의 내부 구현을 알지 못하는 상태로 메소드를 실행함

    • 견고한 커플링1 문제 해결

      • 느슨한 커플링2


  • 이벤트 리스너
    • 이벤트가 발생될 때, 실행되는 메소드들
    • 이벤트에 등록하는 것을 이벤트 리스너가 이벤트를 구독한다고 표현


Event

  • 델리게이트 타입의 변수는 event 키워드를 붙여 사용 가능
  • 델리게이트 변수를 event로 선언하면 클래스 외부에서는 해당 델리게이트를 실행 불가능 함.
    • 오로지 내부에서만 실행됨
  • 사용을 하는 경우, Event를 사용하지 않는 쪽에서 이벤트 발동하는 것을 방지할 수 있음


  1. 두 코드간의 연결 정도가 강해, 코드 수정이 힘들다는 의미 

  2. 이벤트로 처리하는 경우, 두 코드간의 연결 정도가 약해 코드 수정이 쉬움 

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.