Actionscript3.02012.01.08 20:05


요즘 OAuth 인증 때문에 고생좀 했습니다. 머리속에 있는 개념을 정리도 할겸 제가 사용해본 OAuth 라이브러리에 대해 소개 합니다. 


OAuth 란?


 OAuth가 사용되기 전에는 인증방식의 표준이 없었기 때문에 기존의 기본인증인 아이디과 비밀번호를 사용하였는데, 이는 보안상 취약한 구조이다.

기본인증이 아닐 경우는 각 애플리케이션들이 각자의 개발한 회사의 방법대로 사용자를 확인하였다. 예를 들면 구글의 AuthSub, AOL의 OpenAuth, 야후의 BBAuth, 아마존의 웹서비스 API 등이 있다.

OAuth는 이렇게 제각각인 인증방식을 표준화한 인증방식이다. OAuth를 이용하면 이 인증을 공유하는 애플리케이션끼리는 별도의 인증이 필요없다. 따라서 여러 애플리케이션을 통합하여 사용하는 것이 가능하게 된다.


(출처 : http://ko.wikipedia.org/wiki/OAuth )


실 서비스 외부에서 API 를 사용할 때 이 OAuth 를 이용하여 인증을 하게 됩니다. 요즘 많이 사용하는 Twitter, facebook, Dropbox에서 제공 하는 API 모두 이 OAuth 를 지원하고 있고 지원하는 버전은 대부분 1.0 입니다. API 를 제공하는 곳에 따라서 2.0 을 제공하는 곳도 있습니다.  저 자세한 내용은 아래 링크에 자세히 설명 되어 있으니 생략하고 Flash 에서 OAuth 를 사용하는 방법에 대해 다뤄 보겠습니다.


 OAuth 인증 방식 이해 하기 : http://dev.springnote.com/pages/1083036



Actionscript3.0 으로 구현 된 OAuth 라이브러리


OAuth인증을 하기 위해서는 서비스 프로바이더와 몇번의 통신을 해야 하고 결과적으로 accessToken 과 accessTokenSecret 을 발급 받게 됩니다. 일종의 로그인을 위한 허락 키를 발급 받는 거지요. 이 키와 몇가지 OAuth 에서 원하는 값들을 조합해서 리퀘스트를 날릴때 Header 나 리퀘스트 URL 에 포함 시켜서 보내게 되면 서비스 프로바이더는 해당 리퀘스트를 분석하여 제대로된 인증을 가지고 있을 경우에만 결과 값을 내려 주는 구조로 되어 있습니다. 


OAuth 인증을 거치는 과정이 accessToken 과 accessTokenSecret을 발급 받는 과정이지만, 인증이 끝나고 나서 이 값들만 포함 시켜서 리퀘스트를 날리는건 아님니다. OAuth 에서 원하는 값들이 많이 있는데요. 이 값들을 http://oauth.net/ 에 구현 된데로 개인적으로 만들어서 사용해도 되지만, 이미 많은 라이브러리가 구현 되어 사용 되고 있기 때문에 기존 라이브러리를 사용 하는 걸 추천 합니다. (OAuth 인증 절차상 인증이 잘못된 경우 어디서 무엇이 잘못된건지 디버깅 하기가 어렵습니다.)


oauth-as3



oauth-as3은 actionscript3.0으로 구현된 oauth 라이브러리 입니다. 기본적인 기능들만 구현 되어 있어서 바로 사용하기 보다는 이 라이브러리를 이용하여 따로 구현해 줘야 할 것들이 많습니다. 그럼 인증을 받는 순서대로 라이브러리를 사용해 보겠습니다.

사용하기 전에 알아 두면 좋은 이론은 라이브러리에 포함 되어 있는 OAuthRequest 는 실제로 서비스프로바이더와 통신을 하기 위해 리퀘스트를 만드는 클래스 이고, 이 클래스에서 OAuth 인증을 할때 필요한 oauth_nonce, oauth_timestamp, oauth_signature 등을 생성하게 됩니다. 서비스 프로바이더와의 통신은(인증할때) URLLoader 를 사용하지만 이 URLLoader의 값을 세팅할때 참조 해야 하는 클래스가 인증에 대한 정보를 가지고 있는 OAuthRequest 클래스 입니다. 그럼 requestToken을 받는걸로 시작해서 코드를 작성해 보겠습니다. Twitter(https://dev.twitter.com/docs/api) 인증을 예를 들겠습니다.


1. 서비스 프로바이더에서 requestToken 을 받는다.


우선 인증을 시작하기에 앞서 인증을 해야 하는 대상 어플리케이션이 존재 합니다. Twitter 등의 서비스 프로바이더에서 어플리케이션을 생성하면 해당 어플리케이션이 갖게 되는 고유의 consumerKey 와 consumerSecretKey 을 알 수 있습니다. 이 값들을 이용해서 OAuthRequest를 생성 합니다. 



var twitter = {
  consumerKey : "",
  consumerSecret : "",
  requestTokenURL : "https://api.twitter.com/oauth/request_token",
  authorizeURL : "https://api.twitter.com/oauth/authorize",
  accessTokenURL : "https://api.twitter.com/oauth/access_token",
  callbackURL : ""
}


var oauthRequest:OAuthRequest = new OAuthRequest(OAuthRequest.HTTP_MEHTOD_POST, twitter.requestTokenURL, nullnew OAuthConsumer(consumerKey, consumerSecret));

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, oauthLoadHandler);

var request:URLRequest = new URLRequest();

request.method = URLRequestMethod.POST

request.url = oauthRequest.buildRequest(new OAuthSignatureMethod_HMAC_SHA1(), OAuthRequest.RESULT_TYPE_URL_STRING);      

loader.load(request);

private function oauthLoadHandler(event:Event):void {
    
  //oauth_token=&oauth_token_secret=&oauth_callback_confirmed=
  //위의 값을 oauthRequest 에 저장
  
  var token:OAuthToken = new OAuthToken();
  token.key = oauth_token값;
  token.secret = oauth_token_secret값;
  oauthRequest.token = token;
}

 



그리고 Twitter의 경우 requestToken 을 발급 받는 api 가 post 를 사용하므로 셋팅을 해주고 oauthRequest에 인증에 필요한 모든 값들이 들어 있기 때문에 buildRequest 메소드를 이용해서 OAuth인증 값들이 포함 되어 있는 url 을 리턴 받아서 서비스프로바이더에서 리퀘스트를 날리게 됩니다.


buildRequest 에 들어가는 첫번째 파라미터는 oauth_signature_method 값이고 두번째 인자는 OAuth 인증 리퀘스트 값을 어떤 방식으로 받을 것이냐 선택 하는 것 입니다. 파라미터에 따라 URLRequestHeader값 또는 String 으로 받을수 있습니다.


2. requestToken 을 이용하여 서비스 프로바이더에게 접근 한다.


1번에 대한 response 값으로 oauth_token을 받게 되는데요. 이 값을 이용해서 또 다시 서비스 프로바이더에게 인증을 요청해야 합니다. 이번에 요청하는 인증은 URLLoader 를 이용한 인증이 아니라, 직접 URL로 이동하여 사용자가 아이디와 비번을 입력하여자신의 권한을 해당 어플리케이션에 수락 시키는 절차 입니다.





 https://api.twitter.com/oauth/authorize?oauth_token=REQUEST_TOKEN입력


위의 URL로 Desktop AIR의 경우 HTMLLoader 를, Mobile AIR의 경우 StageWebView를 이용해서 해당 사이트로 이동하면 위와 같이 인증 화면이 뜨게 됩니다. 


 

웹용 Flash Player에서는 서버를 (Proxy) 사용하지 않고 인증 할 수 없습니다. 웹상에서 클라이언트를 Flash 로 만들경우에는 (javascript 도 마찬가지 입니다) 서버에서 위의 인증 과정을 모두 대리로 수행 해야 합니다. 



사용자가 아이디와 비번을 입력하고 인증을 마무리 하게 되면 Twitter의 경우 어플리케이션을 등록할때 지정 했던 callback URL 로 이용하게 되는데요. 이동할때 URL 뒤로 추가적으로 필요한 정보들을 전달 받게 됩니다. 이 인증 절차를 통해 OAuthRequest가 가지고 있는 token 값은 이제 accessToken 을 접근 할 수 있는 인증권한을 갖게 됩니다.  


 http://www.ddongkang.com?oauth_token=&oauth_verifier=


위의 callback URL 로 전달 되는 oauth_token값은 요청할때 전달했던 값과 같습니다. oauth_verifier값은 이 예제에서는 사용되지 않습니다. 다음 링크를 참조 하세요. 


3. 서비스 프로바이더에서 accessToken 을 받는다.


이제 인증의 마지막 절차 입니다. accessToken 을 받는 방법은 requestToken 을 받을때와 같습니다. 



oauthRequest.requestURL = twitter.accessTokenURL;

oauthRequest.httpMethod = OAuthRequest.HTTP_MEHTOD_POST;
      
request.url = _oauthRequest.buildRequest(new OAuthSignatureMethod_HMAC_SHA1(), OAuthRequest.RESULT_TYPE_URL_STRING);

loader.load(request);

private function oauthLoadHandler(event:Event):void {
  
 // request token 리퀘스트일때
 //oauth_token=&oauth_token_secret=&oauth_callback_confirmed=true
 // access token 리퀘스트일때
 //oauth_token=&oauth_token_secret=&user_id=&screen_name=
 //위의 값을 oauthRequest 에 저장
 

  var token:OAuthToken = new OAuthToken();
 token.key = oauth_token값;
 token.secret = oauth_token_secret값;
 oauthRequest.token = token;

}




4. 인증 끝. 


위의 과정을 통해 accessToken 과 accessTokenSecret을 갖게 되어 인증이 끝났습니다. 이제 oauthRequest값에 인증 값들이 모두 포함 되어 있기 때문에 이를 이용해서 api 호출을 하면 됩니다.



oauthRequest.requestURL = Resource URL
oauthRequest.httpMethod = Request Method
    
var api_loader:URLoader = new URLLoader();

var api_request:URLRequest = new URLRequest();    
api_request.url = oauthRequest.buildRequest(new OAuthSignatureMethod_HMAC_SHA1(), OAuthRequest.RESULT_TYPE_URL_STRING);

api_loader.load(api_request);

 



OAuth를 이용한 인증은 개념을 파악하면 간단하지만 처음 개념 없이 무작정 사용하기엔 어렵습니다. 서비스 프로바이더에 따라 OAuth 인증 실패 이유를 제대로 반환해 주는 곳도 있지만 한번 꼬이기 시작하면 어디서 잘못된건지 찾기도 힘든게 OAuth 인증 같습니다. 


웹상에서 Flash 로 Twitter 나 Dropbox 같이 OAuth를 제공하는 서비스를 사용하고 싶으면 서버에 Proxy를 만들어서 서버를 통해서 인증을 받아야 합니다. 클라이언트 단에서 인증이 가능한 서비스 제공 업체도 있겠지만, 대부분은 서버를 통해서 인증을 받아야 보안 제약을 받지 않습니다. 그래서 FLash 를 이용한 방법은 주로 AIR(Desktop, Mobile)에서 사용 가능 합니다. 


많이 사용 되는 Twitter API 는 tweetr (http://wiki.swfjunkie.com/tweetr)는 있지만, 인증에 문제가 있는지 잘못 쓴건지 제대로 동작을 하지 않아 따로 만들어 사용하고 있습니다. 검색을 해 보니 github에 Twitter API를 구현한 소스가 올라와 있는데요. 아직 구현중인걸로 보이네요; 


조만간 사용하고 있는 라이브러리도 정리 해서 공유해 보겠습니다. 

잘못된 점이나 궁금한 점이 있으면 댓글로 문의 주세요~



Posted by Flash 동강
i'T news2011.12.03 11:54

Google Analytics


서비스를 만들어 보면 페이지뷰가 얼마나 발생하나 실 사용자는 얼마나 되나 같은 분석이 필요 합니다. 하지만 이런 분석 시스템을 구축 하기란 여간 힘든 작업이 아닐수가 없지요. 이 문서에서 소개 해 드릴 서비스는 Google Analytics 입니다. 구글이 내놓은 분석 서비스 입니다.




http://www.google.com/intl/ko/analytics/ 


위 주소로 들어 가서 계정을 만들면 바로 사용 할 수 있습니다. 로그인을 완료 하게 되면 계정 홈으로 들어가지는데요. 오른쪽 상단에 위치한 설정 아이콘을 클릭해서 들어 가면 분석을 할 대상을 추가 할 수 있습니다.




계정을 만드는 절차를 진행하면 등록된 서비스의 고유한 ID를 부여 받게 되고, 웹 서비스에 추가 할 수 있는 스크립트를 볼수 있습니다. 


웹 속성 ID : UA-XXXXXXXX-X 


<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type =
 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
 s.parentNode.insertBefore(ga, s);
  })();

