티스토리 뷰

이 포스트는 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

이제 본론으로 들어가서... 구현 내용 보시죠,

사용 방법은 간단하니 설명은 생략해도 될 것 같습니다.
다들 즐거운 주말 되세요!!!
package
{
import flash.errors.IllegalOperationError;

public class ObjectHelper
{
	
	/**
	 * 객체가 가진 아이디를 알아 냅니다. 
	 * @param $checkObject String은 지원하지 않습니다.
	 * @return 
	 * 
	 */		
	public static function getInstanceId($checkObject:*):String
	{
		var idPattren:RegExp = new RegExp("(@.*?.[a-z|A-Z|0-9|]+)", "gi");
		var message:String = null;
		
		if($checkObject is String)
		{
			throw new IllegalOperationError("Not support type (String)");
		}
		
		try
		{
			CheckClass($checkObject);
		}
		catch ($e:Error)
		{
			message = String($e);
			
			if(message.search(idPattren) > -1)
			{
				message = idPattren.exec(message)[0];
			}
		}
		
		idPattren = null;
		
		return message;
	}
	
}
}

internal final class CheckClass{	
}

이거보다 더 좋은 방법이나, 고유아이디를 뽑는 비공식 메소드를 알고 계시다면 포스팅  및 댓글 부탁드립니다~ ^^;;

저작자 표시 비영리 동일 조건 변경 허락
신고
댓글
  • 프로필사진 Favicon of http://diebuster.com BlogIcon hika 코오~ 생각해보지도 않았던 방법이에요. 유일한 식별키를 알고 있는 에러객체를 사용하시다니 발상의 전환이 놀랍습니다.
    리얼타임에 try catch를 호출하는건 자살행위라서 불가능하겠지만, 고정풀링을 쓸 생각을 하고 사용할 객체를 일괄 초기화하는 시점에서 미리 해둔다면 충분한 대안이 될거 같아요!
    성능적인 문제는 직접 테스트를 해보겠습니다.
    (try catch와 정규식의 합체라니 ㅎㅎ 그냥은 절대 사용할 수 없는 성능이군요. 하지만 커스텀 브레이커나 디버거에는 엄청 좋은 정보를 제공해줄 수 있을거 같아요.)

    저와의 약속때문에 작성해주셨다니 그저 황송할 따름입니다.
    2011.02.19 19:54 신고
  • 프로필사진 Favicon of http://lovedev.tistory.com BlogIcon Kevin lovedev 크크크크 완전 못말리겠군요..
    정규식에 try catch라니!!

    그래서 모.. 정답이 아니라고 말씀드렸잖아요~~

    사실 전 퍼포먼스 위주의 프로그래밍보단 안정성과 호환성을 강조한 쪽에 길들여져 있어서.. 속도면에서는 꽝인 것 같아요..

    hika님한테 배워야 할 것 같아요~ ^^)/
    많이 가르쳐 주셔요~

    댓글이 아니었다면 이런거 해보지도 않았을 거에요..

    헤헤 좋은 하루 되세요!
    2011.02.19 20:15 신고
  • 프로필사진 Favicon of http://diebuster.com BlogIcon hika 객체키를 얻어내는데 분명히 유일한 정답일거 같은데요!
    창훈님이 주신 힌트 때문에 Error객체 외의 다른 기반객체중에 그 정보를 갖고 있는 녀석이 있는지 그녀석에게 간접적으로 얻어낼 방법이 있는지방향을 우회해서 조사해보는 중입니다. 역시 여러사람과 의견을 나눌 수 있는 웹에서 생각을 키워갈 수 있는듯.
    2011.02.19 22:15 신고
  • 프로필사진 Favicon of http://lovedev.tistory.com BlogIcon Kevin lovedev ^^) 좋은 하루 되세요~ 2011.02.21 10:36 신고
  • 프로필사진 Favicon of http://jidolstar.tistory.com BlogIcon 지돌스타 역쉬!!!! 최고! 2011.02.21 12:24 신고
  • 프로필사진 Favicon of http://lovedev.tistory.com BlogIcon Kevin lovedev 잘 지내지? 얼굴 안본지 꽤 됐구나~
    술 한잔 하면서 재밌는 이야기도 하고 그래야 하는데.. :D
    여튼 하는 일 잘 되고! 대박 나라!!! ^^)/
    2011.02.21 13:15 신고
  • 프로필사진 Favicon of http://drumcap.tistory.com BlogIcon 드럼캡 와우! 이걸로 한참 헤맨거 생각하면.. 뒤통수 맞은 기분입니다. ㅋㅋ
    좋은 글 감사!
    2011.02.21 17:18 신고
댓글쓰기 폼