ActionScript 3.0과 이전 버전의 이벤트 처리 방식 비교

Flash Player 9 이상, Adobe AIR 1.0 이상

ActionScript 3.0과 이전 버전의 ActionScript에서 이벤트를 처리하는 방식 중 가장 큰 차이점은 ActionScript 3.0에는 이벤트 처리 시스템이 하나뿐인 반면 이전 버전의 ActionScript에는 이벤트 처리 시스템이 여러 개 있다는 것입니다. 이 단원에서는 먼저 이전 버전의 ActionScript에서 이벤트를 처리하는 방식에 대해 간략하게 설명한 다음, ActionScript 3.0에서 이벤트 처리 방식이 어떻게 변경되었는지 설명합니다.

이전 버전의 ActionScript에서 이벤트 처리

ActionScript 3.0 이전 버전의 ActionScript에서는 다음과 같은 다양한 방법을 사용하여 이벤트를 처리합니다.

  • on() 이벤트 핸들러 - Button 및 MovieClip 인스턴스에 직접 배치할 수 있습니다.

  • onClipEvent() 핸들러 - MovieClip 인스턴스에 직접 배치할 수 있습니다.

  • 콜백 함수 속성 - XML.onloadCamera.onActivity 등이 있습니다.

  • 이벤트 리스너 - addListener() 메서드를 사용하여 등록합니다.

  • UIEventDispatcher 클래스 - DOM 이벤트 모델을 부분적으로 구현했습니다.

이러한 메커니즘에는 각각 고유한 장점과 단점이 있습니다. on()onClipEvent() 핸들러는 쉽게 사용할 수 있지만 버튼과 동영상 클립에 직접 배치한 코드를 찾기가 어려우므로 이후 프로젝트를 관리하는 데 어려움이 있습니다. 콜백 함수도 간단하게 구현할 수는 있지만 지정된 이벤트에 대해 콜백 함수를 하나만 사용할 수 있습니다. 이와 달리 이벤트 리스너는 리스너 객체와 함수를 만들어야 할 뿐만 아니라 이벤트를 생성하는 객체에 리스너를 등록해야 하므로 쉽게 구현할 수 없습니다. 그러나 이를 통해 리스너 객체를 여러 개 만들어 같은 이벤트에 모든 리스너를 등록할 수 있습니다.

ActionScript 2.0의 구성 요소 개발을 통해 다른 이벤트 모델이 생성되었습니다. UIEventDispatcher 클래스에 구현된 이 새 모델은 DOM 이벤트 사양의 하위 집합을 기초로 하므로 구성 요소 이벤트 처리 작업에 익숙한 개발자는 비교적 큰 어려움 없이 새 ActionScript 3.0 이벤트 모델을 사용할 수 있습니다.

다양한 이벤트 모델에 사용되는 구문은 여러 가지 면에서 공통되는 부분이 있지만 나머지 부분에서는 서로 다릅니다. 예를 들어 ActionScript 2.0에서는 TextField.onChanged와 같은 일부 속성을 콜백 함수 또는 이벤트 리스너로 사용할 수 있습니다. 그러나 리스너 객체 등록 구문은 리스너를 지원하는 여섯 개의 클래스 중 하나를 사용하는지 아니면 UIEventDispatcher 클래스를 사용하는지에 따라 다릅니다. Key, Mouse, MovieClipLoader, Selection, Stage 및 TextField 클래스의 경우 addListener() 메서드를 사용하지만 구성 요소 이벤트 처리의 경우에는 addEventListener() 메서드를 사용합니다.

또한 이벤트 처리 모델이 여러 개인 경우에는 사용된 메커니즘에 따라 이벤트 핸들러 함수의 범위가 크게 달라진다는 문제도 있습니다. 즉, this 키워드의 의미가 이벤트 처리 시스템 간에 일치하지 않습니다.

ActionScript 3.0의 이벤트 처리

ActionScript 3.0에서는 이전 버전의 언어에 사용된 다양한 이벤트 처리 메커니즘을 대체하는 단일 이벤트 처리 모델을 사용합니다. 새 이벤트 모델은 DOM(Document Object Model) 레벨 3 이벤트 사양을 기초로 합니다. SWF 파일 형식은 Document Object Model 표준을 따르지는 않지만 표시 목록과 DOM 구조에는 DOM 이벤트 모델을 구현할 수 있도록 비슷한 점이 많습니다. 표시 목록의 객체는 DOM 계층 구조의 노드에 해당하므로 여기에서 표시 목록 객체노드라는 용어를 바꾸어 사용할 수 있습니다.

