삽질의 현장/- .NET

#057_닷넷(.NET)_.Net Framework 기본 - 대리자 & 이벤트 & 람다 정리

shovelman 2015. 11. 4. 20:55


안녕하세요 삽잡이입니다.


이번 시간에는 대리자, 이벤트, 람다에 대해서 정리해보려고합니다.

가뜩이나 글만 주구장창 쓰는데,

오늘은 더욱 글이 흘러 넘칠 것 같군요... 시작합니다!



'대리자, 이벤트, 람다'
이 모두는 모두 delegate에 관한 이야기입니다.

대리자는 메서드를 가리키는 객체를 말하지요.
그러면 왜 메서드를 가리킬까요? 
그 객체를 가지고 메서드를 호출하기 위해서입니다.
아무튼... 대리자는 함수를 가리키는 객체를 만드는 문법입니다.
그리고 그 객체를 함수로 호출하는 문법이지요.

대리자는 이미 하나의 타입으로 자리를 잡았습니다.
그래서 대리자는 가장 많이 쓰이는 대리자로써 


라는 굉장히 중요한 핸들러로 만들어져있지요.

즉, 이런 delegate가 BCL에 이미 만들어져있다는 것입니다.


그래서 delegate 는 형식의 이름이기도 하지만, 

그 형식으로부터 만들어진 객체라고도 부릅니다.


대리자는 함수를 가리키고 호출을 할 때 사용이 되는데,

대리자에서 callback으로 사용되는 부분은 70% 이상일 정도로 많이 차지합니다.


callback은 서버에서 클라이언트의 코드를 호출 및 실행하는 것이라고 했었지요...


아무튼... 대리자가 그래서 필요한 것입니다.


대리자는 클라이언트 코드의 함수를 가리킴으로써,

언제든 실행할 수 있도록 작성되어있습니다.


그런데, 대리자는 필드입니다.

그리고 굉장히 많은 기능을 가지고 있습니다.

대리자를 잘못 건드리면 나머지가 큰 일날 수 있지요.

따라서 정말 내가 원하는 함수를 가리키고 콜백하기 위해서 문법하나가 만들어졌는데,

이게 바로 '이벤트'입니다.



그래서 대리자 앞에는 모두 event 키워드를 붙일 수 있습니다.


event를 뺐다가 붙였다가로 대리자, 이벤트 변환이 가능한 것이지요...

아무튼.. 어떤 사건이 발생했을 때 k를 발생하겠다는 뜻입니다.

즉, k가 메서드에 등록이 되어있다면 실행된다 이겁니다.


이벤트가 뭐냐고 한다면,

닷넷의 이벤트는 대리자에서 콜백을 위해 만들어놓은 문법이라고 할 수 있습니다.

키워드라고도 부를 수 있겠군요.


대리자 중에서도 콜백을 위해 만들어 놓은 특수한 문법인 이벤트!

이 이벤트는 두가지 연산 +=, -= 이 연산밖에 없습니다.

==, = 이런 연산들 다 안됩니다.

그래서 이벤트를 더하거나 빼거나 즉, 등록, 제거만을 할 수 있습니다.

정확히는 이벤트 핸들러를 등록하거나 제거할 수 있다는 것이지요.


참고로 핸들러는 실행되는 메서드입니다.



predicate는 이벤트라고 할 수 없습니다.

사실... predicate는 또 대리자라고도 할 수 없습니다.


이 predicate는 어떤 조건을 판단 하는 놈이라는 것을 가리킵니다.

그런데, 닷넷의 100%는 서버가 클라이언트에게 질의를 묻고자할 때 사용됩니다.

그래서 닷넷에서는 callback의 용도로 사용이 되는 것입니다.


원래 predicate 정의 자체는 callback이 아닙니다.

predicate는 이벤트, 대리자도 아닙니다. 단지, predicate일 뿐이지요...


이 놈은 닷넷만 있는 기능이 아닙니다.

다른 언어에도 존재합니다.

어떤 조건을 판단하는 놈, 메서드, 행동 자체를 가리켜 

predicate라고 부르는 사실을 잊지 마시길 바랍니다.


그런데, 닷넷으로 오면 callback으로 취급받고요... 허허...

서버가 클라이언트에게 조건을 묻고자 해서 만든 콜백이라는 뜻입니다.

그래서 predicate가 형식으로 정의 되어있는 것이구요.


반복하지만, 닷넷에서는 Predicate<T> 형식으로 정의되어있다는 것입니다.

이 형식은 predicate<T> 형 delegate라고 얘기해도 되구요.


그리고 그 대리자는 클라이언트가 predicate의 내가 하고자하는 메서드의 

조건, 판단을 위해 사용된다 이겁니다.


그리고 람다는 predicate가 아닙니다.

또한 람다는 이벤트, 딜리게이트도 아닙니다.

람다는 람다 기호를 갖고, 

왼쪽에는 인수, 오른쪽에는 행동을 갖는 문법을 말합니다.


90%이상 predicate를 지정하는 곳에는 람다를 사용합니다.

람다는 또 callback일 경우 사용되는 경우가 많지요...

(이벤트 핸들러를 등록할 때 callback을 많이 쓰지요...)


적어도 C#, 닷넷에서의 람다는 

전부 predicate를 지정하거나, callback을 지정하는 곳에 사용된다고 생각하시면 됩니다.

왜냐? 문법이 사용되기 쉬우니깐요.


그 전에는 익명 메서드를 사용했었지만,

람다가 나온뒤로 잘 사용되지 않지요...


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!