Delegate

2022. 7. 1. 10:50C#/C#에 대한 다양한 공부

[Delegate]

 

*델리게이트(Delegate)

번역해보면 '대리자' 라는 의미를 가지고 있다. 그대로 무엇인가를 대신할 있는 역할 한다.

 

델리게이트를 사용하는 이유

만약에 클래스a 클래스b 메서드를 호출한다고 생각해보자(혹은 그반대여도). 그러면 a b 참조할 것이고, b에서 a 참조하는 경우도 생길 있다. , 쌍방으로 참조가 생길 있다. 하지만 델리게이트는 그러한 쌍방 참조를 끊어낸다. a b 메서드를 델리게이트로 호출한다면 a b 대한 참조를 생기겠지만 b a 모른다.

 

그래서 무엇을 대신하는 대리자인가. 델리게이트는 메서드를 대신해주는데 메서드의 반환형, 매개 변수 종류와 개수가 모두 일치해야 한다. 델리게이트가 메서드를 대신해준다는건 알겠는데 "메서드를 그냥 호출하는 것과 비교해서 뭐가 좋다는건가?" 라는 의문이 든다. 사실 그냥 메서드를 부르는데에는 의미가 없다.

델리게이트는 콜백함수 만들때 매우 유용하다. 델리게이트와 이벤트를 결합하게 되면 이벤트가 발생했을때 구독자들에게 이벤트 발생을 알릴 있다

 

*콜백(call-back)

함수의 호출 실행 시점을 프로그래머가 아닌, 시스템에서 결정하는 함수를 콜백함수라고 한다. 콜백은 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 일반적인 개발에서는 개발자가 필요한 시점에 , 특정 이벤트가 발생했을때 동작하는 콜백을 콜백함수라고 한다.

-> 누가봐도 오른쪽의 과정이 효율적으로 보일 것이다. 그래서 콜백함수를 사용한다.

 

(연습용 예제)

 

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

이벤트와 델리게이트의 가장 차이점은 이벤트는 외부에서 직접 사용할 없다. 이벤트가 public으로 선언되어 있어도 자신이 선언되어 있는 클래스 외부에서는 호출이 불가능하다. 하지만 델리게이트는 가능하다. 그렇기 때문에 델리게이트는 콜백용도로 사용하고 이벤트는 이벤트를 알리는 용도로 사용한다.

 

그런데 이렇게 특정한 이벤트를 생성하기 위해서는 사용되는 delegate 타입을 미리 정의해야하는 번거로움 있다. 그래서 C#에서는 미리 정의 delegate 간단하게 있는 기능을 제공하고 있는데, 대표적인 기능이 바로 Action Func. 기능을 통해서 별도의 delegate 선언없이 한줄로 표현할 있다.

-> 이게 가능한 이유는 system네임스페이스 안에 이미 선언이 되어있기 때문.. 우리는 그걸 가져다 쓰는것..

 

*Action

Action<T> 이름; 형태로 선언한다. 단어 그대로 일종의 '동작'이므로 반환 없이 연결된 일련의 함수들을 실행한다.

-> 두문장을 아래의 한문장으로 대체 가능

 

*Func

Func<T, TResult> 이름; 형태로 Action 달리 반환값이 존재하며 마지막 매개변수 TResult 반환 형태이다. 람다식을 활용해 간단하게 특정 값을 얻어낼 주로 사용한다.

 

Action 편하긴 하지만 단점도 존재한다. 이미 정의 delegate 가져와 사용하는 것이기 때문에 매개변수 명이 기본값으로 고정되어 있다. 그렇기 때문에 다른 스크립트에서 연결될 함수를 자동생성했을 어떤값이 전달되는지 직관적으로 없다. 누구나 쉽게 바로 사용할 있는 event 만들어야 한다면 delegate 직접 정의하여 쓰도록하자!

'C# > C#에 대한 다양한 공부' 카테고리의 다른 글

Static, 싱글톤  (0) 2022.07.01
[async/await]  (0) 2022.07.01
델리게이트, 이벤트  (0) 2022.06.01
추상클래스, 인터페이스 연습용  (0) 2022.05.24
델리게이트와 이벤트를 활용한 콜벡메서드 예제  (0) 2022.05.24