* 본 포스트를 퍼가실 때는 상단에 아래와 같이 원본과 출처를 명시해 주세요! ^^
원본 : http://blog.missflash.com/
출처 : MissFlash.com, http ://www.missflash.com/
* 포스트의 내용중 일부가 추가/수정될 수 있으므로 최신 내용을 접하고 싶으신 분은 원본글을 이용하시기 바랍니다.
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) 배열 원소와 타입 체크
컴파일러는 배열의 원소에서 존재하지 않는 속성이나 메소드에 대해 접근을 시도할 때 오류를 발생시키지 않습니다.
'Flash > ActionScript 2.0' 카테고리의 다른 글
[MissFlash의 Flash ActionScript 2.0] 4. 클래스 (2) (0) | 2007.05.02 |
---|---|
[MissFlash의 Flash ActionScript 2.0] 4. 클래스 (1) (0) | 2007.05.01 |
[MissFlash의 Flash ActionScript 2.0] 3. 데이터타입과 타입 체크 (1) (0) | 2007.04.03 |
[MissFlash의 Flash ActionScript 2.0] 2. 객체지향 액션스크립트 프로그래밍 (0) | 2007.03.14 |
[MissFlash의 Flash ActionScript 2.0] 1. 액션스크립트 2.0 (0) | 2007.03.14 |