Flash Player 및 AIR에서 DOM 이벤트 모델을 구현하는 경우 기본 비헤이비어라는 개념이 포함됩니다. 기본 비헤이비어는 특정 이벤트의 결과로 Flash Player 또는 AIR에서 실행되는 액션입니다.

기본 비헤이비어

일반적으로 개발자는 이벤트에 응답하는 코드를 작성합니다. 그러나 경우에 따라서는 해당 이벤트와 일반적으로 연결된 비헤이비어가 있어 개발자가 비헤이비어 취소 코드를 추가하지 않는 한 Flash Player 또는 AIR에서 자동으로 비헤이비어를 실행합니다. Flash Player 또는 AIR에서 자동으로 실행하는 이러한 비헤이비어를 기본 비헤이비어라고 합니다.

예를 들어 사용자가 TextField 객체에 텍스트를 입력하는 경우 일반적으로 이 텍스트가 TextField 객체에 표시될 것으로 예상하므로 이러한 비헤이비어가 Flash Player 및 AIR에 내장됩니다. 이 기본 비헤이비어가 발생하지 않도록 하려면 새 이벤트 처리 시스템을 사용하여 취소하면 됩니다. 보다 구체적으로 설명하면, 사용자가 TextField 객체에 텍스트를 입력하는 경우 Flash Player 또는 AIR에서 TextEvent 클래스의 인스턴스를 만들어 사용자 입력을 표시합니다. Flash Player 또는 AIR에서 TextField 객체에 텍스트를 표시하지 않도록 하려면 특정 TextEvent 인스턴스에 액세스하여 해당 인스턴스의 preventDefault() 메서드를 호출해야 합니다.

기본 비헤이비어 중 일부는 취소할 수 없습니다. 예를 들어 사용자가 TextField 객체에서 단어를 두 번 클릭하면 Flash Player 및 AIR에서 MouseEvent 객체를 생성합니다. 이때 커서 아래의 단어가 강조 표시되는 기본 비헤이비어는 취소할 수 없습니다.

대부분의 이벤트 객체 유형에는 기본 비헤이비어가 연결되어 있지 않습니다. 예를 들어 네트워크 연결이 설정되면 Flash Player에서 connect 이벤트 객체를 전달하지만 이 객체에는 기본 비헤이비어가 연결되어 있지 않습니다. Event 클래스 및 하위 클래스에 대한 API 설명서에서는 각 이벤트 유형 목록을 제공하고 해당 이벤트에 연결된 기본 비헤이비어에 대한 내용 및 각 비헤이비어를 취소할 수 있는지 여부를 설명합니다.

기본 비헤이비어는 Flash Player 또는 AIR에서 전달하는 이벤트 객체에만 연결되고 ActionScript를 통해 프로그래밍 방식으로 전달되는 이벤트 객체에는 연결되지 않는다는 사실을 이해해야 합니다. 예를 들어 EventDispatcher 클래스의 메서드를 사용하면 textInput 유형의 이벤트 객체를 전달할 수 있지만 이 이벤트 객체에는 기본 비헤이비어가 연결되지 않습니다. 즉, Flash Player 및 AIR에서는 개발자가 프로그래밍 방식으로 전달한 textInput 이벤트의 결과로 TextField 객체에 문자를 표시하지 않습니다.

ActionScript 3.0 이벤트 리스너의 새로운 기능

ActionScript 2.0의 addListener() 메서드를 사용해 본 개발자는 ActionScript 2.0 이벤트 리스너 모델과 ActionScript 3.0 이벤트 모델의 차이점을 쉽게 파악할 수 있습니다. 다음 목록에서는 두 이벤트 모델의 몇 가지 주요 차이점을 설명합니다.

  • ActionScript 2.0에서는 이벤트 리스너를 추가할 때 상황에 따라 addListener() 또는 addEventListener()를 사용하지만 ActionScript 3.0에서는 항상 addEventListener()를 사용합니다.

  • ActionScript 2.0에는 이벤트 흐름이 없으므로 이벤트를 브로드캐스팅하는 객체에서만 addListener() 메서드를 호출할 수 있지만 ActionScript 3.0에서는 이벤트 흐름에 포함된 모든 객체에서 addEventListener() 메서드를 호출할 수 있습니다.

  • ActionScript 2.0에서는 함수, 메서드 또는 객체를 이벤트 리스너로 사용할 수 있지만 ActionScript 3.0에서는 함수 또는 메서드만 이벤트 리스너로 사용할 수 있습니다.