본문 바로가기

Flash/ActionScript 2.0

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

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

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

5. 캐스팅

캐스팅은 클래스의 오브젝트를 완전히 다른 것으로 변경하는 것이 아니라 컴파일러가 잠시 동안 데이터를 저장한 오브젝트를 특정한 데이터타입으로 인식하도록 만드는 것입니다.

var obj:Object = new Object();
var tf:TextField = TextField(obj);

1) 캐스팅 관련 용어
- 업캐스트(upcast) : 오브젝트를 슈퍼타입으로 캐스팅 하는 것 (확장한다, 안전한 캐스트)
- 다운캐스트(downcast) : 오브젝트를 서브타입으로 캐스팅 하는 것 (축소한다, 불안한 캐스트)
- 암묵적인 캐스트(implicit upcast) : 인스턴스의 자동변환

2) 런타임 캐스팅 지원
- 컴파일타임의 타입 체크는 변수의 초기 데이터타입에 따라 결정
- 런타임의 캐스팅은 변수에 저장된 오브젝트의 데이터타입에 의존

3) 캐스팅은 메소드와 속성의 선택에 영향을 주지 않음
- 상속관계에 있어서 슈퍼클래스를 상속받아 서브클래스를 구성할 때 슈퍼클래스에 있는 메소드나 속성을 서브클래스에서 동일한 이름으로 재정의할 수 있습니다.
- 동일한 이름의 메소드나 속성을 서브클래스에서 구현하는 것을 오버라이드(override)라고 합니다.

4) 캐스팅 vs. 타입 변환
- 캐스팅 : 컴파일러에게 오브젝트를 다른 데이터타입의 인스턴스로 다뤄달라고 요청
- 데이터변환 : 오브젝트를 다른 데이터타입으로 완전하게 변경


6. String, Number, Boolean, Date와 Array로의 캐스팅 문제

String, Number, Boolean, Date, Array는 클래스의 생성자(constructor)이기도 하지만, 동일한 이름의 전역함수도 존재합니다. 따라서 위 클래스의 데이터타입으로 캐스팅하는 것은 불가능합니다.

다음과 같은 배열의 오브젝트를 생성했을 때,
var obj:Object = [1,2,3];

이것을 배열로 캐스팅하기 위한 방법은 다음과 같습니다.
Array(obj);

하지만, 위의 경우 캐스팅이 적용되기 이전에 데이터 변환을 위한 전역함수가 실행되어 [1,2,3]을 첫번째 원소로 가지는 새로운 배열이 생성되어 다음과 같은 결과를 가집니다.
var arr:Array = Array(obj);
trace(arr[0]); // 출력 : 1,2,3
trace(arr[1]); // 출력 : undefined
trace(arr[2]); // 출력 : undefined

정상적인 출력값을 가지기 위해서는 위 굵은 코드 대신 다음의 코드를 써야 합니다.
var arr = obj;


7. 내장 클래스의 데이터타입 정보

플래시 MX 2004가 설치된 폴더에서 클래스 소스 코드를 분석해야만 알 수 있습니다.
폴더 위치 - /Macromedia/Flash MX 2004/en/First Run/Classes


8. 액션스크립트 2.0의 타입 체크에 대한 유의사항

1) 전역변수는 데이터타입을 갖지 못함
_global.varname = value; // 전역변수의 생성
_global.varname:String = "value"; // 오류 발생

2) 타임라인 코드에 대한 타입 체크
타임라인의 프레임에 액션스크립트 코드를 작성하면 무비클립의 속성이나 메소드에 대한 데이터타입을 검사하지 않습니다. 그 이유는 타임라인에서는 무비클립을 사용하는 것에 대해 하나의 동적인 속성으로 간주하기 때문입니다. 액션스크립트 2.0은 동적인 속성에 대해서 타입 체크를 수행하지 않습니다.

_root._x = "String"; // 오류 발생하지 않음

var theRoot:MovieClip = _root;
theRoot._x = "String"; // 오류 발생

3) XML 인스턴스에 대한 타입 체크
일반적으로 XML 인스턴스 또는 인스턴스의 자식 노드들을 변수에 저장하면 변수의 데이터타입이 XML이 아닌 XMLNode인 것으로 취급해야 합니다.

4) []연산자와 타입 체크
- 속성이나 메소드를 []연산자를 통해 접근하면 컴파일러는 타입 체크를 수행하지 않음
- []연산자는 for문과 같이 동적으로 어떤 속성이나 메소드의 이름을 참조할 때 사용

5) 배열 원소와 타입 체크
컴파일러는 배열의 원소에서 존재하지 않는 속성이나 메소드에 대해 접근을 시도할 때 오류를 발생시키지 않습니다.