</script>


위 스크립트를 블로그나 서비스에 추가 하면 설정을 끝납니다. 다시 정리 해 보면 절차는 다음과 같습니다.



1. http://www.google.com/intl/ko/analytics/ 접속
2. 웹 로그 분석 액세스 클릭
3. 계정 홈 - 설정 클릭
4. 새 계정을 추가 해서 사용하거나, 기존에 만들어져 있는 계정에 새 웹 속성을 등록해서 사용
5. 웹 페이지 컨텐츠일 경우 추적 코드를 페이지가 추가



gaforflash


그럼 플래시로 만들어진 컨텐츠는 어떻게 하느냐? 위의 스크립트를 통해 분석을 하는 방법도 있지만, 더 쉬운 방법으로 Actionscript Library가 있습니다.



http://code.google.com/p/gaforflash/  


import com.google.analytics.GATracker;

import com.google.analytics.AnalyticsTracker;

var tracker:AnalyticsTracker;

tracker = new GATracker(this, "UA-XXXXXXX-X", "AS3", true);
// ex) tracker.trackPageview("admin/change");
tracker.trackPageview("페이지이름");


이 라이브러리를 사용해서 이벤트에 따라서 페이지뷰를 날리는 방법으로 특정 이벤트에 대해 분석을 할 수 있습니다. 더 자세한 설명은 Google Code 페이지에 되어 있습니다.


http://code.google.com/apis/analytics/docs/tracking/flashTrackingIntro.html 


Google Analytics는 정말 여러가지의 분석을 해 줍니다. 자주 보는것 위주로 정리를 하면 다음과 같습니다.


주요 기능


1. 지역별 방문자 

2. 페이지 뷰 

3. 사용자 유입량

4. 실 사용자 유입량

5. 사용자 접속 환경 ( 브라우저, 플래시 버전 등등 )

6. 실시간 방문 현황 (베타)

7. 사이트 속도

8. 방문자 흐름

9. 방문 형태 (신규 방문, 재방문)

10. 광고 분석


생각 나는 것만 정리해 본 내용이니 실제로 사용할 수 있는 데이터는 엄청 많습니다. 

저는 이 블로그크롬 웹스토어에 올린 Daum Equation EditorDaum Paper 에 적용해서 사용하고 있는데요. 데이터 질적인 면에서 서비스를 분석하는데 상당히 많이 도움이 되고 있습니다. 


무료 서비스와 전문적인 서비스 지원 두가지로 제공 되니 사용해 보세요.


Posted by Flash 동강
Actionscript3.02011.05.01 16:29


 ApplicationDomain 에 대한 개념만 잘 이해 하고 있다면, 이 포스팅은 보지 않으셔도 됩니다. 최근까지 ApplicationDomain 에 대한 개념 자체를 다르게 이해 하고 있어서 어렵다고 생각했던 부분들은 정리 합니다.


 Flash/Flex 를 사용하면서 가장 많이 사용하는 클래스중 하나는 Loader 일 것 입니다. Loader 클래스는 SWF 나, 이미지 (JPG, PNG 등등) 을 로드 하는데 사용 합니다. 많은 분들이 이미지를 로드 하는데 자주 사용하고 있을거라 생각 합니다. 외부에서 이미지를 로드 하면 로드된 리소스는 Bitmap 으로 처리가 되어 BitmapData 의 clone 메소드를 통해서 해당 이미지를 재사용 할 수 있습니다. 코드는 아래와 같습니다.


 // 이미지 로드

package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; public class ApplicationDomainTest extends Sprite { public function ApplicationDomainTest() { var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler); loader.load(new URLRequest("TestAsset.png")); } private function loadCompleteHandler(event:Event):void { var image:Bitmap = event.target.content as Bitmap; var imageData:BitmapData = image.bitmapData.clone(); trace(imageData); } } }



이미지는 위와 같이 재사용하면 되고, 이미지가 아닌 SWF 파일은 어떻게 재사용 할까요? 제가 사용한 방법은 ApplicationDomain 을 이용한 것 입니다. ApplicationDoamin 에 대한 자세한 내용은 다음 블로그에 잘 정리 되어 있으니 참고해 주세요.


Flex 모듈 프로그래밍의 기초 - Application domain의 이해

http://blog.jidolstar.com/469

http://blog.jidolstar.com/346 


 Loader 를 통해 외부 리소스를 로드 하면 해당 리소스는 load 메소드의 LoaderContext 의 ApplicationDomain 설정에 따라 새로운 ApplicationDoamin 또는 로드를 객체의 ApplicationDoamin 에 정의가 저장 됩니다.


 load(request:URLRequest, context:LoaderContext = null):void


LoaderContext 에서 applicationDoamin 값을 (new ApplicationDoamin, ApplicationDomain.currentDoamin 등) 어떤 값으로 설정하는가에 상관 없이 로드된 외부 리소스는 자신의 ApplicationDomain 을 알 수 있습니다. 


 // 로드된 리소스 ApplicationDomain 알기

package {    

    import flash.display.Loader;    
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;        

    public class ApplicationDomainTest extends Sprite {        

        public function ApplicationDomainTest()    {

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load(new URLRequest("TestAsset.swf"));    
        }

        private function loadCompleteHandler(event:Event):void {

            var swf:* = event.target.content;

            trace(swf.loaderInfo.applicationDomain);
        }
    }
}


이 ApplicationDomain 에는 로드된 자기 자신의 정의 들을 가지고 있기 때문에 해당 정의(클래스)를 불러와서 사용 할 수 있습니다. 예를 들어 아래와 같이 작성 되어 있는 외부 SWF 를 로드 한다고 하면 각각의 객체 정의 들은 불러 오는 방법은 다음과 같습니다. 


// TestAsset

