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

아래와 같이 합니다.

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;
}

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

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


+ Recent posts