이벤트 객체

Flash Player 9 이상, Adobe AIR 1.0 이상

이벤트 객체는 새 이벤트 처리 시스템에서 크게 두 가지 목적으로 사용됩니다. 첫 번째로 이벤트 객체는 속성 집합에 특정 이벤트에 대한 정보를 저장하여 실제 이벤트를 나타내고, 두 번째로 이벤트 객체에는 이벤트 객체를 조작하고 이벤트 처리 시스템의 비헤이비어에 영향을 줄 수 있는 메서드 집합이 포함되어 있습니다.

이러한 속성과 메서드에 쉽게 액세스할 수 있도록 Flash Player API에서는 모든 이벤트 객체의 기본 클래스로 사용되는 Event 클래스를 정의합니다. Event 클래스는 모든 이벤트 객체에 공통으로 사용되는 기본 속성 및 메서드 집합을 정의합니다.

이 단원에서는 먼저 Event 클래스 속성과 Event 클래스 메서드에 대해 차례로 설명하고 Event 클래스의 하위 클래스를 사용하는 이유에 대해 설명합니다.

Event 클래스 속성 이해

Event 클래스는 이벤트 객체에 대해 다음과 같은 중요한 정보를 제공하는 많은 읽기 전용 속성 및 상수를 정의합니다.

  • 이벤트 객체 유형은 상수로 나타내고 Event.type 속성에 저장됩니다.

  • 이벤트의 기본 비헤이비어를 취소할 수 있는지 여부는 부울 값으로 나타내고 Event.cancelable 속성에 저장됩니다.

  • 이벤트 흐름 정보는 나머지 속성에 포함됩니다.

이벤트 객체 유형

모든 이벤트 객체에는 이벤트 유형이 연결되어 있으며 이벤트 유형은 Event.type 속성에 문자열 값으로 저장됩니다. 코드에서 유형이 다른 객체를 구별할 수 있도록 이벤트 객체의 유형을 알고 있으면 유용합니다. 예를 들어 다음 코드에서는 clickHandler() 리스너 함수가 myDisplayObject에 전달되는 마우스 클릭 이벤트 객체에 응답하도록 지정합니다.

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

Event 클래스 자체에 연결된 이벤트 유형은 24개 정도이며 각각 Event 클래스 상수로 나타냅니다. Event 클래스 정의에서 발췌한 다음 코드에서는 이러한 이벤트 유형 중 일부를 보여 줍니다.

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

이러한 상수를 사용하면 특정 이벤트 유형을 쉽게 참조할 수 있습니다. 실제로 이벤트 유형을 나타내는 문자열 대신 상수를 사용해야 합니다. 코드에 상수 이름 철자를 잘못 입력하면 컴파일러에서 이러한 오류를 catch하지만 문자열을 사용하는 경우에는 컴파일할 때 철자 오류가 나타나지 않으므로 쉽게 디버깅할 수 없는 비헤이비어가 발생할 수 있습니다. 예를 들어 이벤트 리스너를 추가할 때 다음 코드를 사용하십시오.

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

이때 다음 코드를 사용하지 않는 것이 좋습니다.

myDisplayObject.addEventListener("click", clickHandler);

기본 비헤이비어 정보

cancelable 속성에 액세스하여 특정 이벤트 객체의 기본 비헤이비어를 취소할 수 있는지 여부를 검사하도록 코드를 작성할 수 있습니다. cancelable 속성에는 기본 비헤이비어를 취소할 수 있는지 여부를 나타내는 부울 값이 포함되어 있습니다. preventDefault() 메서드를 사용하면 소수의 이벤트와 연결된 기본 비헤이비어를 취소할 수 있습니다. 자세한 내용은 Event 클래스 메서드 이해에서 "기본 이벤트 비헤이비어 취소"를 참조하십시오.

이벤트 흐름 정보

나머지 Event 클래스 속성에는 이벤트 객체 및 해당 이벤트 객체와 이벤트 흐름 간의 관계에 대한 중요 정보가 포함되어 있습니다(다음 목록의 설명 참조).

  • bubbles 속성에는 해당 이벤트 객체가 참여하는 이벤트 흐름의 단계에 대한 정보가 포함됩니다.

  • eventPhase 속성은 이벤트 흐름에서 현재 단계를 나타냅니다.

  • target 속성에는 이벤트 대상에 대한 참조가 저장됩니다.

  • currentTarget 속성에는 현재 이벤트 객체를 처리하고 있는 표시 목록 객체에 대한 참조가 저장됩니다.

