본문 바로가기
C#

[C#] 델리게이트(delegate), 이벤트(event)

by dabiLibrary 2023. 11. 13.
728x90
반응형

델리게이트

델리게이트는 메소드에 대한 참조이다. 힙 영역에 할당이 되는 하나의 형식(type)이다.

델리게이트는 인스턴스 메소드, 정적 메소드 모두 참조 가능하다. 델리게이트는 값이 아닌 '코드'그 자체를 넘기고 싶을 때 사용한다. 델리게이트를 호출하면 참조하던 메서드가 모두 호출된다.

델리게이트는 반환형과 매개변수가 일치하는 함수만 델리게이트 변수에 할당할 수 있다. 델리게이트는 힙 영역에 할당되는 것이기 때문에 인스턴스를 생성해주어야 한다. 그리고 호출할 땐 델리게이트 변수를 함수 호출법과 동일하게 ()를 통해 호출한다.

델리게이트는 observer 패턴의 한 형태이고, 객체 간 상호작용과 이벤트 처리에 유용하게 활용된다.

델리게이트 선언

델리게이트를 선언할 땐 'delegate 반환형 델리게이트이름(매개변수들);' 로 한다.

ex. public delegate float DelegateMethod1(float param1, float param2);

 

 

델리게이트 변수 생성

선언한 델리게이트의 변수를 생성할 땐

public static DelegateMethod1 delegate1; 이런식으로 한다.

 

델리게이트 사용

델리게이트에 함수를 넣을 땐, 즉 인스턴스를 생성하는 것인데

delegate1 = new DelegateMethod(넣을 함수); 혹은 delegate1 = 넣을 함수;

이런식으로 델리게이트 인스턴스를 생성할 수 있다.

 

델리게이트 체인

하나의 델리게이트 변수에 여러 개의 함수를 할당하는 것이 가능하다. 이땐 '='가 아니라, '+=' 혹은 '-='연산자를 통해 할당을 추가하고 제거할 수 있다. 만약 '='연산자를 통해 할당할 경우 이전의 다른 함수들을 할당한 상황이 사라진다.

델리게이트를 호출시킬 땐 할당한 순서대로 함수가 호출된다.

델리게이트는 같은 함수를 여러 번 할당할 수도 있다. 이럴 땐 할당한 수만큼 여러 번 호출된다.

 

Func 델리게이트

반환형과 매개변수를 지정한 델리게이트

Func<매개변수들..., 반환형>

static Func<int, int, int> funcDelegate;

 

Action 델리게이트

반환형이 void 이며 매개변수를 지정한 델리게이트

Action<매개변수들 ...>

static Action<string> actionDelegate;

Predicate 델리게이트

반환형이 bool, 매개변수가 하나인 델리게이트

Func이 더욱 확장성 있기 때문에 잘 사용되진 않음 (.Net 2.0에서 사용함)

static Predicate<string> predicateDelegate;

C# 에서는 이런 델리게이트의 기능을 이용하여 event를 구현하여 사용할 수 있다.

 

Event(이벤트)

객체에 특정 작업의 실행을 다른 개체에게 알리는 메시지이다.

이벤트는 일반적으로 델리게이트 모델을 기반으로 하는데, 이는 Observer 디자인 패턴을 따른다. 델리게이트의 일부 기능을 제한하여 이벤트의 용도로 사용

 

이벤트 사용

public delegate void EventDelegate(string message);

public event EventDelegate OnEvent; // 이벤트 변수 : 델리게이트 변수 앞에 event 키워드 추가

이벤트의 제약사

1. 할당 연산자(=) 사용불가

why? '='를 통한 할당의 경우 이전 함수들의 할당이 사라지므로 객체가 이벤트에 반응할 것을 기대하고 추가하 였지만 반응하지 않는 것을 방지 (즉 실수방지)

2. 클래스 외부 호출 불가로 안정성 증가

이벤트는 이벤트가 포함된 클래스 내에서만 발생 가능. 발생은 호출이라는 뜻. 즉 할당 및 제거는 다른 클래서에

서도 가능. 이벤트 호출만 외부에서 불가능

why? 일련의 사건이 발생했다는 사실을 다른 개체에게 전달할 용도로 사용하기 위해. 외부에서 이벤트를 발생

시킨다면 개체가 사건이 발생하지 않은 경우에도 호출할 수 있음

728x90
반응형

'C#' 카테고리의 다른 글

[C#] 싱글톤  (0) 2023.11.13
[C#] 가비지컬렉터(GC, 가비지 수집기)  (1) 2023.11.13
[C#] 코루틴(Coroutine)  (0) 2023.11.13
[C#] string(문자열)과 StringBuilder  (1) 2023.11.13
[C#] 정렬(Sorting)  (0) 2023.11.13