{{위키데이터 속성 추적}}
[[컴퓨팅]]에서 '''이벤트'''(event)란 [[컴퓨터 프로그램|프로그램]]에 의해 감지되고 처리될 수 있는 동작이나 [[사건]]을 말한다. 대체로 이벤트는 프로그램 동작 과정과 함께 동시에 처리되도록 프로그래밍되어 있다. 즉 프로그램은 이벤트를 처리하기 위한 하나 이상의 전용 공간(또는 핸들러)를 가지게 되는데, 보통의 경우 [[이벤트 루프]]라고 불리는 곳에서 이를 처리하게 된다. 사용자가 [[컴퓨터 자판|키보드]]의 키를 누르는 것이 가장 대표적인 이벤트 발생 인자 중의 하나이며, 타이머와 같은 하드웨어 장치가 이벤트를 발생시키기도 한다. 또한 모든 프로그램은 작업이 완료되었다는 사실 등을 알리기 위해 자체적으로 정의한 이벤트를 발생시킬 수도 있다. [[컴퓨터 프로그램]] 중에서 특히 이벤트에 반응하여 동작을 변경하는 방식을 이벤트 드리븐([[:en:event-driven|event-driven]]) 방식이라고 하는데, 이는 보통 [[대화형 프로그램]]을 만드는데 그 목적이 있다.

==설명==
{{출처 필요 문단|날짜=2015-03-13}}
일반적으로 이벤트 기반 시스템은 프로그램에서 처리해야 할 비동기 외부 활동이 있을 때 사용된다. 사용자가 마우스 버튼을 클릭하는 것을 예로 들 수 있다. 이벤트 기반 시스템은 보통 이벤트 루프의 형태로 동작한다. 이벤트 루프는 평소에 장치로부터 입력이나 내부 경보를 계속해서 기다리고 있다가, 이와 같은 활동이 발생하면 이벤트를 생성시킨다. 이벤트 기반 시스템은 발생한 이벤트에 대해 언제, 어디서, 어떤 이벤트가 발생했는지 따위의 데이터를 수집하고, 이 데이터를 필요한 ''이벤트 핸들러''로 발송(dispatch)한다.

프로그램은 이벤트를 선택적으로 무시할 수 있으며, 하나의 이벤트를 여러 개의 핸들러에 동시에 발송하게 할 수도 있다. 이벤트에 관련된 데이터는 최소한 어떤 형태의 이벤트인지 나타내기 위한 정보를 가지고 있고, 발생 시기 및 원인, 그리고 이벤트 ''소스'' 가 이벤트 핸들러로 제공하는 이벤트 처리 방법 등과 같은 추가 정보를 포함 할 수도 있다.

이벤트는 일반적으로 마우스 클릭, 창 크기 조정, 키보드 누름, 다른 프로그램의 메시지 등과 같이 외부의 동작이 프로그램 내부에서 처리되는 사용자 인터페이스에서 주로 사용된다. [[윈도 환경]]에서 작성된 대부분의 프로그램은 이런 이벤트 핸들러로 구성되어 있다.

이벤트는 [[인터럽트]]를 보완하기 위한 용도로 [[명령어 집합]] 레벨에서 사용될 수도 있다. 인터럽트와는 달리 이벤트는 동기화된 환경에서 처리된다. 프로그램에서는 보통 다음 이벤트를 발송(dispatch) 하는 함수를 호출하는 식으로 이벤트가 제공될 때까지 기다리는 반면, 반면 인터럽트는 아무 때나 처리를 요구할 수 있다.

==이벤트 핸들러==

컴퓨터 프로그래밍에서 ''이벤트 핸들러''는 프로그램 내부에서 입력을 받아 처리하는 일종의 [[콜백]] 서브루틴이며, [[자바 (프로그래밍 언어)|자바]] 또는 [[자바 스크립트]]에서는 ''listener'' 라고도 불린다.<ref>https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener</ref> 각각의 이벤트는 주로 [[위젯 툴킷|GUI 툴킷]] 등을 포함하는 기본 프레임 워크에서 온 응용 프로그램 레벨의 정보로, 이러한 GUI 이벤트에는 키 누름, 마우스 움직임, 동작 선택 및 타이머 완료 등이 있다. 좀 더 하위의 이벤트는, [[파일]] 또는 [[네트워크 스트림]]을 읽는 부분에서 데이터의 가용성을 나타내기 위해 사용될 수도 있다. 이벤트 핸들러는 [[사건 기반 프로그래밍|이벤트 기반 프로그래밍]] ([[:en:Event-driven programming|Event-driven programming]])에서 가장 중요한 개념이다.