bubbles 속성

이벤트 객체가 이벤트 흐름의 버블링 단계에 참여하는 경우, 즉 이벤트 객체가 대상 노드에서 다시 전달되어 조상 노드를 거쳐 Stage에 도달하는 경우 해당 이벤트가 버블링된다고 합니다. Event.bubbles 속성에는 이벤트 객체가 버블링 단계에 참여하는지 여부를 나타내는 부울 값이 저장됩니다. 버블링되는 모든 이벤트는 캡처 및 대상 단계에도 참여하므로 버블링되는 이벤트는 이벤트 흐름의 세 단계에 모두 참여하게 됩니다. 이 값이 true이면 이벤트 객체가 세 단계에 모두 참여하고, 이 값이 false이면 이벤트 객체가 버블링 단계에 참여하지 않습니다.

eventPhase 속성

eventPhase 속성을 검토하면 이벤트 객체의 이벤트 단계를 확인할 수 있습니다. eventPhase 속성에는 이벤트 흐름의 세 단계 중 하나를 나타내는 부호 없는 정수 값이 포함됩니다. Flash Player API에서는 다음 코드와 같이 부호 없는 세 정수 값에 해당하는 세 개의 상수가 포함된 별도의 EventPhase 클래스를 정의합니다.

package flash.events 
{ 
    public final class EventPhase 
    { 
        public static const CAPTURING_PHASE:uint = 1; 
        public static const AT_TARGET:uint = 2; 
        public static const BUBBLING_PHASE:uint= 3; 
    } 
}

이러한 상수는 eventPhase 속성의 유효한 세 값에 해당합니다. 상수를 사용하면 쉽게 읽을 수 있는 코드를 작성할 수 있습니다. 예를 들어 이벤트 대상이 대상 단계에 있는 경우에만 myFunc() 함수를 호출하려면 다음 코드를 사용하여 이 조건을 테스트할 수 있습니다.

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

target 속성

target 속성에는 이벤트 대상 객체에 대한 참조가 있습니다. 이는 경우에 따라 간단할 수 있는데, 예를 들어 마이크가 활성화되는 경우 이벤트 객체의 대상은 Microphone 객체입니다. 그러나 대상이 표시 목록에 있는 경우에는 표시 목록 계층 구조를 고려해야 합니다. 예를 들어 표시 목록 객체가 겹쳐 있는 지점에서 사용자가 마우스 클릭을 입력하면 Flash Player 및 AIR에서는 항상 Stage와 가장 멀리 떨어진 객체를 이벤트 대상으로 선택합니다.

복잡한 SWF 파일, 특히 크기가 작은 여러 개의 자식 객체로 장식된 버튼이 있는 SWF 파일의 경우 target 속성은 버튼이 아니라 버튼의 자식 객체를 가리키는 경우가 많으므로 자주 사용되지 않습니다. 이러한 경우 target 속성은 버튼의 자식 객체를 가리키지만 이 속성은 버튼을 가리키므로 일반적으로 버튼에 이벤트 리스너를 추가하고 currentTarget 속성을 사용하는 것이 좋습니다.

currentTarget 속성

currentTarget 속성에는 현재 이벤트 객체를 처리하고 있는 객체에 대한 참조가 포함됩니다. 검토 중인 이벤트 객체를 어떤 노드에서 처리하고 있는지 모른다는 것이 잘 이해가 되지 않을 수도 있지만 이벤트 객체의 이벤트 흐름에 있는 모든 표시 객체에 리스너 함수를 추가할 수 있으며 아무 위치에나 리스너 함수를 배치할 수 있음을 기억하십시오. 또한 같은 리스너 함수를 여러 표시 객체에 추가할 수도 있습니다. 프로젝트가 더 복잡해지고 크기가 커질수록 currentTarget 속성의 유용성도 커집니다.

Event 클래스 메서드 이해

Event 클래스 메서드는 다음과 같은 세 가지 범주로 구성되어 있습니다.

  • 유틸리티 메서드 - 이벤트 객체의 복사본을 만들거나 문자열로 변환할 수 있습니다

  • 이벤트 흐름 메서드 - 이벤트 흐름에서 이벤트 객체를 제거합니다.

  • 기본 비헤이비어 메서드 - 기본 비헤이비어를 취소하거나 취소 여부를 확인합니다

Event 클래스 유틸리티 메서드