package { import com.ddongkang.AssetLoader; import com.ddongkang.Circle; import com.ddongkang.List; import flash.display.Sprite; public class TestAsset extends Sprite { private var loader:AssetLoader; private var circle:Circle; private var list:List; public function TestAsset(){ }

} 


 // Main

package {    

    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;

    public class ApplicationDomainTest extends Sprite {
        

        public function ApplicationDomainTest()    {

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load(new URLRequest("TestAsset.swf"));    

        }

        private function loadCompleteHandler(event:Event):void {
            var swf:* = event.target.content;
            trace(ApplicationDomain(swf.loaderInfo.applicationDomain).getDefinition("com.ddongkang.AssetLoader"));
            trace(ApplicationDomain(swf.loaderInfo.applicationDomain).getDefinition("com.ddongkang.Circle"));

            trace(ApplicationDomain(swf.loaderInfo.applicationDomain).getDefinition("com.ddongkang.List"));

        }

    }

}



getDefinition 으로 불러온 정의는 클래스 정의 이기 때문에 객체를 생성 할 수 있습니다. 


// 외부에서 로드한 Circle 객체 생성

var circle:* = new ((swf.loaderInfo.applicationDomain).getDefinition("com.ddongkang.Circle"))();
addChild(circle);            
trace(circle); 


로드된 TestAsset.swf 는 AssetLoader, Circle, List 정의를 가지고 있기 때문에 컴파일 될때 해당 정의도 SWF 에 포함됩니다. 로드한 클래스는 TestAsset 이지만, TestAsset 이 가지고 있는 정의들이 같은 ApplicationDomain 안에 포함되어 있기때문에 이러한 접근이 가능 합니다. 여기서 SWF 자체인 TestAsset.swf 도 다음 코드를 통해 접근 가능 합니다.


// TestAsset 접근 

var asset:* = new ((swf.loaderInfo.applicationDomain).getDefinition("TestAsset"))(); 


주의할 점은 getDefinition 에 사용한 이름이 package 까지 포함된 이름이라는 점 입니다. getDefinition 을 통해 해당 클래스 정의에 접근 할때는 해당 정의가 ApplicationDomain 에 존재 하지 않을수도 있기 때문에 hasDefinition 를 통해 있는지 확인 후 접근해야 런타임 에러를 방지 할 수 있습니다.


// hasDefinition 사용


 private function createAssetByName(loaderInfo:LoaderInfo, name:String):* {

            
     var applicationDomain:ApplicationDomain = loaderInfo.applicationDomain;
     if(applicationDomain.hasDefinition(name)) {
          return new (applicationDomain.getDefinition(name))();                
     }
            
     return null;
            
}


로드할 자원을 만들때, Flash Builder/ Flex Builder 를 사용할 경우 컴파일 된 자원 이름 (위의 경우에는 TestAsset.swf)이 클래스 이름(TestAsset)과 동일 하기 때문에 외부 리소스가 단일 자원으로 컴파일 될 때는 swf 이름으로 클래스를 접근해도 무방 합니다. 해당 swf 이름을 이용하여 Dictionary 를 만들어서 정의를 저장해 놓고 사용할 수도 있습니다. (http://mrdoob.com/blog/post/612


 하지만 Flash IDE 로 외부 리소스를 만들때는 반드시 Document 클래스를 지정하고 지정된 Document 클래스 이름을 통해 클래스를 접근해야 합니다. Flash/Flex Builder 에서 만든 리소스는 swf 자체가 클래스가 되지만 Flash IDE 에서는 Document 클래스로 연결이 안되어 있는 swf는 swf 자체가 클래스가 아니기 때문에(?) 정의를 불러 올 수 없습니다. 그러나Flash IDE 를 통해 Linkage 를 이용하여 클래스를 정의한 경우에는 Builder 에서 만들때와 마찬가지로 컴파일된 SWF 에 Linkage 를 통해 클래스화 된 객체 정보들을 가지고 있기 때문에 접근이 가능 합니다.  정리해 보면 다음과 같습니다.


로드할 자원 만들 때 주의 사항

1. 클래스 이름을 package 까지 포함하여 알고 있어야 한다.

2. Flash IDE 로 자원을 만들때는 Document 클래스를 연결해 주고 Document 클래스의 이름을 알아야 한다.

3. Flash IDE 의 라이브러리 Linkage 를 사용하여 클래스를 만들면 컴파일된 swf 에서 해당 정의를 불러올 수 있다. ( http://goo.gl/xrY8q ) 


로드한 자원 (클래스) 를 재사용하기 위해서는 로드된 클래스 이름을 알아야 한다는게 핵심입니다. 그 클래스정의는 로드된 swf 의 ApplicationDomain 안에서 있고 해당 클래스 이름을 통해서 가져 올 수 있습니다. 그리고 그 정의를 통해 new 를 통해 객체를 생성하여 사용 합니다.


잘못된 내용이나 개발 중 고민하고 있는 부분들은 댓글을 통해 공유 주세요~ 






Posted by Flash 동강
Adobe AIR2011.02.18 14:22

 최근들어 Adobe AIR 기반으로 되어 있는 데스크톱 어플들이 하나 둘씩 나오고 있는데요. FlashPlayer 기반의 개발보다 자료가 없어서 개발하면서 검색하는 시간이 점점 늘어만 가네요. 그중 하나 BrowserInvokeEvent 사용시 arguments 값에 대한 이야기를 해 보려고 합니다.


AIR 기반 어플리케이션은 일반적으로 아이콘 클릭으로 실행 시키는 방법과 함께 브라우져에서 사용자 이벤트 (마우스 또는 키보드)가 발생 했을때 실행 시킬수 있는 기능이 있습니다. 자세한 내용은 아래 링크에 있는 설명서를 참고하세요.


웹 페이지에서 AIR 응용 프로그램 설치 및 실행


이때 어플리케이션이 실행 되었을때 아이콘을 클릭해서 실행이 되면 InvokeEvent, 브라우저에 의해서 실행이 되면 BrowserInvoke 이벤트가 발생하게 됩니다. 

브라우저에서의 실행은  air.swf 파일 로드를 통해 그안에 정의 되어 있는 메소드의 installApplication 과 launchApplication을 이용합니다. 이 두 메소드의 쓰임은 위의 링크에서 브라우저에서의 AIR 응용프로그램 설치, 브라우저에서 설치된 AIR 응용 프로그램 시작 에서 확인할 수 있습니다. 

이 두 메소드는 설치후에 어플리케이션이 실행되었을때 파라미터를 전달해 주는 arguments 값을 설정해 줄수 있는데요. 이 arguments 값이 Array 형으로 전달 되는데 Array 안에 들어 갈수 있는 데이터형이 문자형(String) 으로 제한 됩니다. 보안상에 이유로 인해서 제한을 두고 있는것 같지만, 문제는 문자형도 제대로 넘어가지 않습니다. 예를 들어 URL 은 배열안에 넣고 전달 하려고 해도 아에 launchApplication 이나 installApplication 이 호출된 후에 AIR 어플리케이션이 실행 되지 않습니다. 그 이유는 문자안에 영문 문자열이 아닌 다른 문자가 포함되어 있을때 이러한 문제가 발생 합니다.

해결 방법은 전달해야 하는 문자들은 Base64로 인코딩 한 후에 전달하고 어플리케이션에서 디코딩해서 사용하면 됩니다.
Flex SDK 를 사용한다면 기본으로 Base64Encoder, Base64Decoder 가 포함되어 있으니 사용하시면되고, 다른 프로젝트라면 as3crypto (http://code.google.com/p/as3crypto/)라이브러리를 사용해 보는것을 추천합니다.

비교적 많은 기능을 가지고 있는 AIR 플랫폼이지만 제약도 많습니다. 다만 다른 플랫폼에서는 없는 기능과 사용자 편의성을 몇개 가지고 있다는게 메리트가 느껴집니다. 



Posted by Flash 동강
Flash Programming 란?2010.03.07 15:05

 지금까지 Flash 에서의 Timeline 에 대해 알아보았습니다. Timeline 에 대한 개념이 정리가 되셨는지요? 보통 사람들은 아래 그림 A와 같이 흰 도화지 안에 Timeline이 존재 하는 줄 알고 있습니다. 하지만 실제로는 반대입니다.



그림 A

그림 B



 그림 B와 같이 Timeline 안에 희 도화지가 속해 있는 형식으로 구성되어 있습니다. Timeline의 한 프레임 당 하나의 흰 도화지를 가지고 있고, 코드를 입력 할 수 있는 공간을 가지고 있습니다. 그림 A와 B는 단순히 Timeline 이 흰 도화지 보다 크다 (Timeline > 흰 도화지) 라는 의미를 뜻하지만, Flash의 구조 안쪽으로 들어가면 Flash에서의 객체라는 것의 뿌리가 되는 개념입니다. 왜냐 하면 모든 객체들은 이 Timeline에 속하게 되므로서 사용자들에게 보일 수 있게 되는 것이기 때문입니다. 이번 장을 진행하면서 왜 Timeline이 Flash의 구조의 뿌리가 되는 이유에 대해 살짝 엿보고, Flash에서의 객체가 어떻게 정의 되어 있고, 생성 되었다가 소멸 되는 과정에 대해 이야기 해 볼 것입니다.


 Flash는 객체기반 툴입니다. Flash에서 사용되는 것들 중에 객체가 아닌 것은 없을 정도로 모두 객체로 이루어져 있습니다. 지금 말하고 있는 객체란, MovieClip과 Button 그리고 툴로 그릴 수 있는 모든 것들을 의미 합니다. 잠시 객체의 의미에 대해 잠깐 짚고 넘어가겠습니다. 사전에서는 객체를 이렇게 정의 하고 있습니다.



 객체 [客體, object]

객체 지향 프로그래밍(OOP)이나 설계에서, 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념. 예를 들어 기차역에서 승차권을 발매하는 경우, 실체인 ‘손님’과 동작인 ‘승차권 주문’은 하나의 객체이다. 실체인 ‘역무원’과 동작인 ‘승차권 발매’도 하나의 객체이다.



백과 사전에서 정의한 것과 같이 동작의 주체가 되는 사람이나, 사람이 하는 동작 자체도 모두 객체라고 할 수 있습니다. 프로그래밍을 처음 접하는 사람들은 객체를 이해 할 때 사람과 같은 정해진 사물은 객체라고 이해 하지만, 동작이나 수학 공식을 처리해 주는 객체 같은 경우에는 객체가 아니라고 생각하는 경우가 많습니다. 객체는 보통 생각하는 것 보다 더 커다란 의미를 가지고 있습니다. 예를 들어 놀이터에 철수와 영희라는 객체가 놀고 있습니다. 놀이터에는 그네 객체, 미끄럼틀 객체가 있고 철수와 영희는 이들 놀이 기구 객체들을 사용할 수 있습니다. 이 경우는 모두 객체의 구분이 분명하기 때문에 이해하기에 어려움이 없을 것입니다. 하지만, 객체는 이러한 경우뿐만 아니라 우리가 행하는 동작이나, 기계들이 가지고 있는 기능들의 모음 또는 문서에 저장되는 데이터 모두 객체라고 할 수 있습니다. 이러한 객체들을 이용하는 툴을 객체 기반 툴이라고 하고, 객체 기반 언어라고 하는 것입니다. 그럼 Flash 에서의 객체는 어떤 것이 있을까요? 예를 들어 보겠습니다. Flash를 실행시키면 바로 보이는 것은 흰 도화지입니다. 그리고 그 아래 타임라인, 옆에는 Color패널과 Properties 와 라이브러리패널이 위치하고 있습니다. 이들 모두 객체입니다. 그리기 툴을 이용해서 사각형을 그린다고 하면, Color 패널을 사용하여 그리고 난 후에 사각형의 색상을 변화 시킬 수 있습니다. 왜 변화 시킬 수 있을까요? 그건 그려진 사각형에 color 라는 속성을 가지고 있기 때문에 변경을 할 수 있는 것입니다. 객체는 아무 것도 없는 빈 상태로 다른 객체를 담을 수 있는 역할도 하고, 속성과 메소드를 추가하여 그 자체로서 역할을 갖기도 합니다.

객체의 의미에 대해서 어느 정도 감이 왔을 것이라 생각이 듭니다. 그럼 본격적으로 Flash의 객체 구조에 대해서 다뤄 보도록 하겠습니다.


  • Flash 의 Display 구조

 Flash는 기본적으로 가지고 있는 구조가 있습니다. 과일을 담으려면 바구니가 필요하듯, Flash는 자체적으로 객체를 담을 그릇을 가지고 있습니다. 그 그릇이 바로 이전 포스팅에서 배웠던 Timeline입니다. 지금까지는 Timeline이라고 말했지만, 이 Timeline은 실제로 MainTimeline이라고 불리는 Flash에서 최상위 부모(바구니) 역할을 하는 객체입니다. 하지만 바구니가 있다고 해서 그 바구니가 가장 크기가 큰 개념은 아닙니다. MainTimeline 위에는 Stage 라는 객체가 더 존재하게 됩니다. 이러한 관계는 부모와 자식의 관계로 비유 하는 경우가 많으나, 여기에서는 바구니를 놓는 공간과 큰 바구니의 관계로 비유해 보겠습니다. Flash는 기본적으로 Stage 라는 공간 안에, MainTimeline 이라는 Timeline을 가지고 있는 바구니가 들어가게 됩니다. 그리고 그 MainTimeline 안에 모든 객체들이 만들어 지는 것입니다. 아래 그림을 보면 그러한 관계가 나타나 있습니다. 실제로 이러한 관계는 코드를 통해 확인해 볼 수 있습니다.





첫 번째 프레임에 아래 코드를 입력 합니다.

trace("this.parent : "+this.parent);

trace("this : "+this);


실행결과

this.parent : [object Stage]

this : [object MainTimeline]

 


실행 결과에서 볼 수 있듯이, 아무 것도 존재 하지 않은 상태의 this 는 MainTimeline을 가리키고 있습니다. 그리고 부모 객체를 알 수 있게 해 주는 parent 속성을 통해 MainTimeline의 부모를 보니 Stage 라고 나오는 것을 확인할 수 있습니다. 이와 같이 Flash는 사용자가 객체를 만들기 전에 그 객체가 담겨질 그릇에 해당하는 Stage와 MainTimeline을 준비해 놓고 객체가 만들어 지기만을 기다립니다.

Flash의 display 구조는 Stage-MainTimeline-만들어지는객체 로 이루어져 있습니다. 하지만 같은 객체를 나타내는 것이라도, 표현 방법은 여러 가지가 있습니다.



// 기본 display list

trace("this :"+this);

trace("this.parent :"+this.parent);

trace("this.stage :"+this.stage);

trace("-------------------------");


// root 에 관하여

trace("root : "+root);

trace("this.root :"+this.root);

trace("this.stage.root :"+this.stage.root);


//결과

this :[object MainTimeline]

this.parent :[object Stage]

this.stage :[object Stage]

-------------------------

root : [object MainTimeline]

this.root :[object MainTimeline]

this.stage.root :[object Stage]

 



이와 같이 같은 의미 이지만, 다르게 표현 될 수 있는 경우가 많이 있습니다. 또한 코드를 MainTimeline에 작성했을 경우에는 위와 같은 결과를 나타내지만, 빈 스테이지에 무비클립을 만든 후 그 안에 아래와 같은 코드를 입력할 경우에는 결과가 달라집니다.



 

// 기본 display list

trace("this :"+this);

trace("this.parent :"+this.parent);

trace("this.stage :"+this.stage);

trace("-------------------------");

// root 에 관하여

trace("root : "+root);

trace("this.root :"+this.root);

trace("this.stage.root :"+this.stage.root);

// 결과

this :[object Symbol1_1]

this.parent :[object MovieClip] // MainTimline이 나올 것이라 예상했을 것이다.

this.stage :[object Stage]

-------------------------

root : [object MovieClip]

this.root :[object MovieClip]

this.stage.root :[object Stage]



stage 관련 코드를 제외 하고는 모두 결과가 바뀌었습니다. 왜 그럴까요? 결과 분석에 앞서 root의 개념에 대해 짚고 넘어 가겠습니다. root 속성은 어떠한 객체가 포함되고 있는 최상위 부모객체를 나타내는 속성입니다. 예를 들어 보겠습니다. 빈 스테이지에 SuperMother이 있고, 그 안에 Mother, 또 그 안에 Child 라는 무비 클립 객체가 있습니다.




// 각각의 무비 클립은 포함 관계에 있으며 instanceName이 부여 되어 있다.

trace(_supermother.root);

trace(_supermother._mother.root);

trace(_supermother._mother._child.root);

// 결과

[object MainTimeline]

[object MainTimeline]

[object MainTimeline]

 


결과와 같이 root는 자기 자신이 존재하고 있는 최상위의 부모를 나타냅니다. MainTimeline 과 Stage는 자기 자신이 최상위이기 때문에 root 속성을 보아도 자신이 출력 되는 것입니다.

 

Adobe에서 제공하고 있는 as3.0 설명서에서 DisplayObject에 root 속성을 찾아보면 상황에 따라 root 가 어떻게 다르게 쓰이는가를 볼 수 있습니다. 아직 배우지 않은 개념들을 이용해서 설명해야 하므로 관련된 포스팅에서 더 자세히 알아보도록 하겠습니다.

 

 다시 이전 예제로 돌아가서, MainTimeline으로 나올 것이라 생각했던 값이 MovieClip으로 출력되었습니다. 그 이유는 스테이지 위에 생성된 무비클립에서는 자기 자신의 부모의 타입이 MovieClip 이라는 것은 알고 있지만, 정확한 이름을 알고 있지 못하기 때문에 MovieClip 이라고 출력해준 것입니다. 해결 방법은 간단합니다. Flash에 이름을 알려주면 되는 것이지요. 소스는 생성된 무비 클립 안에 작성 되었으니, trace(this.root); 코드를 MainTimeline에 입력해 봅시다.



 

// 기본 display list

trace("this :"+this);

trace("this.parent :"+this.parent);

trace("this.stage :"+this.stage);

trace("-------------------------");

// root 에 관하여

trace("root : "+root);

trace("this.root :"+this.root);

trace("this.stage.root :"+this.stage.root);

// 결과

[object MainTimeline]

this :[object Symbol1_1]

this.parent :[object MainTimeline]

this.stage :[object Stage]

-------------------------

root : [object MainTimeline]

this.root :[object MainTimeline]

this.stage.root :[object Stage]



MainTimeline 에서는 자신이 MainTimeline이라는 것을 알고 있었기 때문에, MainTimeline이라 출력해 주었고, Flash는 가장 먼저 실행되는 trace(this.root);를 통해서 정보를 알게 되었기 때문에 MovieClip 으로 출력해 주었던 것은 MainTimeline 으로 좀 더 객체를 명확하게 나타내 주었습니다. 이와 같이, 같은 키워드를 사용하는데도 불구하고 자신의 의도와는 다르게 나타나는 경우가 있습니다. 특히 this 와 root 그리고 parent의 개념을 잘 알고 사용해야 버그를 줄일 수 있습니다. 


 

this 의 의미 변화


AS2.0때까지만 해도 this가 의미 하는 것은 같은 코드 페이지에서 사용하여도 this를 사용하는 함수에 따라 달라졌습니다. AS2.0 코드에서는 아무것도 없는 스테이지상에서 trace(this);를 입력해 보면 _level0 이라는 최상위 표시객체를 나타내 줍니다. 하지만 스테이지 상에 mc 라는 무비 클립을 만든 후에 onRelease 이벤트를 걸어준 후에 나타나는 this는 _level0.mc입니다.


 이와 같이 같은 페이지(객체)에 코딩을 하고 있더라도, this의 의미는 어떤 이벤트에서 사용되는가에 따라 그 이벤트의 행위의 주체가 되는 객체로 의미가 바뀌면서 사용 됩니다. 아래의 코드를 보면 이벤트에 속해 있지 않았을 때의 this 는 _level0 은 나타내고 있지만, onRelease 라는 이벤트 안에서는 이벤트의 주체가 되는 _level0.mc를 가리키고 있는 것을 보면 이와 같이 동작하고 있다는 것을 알 수 있습니다. 하지만 as3.0 에서는 달라졌습니다.



trace(this);

mc.onRelease = function(){ // AS2.0 에서의 Click 이벤트입니다.

trace(this);

}

 

// 결과

_level0

_level0.mc // mc 라는 무비 클립을 클릭했을 때



 as3.0 의 경우 ‘같은 객체’ 안에서 사용되는 this의 의미는 항상 코드가 입력되고 있는 자기 자신을 나타냅니다. 우리가 지금 하고 있는 프레임 코딩 같은 경우에는 코드를 입력하는 장소가 MainTimeline 이기 때문에 최상위의 프레임일 경우 this는 항상 MainTimeline을 가리킵니다. 위에서 ‘같은 객체’ 라고 표현한 이유는 앞으로 우리들은 MainTimeline 뿐만 아니라, 새로운 객체(클래스)를 만들어서 그 안에 코딩 할 것이기 때문에 표현을 한정시킨 것입니다. 빈 스테이지에 무비 클립을 만든 후에 더블클릭으로 만들어진 무비클립의 타임라인에 trace(this); 라고 코딩해 보면 [object Symbol1_1] 라는 결과를 출력합니다. 무비 클립을 만들 당시에 객체 이름 즉, 클래스 이름을 정의 하지 않았기 때문에 Flash에서는 임의로 Symbol1_1 이라는 이름을 부여한 것입니다. 이 이름은 무비클립을 만들 때 입력했던 Name을 바탕으로 만들어 지는 것이나, 실제로 여기서 만든 무비 클립을 바로 동적으로 생성하여 사용할 수는 없습니다. Linkage 라는 클래스 연결 작업을 통해서 하나의 클래스 객체가 되는 것입니다. 다시 this의 의미로 돌아와서, as3.0 에서의 this는 항상 자기 자신을 가리킵니다. this를 통해서 자신의 부모객체인

this.parent 로 접근할 수 있으며, 자신의 자식 객체가 존재할 경우에는 this.자식객체이름 으로 접근 가능한 것입니다. 마지막 예로 AS2.0 에서는 이벤트에 포함했을 때 this의 의미가 바뀌었으니, as3.0 에서는 이벤트에 포함된 this 는 어떤 의미를 나타내는지 보겠습니다. 위의 예제와 같이 빈 스테이지에 무비 클립을 만든 후 이벤트를 걸어 줍니다.



trace(this);
mc.addEventListener(MouseEvent.CLICK, onClickHandler);  // as3.0의 Click이벤트
function onClickHandler(event:MouseEvent):void
{
trace(this);
}

// 결과
[object MainTimeline]
[object MainTimeline]     // mc 라는 무비 클립을 클릭했을 때



이와 같이 MainTimeline 에 작성된 this 는 모두 MainTimeline을 가리킵니다.


Posted by Flash 동강
Actionscript3.02010.01.14 11:03

작년에 썼던 Javascript vs Actionscript 라는 글에서는 비교 관련 자료가 06년도의 Flash player 9 와 그때 당시의 브라우져를 대상으로 테스트한 것인데요. jacksondunstan.com 블로그에서 최근에 AS3 기반의 Flash player 10과 최근 브라우져의 Javascript 와 Performance 테스트를 한 포스팅이 있었네요. 아래는 테스트 한 결과 입니다.



참고 자료 :  AS3 vs Javascript Performance Test

                AS3 vs Javascript Performance Test Followup

                


Posted by Flash 동강
Actionscript3.02010.01.12 01:06

외부 데이터를 불러 와서 TextField 에 넣어 줄때, 외부 데이터 문자 길이를 UI 에 맞게 잘러서 나타내는 경우가 있습니다. 기본적으로 String 클래스에서 제공하는 substr 등을 이용하여 문자열을 보기 좋게 자르는데요. 여기서 소개 하는 방법은 substr 과 TextField 의 getLineOffset를 이용하여 한정된 라인에만 글짜를 출력 하는 방법 입니다.

var field:TextField = new TextField();
field.width = 250;
field.wordWrap = true;
field.text = "안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.";
addChild(field);
위의 코드를 출력하면 아래와 같은 결과가 나옵니다.


위와 같이 width 값은 고정되어 있고 wordWrap = true 로 TextField 의 자동 줄바꿈이 설정 되어 있을때 getLineOffset 을 이용하여 원하는 최대 라인수 보다 넘어 갔을때 그 다음 라인의 첫번째 문자 인덱스 값을 가져온 뒤에 그 인덱스의 -2 만큼 String 값을 잘라 버리는 방식 입니다. getLineOffset 의 설명은 아래와 같습니다. 

var field:TextField = new TextField();
field.width = 250;
field.wordWrap = true;
field.text = "안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.";
cutNumLines(field,2);
addChild(field);
function cutNumLines( $field:TextField,$maxLen:int ):void{
	if($field.numLines-1 < $maxLen) return;
	
	var idx:int = $field.getLineOffset($maxLen);
	$field.text = $field.text.substr(0,idx-2)+"..";
}

getLineOffset(lineIndex:int):int
lineIndex 매개 변수로 지정된 행에 있는 첫 문자의 문자 인덱스를 반환합니다.


위의 함수를 실행한 후의 결과는 다음과 같습니다.



'Actionscript3.0' 카테고리의 다른 글

AS3 vs Javascript Performance Test  (0) 2010.01.14
[AS3] TextField 에 한정된 라인에만 글짜 넣기  (0) 2010.01.12
Avoid ints in Actionscript  (10) 2009.11.14
Factory Pattern (AS3)  (0) 2009.10.25
Posted by Flash 동강
Actionscript3.02009.11.14 19:56

 오랜만에 블로그를 둘러 보다 흥미로운 포스팅을 보았는데요. Actionscript 로 작업할시 숫자 타입의 int 를 사용을 자제 하라는 내용 입니다. 일반적으로 생각하면 int 가 Number 보다 크기가 작으니 int 로 처리 하면 더 빠르다고 생각하는 분들이 많으실텐데요. 이 포스팅에서는 여러 이유를 통해 부정 하고 있습니다.


이유 1. Number 를 사용하는게 int를 사용하는 것 보다 빠르다.

아래 코드를 실행 시키면 어떤 결과가 나올까요? 


public function timingTest() : void
{
	var intTime : Number;
	var numberTime : Number;

	var i : int;
	var j : int = 0;

	intTime = (new Date()).time;
	for (i=0; i<10000000; i++)
		j = (j + 15) / 7;

	intTime = (new Date()).time - intTime;

	var n : Number;
	var m : Number = 0;

	numberTime = (new Date()).time;
	for (n=0; n<10000000; n++)
		m = (m + 15) / 7;

	numberTime = (new Date()).time - numberTime;

	var message : String =
		"int version: " + intTime + "ms\n" +
		"Number version: " + numberTime + "ms";

	Alert.show(message);
}

int 를 사용한 코드 : 331ms

number 를 사용한 코드 : 291ms

 

  조금 의아해 할수도 있는데요. number 가 조금 빠르게 나왔습니다. 여기서는 조금한 차이지만 더 많은 루프를 돌리면 더 많은 차이를 낼 것 입니다. 일반적으로 number 가 더 많은 대역의 숫자를 커버 하기 때문에 연산할때 더 느릴텐데 왜 number 를 사용한 코드가 더 빠르게 나온걸까요? 


 j = ( j + 15 ) / 7;


 연산 비교에 사용된 코드를 보면 나누기 연산을 하고 있습니다. 이 나누기 연산이 number 가 더 빠른 연산 속도를 낼 수 있었던 이유 입니다. 연산이 이루어 질때 시스템은 내부적으로 int 범위 내에서 처리 할 수 없는 것은 number (double) 로 바꾸어 처리 하기 때문에 int - > number 로 변환 하는 처리 비용이 더 들기 때문에 number 가 더 빠른 결과를 낸 것 입니다. 


이유 2. Number 는 더 많은 bit 를 가지고 있다.


Number를 나타내는 데이터 format 은 아래와 같습니다. int 에 비해 더 많은 데이터 범위를 저장 할 수 있고 ( 12 ~ 63 ) 연산이 손실되는 데이터 없이 이루어 집니다. 그 만큼 오차를 줄여서 계산할 수 있다는 의미 입니다. 


 S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

  0 1        11 12                                                63 


실제로 + 연산이나 - 연산에서는 int 를 이용한 연산이 더 빠릅니다. 하지만, number 에 비해서 많이 빠르지 않습니다. 아래 결과를 보면 gskinner 가 "Types in AS3: ints not so fast, uints slow!" 포스팅을 통해 퍼포먼스 테스트를 한 결과 입니다. int 는 number 에 비해 많이 빠르지 않고, 느릴때도 있으니 차라리 데이터 손실 없이 연산이 이루어 지는 number 를 주로 사용하는게 좋다는 내용 입니다.  


Assignment ( var a:TYPE = 0; )
int: 24-45ms
Number: 24-36ms
uint: 25-37ms

Statistically, they look the same, which is to be expected.

Assignment ( var a:TYPE = 0.5; )
int: 56-83ms
Number: 26-43ms
uint: 57-92ms

Predictably, Number is faster for fractional assignments, as the value does not need to be converted to an integer.

Division ( var a:TYPE = i/2; )
int: 60-105ms
Number: 34-64ms
uint: 184-278ms

Number is a much faster type for division, as expected from Sho's post. uint trails badly.

Multiplication ( var a:TYPE = i*2; )
int: 78-129ms
Number: 39-64ms
uint: 207-280ms

Similar results to division. I thought int might perform better as the value would never have to be converted to a float (whereas in division it would).

Addition ( var a:TYPE = i+2; )
int: 31-49ms
Number: 44-55ms
uint: 85-113ms

As expected from the plain iterator test, int is slightly faster for integer addition.

Bitshift ( var a:TYPE = i<<1; )
int: 31-63ms
Number: 61-114ms

uint: 71-130ms 


가장 좋은 방법은 상황에 따라서 Number 와 int 를 골라 쓰는 건데요. 그 판단이 항상 좋을 수는 없으니, 잘 생각해서 써야 할 것 같습니다. 실제로 "Types in AS3: ints not so fast, uints slow!" 의 댓글에서 Number 의 연산 퍼포먼스가 휠씬 떨어 진다는 내용도 있었습니다. 그러면 언제 int 를 사용하면 좋을까요? 


1. 별로 차이가 없겠지만, 메모리를 적게 쓰고 싶을때

2. var i : int = j / 2; 와 같이 int 를 사용할 때

3. 클라이언트와 서버 측의 통신이 이루어 질때 오차를 줄이고 싶을때 


아무리 여러 테스트가 있어도, 정답은 "상황에 따라 맞는 방법을 쓴다." 이네요.




'Actionscript3.0' 카테고리의 다른 글

[AS3] TextField 에 한정된 라인에만 글짜 넣기  (0) 2010.01.12
Avoid ints in Actionscript  (10) 2009.11.14
Factory Pattern (AS3)  (0) 2009.10.25
Actionscript3.0의 DisplayList  (2) 2009.09.22
Posted by Flash 동강
i'T news2009.10.26 00:00

 발행한지 얼마 되지 않았지만, 언제나 일요일 저녁에 오픈캐스트를 발행하는것 같습니다. 포스팅해야지 해야지 생각만 하고 하지 않는 일상이 반복 되고 있네요. 하고 싶어도 못한다는 말은 그냥 핑계 인것 같습니다.


 세번째 캐스트를 발행하였습니다. 이번에도 마찬가지로 액션스크립트를 처음 접하거나 초보자를 위한 캐스트 이고요. 어떤 방법을 알려주는 링크라기 보단 초심자가 한번쯤을 읽어 봐야 하는 내용들로 모아 보았습니다.


몇주째, 캐스트만 홍보 하는 블로그가 되고 있네요. ㅜㅜ


캐스트 : http://opencast.naver.com/DO718



Posted by Flash 동강
Actionscript3.02009.09.22 12:41


목차

DiplayList 란?

- DisplayList의 3가지 요소

- DisplayList의 구조

- DisplayList 구조의 장점

- Index 개념

- Shape, Sprite, MovieClip

- DisplayList의 부모 자식 노드 관계 탐색이 간편해짐

DisplayObject 클래스

- DisplayObject를 상속받는 클래스

- 속성 메소드 및 이벤트

- root , parent, stage 에 접근하기

- Loader 를 사용해 불러온 외부 swf 의 root 와 stage

DisplayObjectContainer 클래스

- DisplayObjectContainer 의 상속

- 속성 및 메소드


DisplayList 란?


DisplayList 란 SWF안에 존재 하는 객체들 중에 눈에 보이는 객체들을 총칭한다. 눈에 보이는 객체라고 하니 잘 이해가 안될수도 있으나, 간단하게 MovieClip 과 같이 addChild 를 통해 사용자에 눈에 보일수 있는 객체들을 뜻한다. 반면에 Date 클래스와 같은 객체는 단순히 시간에 대한 데이터를 처리 하는 객체 이므로 DisplayList 에 속하지 않는다. (빈 MovieClip 이나 Sprite, Shape 도 비어 있지만 모두 DisplayList 이다)


DisplayList의 3가지 요소


Flash Actionscript 에서는 이러한 DisplayList 구조가 아래와 기본 골격을 가지고 있다.


가장 상위에 Stage가 존재 하고 그 아래 MainTimeline 그리고 사용자가 만들어 내는 객체들로 눈에 보이게 되는 것이다. 그러면 어떠한 객체들이 "만들어지는 객체" 에 속하는 것인가? 바로 DisplayObject 와 DisplayObjectContainer 클래스를 상속받은 객체 들이다.

- DisplayObject : 화면에 표시 되는 객체 (Shape, Sprite, MovieClip, SimpleButton 등등)

- DisplayObject : 화면에 표시 되고 다른 객체들을 포함 할수 있는 객체 (Sprite, MovieClip, Loader 등등)



결국 SWF 안에 존재 하는 DisplayList 구조는 위와 같은 구조로 만들어 지게 된다.


DisplayList 구조의 장점


AS1.0, AS2.0 때 까지만 해도 위와 같은 DisplayList 구조를 가지고 있지 않았다. Flash CS3 이전 버젼에서는 MovieClip 이 거의 대부분의 객체의 기본이 되었고 그렇기 때문에 단점이 많았다. 하지만 위와 같은 DisplayList 를 가지게 되고 여러 장점을 가질수 있게 되었다.

- Shape, Sprite, MovieClip 등과 같이 객체가 다양해 져서, 효율적인 화면 구성을 할수 있다 되었다.

AS2.0 까지만 해도 MovieClip 만이 화면을 구성 하였으므로, 효율성이 떨어졌었다. 하지만, MovieClip 에서 타임라인을 제거한 Sprite 와 단지, 드로잉 기능만 가지고 있는 Shape 객체로 인해 좀더 효율적인 렌더링이 가능해 졌다.


Depth 개념에서 Index 개념으로 변화


AS2.0 까지는 객체의 위,아래 순서 개념을 Depth 개념이다. Depth 개념을 말 그대로 절대적인 깊이를 적용하여 z-index를 바꾸는 방식이었다. 예를 들어 mc 라는 객체가 depth 10에 존재 하고 mc2 라는 객체가 depth100에 존재 한다면 mc는 mc2 보다 아래 위치하게 되고 만약 영역히 겹쳐 졌을 경우에는 mc가 mc2에 가려 않 보인다. 여기서 중요한 점은 depth10 과 depth100 사이에는 아무것도 존재 하지 않아도 된다는 점이다. 빈 공간으로 둬도 상관없는 상태 이다. 하지만 AS3.0 부터 적용된 Index 개념에서는 조금 다르다. 항상 순서에 맞게 객체에 index 가 적용 된다. addChild 메소드를 통해 객체를 DisplayList 에 등록했다면, 제일 처음으로 등록한 객체는 index 0 을 할당 받고 그 다음은 1 다음은 2. .....7,8,9 등등 순서대로 할당 받게 된다. 순서를 가지고 있다는 점은 여러 가지 특징을 함께 가지고 있다는 뜻과 같다. 일상 생활에서 10개의 박스가 아래에서 부터 순서대로 쌓여 있다는 경우를 예로 들어 보면, 어떠한 사람이 제일 아래 있는 1 index 에 있는 박스를 가지고 간다면, 1 index 위치가 비게 되므로 위에 있는 박스들이 차례로 아래로 다시 쌓여 제 정렬 되게 됩니다. (1<-2 , 2<-3, 3<-4 등등) AS3.0 에서의 Index 도 같은 개념 이다.


Depth방식에 비해 Index방식이 효율적인 점



 첫번째로 Index방식은 객체에 순서를 부여 하므로 해서 부모 객체에서 자식 객체를 탐색할 때, 매우 빠르게 조회 할 수 있게 해준다. 아래 코드는 어떠한 DisplayObjectContainer 에 속해 있는 객체들을 탐색 하는 메소드 이다.



function displayChild(&prt:DisplayObjectContainer):void{

for(var i:int = 0; i < &prt.numChildren; i++){

var child:DisplayObject = &prt.getChildAt(i);

if(child as DisplayObjectContainer)

{

trace(child.name);

displayChild(child as DisplayObjectContainer);

}

else

{

trace(child.name);

}

}

}


 두번째로 또 다시 일상생활의 예를 들어 보면, Depth 방식으로 책을 만드는 사람들과 Index 방식으로 책을 만드는 사람들이 있다고 하자. 두 사람 모두 150쪽 짜리 책을 완성 하였다. 하지만, 중간에 잘못된 부분을 발견하여 50쪽에 100쪽 분량의 내용을 삭제 하려고 한다. Depth 방식의 사람들은 엄청 고생을 해야 할 것이다. 왜냐하면 기존에 있던 100쪽 부터 150쪽까지의 분량을 일일히 앞으로 옮겨야 하기 때문이다. 하지만 Index 방식으로 책을 만드는 사람들은 옮기는 수고를 할 필요가 없다. 50쪽부터 100쪽까지 의 분량을 삭제 하면 알아서 100쪽에서 150쪽까지 있었던 분량이 알아서 정렬하기 때문이다. Actionscript 에서도 이 예제와 똑같은 원리가 적용 된다.


DisplayObject 와 DisplayObjectContainer


아래 구조도에서 볼수 있듯이 AS3.0 의 DisplayList 는 DisplayObject 와 DisplayObjectContainer 를 통해 만들어 진다. 자주 사용하는 MovieClip 이나 Sprite 의 속성중 x, y, visible, alpha 등등의 속성을 가지고 있는 것은 모두 DisplayObject 클래스를 상속 받았기 때문이다. DisplayObject 란 DisplayList (표시목록) 에 배치 할 수 있는 모든 객체의 기본 클래스 이다. 그러면 DisplayObjectContainer 는 무엇인가 아래 구조도를 보면 DisplayObjectContainer 가 DisplayObject의 상속을 받아서 만들어 졌다는 것을 볼 수 있다. 이 말은 DisplayObject 의 기능은 모두 가지고 있으면서 어떠한 것을 포함 할 수 있는 즉, addChild 와 removeChild 와 같은 DisplayObject 의 객체 컨테이너(바구니) 역할을 할 수 있는 객체들의 기본 클래스 이다.



DisplayObject

상속 받는 구상 클래스 : 실제 객체를 생성 할 수 있는 클래스


Bitmap, Loader, Shape, SimpleButton,Sprite, MovieClip, TextField, Video


상속 받는 추상 클래스 : 실제 객체를 생성 할 수 없고, 기능만을 가지고 있는 추상 클래스이다. 이 추상클래스를 통해 객체를 생성하려고 하면 ArgumentError 가 발생한다.

var mc:DisplayObjectContainer = new DisplayObjectContainer() 를 실행 하면 ArgumentError 가 발생한다.


AVM1Movie, DisplayObjectContainer, InteractiveObject, MorphShape, Stage, StaticText


속성 및 메소드

http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/flash/display/DisplayObject.html


이벤트

Event.ADDED , Event.ADDED_TO_STAGE,


DisplayObject 는 객체에 addChild 될수 있으므로 A 객체가 B 객체에 addChild 되면 Event.ADDED 이벤트가 발생한다.

Event.REMOVED, Event.REMOVE_FROM_STAGE


DisplayObject 는 객체에 removeChild 될수 있으므로 A 객체가 B 객체에 removeChild 되면 Event.REMOVED 이벤트가 발생한다.


root / parent / stage 의 의미 알기



DisplayObjectContainer



속성 및 메소드

http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/flash/display/DisplayObjectContainer.html

주요 메소드

추가 / 제거 


addChild / removeChild

addChildAt / removeChildAt : 특정 index에 객체를 추가/삭제 한다.


 addChild(child:DisplayObject):DisplayObject

 addChildAt(child:DisplayObject,index:int):DisplayObject

 removeChild(child:DisplayObject):DisplayObject

 removeChildAt(child:DisplayObject,index:int):DisplayObject

자식 객체에 대한 정보


numChildren : DisplayObjectContainer 안에 addChild되어 있는 (포함되어 있는) 객체의 갯수를 반환한다.


Index 값 정보


getChildAt / getChildByName / getChildIndex : DisplayObjectContainer 안에 존재 하는 객체들을 Index 값(getChildAt), 이름(getChildByName)에 따라 찾아 주고, getChildIndex 는 특정 객체의 Index 위치를 반환한다.


getChildAt(index:int):DisplayObject

getChildByName(name:String):DisplayObject

getChildIndex(child:DisplayObject):int


Index 값 교환


setChildIndex / swapChildren / swapChildrenAt : DisplayObjectContainer 안에 존재하는 객체들의 Index 값을 서로 바꿔주는 메소드 들이다.


setChildIndex(child:DisplayObject,index:int):void

swapChildren(child1:DisplayObject,child2:DisplayObject):void

swapChildrenAt(index1:int,index2:int):void





'Actionscript3.0' 카테고리의 다른 글

Factory Pattern (AS3)  (0) 2009.10.25
Actionscript3.0의 DisplayList  (2) 2009.09.22
What is "Flashplatform" ?  (3) 2009.08.25
OpenCV in Flash  (2) 2009.08.21
Posted by Flash 동강
Review2009.09.09 00:11

 

브라우져 별로 Javascript 와 Actionscript 의 스크립팅 퍼포먼스를 비교한 자료 입니다. 06년라고 나와 있는걸 보니 상당히 오래된 테스트 네요. 하지만 아직 까지 IE6, IE7 사용자가 압도적인 우리 나라 웹 환경에서는 여전히 적용되는 비교 자료 인것 같습니다..

 

 현재 98% 이상 설치 되어 있는 Flash player 9에서의 Actionscript 퍼포먼스와 파폭, 오페라, IE 에서의 Javascript 퍼포먼스를 테스트 한 것인데, 방법의 차이는 있겠지만 Actionscript가 압도적으로 빠르게 나왔네요. 물론 최근에 나온 파폭이나, 오페라 크롬에 탑재 되어 있는 자바스크립트 엔진과 비교를 하지 않은 거라서 언어 적으로 두 언어의 퍼포먼스를 비교 하기는 쉽지 않을것 같습니다. Flashplayer 도 10 버젼에서 굉장한 퍼포먼스 항상을 가져 왔으니, 자바스크립트 엔진Flashplayer 의 퍼포먼스 비교라고 해도 될 정도로 환경의 영향을 많이 받습니다.

 

Javascript 나 Actionscript 나 모두 휼륭한 스크립트 입니다. 두 언어 모두 다른 것과 대체 하기 힘들 정도로 해당 분야에서 가장 많이 사용되는 방법이기도 합니다. 하지만 Javascript(Ajax 컨텐츠) 로 만들어야 하는 것과 Actionscript(Flash 컨텐츠) 로 만들어야 하는 것은 엄연히 차이가 있습니다. 서비스를 기획하기에 앞서, 서비스가 어떤 방향으로 나가는 것인지 여러 상황을 고려 하여 판단하여 프로젝트에 적용해야 합니다.

 

어떤 것을 "할 수 있다." 와 어떤 것을 "잘 한다." 는 엄연히 다른 의미니까요.

 

'Review' 카테고리의 다른 글

Introduce Daum Equation Editor and Daum Paper on Chrome Web Store  (0) 2011.11.14
Javascript Vs Actionscript  (4) 2009.09.09
OpenCast 와 블로거 뉴스  (4) 2008.12.16
대한 민국 플래시 人의 밤  (0) 2008.12.11
Posted by Flash 동강
Flash platform2009.09.08 00:12

 이런 말을 많이 듣습니다.



Flash로 만들면 느리지 않아요? 

Flash 로 만드면 유지 보수가 힘들지 않아요?

Flash 로 만들면 오래 걸리지 않아요?? 




예전에는 Flash를 맹신하여 위의 말들에 "욱" 했었지만, 지금은 반반 입니다. 하지만 확실한건 Flash 로 만든 컨텐츠는

느리지 않다 입니다. 그러면 왜 느린가?? 왜 느리다고 생각하는 건가요?


느리게 만들기 때문에 느린 것이다.

느리게 만들게 의도 하기 때문에 느린 것이다.



 저는 이 두가지 이유 때문이라 생각 합니다. 첫번째 이유는 생각 없이 심볼 생성하고, 퍼포먼스 고려 없이 트윈 남발하고
어느덧 라이브러리에는 쓸데 없는 심볼이 쌓여서 SWF 자체로 무거워 지고, 여러 가지 Flash player 과부화 요소를 생각하지 않고 빨리 빨리 작업 해야 한다는 압박 때문에 그냥 그냥 지나가고... 두번째 이유는 생각 없는 클라이언트, 기획자, 디자이너 만나서 화려 한게 좋아요. Flash 는 화려 한거 아니에요? 트윈 떡 칠한거 보고 역시 Flash 는 달라요. 좀 더 화려 하게 해 주세요. 이 요구에 마지못해 따라가는 개발 때문이라는 생각이 드네요. 

 Flash 컨텐츠는 보통 생각하는 화려한 UI 외에도 많은 것들을 할 수 있습니다. 단순히 UI만 만드는 도구가 아니라는 거죠. 
ActiveX 를 대체해서 채팅 솔루션을 개발하기도 하고, 파일 업로도와 같은 것, 뮤직 플레이어, 동영상 플레이어 최근에 오픈한 네이버의 N드라이브나 뉴스 아카이브 등등 할 수 있는게 무궁 무진 합니다. 

 느리다고 생각하는건 Flash 컨텐츠를 너무 맹신해서 그런것 아닐까요? Flash 로 만들었을때 느리면 다른 걸로 만들면 느리지 않을까요? 

한밤 중에 고뇌 하고 있습니다.....


Posted by Flash 동강
Actionscript3.02009.05.25 00:38

문서 원본 : Adobe 기술문서
작성된 날짜 : 2009-05
저자 : 강동혁(동강)
저자 소개 : Daum communications 에서 UI 개발 업무를 하고 있으며, Flash 커뮤니티에서동강이라는 닉네임으로 활동하고 있다. 뭐든지 사용하기 편해야 한다는 생각을 가지고 개발을 하고 있으며, 최근엔 새로산 자전거를 자주 못타고 다녀 아쉬워 하고 있다.


   <목차>

-Display 객체들의 다양화

-Display List구조의 변화

-객체의 심도 관리 향상(Depth에서 index)

-Depth방식에 비해 Index방식이 효율적인 점

-이벤트 모델의 변화



Flash를 하던 많은 사람들이 AS3.0이 나오고 나서 혼란스러웠던 이유는 두 가지이다.

첫 번째로 Flash에서 핵심이라고 할 수 있는 Display 객체생성을 정의하는 구조가 바뀐 점이고, 두 번째로는 사용자의 반응에 따라 이벤트를 발생 시켜 주는 이벤트 모델이 바뀐 점이다.

또한 AS2.0은 직관적인 문법이지만, AS3.0에서는 간단한 마우스 이벤트를 만들려고 할 때도 코드의 길이가 길어져 버려, AS2.0 사용자들에게 'Flash가 애니메이션 툴의 기능은 사라져 버리고 개발자를 위한 툴로 바뀌었다.' 는 원성을 듣기도 하였다.

하지만, AS3.0에서 코드를 길게 작성해야 이벤트를 만들 수 있다는 말은 AS3.0을 겉으로만 접한 사람들의 오해다. 오히려 AS3.0 은 이벤트 구조를 잘 설계하여 코드를 줄일 수 있고, 덩달아 SWF가 시스템에서 차지하는 메모리의 용량도 줄일 수 있는 장점을 안겨 주었다.

이번 장에서는 AS3.0 AS2.0에 비해 어떤 점이 달라졌고, AS3.0과 하위 언어와의 호환성에 대해 이야기해 보겠다.

 

-Display 객체들의 다양화

Flash 8까지의 AS1.0 2.0에서는 거의 대부분의 객체들은 MovieClip을 통해서 생성됐다.

여러 유형의 객체들이 MovieClip 객체 하나에 모두 포함됐기 때문에 불필요한 메모리와 시스템 리소스를 차지하는 원인이 되었다.

예를 들어 타임 라인이 필요 하지 않는 원을 만들거나, Flash에서 image를 불러와서 사용할 때도 MovieClip을 통해 객체를 만들었기 때문에, 만들어진 객체에는 항상 타임라인이 존재하였다. 이 타임라인이 불필요한 메모리를 차지했던 것이고, MovieClip에 있는 타임라인을 관리하기 위해 사용되었던 시스템 리소스가 증가하게 됐다. 하지만 AS3.0에서는 AS2.0에서 대부분 MovieClip으로 만들어졌던 Display List 객체들을 상황에 맞는 객체들로 만들 수 있도록 객체의 유형이 다양해졌다.

 

대표적인 유형은 MovieClip, Sprite, 그리고 Shape이다. Sprite MovieClip에서 Timeline을 제거한 객체이다. 타임라인을 제거하였기 때문에 MovieClip에 비해 메모리 및 리소스 사용을 줄일 수 있고, Timeline 외에는 MovieClip과 같은 속성 및 메소드를 가지고 있기 때문에 거의 비슷한 용도로 사용할 수 있다.

Shape Sprite와 비슷한 부분이 많다.(Graphics에 포함되어 있는 드로잉API를 이용할 수 있다.)

하지만, 자식 객체를 가질 수 없고 마우스 클릭 이벤트를 지원하지 않는 차이를 가지고 있다. Shape Sprite에 비해 오버헤드가 적고 Sprite가 지원하는 속성에 대한 메모리를 사용하지 않아도 되기 때문에 속도가 향상되고 메모리를 적게 사용한다.

그래서 마우스 이벤트가 필요없는 그래픽 객체를 만들고 싶을 때는 Shape를 사용하는 게 좋다.

각각의 객체를 하나씩 비교 한다면, 많은 차이가 없다. 하지만 객체의 수가 많아진다면, 덩달아 컴퓨터에 부담을 많이 주게 된다. 예를 들어 MovieClip Sprite가 컴퓨터 리소스를 차지하고 있는 양의 차이가 10이라고 하면, 이러한 객체들을 100개를 쓸 일이 생기게 되면 컴퓨터가 감당해야 할 리소스 부담은 MovieClip을 사용했을 때 Sprite보다 1000이 더 나게 된다.

덩치가 큰 프로그램에서 이러한 차이는 곧바로 퍼포먼스의 차이로 이어 지기 때문에, Timeline이 필요 하지 않은 객체는 Sprite로 정의 하는 습관을 가지고 있어야 한다.

 

- Display List구조의 변화

앞 절에서 자식 객체를 포함할 수 있는 객체는 Sprite이고, 포함할 수 없는 객체는 Shape라고 설명했다.

Sprite DisplayObjectContainer(표시객체컨테이너)이기 때문에 자식 객체를 가질 수 있고, Shape DisplayObject(표시객체)이기 때문에 자식 객체를 소유할 수 없다.

 

AS3.0에서 달라진 Display List의 구조는 DisplayObject를 기본으로 하여 구성된다.

SWF에서 사용자에게 보이게 되는 모든 객체들은 모두 DisplayObject 또는 DisplayObjectContainer의 상속을 받아서 만들어진 것이다. Display List의 구조는 아래와 같다.

그림 1 AS3.0 Display List 구조도

 그림에서 볼 수 있듯이 MovieClip, Sprite, Shape 모두 DisplayObject의 상속을 받아서 만들어진다. 하지만, MovieClip Sprite DisplayObjectContainer의 속성을 한 번 더 상속 받기 때문에 자식 객체를 포함하는 속성을 가지고 있다.

자식 객체를 소유할 수 있다는 의미는 바구니가 되어 이것, 저것을 담을 수 있다는 의미이다.

DisplayObjectContainer의 상속을 받은 객체 만이 addChild(담기) removeChild(꺼내기) 메소드를 사용할 수 있다. AS2.0에서는 아래 그림과 같은 구조로 객체들을 정의 하고 있다.


그림 2 AS2.0의 객체 구조도

 객체들을 AS3.0과 같이 상속에 의해 구현한 것이 아니라, Object를 통해 직접적으로 구현하고 있다. 그만큼 직관적으로 구조를 이해 할 수 있다는 장점이 있지만, 객체의 속성을 중복 구현하여, 효율이 떨어진다는 단점이 있다.

새로운 Display List Flash의 가장 핵심이라고 할 수 있다.

Flash에서 사용되는 모든 기능들은 Display List를 통해 구현이 되고 사용되기 때문이다. 그 만큼 중요한 부분을 차지하고 있기 때문에 비교적 이해하기 어려운 내용을 담고 있다.

 

- 객체의 심도 관리 향상(Depth에서 index)

 

Flash Display List에는 심도가 존재한다.

Layer와 별개로 같은 레이어 상에 존재하는 객체들도 위, 아래가 존재하여 위에 있으면 보이고 아래 있으면 위에 있는 객체에 가려서 안보인다. AS1.0 2.0에서는 다음과 같은 메소드를 사용하여 객체의 위, 아래를 조절 하였다.

 

AS2.0에서 객체 심도를 관리하기 위한 메소드

-getDepth() : Number

-getNextHighestDepth() : Number

-getInstanceAtDepth(depth: Number) : MovieClip

-swapDepths(target: Object) : Void


AS3.0
에서는 Display List 구조가 바뀜에 따라, 위와 같은 메소드는 모두 아래와 같이 바뀌었다.


AS3.0에서 객체 심도를 관리 하기 위한 메소드

getDepth() -> getChildIndex()

getNextHighestDepth() -> 직접적으로 대칭 되는 메소드는 없다. 하지만 구현 가능하다.

getInstanceAtDepth() -> getChildAt();

swapDepths() -> addChildAt(), setChildIndex(),swapChildren(), swapChildredAt() 


 

메소드 변경에 대한 더 자세한 내용은 Adobe에서 제공하는 AS2.0마이그레이션을 보면 자세히 기술 되어있다.

AS2.0에서 getNextHighestDepth()를 이용하여, 가장 높은 Depth를 할당하여 다른 객체들 보다 위에 위치하게 함으로서 사용자들에게 보이게 한다거나, swapDepths를 이용하여 이미 존재하고 있는 객체들의 Depth를 바꿔서 객체들끼리 가려지는 정도를 조절하였다.

AS2.0에서 적용되어 있던 심도 관리 개념은 Depth(깊이) 였지만 AS3.0에서는 메소드 이름 뿐만 아니라, 객체의 심도를 관리하는 개념 자체가 바뀌었다.

 

AS2.0에서는 Depth(깊이)개념을 사용하였다.

깊이란 순서가 없이 사용자가 지정한 깊이에 객체를 올려놓을 수 있음을 뜻한다. 사용자가 지정하는 깊이는 음수든 양수든 상관없고, 지정한 값들 사이에 빈 공간이 존재해도 상관없다. 아래 그림이 Depth의 특징에 대해 말해 주고 있다.


 

1) -1 depth부터 2 depth까지 객체들이 놓여 있다.

2) 100 depth에 객체를 추가한다. 100 depth는 추가되어, 존재하지만, 3~99depth까지의 공간은 빈 공간으로 남아 있다.

3) removeMovieClip()을 통해 1 depth에 있는 객체를 제거하면 1 depth는 빈 공간으로 존재하게 된다.

4) 2 depth에 객체가 있음에도 불구하고, 2 depth에 새로운 객체를 올려놓게 되면 기존에 있던 객체는 사라지게 된다.

 이렇게 AS2.0에서는 Depth로 절대적인 위치를 결정 하였다. 하지만 AS3.0에서는 Index라는 개념을 사용하여, 객체의 위치를 상대적으로 결정하도록 바뀌었다.

