본문 바로가기

컴퓨터 언어

[C#] 델리게이트와 이벤트

[델리게이트 (대리자)]

 

델리게이트는 특정 매개 변수들과 반환 형식을 가지고 있는 함수에 대한 참조를 뜻하는 것으로 델리게이트 객체를 통해 함수를 호출할 수 있다. 

 

즉 델리게이트는 같은 형식의 매개 변수들과 같은 형식의 반환 형식을 가진 함수가 있다면 그 함수를 호출할 수 있고 다른 함수의 매개변수에 델리게이트를 넣음으로써 델리게이트와 같은 형식을 가진 함수들을 함수의 매개변수를 통해 호출할 수 있게 된다.

 

델리게이트는 delegate 반환형 델리게이트이름(매개변수들)의 형식을 갖고 있다.

 

이런 식으로 3종류의 델리게이트가 정의되어 있을 때,

 

 

위와 같이 구현된 함수들은 모두 double의 반환 형식과 double타입의 매개 변수 두 개를 갖고 있으므로

해당 함수들을 받을 수 있는 델리게이트는 DelegateMethod2뿐이다.

 

 

 

이러한 델리게이트를 사용하기 위해서는 반환형과 매개변수가 같은 함수를 델리게이트에 할당한 후 할당된 델리게이트 변수를 함수를 호출할 때와 동일한 방법으로 호출을 하면 된다.

 

 

 

 

 

 

델리게이트를 직접 정의하지 않고 C#에서 델리게이트를 사용하기 쉽게 만든 제네릭 델리게이트가 존재하는데 Action과 Func이다. Func는 반환 타입이 있는 함수에 대한 델리게이트이고 Action은 반환 타입이 없는 함수에 대한 델리게이트이다.

Func는 <>안에 매개변수를 나열하고 마지막에 반환 형식을 위치시키는 형식으로 선언하고

Action은 반환형식이 존재하지 않으므로 <>안에 매개변수의 형식만을 선언하게 된다.

 

 

 

델리게이트는 여러 델리게이트 객체를 연결하여 한 번의 호출로 여러 메서드를 실행할 수 있는 델리게이트 체인을 사용할 수 있다. 이 연결을 통해 여러 메스더를 연결하고 순서대로 실행시킴으로써 이벤트의 개념으로 사용할 수 있다.

델리게이트 체인을 구성하기 위해서는 델리게이트의 객체와 함수를 연결할 때 += 연산자를 사용함으로써 여러 메서드를 동시에 호출할 수 있게 된다.

 

델리게이트와 다수의 함수 연결

 

이러한 델리게이트 체인 방식을 사용해서 특정 작업이 발생하였거나 어떤 변화가 일어났을 때 델리게이트 체인을 호출하여 체인에 엮여 있는 함수들을 변화와 동시에 발생시키고자 사용할 수 있다.

 

문제는 델리게이트 체인에 함수를 연결할 때 = 연산자를 사용할 경우 그 이전에 어떤 함수를 연결 했든 상관 없이 =연산자를 사용한 함수로 초기화된다는 점, 델리게이트 체인 델리게이트 체인이 원하지 않은 곳에서 임의로 사용될 경우 비정상적인 알람을 유발할 수 있다는 점이 존재한다.

 

이러한 문제를 해결한게 Event이다 .

 

 

[Event]

이벤트는 특별한 형식의 델리게이트로 일련의 사건이 발생했다는 사실을 다른 개체에 전달하는 작용으로 델리게이트의 일부 기능을 제한하여 이벤트의 용도로 사용한다.

이벤트는 클래스 내에서 정의되며 외부에서 직접 호출 되지 않는다. 대신 다른 클래스나 객체에서 해당 이벤트에 대한 구독을 통해 해당 이벤트가 발생했을 때 실행될 함수를 등록할 수 있다.

 

앞서 말했듯이 델리게이트 체인은 외부에서 직접 델리게이트 체인에 접근하여 수정할 수 있다는 단점이 존재했는데 이로 인해 보안 측면에서도 취약성이 발생할 수 있기 때문에 이벤트를 사용하게 된다. 이러한 이벤트는 외부에서 직접 수정할 수 없게 캡슐화가 되어 외부에서 이벤트를 추가하거나 제거할 수 있지만 직접적으로 설정된 델리게이트 체인을 변경할 수는 없게 된다.

'컴퓨터 언어' 카테고리의 다른 글

[C#] 인터페이스  (0) 2023.11.07
[C#] 구조체와 클래스  (0) 2023.11.06
[C++] 다형성, 추상성  (0) 2023.11.04
[C++] OOP - 캡슐화, 상속  (0) 2023.11.01
[C++] 반복문과 연습  (0) 2023.10.31