Event 클래스에는 두 가지 유틸리티 메서드가 있습니다. clone() 메서드를 사용하면 이벤트 객체의 복사본을 만들 수 있으며, toString() 메서드를 사용하면 이벤트 객체 속성의 문자열 표현과 해당 속성 값을 생성할 수 있습니다. 이러한 두 메서드는 모두 이벤트 모델 시스템에서 내부적으로 사용되지만 일반적인 용도로 개발자에게 노출됩니다.

Event 클래스의 하위 클래스를 만드는 고급 개발자의 경우 이벤트 하위 클래스가 제대로 작동하도록 두 유틸리티 메서드 버전을 모두 재정의하여 새로 구현해야 합니다.

이벤트 흐름 중단

Event.stopPropagation() 메서드 또는 Event.stopImmediatePropagation() 메서드를 호출하면 이벤트 흐름에서 이벤트 객체가 계속 진행되지 않도록 중단할 수 있습니다. 두 메서드는 다음과 같이 현재 노드의 다른 이벤트 리스너를 실행할 수 있는지 여부만 다르고 나머지는 거의 같습니다.

  • Event.stopPropagation() 메서드를 사용하면 현재 노드에서 다른 이벤트 리스너가 실행된 경우에만 이벤트 객체가 다음 노드로 이동되지 않습니다.

  • Event.stopImmediatePropagation() 메서드를 사용하면 이벤트 객체가 다음 노드로 이동되지 않지만 현재 노드에서 다른 이벤트 리스너를 실행할 수 없습니다.

두 메서드 중 하나를 호출해도 이벤트와 연결된 기본 비헤이비어의 발생 여부에는 아무 영향을 주지 않습니다. 기본 비헤이비어를 취소하려면 Event 클래스의 기본 비헤이비어 메서드를 사용하십시오.

기본 이벤트 비헤이비어 취소

기본 비헤이비어 취소와 관련된 두 메서드는 preventDefault()isDefaultPrevented() 메서드입니다. 이벤트와 연결된 기본 비헤이비어를 취소하려면 preventDefault() 메서드를 호출합니다. 이벤트 객체에서 preventDefault() 메서드가 이미 호출되었는지 여부를 확인하려면 isDefaultPrevented() 메서드를 호출합니다. 이때 메서드가 이미 호출되었으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

preventDefault() 메서드는 이벤트의 기본 비헤이비어를 취소할 수 있는 경우에만 작동합니다. 이를 확인하려면 API 설명서에서 해당 이벤트 유형에 대한 내용을 참조하거나, ActionScript를 사용하여 해당 이벤트 객체의 cancelable 속성을 검토하면 됩니다.

기본 비헤이비어를 취소해도 이벤트 흐름에서 이벤트 객체의 진행 상태에는 아무 영향을 주지 않습니다. 이벤트 흐름에서 이벤트 객체를 제거하려면 Event 클래스의 이벤트 흐름 메서드를 사용하십시오.

Event 클래스의 하위 클래스

대부분의 이벤트는 Event 클래스에 정의된 공통 속성 집합만 있어도 충분합니다. 그러나 Event 클래스에 있는 속성으로 캡처할 수 없는 고유한 특성을 갖고 있는 이벤트도 있습니다. 이러한 이벤트를 위해 ActionScript 3.0에서는 Event 클래스의 하위 클래스를 정의합니다.

각 하위 클래스는 해당 이벤트 범주에 고유한 속성 및 이벤트 유형을 추가로 제공합니다. 예를 들어 마우스 입력과 관련된 이벤트에는 Event 클래스에 정의된 속성으로 캡처할 수 없는 몇 가지 고유한 특성이 있습니다. MouseEvent 클래스는 마우스 이벤트의 위치, 마우스 이벤트를 실행하는 동안 특정 키를 눌렀는지 여부 등의 정보가 포함된 10개의 속성을 추가하여 Event 클래스를 확장합니다.

또한 Event 하위 클래스에는 하위 클래스와 관련된 이벤트 유형을 나타내는 상수도 포함되어 있습니다. 예를 들어 MouseEvent 클래스는 click, doubleClick, mouseDownmouseUp 등 몇 가지 마우스 이벤트 유형에 대한 상수를 정의합니다.

이벤트 객체의 "Event 클래스 유틸리티 메서드" 단원에서 설명한 것처럼 Event 하위 클래스를 만들 때는 clone()toString() 메서드를 재정의하여 해당 하위 클래스에 고유한 기능을 제공해야 합니다.