Index는 순서라는 의미이다.

Display List에 보여지는 객체들은 모두 순서가 부여 되고, 순서가 높을수록(숫자 크기가 클수록) 위에 위치하게 됩니다. 순서는 양수 값만이 가능하고, 0부터 차례대로 부여하게 된다. Depth처럼 2depth 다음에 100depth가 올 수가 없고, 빈 공간이 존재하지 않는다. 아래 그림이 Index의 특징에 대해 말해 주고 있다 



1) 0 index부터 3 index까지 객체들이 놓여 있다.

2) 100 index에 객체 추가를 시도하였지만, 에러가 발생한다.

3) 1 index에 객체를 추가하니, 기존의 index들이 한 칸씩 위로 올라가며 재정렬된다.

4) 3 index에 있는 객체를 삭제하니, 4 index에 있던 객체가 3 index로 내려오며 재정렬된다.

이렇게 AS3.0에서는 index를 이용해 상대적으로 위치를 정하는 방식으로 변경하였다.


 

-Depth방식에 비해 Index방식이 효율적인 점

Index방식은 객체에 순서를 부여해서, 부모 객체에서 자식 객체를 탐색할 때, 매우 빠르게 조회할 수 있게 해 준다. Index들은 단일 배열로 만들어져 getChildIndex() getChildAt()으로 탐색하는 것을 도와준다. 예를 들어 다음과 같은 코드를 사용하면, 파라미터로 넘어온 객체의 자식객체에 대해 빠르고, 쉽게 알 수 있다.



 그에 비해 Depth방식은 깊이의 위, 아래는 있어도, 그 위, 아래 정보가 단일 배열로 정리가 되어 있지 않기 때문에 탐색에 오랜 시간을 소요된다.
