[C# 강좌]이벤트 - 보강

공부/C#  2013.03.10 02:56

안녕하세요 명월입니다.

 

강좌글을 참 오랫만에 쓰네요.. 강좌글도 연재를 해야 하는데 프로젝트 연재보다 힘이 많이 들어요... 강좌글은... ㅜㅜ 진짜 하나 쓰면 힘이 쫙 빠진다고나 할까? ㅎㅎ 어쨋든 이것도 계획 잡아서 마무리를 해야겠지요.. ㅎㅎ

 

이번 포스팅은 예전에 이벤트 강좌 한 부분이 있습니다.

[C# 강좌 14강] 이벤트

 

근데 이 글이 너무 난해하고 이해하기 어렵다고 하는 요청이 있어서 정말 쉽게 다시 설명해 보겠습니다.

 

최초 이 강좌를 쓸 때는 C언어를 전혀 모르는 상대로 글을 쓰려고 하다 보니 말이 오히려 어려워 진듯 싶네요.. 그래서 약간 C언어를 약간 비교하여 설명해 보겠습니다.

 

이벤트란 무엇인가 다시 설명하겠습니다.

저번에서도 말했듯이 어떤 사건이 발생했을 때 알리는 메시지라고 했는데 이 말이 정확합니다.

C#의 아버지 C언어에서는 이벤트가 있을까요? 물론 정의해 놓은 말은 있지만 C# 처럼 따로 문법이 정해진 것은 없습니다. 그렇다면 C언어에서는 이벤트를 어떻게 정의해 놓을까요?

 

우리가 사용하는 윈도우는 핸들과 메시지로 이루어져 있다고 합니다. 이 말이 가장 어려운데..

예를 들면 이 익스플로러 창을 예로 들어 보겠습니다.

인간은 눈으로 보면서 익스플로러가 윈도우상에 떠있구나 하고 추상적으로 생각을 하게 되겠습니다. 그렇다면 컴퓨터도 그렇게 인식할까요? 우리가 사용하는 CPU 는 숫자계산만 하는 초고속 계산기에 지나지 않습니다. 그렇다면 우리가 이 창을 인식하기 위해 컴퓨터는 어떤 작업을 할까요?

정적인 숫자 - 핸들, 동적인 숫자 - 메시지로 인식을 합니다. 즉, 모든 프로그램은 각 고유의 식별 코드(핸들)을 가지고 있고 동작을 나타내는 메시지로 나뉩니다.

 

여기서 조금 경험이 있는 분은 눈치 채셨을 겁니다. 그 메시지에 우리는 함수를 넣으면 그게 이벤트가 되는 것 입니다.

우리가 많이 사용하는 클릭 이벤트 예제 가지고 확인 해 보겠습니다.

 

 

 

자 여기까지는 일반적인 이벤트 입니다. 모두들 잘 아실겁니다.

그럼 우리는 여기서 이 클릭이벤트를 만들어(?) 보겠습니다.

 

 

클릭메시지를 찾아서 click() 함수를 호출 했습니다.

위에 보면 0x0201 이란 수가 보입니다. 이걸 모르시는 분이 있을 수 있으니 설명 하겠습니다.

우리가 사용하는 Window 는 정해 놓은 약속이 있습니다. 그것이 무엇이냐 하면 Window API 라고 들 하지요.

 

 

위 Window/System 에 찾아보면 있습니다. WinUser.h 라는 C언어 해더를 찾으면 친절하게 왼쪽 마우스 클릭의 번호는 몇번이다 라고 나와있습니다.(16진수를 사용하는 이유는 컴퓨터가 2진수를 사용하기 때문이지요..)

 

실행 시켜 보겠습니다.

 

 

역시나 클릭을 하면 Test 메시지가 나옵니다.

그런데 우리가 알고 있는 이벤트와는 완전 다른 형태이네요.. 클릭 메시지에 그냥 메소드를 넣은 것 뿐인데...

그렇습니다. 저 둘은 결과는 비슷하지만 내부처리는 완전 다릅니다.

밑에의 메시지에 이벤트를 넣은것은 저 메소드가 끝나기 전, 즉 저 확인 버튼을 누르기 전엔 메시지가 멈춰버립니다. 프로그램이 멈처버리는 것이지요.

프로그램은 아무것도 움직이지도 사용하지도 않는 상태여도 끊임없이 메시지를 보내지요.

어느 위치에다 그려라. 어느 위치에 어떤 행동을 해라.. 등등 입니다.

그럼 그 메시지 가 멈춰버리고 그걸 명령하는 메시지가 스텍에 쌓여버린다면 오버플로가 일어나 버리지요.

 

그래서 이벤트 키워드가 있는 것입니다.  이벤트 키워드는 그냥 실행해 하고 메소드로 값을 던저버림 그걸로 끝나는 것입니다. 그 이벤트가 에러가 나더라도 메시지가 멈춰버리면 안되니깐요..

그래서 저기에 이벤트를 만드는 것입니다.

 

 

 

그리고 이벤트는 또 하나의 기능이 있습니다. 정확히는 이벤트의 특성이 아니라 델리게이트의 특성입니다. 바로 중첩이지요..

 

 

실행화면 입니다.

 

 

이렇게 메시지를 세번 중첩을 하게 되면 세개의 메소드가 전부 실행이 되는 화면입니다.

이런 기능의 특성은 C++ 에서 사용하던 SendMessage를 대신 사용하기 위해서 입니다.

 예로 하나의 행동( 클릭 이던가, 로직상의 호출) 이 일어나면 C++ 에서는 전부 메시지로 처리했습니다. C#에서는 메시지 함수가 없습니다. 그래서 이 이벤트로 설계를 하게 되는 것입니다.

 

(참고 : 참고로 C++에서는 이벤트가 전부 메시지 처리입니다. ^^)

 


댓글 3개가 달렸습니다.
댓글쓰기

  1. 2013.05.22 12:29 |  수정/삭제  댓글쓰기

    비밀댓글입니다


  2. 2018.01.19 16:48 |  수정/삭제  댓글쓰기

    비밀댓글입니다