이벤트는 궁극적으로 하위의 입력 신호를 해석하는 프레임워크에서 출발한다. 예를 들어 마우스로 메뉴를 선택하는 동작을 생각해 보자. 이 이벤트는 최초로 [[운영체제]] 수준에서 하드웨어 장치에서 발생한 인터럽트나 소프트웨어 인터럽트 명령으로부터 출발한다. 이 수준에서는 인터럽트 핸들러와 신호 핸들러가 이벤트 핸들러에 해당한다.

생성된 이벤트는 최초로 프레임워크 내의 이벤트 발송자에서 처리된다. 이벤트 발송자는 보통 이벤트와 이벤트 핸들러 사이를 맺어주는 역할을 하고, 다수의 이벤트나 이벤트 핸들러가 있을 경우, 그 선후 관계를 정리하기도 한다. 이벤트 발송자가 이벤트 핸들러를 직접 호출하기도 하고, 또는 이벤트가 자신이 수행될 이벤트 핸들러에 대한 정보를 가지고 오기를 기다리게 할 수도 있다.

== 일반적으로 발생되는 이벤트 ==
=== 마우스 이벤트 ===
마우스와 같은 [[포인팅 장치|포인팅 디바이스]]의 버튼을 클릭하면 "마우스 클릭" 이벤트가 발생된다. 프로그래머는 이 "마우스 클릭" 이벤트에 반응하는 코드를 짠다. 일반적으로 마우스 이벤트는 마우스의 이동할 때와 (mouse move) 마우스의 버튼을 누르거나(mouse down) 뗄 때(mouse up) 발생한다.<ref name="event">[http://msdn2.microsoft.com/en-us/library/aa983670(VS.71).aspx Mouse and Keyboard Events in Windows Forms]. Microsoft. Retrieved on February 12, 2008.</ref>

=== 키보드 이벤트 ===
사용자가 키보드의 키를 누를 때 현재 실행중인 프로그램은 사용자가 누른 키와 관련된 데이터와 함께 "KeyDown" 이벤트를 수신하게 된다.<ref name="event"/>

=== 조이스틱 이벤트 ===
[[조이스틱]]을 움직이면 X-Y 아날로그 신호를 발생시킨다. 이벤트를 출력할 여러 버튼을 가지고 있기도 하다. 대중적인 게임 박스를 위한 일부 [[게임패드]]들은 조이스틱을 사용한다.

=== 터치스크린 이벤트 ===
[[터치스크린]]을 사용하여 발생되는 이벤트들은 [[DOM 이벤트|터치 이벤트]]나 [[제스처]]를 흔히 가리킨다.

=== 장치 이벤트 ===
장치 이벤트들에는 흔들기, 기울임, 회전, 이동과 같은 장치에 대한 행위를 포함한다.

== 같이 보기 ==
* [[콜백]]
* [[DOM 이벤트]]
* [[사건 기반 프로그래밍|이벤트 드리븐 프로그래밍]]
* [[예외 처리]]
* [[인터럽트 핸들러]]
* [[인터럽트]]
* [[옵서버_패턴|옵저버 패턴]] (예 : 이벤트 리스너)
* [[반응자 패턴]] vs [[프로액터 패턴]]
* [[:en:Signal programming|Signal programming]]
* [[:en:Virtual synchrony|Virtual synchrony]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* Article ''[https://web.archive.org/web/20120313124229/http://doc.trolltech.com/qq/qq11-events.html Another Look at Events]''  by Jasmin Blanchette
* Article ''[http://w3future.com/html/stories/callbacks.xml Event Handlers and Callback Functions]''  by Sjoerd Visscher
* [https://web.archive.org/web/20070211111543/http://atddoc.cern.ch/Atlas/Notes/061/Note061-1.html A High Level Design of the Sub-Farm Event Handler]
* [http://www.w3.org/TR/xml-events/Overview.html#section-eventhandlers An Events Syntax for XML]
* [https://web.archive.org/web/20110720015340/http://www.jini.org/wiki/Jini_Distributed_Events_Specification#Distributed_Events_and_Notifications Distributed Events and Notifications]
* [http://www.quirksmode.org/js/events_order.html Event order]
* [https://web.archive.org/web/20110719030547/http://hikwww2.fzk.de/hik/orga/verdi/rs/Dokumentation/Cpp/Cpp/ioc/tasks/t90us014.htm Write an Event Handler]

[[분류:이벤트 (컴퓨팅)]]
[[분류:컴퓨터 프로그래밍]]
[[분류:함수 (프로그래밍)]]