예를 들어, 1쪽부터 200쪽 분량의 책이 있다고 가정해보자. 그런데 갑자기 계획이 변경되어 100쪽 부근에 50쪽 정도의 새로운 챕터를 넣어야 한다.

Index 방법에서는 우리가 현실 생활에서 대처하는 방법대로, 새로운 챕터는 101쪽부터 번호가 매겨지고, 뒤에 있던 내용들은 50쪽이 끝나면 이어져서 250쪽 짜리 책이 완성된다.

하지만 Depth 방식으로 하면 문제가 발생한다. 기존의 200쪽 분량의 책에 50쪽 분량의 새로운 챕터를 넣으려면 기존의 100쪽부터 150쪽까지가 새로운 내용으로 덮어 씌어지게 된다. 이런 상황을 막기 위해 미리 swapDepths()를 통해 100쪽부터 200쪽까지를 150쪽부터 250쪽까지로 옮기고 빈 공간에 새로운 챕터를 넣으면 되지만, 시간과 리소스 낭비가 많아지게 된다. 더구나, 여기에서는 50쪽만 추가하는 것이었지만, 50쪽이 100쪽이 될 수도 있고, 1000쪽이 될 수도 있다. 이와 같이 Index방식은 Depth방식에 비해 사용하기 편하고, 휠씬 효율이 높은 심도 관리 방법이라고 말할 수 있다.

 

