ActionScript 3.0은 이전 버전의 ActionScript를 기초로 제작되었으므로 ActionScript 객체 모델의 발전 과정을 이해하면 도움이 됩니다. ActionScript는 초기 버전의 Flash Professional을 위한 간단한 스크립트 메커니즘으로 처음 개발되었습니다. 이후 프로그래머들은 ActionScript로 점차 복잡한 응용 프로그램을 작성하기 시작했습니다. 이러한 프로그래머의 수요에 대응하기 위해 이후 릴리스에서는 복잡한 응용 프로그램을 만드는 데 필요한 언어 기능이 계속 추가되었습니다.
ActionScript 1.0
ActionScript 1.0은 Flash Player 6 및 이전 버전에서 사용된 언어 버전입니다. 이러한 초기 개발 단계에서도 ActionScript 객체 모델은 기초적인 데이터 유형으로서 객체라는 개념에 기반을 두었습니다. ActionScript 객체는
속성
그룹이 있는 복합 데이터 유형입니다. 객체 모델에서
속성
이라는 용어에는 객체에 연결된 변수, 함수 또는 메서드 등의 모든 항목이 포함됩니다.
이러한 1세대 ActionScript에서는
class
키워드를 통한 클래스 정의가 지원되지 않지만 프로토타입 객체라는 특수한 객체를 사용하여 클래스를 정의할 수 있습니다. Java 및 C++ 등의 클래스 기반 언어와 같이
class
키워드를 사용하여 구체적인 객체로 인스턴스화하는 추상적인 클래스 정의를 만드는 대신, ActionScript 1.0과 같은 프로토타입 기반 언어에서는 기존 객체를 모델(프로토타입)로 사용하여 다른 객체를 만듭니다. 클래스 기반 언어의 객체는 자신의 템플릿 역할을 하는 클래스를 가리킬 수 있지만, 프로토타입 기반 언어의 객체는 자신의 템플릿 역할을 하는 프로토타입이라는 다른 객체를 대신 가리킵니다.
ActionScript 1.0에서 클래스를 만들려면 해당 클래스의 생성자 함수를 정의해야 합니다. ActionScript에서는 함수가 추상적인 정의가 아닌 실제 객체입니다. 작성된 생성자 함수는 해당 클래스 인스턴스의 프로토타입 객체 역할을 합니다. 다음 코드에서는 Shape라는 클래스를 만들고 기본적으로
true
로 설정되는
visible
이라는 속성 하나를 정의합니다.
// base class
function Shape() {}
// Create a property named visible.
Shape.prototype.visible = true;
이 생성자 함수는 다음과 같이
new
연산자로 인스턴스화할 수 있는 Shape 클래스를 정의합니다.
myShape = new Shape();
Shape()
생성자 함수는 Shape 클래스 인스턴스의 프로토타입 역할을 할 뿐만 아니라 Shape의 하위 클래스(Shape 클래스를 확장하는 다른 클래스)의 프로토타입 역할도 합니다.
Shape 클래스의 하위 클래스를 만들려면 두 단계를 거쳐야 합니다. 우선 다음과 같이 클래스의 생성자 함수를 정의하여 클래스를 만듭니다.
// child class
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
다음으로
new
연산자를 사용하여 Shape 클래스가 Circle 클래스의 프로토타입임을 선언합니다. 기본적으로 작성되는 모든 클래스에는 Object 클래스가 프로토타입으로 사용됩니다. 즉,
Circle.prototype
에는 현재 일반 객체(Object 클래스의 인스턴스)가 들어 있습니다. Circle의 프로토타입을 Object 대신 Shape로 지정하려면 다음 코드를 사용하여
Circle.prototype
에 일반 객체 대신 Shape 객체가 포함되도록 값을 변경합니다.
// Make Circle a subclass of Shape.
Circle.prototype = new Shape();
Shape 클래스와 Circle 클래스는 이제 상속 관계로 연결되었으며 이러한 관계를 일반적으로
프로토타입 체인
이라고 합니다. 다음 그림은 프로토타입 체인 관계를 보여 줍니다.
모든 프로토타입 체인 끝에 있는 기본 클래스는 Object 클래스입니다. Object 클래스에는
Object.prototype
이라는 정적 속성이 들어 있으며 이 속성은 ActionScript 1.0에서 만드는 모든 객체의 기본 프로토타입 객체를 가리킵니다. 예제 프로토타입 체인에서 다음에 있는 객체는 Shape 객체입니다. 이는
Shape.prototype
속성을 명시적으로 설정하지 않았으므로 일반 객체(Object 클래스의 인스턴스)가 계속 들어 있기 때문입니다. 이 체인의 마지막 링크는 해당 프로토타입인 Shape 클래스에 연결되어 있는 Circle 클래스입니다.
Circle.prototype
속성에는 Shape 객체가 들어 있습니다.
다음 예제와 같이 Circle 클래스의 인스턴스를 만들면 Circle 클래스의 프로토타입 체인이 인스턴스로 상속됩니다.
// Create an instance of the Circle class.
myCircle = new Circle();
앞의 예제에서 Shape 클래스의 멤버로
visible
이라는 속성을 포함했습니다. 이 예제에서는
visible
속성이
myCircle
객체에 포함되어 있지 않고 Shape 객체의 멤버일 뿐이지만, 다음 코드 행을 실행하면
true
가 산출됩니다.
trace(myCircle.visible); // output: true
런타임은 프로토타입 체인을 확인하여
myCircle
객체에
visible
속성이 상속됨을 인식할 수 있습니다. 이 코드를 실행하면 런타임은 우선
myCircle
객체의 속성 중에서 이름이
visible
인 속성을 검색하지만 이러한 속성을 찾을 수 없습니다. 다음으로
Circle.prototype
객체에서 속성을 검색하지만
visible
이라는 속성을 여전히 찾을 수 없습니다. 런타임은 프로토타입 체인을 거슬러 올라가면서
Shape.prototype
객체에 정의된
visible
속성을 찾게 되고 이 속성의 값을 출력합니다.
이 설명서에는 이해를 돕기 위해 프로토타입 체인과 관련된 자세한 세부 내용이 상당 부분 생략되어 있습니다. 대신 ActionScript 3.0 객체 모델을 이해하는 데 필요한 수준의 정보만을 제공합니다.
ActionScript2.0
ActionScript 2.0에는
class
,
extends
,
public
및
private
등의 키워드가 새로 도입되었으며, 이를 통해 Java 및 C++ 등의 클래스 기반 언어를 사용하는 작업자에게 익숙한 방식으로 클래스를 정의할 수 있습니다. 단, ActionScript 1.0과 ActionScript 2.0 사이에서 기본 상속 메커니즘은 변경되지 않았습니다. ActionScript 2.0에는 클래스를 정의하는 구문이 새로 추가되었을 뿐입니다. 프로토타입 체인은 두 가지 언어 버전에서 동일한 방식으로 작동합니다.
다음 인용 코드와 같이 ActionScript 2.0에 새로 도입된 구문을 통해 많은 프로그래머에게 친숙한 방식으로 클래스를 정의할 수 있습니다.
// base class
class Shape
{
var visible:Boolean = true;
}
ActionScript 2.0에는 컴파일 타임 유형 확인에 사용되는 유형 약어도 도입되었습니다. 이를 통해 이전 예제의
visible
속성에 부울 값만 포함되도록 선언할 수 있습니다. 또한 새로운
extends
키워드를 통해 하위 클래스를 간편하게 만들 수 있습니다. 다음 예제에서는 ActionScript 1.0의 경우 두 단계가 필요한 작업을
extends
키워드를 사용하여 한 단계로 수행합니다.
// child class
class Circle extends Shape
{
var id:Number;
var radius:Number;
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
}
생성자는 이제 클래스 정의의 일부로 선언되며 클래스 속성인
id
및
radius
도 명시적으로 선언해야 합니다.
ActionScript 2.0에는 인터페이스를 정의하는 기능이 추가되었으며, 이를 통해 객체 간 통신을 위해 정식으로 정의된 프로토콜을 사용하여 객체 지향 프로그램을 개선할 수 있습니다.