ADOBE/ ActionScript

[AS] 플래시 [AS3.0]객체의 고유 아이디 알아내기(소스 코드 공유)

AlrepondTech 2011. 11. 10. 10:29
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://lovedev.tistory.com/622


이 포스트는 hika님과의 약속을 위해 작성하게 되었습니다~
 
액션 스크립트 내부에서 생성되는 객체들은 저마다 각기 고유 아이디를 가지고 있습니다. 디버깅할 때, 브레이크포인트를 걸어 보면, 객체가 표기되고, @아이디와 같은 모습을 볼 수 있는데, 액션 스크립트내에서는 저런 아이디를 알아내는 API가 없는데요. 그래서 사실 전 객체를 만들 때마다, toString()을 구현하고 있습니다. equals나, compare같은 기능을 위해서인데요. 이건 그것과는 약간 다른 느낌인 것 같습니다. 객체의 엄격한 비교격인 === 구문을 객체대 객체가 아닌, 문자열만으로 알 수 있으니까요. 이걸로 인해 파생되는 가치는 위에 적어 놓은 이전 포스트에서 hika님의 댓글을 참고해 주셔요~ 
 
사실 Dictanary객체의 구현은 Object의 고유 아이디를 지정해주고, 그 아이디를 이용해 Dictionary를 구현할 수 있습니다. 자바스크립트에는 Dictionary가 없어서 구현했었어요. ^^;; 
 
객체의 고유 아이디를 알면, 무엇이 좋아질까.. 고민을 조금 해봤습니다.
일단 hika님의 의견대로, 객체와 약한 연결을 가지게 되어, 유연한 구조를 가져갈 수 있습니다.
그리고, 객체 추적이 가능해진다는 점인데요. 디버깅 및 프로파일링이 용이해 질 것 같고, 객체 비교를 좀 더 빠르게 할 수 있을 듯 합니다.  이 외에 파생될 수 있는 것들이 꽤 있을 것 같긴한데.. 잘 모르겠습니다 ㅠ_ㅠ); 있으면 댓글 좀..





 현재 회사에서 내부적으로 사용되는 플래시 프로파일러를 만들어 본 적이 있습니다. 그래서 고유아이디도 얻을 수 있겠지 하고 Sampler를 이용해 테스트해봤습니다. 그랬더니 알고 있던 NewSample이나, DeleteSample의 아이디가 고유 아이디가 아니더라는.. API를 보면, 분명 객체의 고유아이디이다라고 되어 있거든요.. 고유 아이디는 맞긴 하겠지만. 우리가 아닌 고유 아이디는 아니었습니다..
 
막상 해보니.. 아니더라고요;;;  오잉??
 
그래서 별의 별 방법을 시도해보던 중.. 객체의 캐스팅을 잘못하면, Exception이 발생할 때, 고유 아이디를 에러에 찍어 주던 기억이 나서, 고의적인 객체 캐스팅 에러를 만들고 거기서 고유 아이디 값을 추출했습니다. 이게 정답은 아닐 것 같지만.. 동작은 잘 하니.. 편법으로는 사용할 만 할 것 같습니다. 그리고 Sampler를 이용한 것이 아니어서, 메소스화하기도 쉬워서 좋네요.. 더 좋은건 비공식이어도, 내부 메소드가 있는 것인데 있을 듯한데 참.. 알기 어렵네요..  
 
mx패키지에 UIDUtil이라는 것이 있는데.. 거기서도 UID를 만들고 추출하니.. 공식 API상으로는 없다는 이야기겠죠?
 
UIDUtil : http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/UIDUtil.html#propertySummary
 
이제 본론으로 들어가서... 구현 내용 보시죠,
 
사용 방법은 간단하니 설명은 생략해도 될 것 같습니다.
다들 즐거운 주말 되세요!!!
01 package
02 {
03 import flash.errors.IllegalOperationError;
04  
05 public class ObjectHelper
06 {
07      
08     /**
09      * 객체가 가진 아이디를 알아 냅니다.
10      * @param $checkObject String은 지원하지 않습니다.
11      * @return
12      *
13      */    
14     public static function getInstanceId($checkObject:*):String
15     {
16         var idPattren:RegExp = new RegExp("(@.*?.[a-z|A-Z|0-9|]+)", "gi");
17         var message:String = null;
18          
19         if($checkObject is String)
20         {
21             throw new IllegalOperationError("Not support type (String)");
22         }
23          
24         try
25         {
26             CheckClass($checkObject);
27         }
28         catch ($e:Error)
29         {
30             message = String($e);
31              
32             if(message.search(idPattren) > -1)
33             {
34                 message = idPattren.exec(message)[0];
35             }
36         }
37          
38         idPattren = null;
39          
40         return message;
41     }
42      
43 }
44 }
45  
46 internal final class CheckClass{   
이거보다 더 좋은 방법이나, 고유아이디를 뽑는 비공식 메소드를 알고 계시다면 포스팅  및 댓글 부탁드립니다~ ^^;;
 

 

=================================

=================================

=================================

 

 

 

반응형