- 이벤트 모델의 변화

Flash에서 중요한 부분을 차지하고 있는 이벤트 모델 역시 바뀌었다. 이전 버전의 AS에서는 이벤트를 처리하는 방법이 여러 가지가 있었다


AS2.0에서의 이벤트 핸들링 방법

- on() 이벤트 핸들러와 onClipEvent()핸들러 : 객체 안에 코드를 입력하여 해당 객체에 대한 이벤트를 발생시키는 방법이다. 쉽게 사용할 수 있지만, 객체 안에 있는 코드를 찾기가 어려워서 프로젝트 협업 작업에 어려움이 발생한다.

- 콜백 함수 이벤트 핸들러 : 객체. onRelease XML.onload와 같이 객체에 직접 콜백 함수를 등록함으로써 발생시키는 방법이다. 지정된 이벤트에 대해 콜백 함수 하나만 사용할 수 있다. 예를 들어 AS2.0에서 아래와 같은 코드를 실행하면 두 번째 콜백 함수만이 동작 하게 된다.



- 이벤트 리스너 : addListener() addEventListener()를 이용하여 발생시키는 방법으로 리스너 객체와 함수를 만든 후에 리스너를 등록해야 하므로 번거롭지만, 콜백 함수와는 달리 해당 이벤트에 여러 개의 리스너를 만들어서 모두 사용할 수 있다.




