본문 바로가기

Flash/ActionScript 2.0

[MissFlash의 Flash ActionScript 2.0] 3. 데이터타입과 타입 체크 (1)

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

액션스크립트 2.0에서 모든 ①변수, ②속성, ③함수/메소드 파라미터, ④함수/메소드의 반환값에 데이터타입을 선언하는 습관을 들여야한다.

액션스크립트 2.0의 데이터타입은 정적인 타이핑(Static typing)을 사용합니다. 이것은 데이터타입을 컴파일 과정에서 검사하는 것을 뜻합니다. 이와 반대인 동적인 타이핑(Dynamic typing)에서는 데이터타입을 컴파일 과정이 아닌 런타임에서 체크합니다. 즉 프로그램 실행 과정에서 데이터타입이 결정됩니다.

액션스크립트 1.0은 데이터타입을 아예 검사하지 않기 때문에 정적인 타이핑이나 동적인 타이핑을 사용하지 않습니다.

0. 액션스크립트는 왜 정적인 타입 체크를 하는가?

- 타입 체크를 함으로써 관련 오류들을 제거할 수 있다.
- 타입 정보를 코드에 포함시킴으로써 객체지향 프로그램을 완성할 수 있다. 또한 다른 개발자가 만든 클래스를 이용해 안심하고 사용할 수 있다.
- 유효한 데이터를 확인하는 수작업을 줄일 수 있다.


1. 데이터 타입의 사용

1) 변수와 속성의 데이터타입 선언방법
var variableName:datatype;
var propertyName:datatype;

2) 메소드 파라미터, 반환값의 데이터타입 선언방법
function methodName(param1Name:param1Type, param2Name:param2Type):returnType{
  // ...
}


2. 호환 가능한 데이터타입

클래스 Car, 서브클래스 SportsCar가 있을 때, 다음을 참고하시기 바랍니다.
var Car1:Car = new SportsCar(); // 올바른 문법
var Car2:SportsCar = new Car(); // 틀린 문법

Car 인스턴스가 반드시 SportsCar의 모든 메소드와 속성을 가지는 것은 아니기 때문입니다.

컴파일러는 어떤 메소드와 속성을 가지고 있는지에 대해 변수 Car1, 2의 데이터타입을 체크하지 오브젝트를 생성한 원본 클래스를 참조하는 것이 아닙니다.

1) 모든 데이터타입에 대한 사용법
액션스크립트 2.0에서는 변수, 속성, 파라미터와 반환값의 데이터타입을 오브젝트(Object)로 선언하면 어떤 데이터라도 사용할 수 있습니다.

2) null과 undefined의 호환성
객체지향 액션스크립트 2.0 프로그램에서 변수에 null과 undefined가 저장되어 있다면 이것은 데이터가 존재하지 않거나 초기화되지 않은 상태를 의미합니다.


3. 동적인 내장 클래스

클래스의 인스턴스에 새로운 속성과 메소드를 추가하고 싶다면 동적인 클래스(Dynamic Class)를 사용하면 됩니다.
액션스크립트 2.0에서의 동적인 클래스는 다음과 같습니다.

- Array
- ContextMenu
- ContextMenuItem
- Function
- FunctionArguments(Arguments 오브젝트의 별칭)
- LoadVars
- MovieClip
- Object
- TextField


4. 타입체크를 무력화 시키기

1) 파라미터에서 다양한 타입의 데이터 사용
function output(msg:Object):void{
 // typeof를 사용하여 msg의 데이터타입을 검사할 수 있습니다.
 if(typeof msg == "string"){
  trace(msg);
 }

 // instanceof를 사용하여 msg가 XML클래스의 오브젝트인지 검사할 수 있습니다.
 if(msg instanceof XML){
  // ...
 }
}

2) 클래스 인스턴스에 메소드와 속성 생성
클래스를 제작할 때, 런타임에 새로운 속성과 메소드를 인스턴스에 동적으로 추가하려면, 클래스를 dynamic으로 정의하면 됩니다.

3) 타입체크 기능의 제한
- []연산자의 사용으로 인스턴스에 새로운 속성을 추가할 수 있습니다.
var song:Sound = new Sound();
song["url"] = "track1.mp3"; // 오류 발생하지 않음
trace(song["url"]); // "track1.mp3" 출력

- 캐스팅 연산 적용
var tf:TextField = TextField(someValue);