본문 바로가기

Flash/ActionScript 2.0

[MissFlash의 Flash ActionScript 2.0] 4. 클래스 (1)

* 본 포스트는 "콜린 무크의 Flash ActionScript 2.0"의 내용을 정리, 가공한 것입니다.
* 본 포스트를 퍼가실 때는 상단에 아래와 같이 원본출처를 명시해 주세요! ^^
원본 : http://blog.missflash.com/
출처 : MissFlash.com, http ://www.missflash.com/
* 포스트의 내용중 일부가 추가/수정될 수 있으므로 최신 내용을 접하고 싶으신 분은 원본글을 이용하시기 바랍니다.

1. 클래스 정의

* 클래스의 기본 형태
class ClassIdentifier{
}

* 클래스의 저장
 - 클래스는 .as 확장자를 가진 외부 파일에 저장해야 합니다. 또한 .as 파일은 하나의 클래스 선언만 포함해야 하고, 클래스 이름과 파일명은 동일해야 합니다.

* 클래스 바디(Class Body)의 구성요소
 - 생성자 함수(클래스의 인스턴스를 생성시 이를 초기화하는 함수)
 - 변수 정의(클래스의 속성)
 - 함수 정의(클래스의 메소드)
 - #include 지시자, 속성이나 메소드, 생성자 함수를 정의한 파일을 불러올 수 있습니다.
 - 플래시 MX 2004 컴포넌트의 메타 태그
 - 주석
 참고) 클래스 바디에 일반 코드는 작성할 수 없습니다.

1) 클래스의 특성
- ActionScript 2.0은 ECMAScript 4에 명시된 final 특성을 제공하지 않음 : final은 더 이상 서브클래스를 만들 수 없게 설정하는 것
- 자바에서 사용되는 abstract 키워드가 존재하지 않음 : abstract는 클래스의 인스턴스를 생성할 수 없도록 추상클래스를 설정하는 것

A. dynamic 특성
- 클래스를 dynamic으로 선언하지 않으면 동적인 속성을 추가할 수 없습니다.
class Car{
}

var c1:Car = new Car();
c1.color = "Black";

위와 같은 코드의 경우 Car 클래스에 color라는 속성이 정의되어 있지 않으므로 속성을 동적으로 추가할 수 없습니다.

- 일반적으로 특정 인스턴스에만 필요한 속성이나 메소드가 있다면 동적인 클래스 대신 다음의 방법을 사용하는 것이 좋습니다.
 ① 원본 클래스의 서브클래스를 생성
 ② 서브클래스에 새로운 속성과 메소드를 추가(즉, 런타임에 동적으로 추가하지 않음)
 ③ 슈퍼클래스 대신에 새로 만든 서브클래스를 사용하여 인스턴스를 생성

- dynamic 특성은 내장 ActionScript 클래스의 특별한 형태를 만들기 위해 제공하는 것입니다.

- 슈퍼클래스에 dynamic 특성이 정의되어 있다면 서브클래스에서도 모두 동일하게 동작합니다.
예외 : MovieClip과 Object 클래스만 예외임 (ActionScript 2.0의 모든 클래스는 Object의 서브클래스이기 때문)

B. intrinsic 특성
- intrinsic 특성은 컴파일된 클래스를 배포할 때만 사용하며 원본 클래스의 소스코드를 제공하지 않습니다.
- 플래시 플레이어에 내장된 LoadVars 클래스의 경우, 플래시 플레이어 안에 이미 컴파일된 상태로 존재합니다.


2. 생성자 함수(1단계)

- 클래스의 새로운 오브젝트를 초기화하기 위해 생성자 함수(constructor function)를 사용합니다.
- 생성자 함수는 인스턴스가 생성될 때 자동으로 실행됩니다.
class Car{
 public function Car(){
 }
}

- 클래스에 생성자가 없다면 ActionScript는 컴파일 과정에 자동으로 텅빈 상태의 생성자를 추가합니다.


3. 속성

* 속성의 종류
- 클래스 속성(class properties) : 클래스와 연결된 데이터 저장 공간
- 인스턴스 속성(instance properties) : 오브젝트(클래스의 인스턴스)와 연결된 데이터 저장 공간

* 클래스 속성의 특성
- 클래스의 외부 코드가 클래스 속성에 접근하는 것을 제한하기 위해 private 키워드를 사용할 수 있음

* 인스턴스 속성의 특성
- 클래스의 개별 인스턴스에 각각 저장
- 인스턴스를 통해서만 접근 가능
- 다른 인스턴스들에게 영향을 미치지 않고 하나의 이스턴스의 값만 독립적으로 변경 가능

* 속성의 선언
- ActionScript 2.0에서는 속성의 선언시 반드시 var를 사용해야 합니다.

1) 속성의 특성
속성은 한 개 이상의 특성을 가질 수 있으며, 특성을 표시하는 순서는 관계없습니다.
일반적으로 public, private는 static의 앞쪽에 위치합니다.

A. private와 public을 이용한 속성의 접근 제한
- 접근 제어 변경자 public : 접근 제한 없음
- 접근 제어 변경자 private : 클래스 자신과 서브클래스에서 접근 가능
- 접근 제어 변경자가 없을 때 : public과 동일

B. 클래스 속성 선언 : static 특성
- static 특성은 클래스 속성인지 인스턴스의 속성인지를 결정
- 클래스 속성임을 나타내기 위해 static키워드를 사용
- 클래스 속성을 static 속성이라고도 부름
- 인스턴스 속성과는 달리 클래스 속성은 전체 클래스에서 공통적으로 사용하는 정보를 저장
- 클래스의 외부에서 클래스 속성을 사용하기 위해서는 클래스 이름과 함께 클래스 속성을 사용해야 함
* 클래스 내부 접근시
trace("A car have "+doorNumbers+" doors.");

* 클래스 외부 접근시
trace("A car have "+Car.doorNumbers+" doors.");

- 클래스 속성은 유일한 값을 가짐
- 클래스 속성만 가지고 인스턴스 생성이 불가능한 클래스 : Math 클래스 등
- 프로그램이 동작하는 과정에서 절대 변경되지 않도록 보호해야 하는 클래스 속성의 경우 보통 대문자로 표기함

C. 전역 변수 vs. 클래스 속성
- 전역 변수의 사용 : _global.someVariable = someValue;
- 전역 변수는 데이터타입을 정의할 수 없음
- 변수의 이름이 충돌하지 않도록 전역 변수의 사용을 자제하는 것이 좋습니다.

D. 서브클래스와 클래스 속성
슈퍼클래스의 속성을 서브클래스에서 (동일한 이름으로) 오버라이드 할 경우, 슈퍼클래스와 다른 새로운 속성이 만들어 집니다.

2) 컴파일타임 상수 선언
속성에 대한 초기화 작업으로 컴파일타임 상수 선언을 사용하는 것보다 생성자에서 처리하는 것이 좋습니다.

3) for-in 반복문을 사용하여 속성 탐색
기본적으로 인스턴스 속성은 for-in 반복문에서 탐색하지 못하지만, 클래스 속성은 탐색이 가능합니다.

class Car{
 public static var maxDoor:Number = 10;
 public static var maxChair:Number = 20;
}

for(var prop:String in Car){
 trace("Property name : " + prop);
 trace("Property value : " + Car[prop]);
}

//출력 :
Property name : maxDoor
Property value : 10
Property name : maxChair
Property value : 20

특히, 클래스 속성의 경우 private로 선언한 경우나 dynamic으로 선언한 경우에도 탐색이 가능합니다.