여러 개의 이벤트 처리 방식이 상황에 따라 사용되었지만, AS3.0에서는 하나로 통일되었다. 하나로 통일된 새 이벤트 모델은 DOM Level3 이벤트를 기초로 하고 있다.

DOM Level3 이벤트는 기존의 이벤트 모델보다 더 빠르게 이벤트를 발생시킨 객체를 찾아낼 수 있고, 그에 따른 이벤트를 호출해준다. 또한 이전 버전의 이벤트 모델은 이벤트 흐름을 가지고 있지 않았다. 무조건 이벤트를 발생시킨 객체만이 콜백 함수나 이벤트 리스너를 호출 할 수 있었지만, AS3.0에서는 이벤트 흐름에 연관된 객체들은 모두 이벤트 리스너를 호출할 수 있다. 예를 들어 그림 3과 같이 A, B 객체가 있고 B 객체에 마우스 이벤트를 등록했다면, A B 두 객체 모두 이벤트 흐름 안에 있기 때문에 이벤트 리스너를 호출할 수 있다.








AS3.0을 시작하는 분들이 시작부터 어렵다고 느끼는 이유 중 하나가 바로 이벤트 모델 때문이다.

AS2.0에서는 그림4 코드와 같이 단 3줄에 끝나는 것이 AS3.0에서는 이벤트 리스너를 추가하고, 이벤트 핸들러를 만들고, 이벤트 핸들러에 해당 이벤트(MouseEvent)에 대한 파라미터를 넘기는 작업을 해야 하기 때문에 비교적 복잡하게 보이기 때문이다. 하지만 사용해 보면 휠씬 효율적이라는 것을 느낄 수 있다.

AS3.0의 이벤트모델만이 가지고 있는 이벤트 흐름을 이용하여 복잡한 이벤트 발생 구조도 단순화 시킬 수 있으며, 이벤트 리스너의 등록과 제거 과정을 통해, 효율적인 메모리 관리와 객체지향 코드를 구현할 수 있다.

 

글을 마치면서

1부와 2부에 걸쳐서 AS3.0을 왜 사용해야 되고, 어떻게 사용해야 하는가에 대해 다루었다. 많은 사람들이 Flash platform을 도입하면서 Flash 시장도 많이 넓어 지고 있지만, 한간에서는 아직도 “Flash는 배너를 만드는데 사용하는 애니메이션 툴이다.” “Flash를 사용하면 느려진다.” 라고 생각하는 사람들이 있다.

하지만, 이러한 걱정들은 구시대의 산물이 되어 가고 있고, Flash platform이 단지 표현(User Interface)을 위한 수단만이 아니라, 표현과 퍼포먼스를 모두 만족시킬 수 있는 도구로서 나아 가고 있다.

AS3.0은 좀 더 사용자를 만족 시키기 위해 반드시 이용해야 하는 언어이다.


관련 문서: 왜 Actionscript3.0을 사용해야만 하는가?



Posted by Flash 동강
Actionscript3.02009.01.20 23:49

 커뮤니티의 질문들 중에서 단연 1위를 달리고 있는 "Actionscript 학습법" 에 대해, 오직 제 견해와 경험을 통해 작성해 보려고 합니다.

- Flash MX , Flash 8, Flash CS3, Flash CS4 먼놈의 버젼이 이렇게 많은 건지 많이 혼동 됩니다.
 
시중에 나와 있는 책들을 보면 벌써 CS4가 출시 되었음에도 불구 하고, MX 버젼과 그 이하 버젼의 책들을 종종 보게 됩니다. 당연히 Flash를 처음 시작 해야 겠다고, 다짐하고 서점에 간 분들은 혼동 될 수 밖에 없지요. 보통 액션 스크립트 책은 Flash 라는 제목을 작게 표기 하고 Actionscript를 크게 표기 하기 때문에(?) Flash 8 이라 크게 적혀 있는 책을 고르게 됩니다. 그리고 카페에 와서 물어 봅니다. " Flash 8 책 샀는데, 이걸로 공부 시작 해도 될까요? " 많은 분들이 처음 시작 할때 혼동이 많았을 거라 생각 됩니다. 

 
Flash MX : AS1.0 과 AS2.0 지원
Flash 8 : AS1.0 과 AS2.0 지원 , AS2.0의 스펙이 향상 되었습니다.

Flash CS3 : AS3.0 지원, AS1.0 및 2.0 으로 작업 할 수 있으나, AS3.0 과는 같이 사용할 수 없다.
Flash CS4 : AS3.0 지원, AS3.0의 스펙이 향상 되었습니다.
 

버젼 별로 제공 하고 있는 언어 스펙은 위와 같습니다. 책을 고를 떄는 CS3 이나 CS4 라고 써 있는 것이나, Actionscript3.0 이라고 써 있는 책을 골라야 합니다. 중요한 점은 AS2.0 과 AS3.0 은 완전 다른 문법을 가지고 있는 언어 라는 점 입니다. (비슷한 부분이 많이 존재 하지만 ) AS2.0 에서 업그레이드 한 언어라고 보기엔 Java 와 더 닮아 있는 언어 입니다. 

-무슨 버젼으로 공부를 시작 해야 되나요?
 
 현재 Flash 최신 버젼은 Flash CS4 입니다. 스크립트는 AS1.0, 2.0, 3.0 모두 지원 합니다. Flash는 배우고 싶은데, 어떤 툴 버젼으로 어떤 언어 버젼을 공부 해야 해야 할까요. 

 회사에서 흥쾌히 Flash CS4를 제공해 준다면 Flash CS4로 시작 하는 것이 좋습니다. 언어야 뭐든 다 지원을 하고 있고, 무엇보다 Flash player10 을 지원 하므로 해서 Flash CS4에서만 구현 할 수 있는 다양한 스펙들을 비교적 손 쉽게 사용이 가능 합니다. 여건이 안된다면 Flash CS3를 사용해도 무관 합니다. Flash CS4에 대한 문서 라든지 책이 부족하고, 거의 대부분이 Flash CS3 의 Actionscript3.0 스펙을 기본으로 하고 있기 때문에 Flash CS3후에 추가로 Flash CS4에서 제공 하는 기능을 배우면 됩니다. 
 
 어떤 버젼으로 시작 해야 할까요. 많은 입문자들이 가장 혼동을 일으키고 있는 부분 입니다. Actionscript면 똑같은 Actionscript라고 생각하고 아무 책이나 덜컥 샀다가는 후회 합니다. 
