인스턴스의 타입체크하기

2011.07.28 09:57

Myip 심걸 조회 수:12720

출처: 우야꼬의 Adobe RIA



보통 객체의 클래스를 체크하기 위해선

아래와 같이 합니다.

var obj: Sprite = new Sprite();

trace( obj is Sprite );     // true;

is 연산자가 참 편하죠.

타이핑도 쉽고 길이도 짧고 ㅎㅎ

자 그럼 문제!!

만약 Sprite 인스턴스와 MovieClip 인스턴스가 있다고 예를 들어봅시다.

이 상황에서 여러분은 Sprite만 검출해 낼 수 있습니까?

아마 아래와 같은 코드를 떠올릴지도 모릅니다.

var obj1: Sprite = new Sprite();
var obj2: MovieClip = new MovieClip();

trace( obj1 is Sprite );
trace( obj2 is Sprite );

하지만 안타깝게도 결과는 둘 다 true 입니다.

"is" 비교 연산자는 상위 클래스까지 검사해주기 때문이죠.

MovieClip은 Sprite의 하위 클래스이기 때문에 MovieClip is Sprite 는 true가 되버리는것이죠.



그러면 진짜 딱 내 클래스만 체크하기 위해선 어떻게 해야할까요?

우리 센스쟁이 선배님들께서는 이미 그런것을 알고 계셨던가 봅니다.

하지만 남용하지는 말라는 듯이 숨겨놓았습니다.

바로 Object.constructor 속성입니다.

Object.constructor는 이름에서 알 수 있듯이 생성자를 참조하는 속성입니다.

객체에서 생성자를 참조 할 수 있도록 해주는 것이지요.

이것을 활용하면 재밌는것들을 많이 할 수 있습니다.

하지만 이 속성은 하위 클래스로 내려가면서 접근할 수 없도록 되어 있습니다.

무슨 이야기냐면

var obj: Object = new Object();
trace( obj.constructor );     // [class Object]

이렇게 접근하면 무사히 잘 나타나지만

var obj: Sprite = new Sprite();
trace( obj.constructor );     // Error #1119

이와 같이 다른 하위 클래스들한테서는 접근할 수 없게 되어 있습니다.

없는 속성에 접근할때 발생하는 1119 Error 가 발생하는군요.

하지만 저 속성은 "함부로" 접근할 수 없게 되어 있는것이지

절대로 접근하지 못하는것은 아닙니다.

바로 Object형으로 type-casting 을 시킨후 접근하면 된다 이말이죠~!!

var obj: Sprite = new Sprite();
trace( Object( obj ).constructor );     // [class Sprite]

Object( obj )로 type-casting을 하니까 잘만되는군요!!

그렇다면 위에서 풀지 못한 문제를 풀어봅시다.

var obj1: Sprite = new Sprite();
var obj2: MovieClip = new MovieClip();

trace( Object( obj1 ).constructor == Sprite );     // true
trace( Object( obj2 ).constructor == Sprite );     // false

오옷!!

Sprite 객체만 잡아냈습니다!!

생성자를 직접 끄집어내서 비교하기 때문에 내가 원하는 특정한 클래스로 딱 꼬집어서 검사할 수 있는 것이죠.

static public function getClassFromInstance( obj: Object ): Class
{
     var type: Class = obj.constructor;
    
     return type;
}

유틸 클래스를 하나 만들어놓고 위 함수를 만들어서 쓰면 앞으로 참 편리하겠죠?

아... 말해주고 싶다!!
말해주고 싶은게 있으신분은 참지말고 리플로 꼭 달아주세요. (사진 제목 : "말해주고 싶다..." )


저작자 표시 비영리 동일 조건 변경 허락
번호 제목 글쓴이 날짜 조회 수
160 jpgraph 1.20.4 에서 한글 폰트 사용 [16] Myip 심걸 2011.07.28 14552
159 [AS3] Integer.reverseBytes() of Java [1] Myip 심걸 2011.07.28 12796
158 [AIR] AIR를 포함하는 ASDoc 만들기 [2] Myip 심걸 2011.07.28 12902
157 [AIR] EncrytpedLocalStore 저장 위치 Myip 심걸 2011.07.28 12621
156 [AS3]trace 를 지우거나 주석화하지 않고 비활성화 시키기 [2] Myip 심걸 2011.07.28 13068
155 PHP코딩팁. include와 return의 특성 Myip 심걸 2011.07.28 12951
154 [PHP] 배열의 활용 Myip 심걸 2011.07.28 12789
153 php 기본 문법. php group 에서 시키는 대로 하자 Myip 심걸 2011.07.28 14832
» 인스턴스의 타입체크하기 Myip 심걸 2011.07.28 12720
151 Flash Builder에서 TODO, FIXME 사용하기 [23] Myip 심걸 2011.07.28 13048
150 [Flex] Flash Builder 4 Compiler Options [15] Myip 심걸 2011.07.28 13625
149 [AS3] 인스턴스의 클래스와 패키지명까지 알아오기 [1] Myip 심걸 2011.07.28 12796
148 javascript로 난수 발생 Myip 심걸 2011.07.28 12652
147 webkit계열에서 css문건내 @charset 선언문제 Myip 심걸 2011.07.28 12711
146 [AS3] 인스턴스 자동 선언 옵션은 반드시 Off 합시다 [35] Myip 심걸 2011.07.28 19797
145 [AS3] 최대, 최소값 자르기 두가지 방법 Myip 심걸 2011.07.28 12695
144 [AS3]최적화 코드 Myip 심걸 2011.07.28 12664
143 [AS3] Flash Player 10.1 활용하기 [4] Myip 심걸 2011.07.28 12927
142 [FF3].html post .php 데이터 손실 Myip 심걸 2011.07.28 12555
141 new 안하고, 전역변수 안쓰기. class, static Myip 심걸 2011.07.28 12658