Actionscript는 현재 3.0 버젼 까지 나와 있습니다. AS1.0 , 2.0, 3.0 모두 기본적인 프로그래밍 문법을 따르고 있지만, AS1.0 . 2.0 과 AS3.0 은 큰 차이가 있습니다. AS1.0 과 AS2.0 은 하나의 fla 에서 두 버젼을 동시에 사용가능 합니다. 하지만 AS3.0은 오직 AS3.0 단일로만 사용 가능 합니다. 그 이유는 Actionscript Virtual machine 이라 불리는 엔진이 다르기 때문입니다. AS1.0, 2.0 은 AVM1 을 사용하고 AS3.0 은 AVM2 를 사용 합니다. 

 어떤 언어가 좋다고는 견해 차이가 많지만, 분명한 것은 AS3.0 이 AS1.0,2.0 으로 구현한 것에 비해 훨씬 빠르다는 것 입니다. Actionscript3.0 설명서에서는 순수하게 Actionscript만 실행 시켰을때 AS3.0이 이전 버젼보다 최대 10배 빠른 연산 속도를 가진다고 합니다. 또한 AS3.0 은 Flash CS3 와 CS4 에서만 쓰이는 언어가 아닙니다. 현재 Flex 3, AIR 등에서도 같은 언어 스펙을 가지고 사용 되고 있으며 앞으로 나올 모든 Flash playform에서 쓰이는 언어들은 모두 AS3.0을 기반으로 하여 만들어 질 것 입니다. 하지만, 비교적 스크립트를 공부 하는 초기에 어렵게 느껴지는 부분이 존재 합니다. 하지만 그걸 극복 하면 쉽고, 더 많은 것을 구현하고 만들 수 있는 언어가 AS3.0 입니다.


- Actionscript 를 공부 하려고 하는데 무엇 부터 해야 하나요?
 
많은 분들이 AS3.0, 을 공부 하면서 고생을 많이 하셨을 꺼라 생각 됩니다. 저 또한 AS2.0 을 하다가 AS3.0이 나오고 왕성한 배움에 욕구로 무작정 달려들었지만 완전 "GG" 를 친 적이 하루 이틀이 아니었습니다. 그럼 무엇 부터 해야 하나, 저는 이렇게 하였습니다. 

 
1. Flash CS3 나 CS4 관련 무작정 따라 하기 책을 보고, Flash 툴을 무작정 따라해 보세요. Actionscript를 배우고 싶다고 해서 Flash 와 Actionscript를 따로 쓰는건 아닙니다. 어쩔 때는 툴로 해결 해야 하는 부분도 있고 스크립트로 해결 해야 하는 부분도 있기 때문에 툴에 대한 이해는 필수 입니다. 감이 않오는 분은 2권 3권 계속 따라해 보세요. 
 

2. 툴에 대한 충분히 되었다고 생각 되면 인터넷을 활용하여 AS3.0 에 대한 공부를 시작해 보세요. 인터넷에는 좋은 분들이 아주 쉽게(?) AS3.0 에 대한 강의를 진행 하고 있습니다. 
3. 위의 3 강좌들의 모두 보았고, 이해 했을 정도라면 AS의 기초는 되는 수준이 되었을 것 입니다. 이때 책을 구입 하세요. 책은 언노운님이 친절하게 리뷰를 해 놓으셨으니 참고 하세요. 
Actionscript 책 추천

동강의 AS3.0 기초 강좌
- 쎈님의 Actionscript 강좌 모음 
- 윤훈남님의 AS 동영상 강좌

 

 전 Essential Actionscript3.0 과 Actionscript3.0 Cookbook , 그리고 새롭게 시작하는 플래시 CS3 Actionscript3.0을 추천 합니다. 앞의 두 책은 Flash 를 하는 동안 계속 봐야 할 정도로 방대한 내용을 다루고 있습니다. 그리고 새롭게 시작하는 플래시 CS3 Actionscript3.0 로 그동안 인터넷 강좌로 봤던 개념을 리뷰 하세요. 전체적인 틀을 잡기 딱 좋은 책 입니다. 책은 보는 동안 모르는 부분이 생길 수 밖에 없습니다. 그럴때 마다 Flash 단축키 F1 을 눌러 설명서를 틈틈히 확인 하세요. F1은 없는게 없을 정도로 Actionscript에 대한 모든것을 설명 하고 있습니다. 그리고 검색을 생활화 하세요.

 

4. 책까지 봤겠다. 이제 무서울게 없는 이론을 갖췄다고, 착각의 늪에 빠져 있을 것 입니다. 하지만 지금 부터가 시작 입니다. 지금 까지의 강좌나 책은 혼자서 공부 할 수 있는 체력을 갖게 해 준 것 입니다. 이제 자신만의 프로젝트를 계획해 보세요. 그리고 시작 하세요. 그리고 삽질 하세요. 시행 착오를 겪고, 혼자 힘으로 생각해서 만들고, 시행 착오를 하면 할 수록 실력은 급격히 상승 하는 것을 느낄 수 있을 것 입니다. 그리고 항상 F1 을 살펴보는 습관을 가지세요.

 

Actionscript3.0 은 어렵다고들 많은 분들이 말 합니다. 하지만 어려운 만큼 재미 있습니다. 제가 AS3.0 을 공부 했던 방법이 정답은 아니지만, 새롭게 Flash를 시작하시는 분들이 더욱 많아 졌으면 하는 바람 입니다.

 
 

posted by 동강


  

Posted by Flash 동강
Review2008.12.11 15:18
Flash 를 처음 시작하시거나, AS3.0 을 처음 시작 하면서 가장 난감한것은 무엇으로 어떻게 시작 해야 되지일 것 입니다. 그중 카페에 가장 질문이 많이 들어 오는 것도 책 추천해 달라는 질문이지요. 그래서 제가 본것과 좋다고 들은 것을 토대로 정리를 해 보았습니다. 이름하여  

동강의 믿거나 말거나 책 추천 :)

: Actionscript 3.0 에 대한국내서가 몇권 없기 때문에 as 버젼에 상관 없이 나열 하였습니다. 그리고 Flash 가 아닌  Actionscript 를 기준으로한 추천 입니다. :) 

     
Flash ActionScript 원리

임종기

영진.COM 2005.04.20


.

/중급

임종기 (아담) 님이 쓰신 Actionscript1.0 2.0 개념서 입니다. 액션을 처음 시작하신 다면 무지막지한 두께 때문에 놀라실 꺼라 생각 됩니다. 하지만 AS2.0  대한기본적인 프로그래밍 방법에서 시작해서 이벤트 흐름, 그리고 실제로 바로 사용해도 될 만한 예제 들로짜여 있습니다. 예제들을 하나하나 따라 하시면서 Actionscript가 이런 것이구나, 아는 것은 물론이고, 책을 독파 하고 나면 책을 찾아 가면서 어느 정도 알 것같다는 느낌을 받으실 것이라 생각됩니다. 액션 공부를 이책으로 시작한 기억이 나네요.

  


플래시 내비게이션 패턴 18

윤용호

길벗 2004.10.07

.

/중급

윤용호 님이 쓰신 플래시 내비게이션 패턴 18 위의 임종기 님이 쓰신 책이개념서 였다면 이 책은 활용서 라고 말하고싶습니다. 4년 전에 나온 책임에도 불구하고 꾸준히 사람들이 찾고 있는건 18 가지패턴에서 볼 수 있습니다.AS3.0 을 공부 하고 계신다면 이 책에서 구현하고 있는 것들을 3.0 으로 바꿔서 구현해 보는 것도 매우 도움이될거라생각 합니다.



.

/중급

패턴 18 이 네비게이션에 대해 다루었다면 땡굴이 형님의 책은 실무에서 사용되고 있는 22 가지에 대해다루고있습니다. 서비스는 되는 것들은 많이 보았는데, 어떻게 구현한거지 라고 궁금해 했던 것들을 이책을 보시면 어느 정도 해소 하실거라 생각합니다. 특히 땡굴이 님의 특유의 설명으로 알기 쉽게 쓰여있습니다.

 


신명용의 플래시 MX 액션스크립트

신명용

제우미디어 2002.10.30

플래시 MX 액션스크립트

신명용

제우미디어 2004.08.13

초/중급

말이 필요 없는 Actionscript 베스트 셀러 입니다. 1권에서는 기본적으로 따라 하는 액션들과, 물리, 수학, 3D 에 대한 내용을 다루고 있고 2권에서는 Data Access 부분에 대해서 다루고 있습니다.


콜린 무크의 Flash ActionScript 2.0

콜린 무크 | 양주일 옮김

한빛미디어 2005.04.11

Essential ActionScript 3.0

Colin Moock

O&apos;REILLY 2007.06.01

.

중급

지금까지소개 해드린 책들이, 프로젝트 위주의 2.0 무작정 따라하면서 알아 가는 책이었다면

콜린무크의 Actionscript Flash as 에서 제공하고 있는 Class 들과 API 그리고 Class 기반 작업에 대해다루고 있습니다. 프로그램을 안해보신 입문자라면 어렵게 느껴질 수도 있습니다. 하지만 Actionscript 를 하시는 분들이라면 한번쯤은 읽어 보셨을 만한 책입니다. 3.0 에 대한 번역서는 아직출간되지 않았으니 늣풀님이 블로그에서 번역 하고 있는 문서를 봐도 도움이 될거라 생각 됩니다



 

.

중급

유명한 Cookbook Actionscript3.0 버젼 입니다. 어떤 주제에 대해 찾아 보기 편하게 Chapter 를 구성하고 있습니다.찾아 보기 편한 책 이긴 하지만, 한번씩 쭉읽어 보면서 따라 해 보면은 따라한 내용들이 모두 프로젝트를 하는데 도움이되는 Tip 과 지식이라는 것을 느낄 수 있을 것 입니다. 


 

.

/중급

Actionscript3.0이 나오고영문 문서에 허덕이고 있을때 가뭄에 단비와 같이 비를 뿌려준 책 입니다Actionscript3.0을 좀더 프로그래밍방법론 쪽으로 소개 하고 있습니다. F1의 압축 판이라고 비유하고 싶습니다. 많은 것을 다루고 있고, 접근 방법을 제시하고 있습니다 


 

예제로 배우는 Adobe 플렉스

옥상훈

에이콘출판 2008.04.21

.

/중급/고급

요즘 한창 보고 있는 플렉스 책 입니다. 원래 Java 를 하시던 분이라 책에서 Java 의 향기를 느껴 집니다기초 부터 플렉스와 AIR 에 대해 다루고 있고, 특히Data 연동에 대한 부분이라든지, 프레임 윅 사용하는 방법등 실제로 Flex 프로젝트에 적용할 수 있는 주제들을 다루고 있습니다

 

.

//고급

우선 책의 두께가 굉장 합니다. Flex mxml Actionscript 를 보다 근본적인 프로그래밍 방법론 적으로 책을 구성하고있습니다. 레퍼런스에서도 찾기 힘든 부분이나 어려웠던 부분을 다루고 있고actionscript 에서의 OOP 분야에 대해서도 다루고 있으니 옆에 두고 천천히 보시라추천하고 싶은 책 입니다.  


Adobe FLEX 3 실전 트레이닝 북

제프 태퍼,마이클 라브리올라,매튜 볼스 | 신호승,정선우,이원영 옮김

위키북스 2008.07.31

아직 접해 보지는 않았지만 Flex2 버젼의 책의 명성 답게 기대가 되는 책 입니다.


 

 

그밖에 영문으로된 책 이지만 영어에 자신 있는 분들은 아래의 책들도 보시면 좋을 것 같습니다.

ActionScript3.0 Design Patterns: Object Oriented Programming Techniques

Bill Sanders,Chandima Cumaranatunge

O_REILLY 2007.07.01

LearningActionscript 3.0 Design

Shupe, Rich/ Rosser, Zevan

Oreilly & Associates Inc 2007.04.01

Head FirstObject-Oriented Analysis & Design

브렛 맥래프린, 게리 폴리스, 데이빗 웨스트 | 신광연, 박종걸 옮김

.            한빛미디어 2007.05.31 

 

 

위에서 나열한 책들 중에 지금 보고 있는 책들도 있고, 몇번씩 볼 만큼 좋은 책들이지만

 

책은 그냥 책 일 뿐입니다 

단지 F1 을 눌러 가면서 google 에서찾아 가면서 삽질 하고, 남이 만들어 논거 디컴파일 해 보고 내가 기획하고 생각해서 만들어 봐야 실력은늘어 가는 것 같습니다. 따라 하고 고쳐 쓰는 정도의 반쪽 짜리 실력에 머무르느냐와 흔히 말하시는 고수가 되는 것은 "어떻게 노력 했는가?" 의 차이가 아닐까 생각해 봅니다

'Review' 카테고리의 다른 글

RIA CAMP  (0) 2008.12.11
Flash , Flex , Actionscript 관련 책 추천목록  (0) 2008.12.11
Daum devday 4th  (0) 2008.12.11
당신은 웹2.0 개발자 입니까?  (0) 2008.12.11
Posted by Flash 동강