<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7630007125298363569</id><updated>2012-02-17T12:33:58.298+09:00</updated><category term='flash'/><category term='point'/><category term='야훔의 저렴한 ActionScript'/><category term='렌더러'/><category term='데이터그리드'/><category term='데이터그리드 아이템렌더러'/><category term='restart'/><category term='fileupload'/><category term='Introduce'/><category term='DataGrid'/><category term='itemRenderer'/><category term='file download'/><category term='Essential'/><category term='actionscript event'/><category term='DisplayObject'/><category term='FlashPlayer parameter'/><category term='저렵한 AIR 개발'/><category term='save()'/><category term='EditPlus'/><category term='interface'/><category term='C++'/><category term='인터페이스'/><category term='코드적 차이점'/><category term='cancelable'/><category term='stopPropagtion'/><category term='SoundChannel'/><category term='sound'/><category term='됨'/><category term='Camera'/><category term='개발이야기'/><category term='야훔'/><category term='Flex'/><category term='oauth'/><category term='저렴한'/><category term='image'/><category term='actionscript'/><category term='DataGridItemRenderer'/><category term='사용자정의 이벤트'/><category term='metatag'/><category term='이벤트 만들기'/><category term='interpolate'/><category term='embed'/><category term='FIleReference.download()'/><category term='stopImmediatePropeagation'/><category term='콜린 무크'/><category term='checkbox'/><category term='custom event'/><category term='Point.polar'/><category term='java'/><category term='이벤트'/><category term='php'/><category term='AIR'/><category term='Flash evnet'/><category term='currentTarget'/><category term='달리면'/><category term='네이버 개발자 센터'/><category term='체크박스 렌더러'/><category term='체크박스'/><category term='그냥'/><category term='target'/><category term='save'/><category term='FLEX BUILDER'/><category term='etc'/><category term='용어비교'/><category term='flashplayer'/><category term='인터페이스 클래스'/><category term='bubbles'/><category term='Flex SDK 3.5'/><category term='filereference'/><category term='ActionScript 3.0'/><category term='EditPlus로 개발하기'/><category term='액션스크립트'/><category term='twitter'/><category term='Point 클래스'/><category term='Class 만들기'/><category term='3.0'/><category term='preventDefault'/><category term='AIR 개발환경 만들기'/><category term='아이템렌더러'/><category term='flashvars'/><category term='Interface Class'/><category term='Flex SDK'/><category term='command line'/><category term='Event'/><category term='svn'/><category term='addEventListener'/><title type='text'>야훔의 ActionScript</title><subtitle type='html'>UI/UX를 찾아나선 야훔의 이야기</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1853464970590344211</id><published>2011-01-07T17:31:00.000+09:00</published><updated>2011-01-11T21:59:20.477+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='oauth'/><title type='text'>Twitter! OAuth를 이용한 어플리케이션 만들기 #1</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;트위터 어플리케이션 만들기 준비작업을 지난 시간에 마무리 했습니다.&lt;/P&gt;&lt;P&gt;이제 PHP 코드를 작성하면 되는데요.&lt;/P&gt;&lt;P&gt;보통 제 블로그 오시는 분들은 대부분 플래시를 하시는 분이고 서버사이드 언어를 잘 모르는 분들이 많을 거라고 생각합니다.&lt;/P&gt;&lt;P&gt;사실 저도 미대를 졸업하고 개발자가 된거라 PHP나 C#이나 JAVA나 이런거 실무나와서 책보고 공부한게 전부라 덜덜덜 하면서 보곤 했는데 막상 다루고 나면 별것 없고 특히나 트위터 연동같은건 너무 많은 사람들이 글을 써 올려주시는 바람에 소스만 읽고 분석할 줄 아는 능력만 있다면 너무 걱정하지 마세요.&lt;/P&gt;&lt;P&gt;(그런 능력이 없으신 분들은 어떻게 하냐고 물으실까봐 하는 말입니다만 그렇다 해도 너무 걱정하지 마세요)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;너무 걱정할 필요가 없는 이유 하나는 지난 시간 다운로드 받았던 코드 있지요? 거기에 다 있습니다.&lt;/P&gt;&lt;P&gt;github.com에서 받아온 소스 있잖아요. 인증하는 샘플소스.&lt;/P&gt;&lt;P&gt;그걸 풀어놨던 곳도 기억하시나요? 일단 그 위치로 가보시죠.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;거기가 보시면 config.php 파일 있습니다. &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XdOaWAn5mL.png" style="width:428px;height:423px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;그 파일을 열어보도록 하지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;&amp;lt;?php&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* @file&lt;br /&gt;&amp;nbsp;* A single location to store configuration.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;define('CONSUMER_KEY', 'xxxxxxxxxxxxxxxxxxxxxx');&lt;br /&gt;define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');&lt;br /&gt;define('OAUTH_CALLBACK', 'http://127.0.0.1/twitterOauth/callback.php');&lt;br /&gt;[/code]&lt;br /&gt;뭐 이런식으로 되어있을겁니다. CONSUMER_KEY가 뭔가요? CONSUMER_SECRET이 뭔가요? OAUTH_CALLBACK은 또 뭐죠? 하실거에요. 물론 잘 알고 계시는 분들도 계시겠지만 모르는 분 위주로 설명할게요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;consumer key라는것은 간단하게 이야기 하면 어플리케이션 키입니다. 어플을 트위터에서 발급해주는 인증키를 기준으로 찾아갈 수 있게 해 놓은거죠. secret은 같은 맥락으로 인증된 키만 갖고는 사용자 정보를 전달하기엔 보안상 문제가 될 수 있으니 secret 키를 둬서 매칭되는지 확인한 후에 접근 가능하도록 해놓습니다. 거기에 하나 더 필요한 것은 callback URL인데요. 어플리케이션을 등록할 당시에 지정한 callBack URL과 리다이렉션 URL이 다르면 인증 절차가 invalid되서 진행할 수 없도록 막아놓고 있습니다.&lt;/P&gt;&lt;P&gt;결국 관리자 외에는 어플리케이션을 컨트롤 할 수 없도록 보안장치를 만들어놓았다는 거죠.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자신의 cunsumer key와 secret키를 보고 싶다면 지난시간에 어플리케이션을 등록하고 나면 &lt;A href="http://dev.twitter.com/apps"&gt;http://dev.twitter.com/apps&lt;/A&gt;&amp;nbsp;에 가보면 자신이 등록한 어플리케이션을 확인할 수 있다고 이야기 했는데요. 여기서 consumer key와 secret을 확인할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XJGyTylEWg.png" style="width:554px;height:725px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;그럼 config.php에 적절하게 입력해줍니다. 그런데 OAUTH_CALLBACK에 뭘 넣어야 할지 모르겠다는 분들 계실텐데요. 아까전에도 말씀 드렸다시피 어플리케이션 등록할 당시에 입력했던 Callback URL을 입력해 줘야합니다. 틀리면 인증절차가 무효되서 User Token을 얻어올 수 없어요.&lt;/P&gt;&lt;P&gt;지난 시간 말씀드렸듯 저는 &lt;A href="http://127.0.0.1/twitterOauth/callback.php"&gt;http://127.0.0.1/twitterOauth/callback.php&lt;/A&gt;&amp;nbsp;이라고 넣어놨습니다.&lt;/P&gt;&lt;P&gt;물론 저 주소를 넣었을때 확인할 수 있는 페이지도 있어야겠지요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;config.php파일을 수정했으면 아파치를 기동하고 &lt;A href="http://127.0.0.1/twitterOauth"&gt;http://127.0.0.1/twitterOauth&lt;/A&gt; 에 접속합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XEBCLbhQOz.png" style="width:640px;height:348px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XEBCLbhQOz.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;그런데 좀 어이없는게 왜 index.php파일이 열리는게 아니라 connect.php 파일이 열리는 건지 당최이해할 수가 없군요.. 라고 말하기 전에 일단 index.php 파일을 열어서 확인해보도록 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;&amp;lt;?php&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* @file&lt;br /&gt;&amp;nbsp;* User has successfully authenticated with Twitter. Access tokens saved to session and DB.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;/* Load required lib files. */&lt;br /&gt;session_start();&lt;br /&gt;&lt;br /&gt;require_once('twitteroauth/twitteroauth.php');&lt;br /&gt;require_once('config.php');&lt;br /&gt;&lt;br /&gt;/* If access tokens are not available redirect to connect page. */&lt;br /&gt;if (empty($_SESSION['access_token']) ||&lt;br /&gt;&amp;nbsp; &amp;nbsp; empty($_SESSION['access_token']['oauth_token']) ||&lt;br /&gt;&amp;nbsp; &amp;nbsp; empty($_SESSION['access_token']['oauth_token_secret']))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; header('Location: ./clearsessions.php');&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;이라고 코드가 짜여져 있을건데요. $_SESSION내에 access_token, access_token 내의 oauth_token, oauth_token_secret 값이 있는지 확인해보고 없으면 clearsessions.php로 이동시킵니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;clearsessions.php는 걸려있는 세션을 지우고 connect.php로 이동시키게 되지요.&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;&amp;lt;?php&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* @file&lt;br /&gt;&amp;nbsp;* Clears PHP sessions and redirects to the connect page.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;/* Load and clear sessions */&lt;br /&gt;session_start();&lt;br /&gt;session_destroy();&lt;br /&gt;&lt;br /&gt;/* Redirect to page with the connect to Twitter option. */&lt;br /&gt;header('Location: ./connect.php');&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이런 이유로 connect.php가 화면에 보여지게 됩니다.&lt;/P&gt;&lt;P&gt;그렇다면 access_token은 어디서 얻을 수 있을까요?&lt;/P&gt;&lt;P&gt;일단 사용자 로그인을 해야합니다. 화면에 있는 "Sign in with Twitter" 버튼을 클릭합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XShvcphcbw.png" style="width:640px;height:432px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XShvcphcbw.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;"Sign in with Twitter" 버튼을 클릭하게 되면 내부적으로 redirect.php 파일에 접근해서 해당 어플리케이션이 접근을 해도 괜찮은 인증된 어플리케이션인지 확인을 하게 됩니다. 인증된 어플리케이션임을 확인하게 되면 Twitter에서는 사용자에게 로그인 창을 띄우고 만약 로그인을 하고 있었다면 해당 어플리케이션과 자신의 계정을 연결할 것인지 묻는 창이 나오게 됩니다.(물론 로그인 창에서 로그인을 하면 자동으로 이 페이지가 나옵니다.)&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XCIDMAjuM9.png" style="width:640px;height:346px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XCIDMAjuM9.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;이때 "Allow"를 선택하게 되면 리다이렉트 주소를 호출하여 접근하는데 그 주소는 이 어플리케이션을 생성할 당시에 &lt;A href="http://127.0.0.1/twitterOauth/callback.php"&gt;http://127.0.0.1/twitterOauth/callback.php&lt;/A&gt;&amp;nbsp;이라고 등록했었지요. 그 페이지로 이동하게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그리고 아래와 같은 화면이 등장하면 이제 글쓰기 준비는 완료 되었습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XbYHCn2tQF.png" style="width:640px;height:590px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XbYHCn2tQF.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘은 여기까지 하고 다음시간에 위와같은 절차로 가져온 사용자 토큰을 갖고 글쓰기를 만들어 보도록 하겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s 제가 보기엔 xml 형식으로 받아오는 것도 좋긴 합니다만 jason 으로 받는게 더 편한거 같더라구요.&lt;/P&gt;&lt;P&gt;xml 방식으로 받아오고 싶기도 한데... 어떤 주소를 호출해야할지 못찾겠어요; 누군가 도와주세요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1853464970590344211?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1853464970590344211/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1853464970590344211&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1853464970590344211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1853464970590344211'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2011/01/twitter-oauth%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-1.html' title='Twitter! OAuth를 이용한 어플리케이션 만들기 #1'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1972345900177965719</id><published>2011-01-04T20:14:00.000+09:00</published><updated>2011-01-11T21:59:19.572+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='oauth'/><title type='text'>Twitter! OAuth를 이용한 어플리케이션 만들기 #0</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;오랜만에 블로그를 하는군요.&lt;/P&gt;&lt;P&gt;요즘에 이것저것 갑자기 일들이 몰려와서 정신없이 바쁘다가&lt;/P&gt;&lt;P&gt;대충 정리가 되어 이렇게 포스팅을 할 수 있게 되었습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;뭐 오늘은 Twitter의 API를 이용해서 간단하게 내 계정의 글을 다른 어플리케이션에서 갖고 오거나&lt;/P&gt;&lt;P&gt;글을 쓰거나 정보를 갖고 오거나 하는 방법에 대해서 쭉 설명해보려고 합니다.&lt;/P&gt;&lt;P&gt;한 3편정도 되려나요.. 쓰다보면 알게되겠지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아, 전에 쓰기로한 Sound 컨트롤은 요 담에 쓸게요.&lt;/P&gt;&lt;P&gt;왠지 계속 손에 안잡혀서;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Twitter에서는 다른 어플리케이션에서 이용하기 쉽게 하기 위해서 API를 제공 하고 있지요.&lt;/P&gt;&lt;P&gt;&lt;A href="http://dev.twitter.com/"&gt;http://dev.twitter.com/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XTbaN9lkxx.png" style="width:640px;height:425px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XTbaN9lkxx.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;게다가 이 곳에선 자신의 어플리케이션을 등록할 수 있기도 하고 Twitter에서 제공하는 API 메서드 명령들도 실행해 볼 수 있도록 서비스 해주고 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XHyk6Py9wi.png" style="width:640px;height:407px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XHyk6Py9wi.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;API Console이라는 기능이죠. 멋진 기능이에요.&lt;/P&gt;&lt;P&gt;그리고 가이드 문서도 제공하고 있습니다. &lt;A href="http://dev.twitter.com/doc"&gt;http://dev.twitter.com/doc&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;뭐.. 서론은 이만 각설하고 일단 이 블로깅의 목적을 정리하고 가지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;Twitter에 내 App 등록하기&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;PHP 코드를 이용해서 Twitter의 내 계정에 접근할 수 있는 토큰값 가져오기&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;토큰값을 이용해서 내 Twitter계정에 글 쓰기&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;이정도로 정리하겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 테스트 환경부터 만들텐데 아파치와 PHP와 MySQL을 설치해보신적 없으신분 계신다면&lt;/P&gt;&lt;P&gt;여기로 가주세요. -&amp;gt; &lt;A href="http://www.apmsetup.com/"&gt;http://www.apmsetup.com/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;근사모 홈페이지 인데 여기가서 APMSetup을 설치하도록 합니다.&lt;/P&gt;&lt;P&gt;APMSetup은 버젼이 지금 현재 7까지 나왔고 APMSetup7에는 Apache 2.2.14, PHP 5.2.12, Zend Optimizer v3.3.3, MySQL 5.1.39, phpMyAdmin 3.2.3가 들어있고( CUBRID , JRE도 들어있어요) 클릭 한방에 서버셋팅까지 다해주니 급하게 테스트 환경만들기엔 안성맞춤.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;APMSetup이든 직접손수 작업했든 일단 다 준비하고 나면 php.ini 파일을 열어서&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"extension=php_curl.dll" 이 부분을 찾아 주석을 풀어주세요.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XSjbr2DtW0.png" style="width:299px;height:193px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;물론 이 php.ini를 수정하였으면 아파치를 재기동시켜야 합니다.&lt;/P&gt;&lt;P&gt;php_curl.dll의 주석을 제거하는 이유는 OAuth 라이브러리에서 사용하기 때문인데요.. 조금 있다가 다운로드할 파일중 "twitteroauth.php"라는 파일이 있습니다. 요녀석이 이번에 하고자하는 핵심파일이죠.&lt;/P&gt;&lt;P&gt;저 안에 보면 이런 코드가 있습니다. 199번째 라인에 보면&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;$ci = curl_init();&lt;br /&gt;&amp;nbsp; &amp;nbsp; /* Curl settings */&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_USERAGENT, $this-&amp;gt;useragent);&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this-&amp;gt;connecttimeout);&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_TIMEOUT, $this-&amp;gt;timeout);&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this-&amp;gt;ssl_verifypeer);&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));&lt;br /&gt;&amp;nbsp; &amp;nbsp; curl_setopt($ci, CURLOPT_HEADER, FALSE);&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;이런 부분이 있습니다. 이 부분때문에 php_curl.dll 의 주석을 풀어주는 거에요.&lt;/P&gt;&lt;P&gt;만약에 이것을 깜빡하고 넘어가셨다면 이런 오류 메시지를 받아보실 수 있을겁니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px dotum, arial, sans-serif; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px" class=Apple-style-span&gt;&lt;EM style="FONT-STYLE: normal; FONT-WEIGHT: bold"&gt;Fatal error&lt;/EM&gt;: Call to undefined function&lt;SPAN class=Apple-converted-space&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM style="FONT-STYLE: normal; FONT-WEIGHT: bold"&gt;curl_init&lt;/EM&gt;()&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;이를 미연에 막고자하는 작업입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그런다음 아래의 링크를 따라가 주세요.&lt;/P&gt;&lt;P&gt;&lt;A href="https://github.com/abraham/twitteroauth"&gt;https://github.com/abraham/twitteroauth&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;여기 보시면 OAuth를 이용한 Twitter 계정받아오기 샘플 소스가 있습니다. 다운로드 버튼을 클릭해서 저장합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XaJQRUXh03.png" style="width:640px;height:191px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XaJQRUXh03.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;압축을 풀고 아파치 컨텍스트 루트... 에.. 그러니까.. "htdocs"라고 써있는 디렉토리에 압축을 풀어주세요.&lt;/P&gt;&lt;P&gt;APMSetup 을 기준으로 말씀드리면 설치디렉토리 가보시면 아래의 이미지처럼 있을 텐데&lt;/P&gt;&lt;P&gt;빨간 테두리되어있는 디렉토리에 압축을 풀어주시면 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XAH44Zyerx.png" style="width:275px;height:310px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;일단 이것으로 준비는 됐고.. Twitter에 어플리케이션 등록을 합시다.&lt;/P&gt;&lt;P&gt;등록을 해야하는 이유는 Consumer Key, ConsumerSecret을 받고 callBack URL을 입력하기 위해서 입니다.&lt;/P&gt;&lt;P&gt;이렇게 해야 사용자 계정에 대응하는 토큰값을 가져와서 제어할 수 있습니다. &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;어플리케이션 등록은 여기서 하면 됩니다. &lt;A href="http://dev.twitter.com/apps/new"&gt;http://dev.twitter.com/apps/new&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XatO0wy0rl.png" style="width:640px;height:421px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XatO0wy0rl.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;위와 같은 창에서 어플리케이션 이름, 설명, 어플리케이션 웹사이트 등등을 입력하는데 &lt;/P&gt;&lt;P&gt;가장 중요한건 Application Type을 Browser로 하고 Callback URL에 적절한 주소를 저장하는데 있습니다.&lt;/P&gt;&lt;P&gt;물론 다른데도 잘 입력해야 등록이 되겠지만 저 두개의 값때문에 삽질을 얼마나 했던지;;;&lt;/P&gt;&lt;P&gt;저의 경우엔 &lt;A href="http://127.0.0.1/twitterOauth/callback.php"&gt;http://127.0.0.1/twitterOauth/callback.php&lt;/A&gt;&amp;nbsp;이라고 넣었습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;모든 필드에 입력을 마치고 Save 버튼을 클릭하시면 Consumer Key, ConsumerSecret 값들과 뭐 다른 URL 주소들이 나오는데 지금 가장 중요한건 저 두개의 Consumer Key, ConsumerSecret 값들입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아, 물론 &lt;A href="http://dev.twitter.com/apps"&gt;http://dev.twitter.com/apps&lt;/A&gt; 에 들어가서 보시면 자신의 등록된 어플리케이션을 확인할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XN2pztxo3j.png" style="width:486px;height:318px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;물론 정보를 수정할 수도 있고 Consumer Key, ConsumerSecret 이 값들도 새로 받을 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘은 여기까지 하고 내일은 php소스 코드를 이용해서 토큰값을 받아오는 것을 구현해 보겠습니다.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1972345900177965719?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1972345900177965719/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1972345900177965719&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1972345900177965719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1972345900177965719'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2011/01/twitter-oauth%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-0.html' title='Twitter! OAuth를 이용한 어플리케이션 만들기 #0'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-3710114175285606472</id><published>2010-11-09T19:24:00.000+09:00</published><updated>2011-01-11T21:59:18.572+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='SoundChannel'/><title type='text'>사운드. 도데체 어찌 사용해야하나요 - #0 프롤로그</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;돌아온 김에 글하나를 써보려고 합니다. ㅎ&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사운드 제어에 관련된 내용을 써보려구요.&lt;/P&gt;&lt;P&gt;사실 사운드 제어는 어떻게 보면 참 간단합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"그냥 로드해서 Play 메서드 호출하면 되잖아!"&lt;/P&gt;&lt;P&gt;라고 하실 수도 있습니다만 제가 하려는건 그런게 아니라 사운드를 어떻게 가져다 쓸 것인지&lt;/P&gt;&lt;P&gt;여러 상황들에 대해 한번 정리하는 시간을 가져보려고 합니다.&lt;/P&gt;&lt;P&gt;어떤 상황들이냐 하면&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. 그냥 mp3파일을 SWF안에 Embed 할지&lt;/P&gt;&lt;P&gt;2. 스트림으로 로드를 할 것인지&lt;/P&gt;&lt;P&gt;3. 아니면 다른 SWF 파일을 Embed해서 그 안에 정의되어 있는 사운드 객체를 가져다 쓸 것인지&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘은 간단히 사운드 객체를 재생하면서 사운드 객체 모형에 대해 고민해 보도록 합시다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사운드를 재생하기 위해서 어찌합니까 라는 질문을 하기전에&lt;/P&gt;&lt;P&gt;ActionScript Language Reference(API라고도 하죠) 를 확인해 보도록 합니다.&lt;/P&gt;&lt;P&gt;&lt;A href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html" target=_blank&gt;여기&lt;/A&gt;를 클릭해 보시면 ActionScript Language Reference에 있는 Sound 클래스 페이지 입니다. &lt;P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html" target="_blank"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XKzSaIjxdp.png" style="width:545px;height:262px;" alt="ActionScript 3.0 Reference for the Adobe Flash Platform" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 Sound객체는 외부에서 사운드를 스트림으로 불러오던지&lt;/P&gt;&lt;P&gt;혹은 Embed된 Sound객체를 재생하거나 할 수 있습니다.&lt;/P&gt;&lt;P&gt;내부에서 어떻게 돌아가는지 정확히 잘 모르겠지만 "소리를 내는 역할을 하는" 객체 임에는&lt;/P&gt;&lt;P&gt;틀림없는 듯 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그런데 Sound 객체를 처음 접하시는 분들은 이런 말씀을 하실 수도 있습니다.&lt;/P&gt;&lt;P&gt;"어라? SoundChannel은 뭐에 쓰는거야?" 라고 하실 수 있습니다.&lt;/P&gt;&lt;P&gt;Example 쪽을 보시면 이런 코드가 있거든요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;private var url:String = "MySound.mp3";&lt;br /&gt;private var song:SoundChannel;&lt;br /&gt;&lt;br /&gt;public function SoundExample()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; var request:URLRequest = new URLRequest(url);&lt;br /&gt;&amp;nbsp; &amp;nbsp; var soundFactory:Sound = new Sound();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; soundFactory.addEventListener(Event.COMPLETE, completeHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; soundFactory.addEventListener(Event.ID3, id3Handler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; soundFactory.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; soundFactory.addEventListener(ProgressEvent.PROGRESS, progressHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; soundFactory.load(request);&lt;br /&gt;&amp;nbsp; &amp;nbsp; song = soundFactory.play();&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"SoundChannel가 뭐길래 Sound.play(); 메서드를 호출할때 SoundChannel을 반환하나요?"&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XbVA9okoPJ.png" style="width:636px;height:38px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;라고 하시는 분도 종종 계시지요.&lt;/P&gt;&lt;P&gt;일단 Sound객체를 알아가기 위해서는 SoundChannel도 알아야하므로 SoundChannel을 어떻게 설명해 놓았는지 API를 읽어보도록 합시다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XSWtnaG8IQ.png" style="width:638px;height:192px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사운드 채널 클래스는 Flash 어플리케이션 내에 있는 사운드 객체를 제어 한다고 하는데 어떤 내용들을 제어 할 수 있냐면 일단 가장 중요한 기능으로 stop() 메서드가 있고 사운드의 볼륨을 모니터링할 수 있는 속성들을 제공합니다. 그리고 SoundTransform 객체를 위한 속성도 제공 하지요. 볼륨을 제어할때 SoundChannel의 SoundTransform 을 이용해 제어합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SoundTransform은 볼륨이나 좌우 Pan 값을 제어하는데 사용되는 클래스 입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;뭔가 상당히 복잡하지 않나요?&lt;/P&gt;&lt;P&gt;그냥 사운드에서 죄다 제어하면 될걸 왜 다 분리해놓고&lt;/P&gt;&lt;P&gt;Sound를 로드한 담에 재생 할 적에 SoundChannel이랑 연결해 놓더니 거기서 stop()이니 position이니 하는 메서드나 속성을 확인하거나 실행하더니 또 볼륨을 제어하려니까 거기서 SoundChannel에 있는 SoundTransform 을 가져다가 볼륨을 제어하고 Pan 값을 제어하게 두다니!&lt;/P&gt;&lt;P&gt;(게다가 재생이 완료되면 거기에 대한 이벤트는 SoundChannel에서 발생합니다. Sound는 뭐하는 애니??)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이거 Sound를 쓰라는거야 말라는거야 하시는 분들 계실 겁니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ActionScript에서 사용되는 Sound관련된 클래스들은 Sound 그 자체와 그것을 제어하는 것을 철저히 분리하여 설계되었습니다.&lt;/P&gt;&lt;P&gt;Sound는 말 그대로 소리에 대한 역할만 수행할뿐 나머지 제어는 다른 클래스로 분업화 하였습니다.&lt;/P&gt;&lt;P&gt;그래서 사용하기가 조금 어려워 지긴 했지만 뭐.. 이해만하면 그리 어렵지는 않아요.&lt;/P&gt;&lt;P&gt;이렇게 분리해 놓으면 그것대로 장점도 있으니까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘은 대충 Sound와 그의 친구인 SoundChannel객체에 대해 맛만 보고 이정도로 정리하고&lt;/P&gt;&lt;P&gt;다음 시간을 기대하세요&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-3710114175285606472?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/3710114175285606472/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=3710114175285606472&amp;isPopup=true' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3710114175285606472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3710114175285606472'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/11/%EC%82%AC%EC%9A%B4%EB%93%9C-%EB%8F%84%EB%8D%B0%EC%B2%B4-%EC%96%B4%EC%B0%8C-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%ED%95%98%EB%82%98%EC%9A%94-0-%ED%94%84%EB%A1%A4%EB%A1%9C%EA%B7%B8.html' title='사운드. 도데체 어찌 사용해야하나요 - #0 프롤로그'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-7406457905396330736</id><published>2010-11-09T19:00:00.000+09:00</published><updated>2011-01-11T21:59:17.828+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='restart'/><title type='text'>2010년 11월 - Came Back</title><content type='html'>&lt;P&gt;아... 안녕하세요.&lt;/P&gt;&lt;P&gt;"야훔의 저렴한 개발" 시리즈를 쓰다가 돌연 잠적하더니 다시 돌아왔습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;여러가지 시리즈로 매일매일 글을 쓰다가 올 4월 말에 2박 3일 예비군 훈련을 마치고&lt;/P&gt;&lt;P&gt;회사로 돌아가니 팀이 해체되어 공중분해 되는 사태가 있었지요.&lt;/P&gt;&lt;P&gt;이유야 여러가지였지만 어쨋든 그 덕에 회사를 나오고 프리랜서로 한 4~5개월정도 보내다가&lt;/P&gt;&lt;P&gt;새로이 자리를 잡고 앉게 되어 다시 글을 쓸 수 있게 되었습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그동안 많은 일들이 있었지만&lt;/P&gt;&lt;P&gt;UI 개발자 같지 않게 "인도네시아"까지 개발 출장도 다녀오고&lt;/P&gt;&lt;P&gt;알바를 받았는데 드롭도 시켜보고&lt;/P&gt;&lt;P&gt;돈 때문에 좌절도 해보고 이것저것 방황 하다가 간신히&lt;/P&gt;&lt;P&gt;새 보금자리에서 새로운 사람들과 호흡을 맞출 수 있게 되었네요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이제 다시 시작합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"야훔의 저렴한 개발"&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-7406457905396330736?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/7406457905396330736/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=7406457905396330736&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7406457905396330736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7406457905396330736'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/11/2010%EB%85%84-11%EC%9B%94-came-back.html' title='2010년 11월 - Came Back'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-8542885537641930733</id><published>2010-04-05T10:56:00.000+09:00</published><updated>2011-01-11T21:59:16.160+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='야훔의 저렴한 ActionScript'/><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='네이버 개발자 센터'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>저렴한 개발 SVN</title><content type='html'>&lt;P&gt;&lt;A href="http://dev.naver.com/projects/cheapas3/" target=_blank&gt;http://dev.naver.com/projects/cheapas3/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;네이버 개발자 센터에 있는 SVN 저장소를 이용하기로 했습니다.&lt;/P&gt;&lt;P&gt;여태 소개했던 예제파일들을 서로 공유하는 장소가 있으면 좋겠다.. 하고 생각했는데&lt;/P&gt;&lt;P&gt;저 혼자서 블로깅하고 예제파일들을 만드는 것이 아니라 여러사람들과 소통하고 코드를 만들어가는게&lt;/P&gt;&lt;P&gt;더 "즐겁지 않을까"하고 생각했습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그래서 네이버 개발자 센터와 Google 개발자 센터중 어디를 택할지 고민하다&lt;/P&gt;&lt;P&gt;네이버 개발자 센터를 이용해보는 것도 괜찮을것 같아 네이버에 둥지를 틀었습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다만 다운로드는 익명으로도 할 수 있게 해놨는데.. 잘 될지는 모르겠습니다.&lt;/P&gt;&lt;P&gt;안되시는 분들은 댓글달아주세요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;참. SVN 사용법을 모르시는 분들을 위해 오늘 저녁에 설명서를 올려드리도록 하겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 SVN 다운로드 페이지는 먼저 소개해 놓을께요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SVN 홈페이지 : &lt;A href="http://subversion.tigris.org/" target=_blank&gt;http://subversion.tigris.org/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;SVN 다운로드 : &lt;A href="http://tortoisesvn.net/downloads" target=_blank&gt;http://tortoisesvn.net/downloads&lt;/A&gt;&lt;/P&gt;&lt;P&gt;SVN subclipse 버젼 다운로드(이클립스 혹은 빌더 사용) : &lt;A href="http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA" target=_blank&gt;http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s 저렴한 개발이므로 이클립스나 빌더로 개발하지 않아요. 그래서 SVN을 이용해 "빌더"에서 다운로드 하셨을 경우 정식 프로젝트로 적용되지 않으니 이점 기억해주세요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-8542885537641930733?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/8542885537641930733/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=8542885537641930733&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8542885537641930733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8542885537641930733'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/04/%EC%A0%80%EB%A0%B4%ED%95%9C-%EA%B0%9C%EB%B0%9C-svn.html' title='저렴한 개발 SVN'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-2404966589876558272</id><published>2010-03-30T11:32:00.000+09:00</published><updated>2011-01-11T21:59:14.993+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EditPlus로 개발하기'/><category scheme='http://www.blogger.com/atom/ns#' term='EditPlus'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='FLEX BUILDER'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex SDK'/><title type='text'>저렴하게 빌더없이 개발하기 - EditPlus 편</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;플래시 액션스크립트 카페에서 테크트리님께서 한 말씀 하셨더랬죠...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xcm3wnEYyq.png" style="width:491px;height:152px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;네.. 그래서 EditPlus로 개발하는 방법을 알려드리는 시간을 갖도록 하겠습니다.&lt;/P&gt;&lt;P&gt;아주 간단한 설정으로 Flex SDK를 이용한 개발방법이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 EditPlus를 엽니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYmotZlbAi.png" style="width:640px;height:436px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XYmotZlbAi.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;여기서 일단 "도구 &amp;gt; 기본설정"을 클릭합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XBYSBhCaDf.png" style="width:283px;height:178px;" alt=""  /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XUfm4uwjAN.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;클릭을 하면 위와 같은 화면이나옵니다. 좌측 트리메뉴에서 "파일"을 클릭하여 "새 파일형식"과 "기본 인코딩"부분을 아래와 같이 수정합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYrRshmwer.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;보통은 UTF-8이 아니라 ANSI 로 되어있는데 영문만 사용하시는 거라면 문제가 없겠지만 한글이라던가 제3국언어를 사용하시게 되면 문자 인코딩이 깨져서 컴파일 되게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그 다음 좌측 트리메뉴에서 "설정 및 구문강조"를 선택하고 "추가"를 클릭합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XGSP3yD189.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XWtP4zkxbD.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"파일 종류 설명 입력"이라고 뭔가를 입력하라는데 그냥 알기쉬운 이름 지어준다 생각하고 적어주시면 됩니다. 저는 귀찮아서 그냥 "as"라고 적었습니다. "확인"을 클릭하면 "파일 종류"리스트에 "as라는 항목이 추가 되면 아래와 같이 설정을 맞춰주시면 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XfzCrFEanL.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;파일확장자는 as와 mxml만 설정했습니다. 문제는 구문파일이나 자동완성 파일인데.. 저 파일을 어디서 구할수 있느냐... 하면 EditPlus 홈페이지에서 구할 수 있지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XAosEK1jTY.png" style="width:572px;height:595px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;저 파일을 &lt;A href="http://www.editplus.com/dn.cgi?flex3_as3.rar" target=_blank&gt;다운&lt;/A&gt;받고 싶으시다면 클릭 고고.&lt;/P&gt;&lt;P&gt;다운로드 받은 뒤에 압축을 풀면 몇몇개 파일이 있습니다. 그 파일들을 적당한 장소에 옮기신 후에 EditPlus로 돌아와 "..." 버튼을 눌러 적용하시면 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XFxMvtjfXP.png" style="width:324px;height:174px;" alt=""  /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XR9Gb0Abae.png" style="width:640px;height:373px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XR9Gb0Abae.png')" /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XDsqhfT6r9.png" style="width:640px;height:373px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XDsqhfT6r9.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;설정하시고 나면 일단 기본적인 코드 읽기가 가능해집니다.&lt;/P&gt;&lt;P&gt;저는 구문강조 색상을 설정해 제 취향에 맞춰서 만들었습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XaPNNLhBaW.png" style="width:588px;height:520px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;적절하게 읽기도 좋아지고 보기도 좋아진것 같습니다. 이제 컴파일 옵션을 맞춰줄 시기가 왔군요.&lt;/P&gt;&lt;P&gt;일단 컴파일은 간단하게 "mxmlc file경로 file명을 제외한 디렉토리\파일명.swf" 명령어로 처리됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"도구 &amp;gt; 사용자 도구 구성"으로 가볼까요?&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XY56jwkzP9.png" style="width:300px;height:249px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XU6gYZHVEG.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;위와같이 아무것도 없는 창이 뜨게 될텐데 일단 그룹이름을 세련되게 지어주도록 하지요.&lt;/P&gt;&lt;P&gt;오른쪽에 있는 "그룹 이름..." 이라는 버튼을 클릭해 이름을 지어줍니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;저는 이번에도 귀찮아서 "as" 라고 지어줬습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XXiS8oWgZF.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;그 다음 "그룹 이름..." 밑에 있는 "추가(D)&amp;gt;&amp;gt;"라고 클릭해주세요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XZpT6VAaGF.png" style="width:394px;height:231px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;추가를 클릭하게 되면 하위 메뉴가 나오는데 그때 "프로그램(P)"를 클릭하면 됩니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XTzdgzj2g4.png" style="width:482px;height:384px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그럼 위와 같이 리스트에 하나가 추가 되는데요. 메뉴 제목에 적절한 이름을 지어줍니다.&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XPsd281Idy.png" style="width:330px;height:325px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;저는 이번에도 귀찮아서 as Compile이라고 지어줬지요.&lt;/P&gt;&lt;P&gt;사실 이름짓는게 가장 귀찮은 작업이라고 생각해요. 그냥 나중에 알아보기에 편하기만 하면 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그 다음 명령 입력필드 오른쪽에 있는 "..." 버튼을 클릭하고 "SDK 디렉토리\bin" 으로 이동합니다.&lt;/P&gt;&lt;P&gt;저의 경우엔 "D:\Dev\02.Util\sdks\flex_sdk_3.5\bin"가 되겠네요.&lt;/P&gt;&lt;P&gt;이동하게 되면 아래와 같은 화면이 나옵니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XHGF0GBjXH.png" style="width:640px;height:373px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XHGF0GBjXH.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;컴파일을 하기 위해선 mxmlc.exe가 필요하니 mxmlc.exe 파일을 선택하고 "열기"를 클릭합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그리고 "인수(O)" 입력필드 오른쪽에 있는 ▼ 버튼을 클릭합니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XfAdsf19pp.png" style="width:464px;height:163px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자.. 이제 아래와 같은 설정이 되었는지 확인해 봅니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XWR2swUtHe.png" style="width:330px;height:325px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;위와 같은 화면이 되었다면 일단 컴파일 셋팅은 끝났습니다.&lt;/P&gt;&lt;P&gt;컴파일을 해볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xa7smX1aQ3.png" style="width:218px;height:235px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;"도구" 메뉴를 보시면 as Compile이라는 메뉴가 생긴걸 볼 수 있지요.&lt;/P&gt;&lt;P&gt;저 메뉴를 클릭하셔도 되고 "Ctrl + 1"을 누르셔도 괜찮습니다. 바쁜 스케쥴때문에 마우스에 손을 대기 귀찮군요. 저는 Ctrl + 1을 누르겠습니다.(아, 경로 중간에 띄어쓰기가 있으면 안됩니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;예전에 작업했던 Point 예제를 컴파일 했습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XCsqIa0rDb.png" style="width:536px;height:86px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그럼 컴파일이 되었습죠. 컴파일한 as 파일과 같은 경로에 말입니다. 에러가 나올땐 이렇게 나옵니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XLcAs1D8bV.png" style="width:615px;height:214px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;참고로 저기 괄호안에 (27) 이라고 나온것이 몇번째 라인에서 에러가 나온 것인지 알려주는 거에요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자.. 컴파일도 했으니 실행을 시켜봐야할텐데.. 사실 빌더에서처럼 자동으로 HTML도 만들어주고 익스플로러도 실행하고 그럼 좋겠으나 EditPlus잖아요. 현실을 받아들입시다.(Ant라던가 뭐.. 다른 방법으로도 할 수 있는 방법이 있겠으나 그걸 다 썼다간 저 오늘 집에 못갈지도 몰라요.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;간단하게 Flash Player로 실행하는 것으로 타협하고 셋팅해 볼께요.&lt;/P&gt;&lt;P&gt;아까 "as Compile" 했던 "도구 &amp;gt; 사용자 도구 구성"메뉴로 들어갑니다. 그 담은 뭐 일사천리에요.&lt;/P&gt;&lt;P&gt;프로그램 추가하시고 이름은 "flash player" 라고 지었습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XPpufmCfzU.png" style="width:330px;height:325px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자.. 이제부터 중요한 "명령"부분. 그냥 Flash Player를 설정해주면 되지 않냐. 라고 하시는데요.. 사실 다들 브라우져에서 보는 플러그인 방식의 Flash Player만 있지 로컬에서 Stand Alone으로 swf를 실행하는 거라곤 "곰 플레이어"밖에 없으신 분들 많으실 겁니다. 아시는 분은 아실지 모르겠습니다만 Adobe에서는 SDK를 배포할때 Flash Player를 같이 배포하고 있지요. "SDK 경로\runtimes\player\10\win" 위치로 가보시면 아래와 같이 Flash Player를 확인하실 수 있습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XSF4Vqxgqk.png" style="width:640px;height:373px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XSF4Vqxgqk.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;저의 경우엔 "D:\Dev\02.Util\sdks\flex_sdk_3.5\runtimes\player\10\win"경로지요.&lt;/P&gt;&lt;P&gt;아무튼 파일을 선택하시고 "열기"합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그 담에 "인수"가 중요한데요. 좀 복잡합니다.&lt;/P&gt;&lt;P&gt;명령이 "FlashPlayer.exe 파일디렉토리\확장자를 뺀 파일이름.swf" 이렇게 나와야 하기 때문이에요.&lt;/P&gt;&lt;P&gt;왜냐하면!!! 그냥 "파일경로"를 넣어버리면 지금 보고있는 as 파일을 재생하기 때문이지요. 그럼 그저 하얀 화면만 보게 됩니다. 그래서 "파일 경로"를 넣는 것이 아니라 "디렉토리\확장자를 뺀 파일이름.swf"라고 인수를 넘겨주는 것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아래와 같이 셋팅합니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XFn3HAzl2w.png" style="width:348px;height:124px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XFn3HAzl2w.png')" /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XRD1gxD9uC.png" style="width:371px;height:139px;" alt=""  /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XItvVMCjbQ.png" style="width:330px;height:325px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;위와 같이 셋팅이 되셨으면 됩니다. 아, 마지막으로 "출력 내용 캡쳐"를 선택해 주세요. 저걸 선택하게 되면 trace로 나오는 메시지를 캡쳐해 화면에 보여주게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자.. 이제 실행해 볼까요?&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XXJ9yjANai.png" style="width:222px;height:247px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;새로 메뉴도 생겼고.. 저는 이번에도 Ctrl + 2 로 실행했습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XBk210RPod.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;아주 잘 실행됩니다. trace도 확인할 수 있어요.&lt;/P&gt;&lt;P&gt;이렇게요.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XRUxHegvzx.png" style="width:479px;height:333px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;간단한가요? 저는 사실 실무 들어와서 약 1년 6개월간을 Edit Plus로 프로젝트를 진행해서&amp;nbsp; 이런 셋팅에 이골이 날 지경이지만 처음 하시는 분들은 조금 어려울지도 모르겠네요. 라이브러리 셋팅이라던가 보다 세부적인 컴파일러 설정을 하려면 좀더 어렵겠지만 (아예 따로 컴파일러를 셋팅하는 경우도.... 덜덜) 간단한 예제같은 것은 이런 설정만으로도 만들 수 있으니까요. 한번 해보시는 것도 괜찮을 듯 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s :&lt;/P&gt;&lt;P&gt;결코 EditPlus를 권장하지 않습니다. 단지 이렇게도 작업할 수 있다는 것만 알아두시는 것이 좋을듯.&lt;/P&gt;&lt;P&gt;사실 Builder라는 좋은 툴을 두고 EditPlus로 개발하는 짓은 좀 웃기는 일이지요.&lt;/P&gt;&lt;P&gt;저는 단지 Builder라는 툴을 사용하지 못할 경우라던가 돈이 없어 Builder를 사용하지 못하는 분들을 위해 방법을 소개함을 다시한번 말씀드립니다.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-2404966589876558272?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/2404966589876558272/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=2404966589876558272&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2404966589876558272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2404966589876558272'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/%EC%A0%80%EB%A0%B4%ED%95%98%EA%B2%8C-%EB%B9%8C%EB%8D%94%EC%97%86%EC%9D%B4-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0-editplus-%ED%8E%B8.html' title='저렴하게 빌더없이 개발하기 - EditPlus 편'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-7038481119653130048</id><published>2010-03-26T11:10:00.000+09:00</published><updated>2011-01-11T21:59:13.849+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='그냥'/><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='됨'/><category scheme='http://www.blogger.com/atom/ns#' term='달리면'/><title type='text'>목표가 생기면</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XFteCEFaLA.png" style="width:640px;height:384px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XFteCEFaLA.png')" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;목표가 생기면 무작정 달려들어야지&lt;/div&gt;&lt;div&gt;실패를 두려워할 여유같은건 없을 때니까.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-7038481119653130048?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/7038481119653130048/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=7038481119653130048&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7038481119653130048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7038481119653130048'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/%EB%AA%A9%ED%91%9C%EA%B0%80-%EC%83%9D%EA%B8%B0%EB%A9%B4.html' title='목표가 생기면'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-7110653756166597143</id><published>2010-03-25T10:26:00.000+09:00</published><updated>2011-01-11T21:59:13.045+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface Class'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='인터페이스 클래스'/><title type='text'>Interface Class #2 - 존재의 이유</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;지난번 포스팅에서 너무 두서없이 이야기해서 혼란스러운 분들이 계실까봐 일단 한번 정리하고&lt;/P&gt;&lt;P&gt;넘어가도록해보겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Interface Class의 존재 이유&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;다중상속을 받기위한 하나의 방법으로 제공&lt;/LI&gt;&lt;LI&gt;해당 Interface Class를 구현하여 본 클래스가 제공하는 기본기능을 유추할 수 있음&lt;/LI&gt;&lt;LI&gt;코딩하는데 있어 개발자의 실수를 미연에 방지(메서드를 안만들거나 하는)&lt;/LI&gt;&lt;LI&gt;서로 다른 클래스를 하나의 인터페이스 클래스로 캐스팅 할 수 있어 확장성에 도움이 됨&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사실 2번이나 3번 같은 이유로 Interface Class를 만든다는건 좀 우습긴하지만 어찌됐든 저런 이유로 Interface Class를 만들기도 하니까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2번이나 3번의 경우엔 개발자가 좀더 신경써서 코딩하거나 네이밍 하게 되면 해결되는 문제로 이런 것만으로는 Interface Class의 존재이유가 될 수 없지요. 일단 인터페이스 클래스를 사용하게 되면 도움이되는 팁을 한번 알아볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;1. 클래스 구조상 어떤 클래스가 들어올지 예측할 수 없는 경우.&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&lt;/P&gt;&lt;P&gt;대표적인 예로 아이템 렌더러가 있을 수 있지요. 데이터 그리드 내에 있는 아이템 렌더러는 반드시 포함되어야할 요소들이 몇가지 있는데요. IDataRenderer, IDropInListItemRenderer, IListItemRenderer. 이렇게 3개의 인터페이스가 구현되어야만 합니다. (총 5개인데 그중 2개는 UIComponent에서 이미 구현했거든요..:D)&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&lt;/P&gt;&lt;P&gt;저 3가지 인터페이스를 구현함으로써 아이템렌더러는 기본적으로 data라는 속성. listData라는 속성을 포함하게 됩니다. 그로인하여 DataGrid 내부적으로는 어떤 형식으로 만들어진 아이템렌더러가 들어오더라도 위의 3가지 인터페이스를 구현했다고 가정함으로써 처리가 가능해 지는 것입니다.&lt;/P&gt;&lt;P&gt;그래서 별별 희안한 아이템 렌더러도 만들 수 있게 되는 것이지요. 이런것들 처럼요.&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XPhFZwUEmv.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XPhFZwUEmv.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;썩... 별별 희안한 아이템 렌더러는 아닙니다만 어찌되었든 복잡한 클래스 구조 안에서 다양한 방법으로 클래스를 처리함으로써 보다 넓게 클래스를 확장할 수 있게 됩니다. 폐쇄적인 클래스 구조가 아니라 좀더 개방적인 코드를 만들어 냄으로 써 코드의 재사용성을 높일 수 있게 되는 것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. 코드의 구현 중 디버깅.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;예를 들어 어떤 클래스군(群)을 만들어 내는데 있어 필요한 요소중 하나가 andromeda와 &lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;general_idea 라는 속성이 있어야 한다고 정의한다고 할 때 개발자가 1인일 경우 큰 문제가 되지 않습니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;허나 거의 모든 SI 프로젝트가 그렇듯 개발자가 1인일 경우는 거의 드물지요. 다른 개발자들과 같이 협업하게 되는 경우가 많습니다. 그럴경우 코드를 배포하고 개발하게 되었을때 첨에 말씀드린 클래스군(群)을 다같이 만든다고 했을 때 누군가가 필수요소 코드인 andromeda와 general_idea를 빼먹었다면? 당연히 컴파일 중 에러가 속출할테고 원인을 분석하기 위해 시간을 버려야만 하는 문제가 발생하게 됩니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;1분 1초가 아까운 시점에서 이런 에러때문에 시간을 버려야만 한다면 그것은 분명 시간의 "낭비"입니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;그런 부분을 보완하기 위한 방법으로 Interface class를 사용합니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;아래와 같이 Interface class를 정의하고&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;&lt;br /&gt;&lt;br /&gt;[code as3]&lt;br /&gt;package classes.core&lt;br /&gt;{&lt;br /&gt;public interface IMain&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; function set andromeda(value:String):void;&lt;br /&gt;&amp;nbsp; &amp;nbsp; function get andromeda():String&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; function set general_idea(value:String):void;&lt;br /&gt;&amp;nbsp; &amp;nbsp; function get general_idea():String;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;Main 클래스를 아래와 같이 작성합니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 19px; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import classes.core.IMain;&lt;br /&gt;public class Main extends Sprite implements IMain&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;위와 같이 코딩해서 컴파일 하게 되면 아래와 같은 메시지가 등장하게 되지요.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XPx94gCeqw.png" style="width:482px;height:432px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 컴파일 단계에서 미리 에러를 보여줘 디버깅하는데 도움을 주게 됩니다.&lt;/P&gt;&lt;P&gt;개인적인 작업을 할때보다 단체로 작업할 때 큰 도움을 주지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;인터페이스 클래스는 반드시 필요하지않은 것도.. 그렇다고 반드시 필요한 것도 아닐지 모르겠지만 코드가 명확해지고 목적을 갖게 하면서 보다 넓은 확장성을 갖게 합니다.&lt;/P&gt;&lt;P&gt;특히 SDK 작업을 할때엔 반드시 작성되어야할 코드이기도 하지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이번은 여기까지 하구요. 다음 시간엔 Interface Class의 마지막 시간이 계속 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s 개인 적인 사정으로 지난주 2일분이 빠지게 되었군요. 회사일이 좀 줄어들거든 메꾸도록 하겠습니다. :)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-7110653756166597143?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/7110653756166597143/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=7110653756166597143&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7110653756166597143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7110653756166597143'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/interface-class-2-%EC%A1%B4%EC%9E%AC%EC%9D%98-%EC%9D%B4%EC%9C%A0.html' title='Interface Class #2 - 존재의 이유'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-6323487855473407011</id><published>2010-03-24T13:04:00.000+09:00</published><updated>2011-01-11T21:59:12.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface Class'/><category scheme='http://www.blogger.com/atom/ns#' term='interface'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='인터페이스'/><category scheme='http://www.blogger.com/atom/ns#' term='인터페이스 클래스'/><title type='text'>Interface Class #1 - 존재의 이유</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;Interface Class라고 들어봤나요? 도데체 뭘하는 녀석들일까요? 이상한 클래스입니다.&lt;/P&gt;&lt;P&gt;사실 필요성 같은거 별로 알고 싶지 않기도 하고 이런거 없이도 잘 살아왔어요.&lt;/P&gt;&lt;P&gt;사실입니다!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 말씀하시는 분 손한번 들어주세요.&lt;/P&gt;&lt;P&gt;Interface 클래스는 거참.. 말씀드리기가 어려운 내용입니다.&lt;/P&gt;&lt;P&gt;왜냐하면 논리적으로 "불필요하다"라고 단정적으로 이야기 할 수 없고&lt;/P&gt;&lt;P&gt;"반드시 필요하지!"라고 말하기도 애매한 내용일 수 있기 때문입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;하지만 개발자들은 Interface 클래스를 이용합니다. 심지어 저번에 포스팅했던 아이템 렌더러까지도요.&lt;/P&gt;&lt;P&gt;인터페이스들을 구현하지 않으면 아이템렌더러가 제대로 작동하지 않게 설계되었기 때문인데요.&lt;/P&gt;&lt;P&gt;그거 외에도 수많은 인터페이스 클래스들이 존재합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;왜 그럴까요? 왜!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아시모프님께서 좋은 설명을 해주셨는데요(관련글 : &lt;A href="http://silverktk.tistory.com/134"&gt;http://silverktk.tistory.com/134&lt;/A&gt;)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="TEXT-ALIGN: left; LINE-HEIGHT: 19px; FONT-FAMILY: 'Lucida Grande', Tahoma, Arial, Helvetica, sans-serif; COLOR: rgb(102,102,102); FONT-SIZE: 12px" class=Apple-style-span&gt;인터페이스를 쓰는 가장 큰 이유는 다중상속을 지원하지 않는 자바에서 다중상속의 장점을 가져오기 위해서입니다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;라고 말씀하셨네요. 자바로 설명을 주셨지만 액션스크립트라고 크게 다르지 않습니다.&lt;/P&gt;&lt;P&gt;C개발하시는 분들이 종종 질문하시는 내용중에 하나인데요. "액션스크립트에서는 다중 상속이 안되느냐?"라고 물어보시곤 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다중상속이라함은 다른 여러 클래스를 다중으로 상속받게 하는 것인데 자바나 액션스크립트에서는 지원하지 않고 있지요. 대신 인터페이스 클래스라는 것을 이용하게 합니다. 이를 통하여 얻을 수 있는 장점은 부모 클래스에서 무조건적으로 받아내는 상속이라는 개념대신 자식 클래스에서 필요한 매서드를 구현하여 부모 클래스의 불필요한 부분을 걷어내고 자식 클래스에 맞게끔 새로 구현할 수 있게 된다는 것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그리고 보다 넓은 확장성을 기대할 수 있게 합니다. 예를 들어 이렇게 되겠지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XXdyk4UwKr.png" style="width:435px;height:296px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;IContent라는 인터페이스 클래스가 있고 안에는 3가지 메서드가 있다고 했을때 그것들을 구현한 ImageContent와 FLVContent, SWFContent는 기본적으로 play(), stop(), pause() 라는 메서드가 있게 됩니다. 의심할 여지가 없지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;코드로 보면 이렇게 됩니다.&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package classes.controls&lt;br /&gt;{&lt;br /&gt;import classes.controls.IContent;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;public class ImageContent extends Sprite implements IContent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function ImageContent()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function play():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function pause():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function stop():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;예를 들어 위와같이 IContent를 구현해 내고 나면 저 클래스를 가져다 쓰는 곳에서는 이렇게 사용할 수 있게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import classes.controls.ImageContent;&lt;br /&gt;import classes.controls.IContent;&lt;br /&gt;&lt;br /&gt;import flash.display.DisplayObject;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!child)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; child = new ImageContent();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IContent(child).play();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var child:DisplayObject;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와 같이 코드를 작성할 수 있게 됩니다. 뭔가 좀 이상한 구석이 있으시다면 코드를 저렇게 만들어 두시고 컴파일해보시면 이해하실 수 있을까요.. child라는 녀석이 DisplayObject이지만 IContent를 구현한 ImageContent로 생성해 놓고 나중에 IContent로 캐스팅 할 수 있게 된다는 사실은 논리적으로 하자가 없지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;게다가 만약에 IContent말고 예를들어 IDestroy같은 인터페이스 클래스가 있다고 가정했을 때 &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;public class ImageContent extends Sprite implements IContent, IDestroy&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;라고 해서 구현해 놓으면 나중에 IDestroy(child)라고 캐스팅할 수 있게 됩니다.&lt;/P&gt;&lt;P&gt;아, 물론 IDestroy(child).play() 이렇게 할 수는 없지요. IDestroy는 IContent와 다르니까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;복잡하신가요? 오늘은 이정도로 맛만보구요. 담부터는 좀더 자세하고 섬세하게 알아보는 시간을 갖었으면 좋겠습니다.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-6323487855473407011?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/6323487855473407011/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=6323487855473407011&amp;isPopup=true' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/6323487855473407011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/6323487855473407011'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/interface-class-1-%EC%A1%B4%EC%9E%AC%EC%9D%98-%EC%9D%B4%EC%9C%A0.html' title='Interface Class #1 - 존재의 이유'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1858601456022169884</id><published>2010-03-23T11:22:00.000+09:00</published><updated>2011-01-11T21:59:11.516+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='체크박스'/><category scheme='http://www.blogger.com/atom/ns#' term='itemRenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='아이템렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='체크박스 렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex DataGrid ItemRenderer #3- 또다른 전쟁의 서막</title><content type='html'>&lt;P&gt;지난 시간 제기한 문제점은 아래와 같았습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. "Y", "N" 값으로만 작동하게 되어있다.&lt;/P&gt;&lt;P&gt;2. CheckBox를 클릭하면 뭔가 다른 행동을 하고 싶을땐 어떻게 하나.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;외부에서 들어오는 데이터가 "0"이나 "1"이면 어떻한다?(혹은 true 나 false일지도..)&lt;/P&gt;&lt;P&gt;CheckBox를 클릭하면 Alert 창이 떠야한다면?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이럴때마다 ItemRenderer를 열어서 수정해야한다면 말이 안되겠지요.&lt;/P&gt;&lt;P&gt;일단 2번 같은 경우는 제가 알기로는 두가지 방법이 있습니다만 그중 하나는 Bubbles라는 이벤트 속성을 이용하는 방법입니다만 ItemRenderer에서 이벤트를 발생시키면서 bubbles 속성을 true로 지정해주면 DataGrid 밖에서 이벤트를 받아올 수 있지요.&lt;/P&gt;&lt;P&gt;다만.. bubbles라는 녀석의 특성상 데이터가 많이 꼬일 염려가 있다는게 문제입니다.&lt;/P&gt;&lt;P&gt;(꼬인다는건 "디버깅"이 어려워질 수 있다는 말을 쉽게 풀어 쓴 말입니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그래서 저는 가장 확실한 방법으로 CallBack 함수를 지정해 놓는 방법을 선택했습니다.&lt;/P&gt;&lt;P&gt;아래의 코드를 봐주세요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Main.mxml&lt;br /&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:renderers="classes.controls.renderers.*"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.collections.ArrayCollection;&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Bindable]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var ac:ArrayCollection = new ArrayCollection([&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:1, description:"test1", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:2, description:"test2", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:3, description:"test3", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:4, description:"test4", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:5, description:"test5", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:6, description:"test6", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:7, description:"test7", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:8, description:"test8", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:9, description:"test9", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:10, description:"test10", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:11, description:"test11", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:12, description:"test12", toggle:"N"}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function checkBoxRendererClickHandler(data:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("click by " + data.description);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid dataProvider="{ac}"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="index" dataField="index" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="description" dataField="description" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="radio" dataField="toggle"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;renderers:CheckBoxRenderer onClickFunction="{outerDocument.checkBoxRendererClickHandler}" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:DataGridColumn&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;CheckBoxRenderer.as&lt;br /&gt;[code as3]&lt;br /&gt;package classes.controls.renderers&lt;br /&gt;{&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp; Import&lt;br /&gt;//&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.controls.CheckBox;&lt;br /&gt;import mx.controls.dataGridClasses.DataGridListData;&lt;br /&gt;import mx.controls.listClasses.BaseListData;&lt;br /&gt;import mx.controls.listClasses.IDropInListItemRenderer;&lt;br /&gt;import mx.controls.listClasses.IListItemRenderer;&lt;br /&gt;import mx.core.mx_internal;&lt;br /&gt;import mx.events.FlexEvent;&lt;br /&gt;&lt;br /&gt;use namespace mx_internal;&lt;br /&gt;&lt;br /&gt;public class CheckBoxRenderer extends CheckBox&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CheckBoxRenderer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 데이터 변경 확인 플래그&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var dataChanged:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; onClickFunction&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var _onClickFunction:Function;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 클릭시 실행할 콜백함수 속성&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set onClickFunction(value:Function):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _onClickFunction = value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function get onClickFunction():Function&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return onClickFunction;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; override public function set data(value:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.data = value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dataChanged)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; currentIcon.x = (unscaledWidth - currentIcon.width) / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; CheckBox의 속성을 변경&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function updateProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(listData.label == "Y")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateDisplayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override EventHandler&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function clickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.clickHandler(event);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //data[DataGridListData(listData).dataField] = selected ? "Y" : "N";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selected)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = "Y";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = "N";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(_onClickFunction != null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _onClickFunction(data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와같이 코딩하게 되면 아래와 같은 산출물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XDWYffAvDE.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XDWYffAvDE.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;CheckBoxRenderer를 클릭해보세요. Alert창이 뜨는걸 볼 수 있지요.&lt;/P&gt;&lt;P&gt;그럼 2번 문제는 해결된것 같습니다. 그럼 1번 문제인 "Y", "N" 이외의 다른 문자열이 들어올땐 어떻게 할까요? 라는 문제는 방금 2번 문제를 해결한것과 같이 해결하면 될것 같습니다.&lt;/P&gt;&lt;P&gt;아래 처럼요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package classes.controls.renderers&lt;br /&gt;{&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp; Import&lt;br /&gt;//&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.controls.CheckBox;&lt;br /&gt;import mx.controls.dataGridClasses.DataGridListData;&lt;br /&gt;import mx.controls.listClasses.BaseListData;&lt;br /&gt;import mx.controls.listClasses.IDropInListItemRenderer;&lt;br /&gt;import mx.controls.listClasses.IListItemRenderer;&lt;br /&gt;import mx.core.mx_internal;&lt;br /&gt;import mx.events.FlexEvent;&lt;br /&gt;&lt;br /&gt;use namespace mx_internal;&lt;br /&gt;&lt;br /&gt;public class CheckBoxRenderer extends CheckBox&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CheckBoxRenderer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 데이터 변경 확인 플래그&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var dataChanged:Boolean = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; onClickFunction&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var _onClickFunction:Function;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 클릭시 실행할 콜백함수 속성&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set onClickFunction(value:Function):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _onClickFunction = value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function get onClickFunction():Function&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return onClickFunction;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; selectedFlag&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; private var _selectedFlag:Array = ["Y", "N"];&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; &amp;lt;p&amp;gt;true, false를 처리할 flag를 Array형태로 받아 처리.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; &amp;lt;p&amp;gt;이때 selectedFlag의 length는 2를 초과할 수 없음.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @default &amp;nbsp;&amp;nbsp; ["Y", "N"]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set selectedFlag(value:Array):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(value.length &amp;gt; 2)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw(new Error("selectedFlag:Array의 값은 두개를 초과할 수 없습니다."));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _selectedFlag = value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */ &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; public function get selectedFlag():Array&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return _selectedFlag;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; override public function set data(value:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.data = value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dataChanged)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; currentIcon.x = (unscaledWidth - currentIcon.width) / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; CheckBox의 속성을 변경&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function updateProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(data[DataGridListData(listData).dataField] == _selectedFlag[0])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateDisplayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override EventHandler&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function clickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.clickHandler(event);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //data[DataGridListData(listData).dataField] = selected ? _selectedFlag[0] : _selectedFlag[1];&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selected)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = _selectedFlag[0];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = _selectedFlag[1];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(_onClickFunction != null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _onClickFunction(data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;이렇게 수정하고 나면 눈으로 보기엔 아무 바뀐게 없어 보일지 모르겠지만 데이터가 "Y", "N"이 아니라 true나 false로 들어온다 하더라도 selectedFlag를 변경해주면 바로 적용할 수 있게 된다.&lt;/P&gt;&lt;P&gt;(163번째 줄 확인 꼭 하셔야합니다. label로 되어있던걸 data에서 바로 값을 뽑아서 비교하게끔 했어요. 이유는 true나 false같은 경우는 String이 아니기때문에 비교식 성립이 안되거든요.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아래와 같이 Main.mxml 파일을 수정해보면 알 수 있다.&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="&lt;A href="http://www.adobe.com/2006/mxml"&gt;http://www.adobe.com/2006/mxml&lt;/A&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:renderers="classes.controls.renderers.*"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.collections.ArrayCollection;&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Bindable]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var ac:ArrayCollection = new ArrayCollection([&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:1, description:"test1", toggle:true},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:2, description:"test2", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:3, description:"test3", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:4, description:"test4", toggle:true},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:5, description:"test5", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:6, description:"test6", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:7, description:"test7", toggle:true},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:8, description:"test8", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:9, description:"test9", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:10, description:"test10", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:11, description:"test11", toggle:false},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:12, description:"test12", toggle:false}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function checkBoxRendererClickHandler(data:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("click by " + data.description);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid dataProvider="{ac}"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="index" dataField="index" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="description" dataField="description" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="radio" dataField="toggle"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;renderers:CheckBoxRenderer&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selectedFlag="{[true, false]}"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; onClickFunction="{outerDocument.checkBoxRendererClickHandler}" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:DataGridColumn&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;이제 대충 감이 오시나요?&lt;/P&gt;&lt;P&gt;Renderer에 대해서 감이 오셨다면 다행입니다.&lt;/P&gt;&lt;P&gt;하지만 "CheckBox"는 대충 알겠는데 "ComboBox"는? "ComboBoxRenderer"는 어떻게 만드나요? 라고 하신다면 1, 2, 3회에 걸쳐 Renderer에 대해 설명한 이유가 없어요. 다시 한번 훑어보시고 연구하시면 될거 같아요.&lt;/P&gt;&lt;P&gt;답은 스스로 만들어가는 것.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다음 시간엔... HeaderRenderer를 해볼까 하다가 좀 다른게 만져보고 싶어져서.. 기대하세요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1858601456022169884?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1858601456022169884/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1858601456022169884&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1858601456022169884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1858601456022169884'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/flex-datagrid-itemrenderer-3-%EB%98%90%EB%8B%A4%EB%A5%B8-%EC%A0%84%EC%9F%81%EC%9D%98-%EC%84%9C%EB%A7%89.html' title='Flex DataGrid ItemRenderer #3- 또다른 전쟁의 서막'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-2399666603298374397</id><published>2010-03-17T19:50:00.000+09:00</published><updated>2011-01-11T21:59:10.473+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataGridItemRenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='itemRenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='checkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='아이템렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='데이터그리드 아이템렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex DataGrid ItemRenderer #2 - 전면전</title><content type='html'>&lt;P&gt;경력사원임에도 불구하고 나이가 어려서 그런지 신입사원 연수를 다녀오라는 지시에 지난 목요일 금요일 다녀오는 바람에 ItemRenderer 이야기가 늦어졌습니다. 기다리신 분 계신가요?? 죄송합니다. 본의아니게;;&lt;/P&gt;&lt;P&gt;아무튼 DataGrid ItemRenderer 라는 뜨거운 감자를 삼키기위해 어떤 모양의 ItemRenderer를 만들지 한번 생각해보도록 할까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;처음이니 간단하게 CheckBox 아이템 렌더러를 만들도록 해봅시다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 메인 어플리케이션을 만들어 놓습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Bindable]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var ac:ArrayCollection = new ArrayCollection([&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:1, description:"test1", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:2, description:"test2", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:3, description:"test3", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:4, description:"test4", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:5, description:"test5", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:6, description:"test6", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:7, description:"test7", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:8, description:"test8", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:9, description:"test9", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:10, description:"test10", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:11, description:"test11", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {index:12, description:"test12", toggle:"N"}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid dataProvider="{ac}"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="index" dataField="index" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="description" dataField="description" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="check" dataField="toggle" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와같이 코딩하고 컴파일하게되면 아래와 같이 산출물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XH0dd7D2cE.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XH0dd7D2cE.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그럼 우리는 ratio라고 적혀있는 곳에 ItemRenderer를 적용할겁니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;CheckBox를 상속받아 작업할겁니다. 왜 "UIComponent 안쓰고!"라고 말씀하신다면&lt;/P&gt;&lt;P&gt;그 이유는 UIComponent를 상속받은 클래스이기도 하고 지난시간 말했던 IDataRenderer, IDropInListitemRenderer, IListItemRenderer 이렇게 세 인터페이스가 이미 구현되어있으며 우리가 원하는 아이템 렌더러는 CheckBox아이템 렌더러이기 때문이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package classes.controls.renderers&lt;br /&gt;{&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp; Import&lt;br /&gt;//&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.controls.CheckBox;&lt;br /&gt;import mx.controls.listClasses.BaseListData;&lt;br /&gt;import mx.controls.listClasses.IDropInListItemRenderer;&lt;br /&gt;import mx.controls.listClasses.IListItemRenderer;&lt;br /&gt;import mx.events.FlexEvent;&lt;br /&gt;public class CheckBoxRenderer extends CheckBox&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CheckBoxRenderer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 데이터 변경 확인 플래그&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var dataChanged:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;초벌로 createChildren, commitProperties, updateDisplayList도 확장해 두고 아이템 랜더러로 사용하기 위한 준비를 마쳤습니다.&lt;/P&gt;&lt;P&gt;그리고 메인 어플리케이션은 아래와 같이 수정하고 컴파일 합니다.&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Bindable]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var ac:ArrayCollection = new ArrayCollection([&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:1, description:"test1", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:2, description:"test2", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:3, description:"test3", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:4, description:"test4", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:5, description:"test5", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:6, description:"test6", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:7, description:"test7", toggle:"Y"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:8, description:"test8", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:9, description:"test9", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:10, description:"test10", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:11, description:"test11", toggle:"N"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {index:12, description:"test12", toggle:"N"}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid dataProvider="{ac}"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="index" dataField="index" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="description" dataField="description" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn headerText="radio" dataField="toggle" itemRenderer="classes.controls.renderers.CheckBoxRenderer" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;일단 아래와 같은 결과가 나오면 성공입니다.&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XcnUcYAg95.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XcnUcYAg95.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;CheckBox 가 "Y"냐 "N"이냐에 따라 selected가 처리되는 로직이 필요합니다. 그러기 위해서는 그 코드를 어디에 넣는것이 좋을지 고민해봐야하는데 아까도 말했듯 모든 속성처리는 commitProperties에서 하게 됩니다. commitProperties를 호출하기 위해서는 저번에 이야기 했었던 대로 invalidateProperties() 메서드를 호출하면 됩니다. 그렇다면 코드를 아래와 같이 수정합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package classes.controls.renderers&lt;br /&gt;{&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp; Import&lt;br /&gt;//&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.controls.CheckBox;&lt;br /&gt;import mx.controls.dataGridClasses.DataGridListData;&lt;br /&gt;import mx.controls.listClasses.BaseListData;&lt;br /&gt;import mx.controls.listClasses.IDropInListItemRenderer;&lt;br /&gt;import mx.controls.listClasses.IListItemRenderer;&lt;br /&gt;import mx.events.FlexEvent;&lt;br /&gt;public class CheckBoxRenderer extends CheckBox&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CheckBoxRenderer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 데이터 변경 확인 플래그&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var dataChanged:Boolean = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; override public function set data(value:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.data = value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dataChanged)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; CheckBox의 속성을 변경&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function updateProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(listData.label == "Y")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateDisplayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;위와 같이 코딩하게 되면 아래와 같은 산출물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XFwh1QxSuj.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XFwh1QxSuj.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;썩 잘나오는거 같습니다. 몇가지 마음에 안 드는 것이 있는데 일단 CheckBox가 셀의 중앙에 갔으면 좋겠고 CheckBox를 클릭하고 휠을 돌려보면 Check가 풀려버리는 버그가 있다는 것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;CheckBox를 중앙에 놓으려면 CheckBox의 너비를 알아야하는데 그것은 CheckBox는 기본적으로 14픽셀의 넓이를 갖습니다. 그것을 어떻게 아냐구요?&lt;/P&gt;&lt;P&gt;measuredWidth를 trace 해보면 간단하게 알 수 있습니다. 아, measuredWidth는 컨포넌트 객체의 기본 너비를 이야기 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위의 두가지 문제점을 해결하기 위해 아래와 같이 코드를 수정합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package classes.controls.renderers&lt;br /&gt;{&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp; Import&lt;br /&gt;//&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.controls.CheckBox;&lt;br /&gt;import mx.controls.dataGridClasses.DataGridListData;&lt;br /&gt;import mx.controls.listClasses.BaseListData;&lt;br /&gt;import mx.controls.listClasses.IDropInListItemRenderer;&lt;br /&gt;import mx.controls.listClasses.IListItemRenderer;&lt;br /&gt;import mx.core.mx_internal;&lt;br /&gt;import mx.events.FlexEvent;&lt;br /&gt;&lt;br /&gt;use namespace mx_internal;&lt;br /&gt;&lt;br /&gt;public class CheckBoxRenderer extends CheckBox&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CheckBoxRenderer()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 데이터 변경 확인 플래그&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var dataChanged:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Properties&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; override public function set data(value:Object):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.data = value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dataChanged)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataChanged = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updateProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; currentIcon.x = (unscaledWidth - currentIcon.width) / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; CheckBox의 속성을 변경&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function updateProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(listData.label == "Y")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invalidateDisplayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Override EventHandler&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function clickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.clickHandler(event);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //data[DataGridListData(listData).dataField] = selected ? "Y" : "N";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selected)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = "Y";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data[DataGridListData(listData).dataField] = "N";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;currentIcon이라는 생소한 속성을 위에서 보실 수 있습니다. 그것은 체크박스에서 체크되는 아이콘을 지칭합니다. 그 currentIcon이란 녀석은 mx_internal이라는 접근자를 이용하고 있고 LanguageReference에는 표시되지 않고 있어서 그 존재를 모르는 사람이 많습니다.&lt;/P&gt;&lt;P&gt;예전에 저도 그것을 몰라서 HBox에다가 넣고 horizontalAlign="center"를 주는 바보같은 짓을 일삼았는데 이 사실을 알고 난뒤에 Container를 사용하지 않고 좀더 가볍게 itemRenderer를 만들어 낼 수 있었지요.&lt;/P&gt;&lt;P&gt;&lt;br /&gt;그래서 updateDisplayList() 메서드에서 좌표를 잡아서 셀의 중앙에 놓고 clickHandler라는 메서드를 확장하여 변경된 값을 data에 반영하게 합니다. 그렇게 되면 아래와 같은 결과물이 나오게 되지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XNXamY22iP.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XNXamY22iP.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오. 그럴싸하게 작동하는 것 같습니다만 몇가지 아쉬운점이 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. "Y", "N" 값으로만 작동하게 되어있다.&lt;/P&gt;&lt;P&gt;2. CheckBox를 클릭하면 뭔가 다른 행동을 하고 싶을땐 어떻게 하나.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 두가지 사항인데요.&lt;/P&gt;&lt;P&gt;이 부분에 대해서는 다음시간에 알아보도록 해요~&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-2399666603298374397?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/2399666603298374397/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=2399666603298374397&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2399666603298374397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2399666603298374397'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/flex-datagrid-itemrenderer-2-%EC%A0%84%EB%A9%B4%EC%A0%84.html' title='Flex DataGrid ItemRenderer #2 - 전면전'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-3809717592226734091</id><published>2010-03-17T10:42:00.000+09:00</published><updated>2011-01-11T21:59:09.224+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataGridItemRenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='itemRenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='DataGrid'/><category scheme='http://www.blogger.com/atom/ns#' term='아이템렌더러'/><category scheme='http://www.blogger.com/atom/ns#' term='데이터그리드'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex DataGrid ItemRenderer #1 - 전초전</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;사실 Flex를 개발하다보면 DataGrid를 밥먹듯이 사용하는 경우가 많지요.&lt;/P&gt;&lt;P&gt;하지만 모두가 알다시피 DataGrid를 이용하는데 있어서 가장 큰일이 바로 아이템렌더러를 만드는 것일지도 모르겠습니다.(모르는게 아니에요. 당연할거라고 생각하고 있습니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;하지만 아이템렌더러.. 만들기 쉽지 않습니다.&lt;/P&gt;&lt;P&gt;저는 심지어 이런 코드도 봤지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; import mx.collection.ArrayCollection;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Bindable]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var ac:ArrayCollection = new ArrayCollection([&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {check: true, description: "test1"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {check: true, description: "test1"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {check: true, description: "test1"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {check: true, description: "test1"},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {check: true, description: "test1"}]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid dataProvider="{ac}"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn dataField="check"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;mx:CheckBox /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;/mx:Component&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;/mx:itemRenderer&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:DataGridColumn&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:DataGridColumn dataField="description" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;이렇게 하면 아래처럼 나오긴 하겠지요.&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XYKduaDZwS.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XYKduaDZwS.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;하지만 문제는 아다시피 저기서 아무리 체크박스를 눌러대도 실데이터는 바뀌지 않는다는 사실입니다.&lt;/P&gt;&lt;P&gt;그 다음에 밀려오는 문제는 "데이터가 변하지 않아요? 어쩌죠?" 하는 질문을 올려서 답변을 받아보거나 책을 찾아보거나 뭐.. 여러가지 행동들을 할 수 있을테지만 문제는 늘 그렇듯 근본적인 해결이 되지 않는 다는 사실입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Flex 프로젝트를 1년간 11개나 해치워보니 알 수 있는건 당연하게도 매번 아이템 렌더러를 그때 그때마다 새로 만든다는게 엄청나게 귀찮은 일이었고 화면설계서를 받아보면 경악하여 기획자와 디자이너를 닥달하며 "구현이 불가능한 기능"이라는 사실을 강조하고 화면설계를 수정하자 요구 했었습니다.&lt;/P&gt;&lt;P&gt;사실 뭐.. 프로젝트에 투입되고 본격적인 개발이 시작되고 난뒤 약 40%정도의 시간을 그렇게 설득하고 우회하는 방법을 찾느라 소비했지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그렇다면 근본적인 해결점을 찾아보는 것이 어떻지 고민해보는 것이 좋겠다 싶었습니다.&lt;/P&gt;&lt;P&gt;괜찮은 아이템 렌더러를 만들어 놓고 앞으로 계속해서 이용하는 것이지요. 일단 그런 아이템 렌더러를 만들기 위해서는 데이터 그리드가 어떻게 만들어졌는지 알아야 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XIECbP2PeU.png" style="width:615px;height:340px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;데이터 그리드의 구조 입니다.&lt;/P&gt;&lt;P&gt;전체적으로 각 객체의 컨트롤을 맡고 있는 DataGrid 상위 객체 안에 DataGridColumn들이 Array형태로 들어가 있고 DataGridColumn 안에 Header와 ItemRenderer가 같이 들어있습니다.&lt;/P&gt;&lt;P&gt;(단순하게 표현하면 그렇다는 거지요.. 실제로는 더 까다롭고 복잡한 구조입니다..)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 저정도만 알고 있으면 우리가 만들려는 DataGridItemRenderer가 어떤 놈인지 mx 패키지에서 확인해볼 필요가 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XcCqc7GY6L.png" style="width:496px;height:145px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;TextField군요.. DataGridRenderer를 확장해서는 버튼이나 콤보박스같은건 넣을 수가 없겠다고 판단됩니다. 그럼 결국 DataGridItemRenderer에서 몇가지 인터페이스 클래스를 구현하여 아이템 렌더러를 만들어 내지요. 뭐. 저것도 사람이 만든건데 우리라고 만들지 말란법은 없으니까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 구현해야할 인터페이스 클래스는 IDataRenderer, IDropInListItemRenderer, IListItemRenderer 이렇게 3가지면 괜찮습니다. ILayoutManagerClient나 IStyleClient는 왜 구현하지 않냐고 물어보시면 &amp;nbsp;우리는 UIComponent를 상속받아 아이템 렌더러를 만들것이기 때문이라고 말씀드리고 싶습니다.&lt;/P&gt;&lt;P&gt;왜냐하면 UIComponent는 ILayoutManagerClient나 IStyleClient를 구현하고 있기 때문이지요.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XUVf3AkfTW.png" style="width:387px;height:296px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이러한 연유로 IDataRenderer, IDropInListItemRenderer, IListItemRenderer 이렇게 3가지 인터페이스만 구현해 볼까 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;중요한 첫번째 내용이 끝이 났어요.&lt;/P&gt;&lt;P&gt;두번째 내용은 Flex의 UIComponent의 라이프 사이클(Life Cycle)에 대해 알아야할 순서입니다.&lt;/P&gt;&lt;P&gt;UIComponent의 Protect 접근자 클래스를 잘 이해해야하는데요.&lt;/P&gt;&lt;P&gt;그 중에서도 특히 updateDisplayList() 메서드와 createChildren()메서드. 그리고 commitProperties() 메서드를 잘 이해해야합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XV8mKa1sTX.png" style="width:640px;height:448px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XV8mKa1sTX.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이 updateDisplayList라는 메서드는 자식객체를 그리거나 혹은 자식객체의 사이즈나 위치를 변경할 때 사용됩니다. 그리고 Flex에서 이 메서드를 호출하기 위해서는 invalidateDisplayList()라는 메서드를 호출하거나 자식객체를 addChild할때 실행되게 되어있는 메서드입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;한마디로 자식객체에 변경이 생겨서 새로 화면을 그려내야할때 사용되는 녀석인데요.&lt;/P&gt;&lt;P&gt;자칫 잘못하면 본의아니게 계속해서 호출해 시스템을 다운시키는 원인이 될 수 있으니 조심히 사용해야합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XFVLykUFrR.png" style="width:640px;height:286px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XFVLykUFrR.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;자식객체를 생성할때 호출하는 녀석으로 컨포넌트를 최초에 생성시킬때 한번 호출되고 다음부터는 고의로 호출하지 않는이상 호출되지 않는 메서드입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYZcawhGOB.png" style="width:640px;height:257px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XYZcawhGOB.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;commitProperties 메서드는 자식객체를 addChild()하거나 invalidateProperties() 에서드를 호출하면 실행되는 메서드로 이때 자식객체의 프로퍼티를 지정하고 변경값을 적용하는 역할을 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이정도만 알고 있으면 어느정도 아이템렌더러를 만들 수 있는 구색은 갖춰졌습니다.&lt;/P&gt;&lt;P&gt;다음시간에 본격적으로 시작해 보도록 할까요?&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-3809717592226734091?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/3809717592226734091/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=3809717592226734091&amp;isPopup=true' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3809717592226734091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3809717592226734091'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/flex-datagrid-itemrenderer-1-%EC%A0%84%EC%B4%88%EC%A0%84.html' title='Flex DataGrid ItemRenderer #1 - 전초전'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-5069434372092635821</id><published>2010-03-16T12:05:00.000+09:00</published><updated>2011-01-11T21:59:07.922+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='save()'/><category scheme='http://www.blogger.com/atom/ns#' term='Camera'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='save'/><category scheme='http://www.blogger.com/atom/ns#' term='filereference'/><title type='text'>FileRefernce는 뭔가요? #3</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;이번시간엔 FileReference.save()메서드가 무엇인지 알아보는 시간을 가져보려고 합니다.&lt;/P&gt;&lt;P&gt;이 기능은 지난번에 말씀드렸다시피 Flash Player 10에서 부터 지원되는 기능으로&lt;/P&gt;&lt;P&gt;Flex SDK 3.3 이후 버젼에서만 작동이 가능하며 Flash CS3에서 이기능을 이용하고 싶으시다면&lt;/P&gt;&lt;P&gt;업데이트를 받으셔야 합니다.(CS4에서는 기본 탑재입니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아, 그리고 Flex SDK로 save기능을 사용하고 싶으시다면 [SDK 경로]\framework\flex-config.xml 파일을 열어서 아래와 같이 수정해줘야 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;!-- Specifies the minimum player version that will run the compiled SWF. --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;!-- 9.0.124 is the April 2008 security release --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;target-player&amp;gt;10.0.0&amp;lt;/target-player&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;Flash Player버젼은 10으로 바꿔주셔야만 save기능을 이용할 수 있습니다.&lt;/P&gt;&lt;P&gt;(원래는 9.0.124 버젼으로 되어있거든요)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;save라는 기능은 LanguageReference에서 이렇게 설명하고 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XGCNngwDYv.png" style="width:426px;height:48px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;사용자의 로컬 파일시스템에 파일을 저장하는 다이얼로그 파일을 열어준다는 건데요. 사실 뭐.. 무슨말인지 모르겠어서 save 메서드 관련 소스를 찾아보았습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아, Language Reference에서도 샘플소스가 있습니다.&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;var MyTextField:TextField = new TextField();&lt;br /&gt;var MyButtonField:TextField = new TextField();&lt;br /&gt;var MyFile:FileReference = new FileReference();&lt;br /&gt;&lt;br /&gt;MyTextField.border = true;&lt;br /&gt;MyTextField.type = TextFieldType.INPUT;&lt;br /&gt;&lt;br /&gt;MyButtonField.background = true;&lt;br /&gt;MyButtonField.backgroundColor = 0x339933;&lt;br /&gt;MyButtonField.x = 150;&lt;br /&gt;MyButtonField.height = 20;&lt;br /&gt;MyButtonField.text = "Click here to save";&lt;br /&gt;&lt;br /&gt;addChild(MyTextField);&lt;br /&gt;addChild(MyButtonField);&lt;br /&gt;MyButtonField.addEventListener(MouseEvent.CLICK, clickhandler);&lt;br /&gt;function clickhandler(e:MouseEvent): void {&lt;br /&gt;&amp;nbsp; &amp;nbsp; MyFile.save(MyTextField.text);&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이건 Flash에서 작동하는 코드니까요. 저는 저렴하게 Flash 툴없이 작동하게끔 코드를 손봤습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.net.FileReference;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldType;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyTextField.border = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyTextField.type = TextFieldType.INPUT;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.background = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.backgroundColor = 0x339933;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.x = 150;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.height = 20;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.text = "Click here to save";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(MyTextField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(MyButtonField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyButtonField.addEventListener(MouseEvent.CLICK, clickhandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var MyTextField:TextField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var MyButtonField:TextField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var MyFile:FileReference = new FileReference();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function clickhandler(e:MouseEvent): void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MyFile.save(MyTextField.text);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;이렇게 코딩하고 컴파일하면 아래와 같이 결과물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XT2CZfnSvB.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XT2CZfnSvB.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아무 글이나 쓰시고 click hear to save를 클릭하시면 왼쪽에 작성된 글이 save됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XFb2OXxawP.png" style="width:640px;height:370px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XFb2OXxawP.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;(글쓰고 저장하는 모습)&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xdb1GrWoX0.png" style="width:640px;height:144px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/Xdb1GrWoX0.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;(저장된 text파일 확인하는 모습)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;정상적으로 저장이 됩니다!&lt;/P&gt;&lt;P&gt;음.. 그럼 Text 파일만 저장하게 하면 왠지 아쉽잖아요.&lt;/P&gt;&lt;P&gt;그래서 곰곰히 생각하다 이미지 저장도 하면 괜찮겠다 싶어서 캠을 이용해 스크린샷을 찍게하는 걸 만들어보기로 했습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.BitmapData;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.display.StageAlign;&lt;br /&gt;import flash.display.StageScaleMode;&lt;br /&gt;import flash.events.MouseEvent;;&lt;br /&gt;import flash.media.Camera;&lt;br /&gt;import flash.media.Video;&lt;br /&gt;import flash.net.FileReference;&lt;br /&gt;import flash.utils.ByteArray;&lt;br /&gt;import mx.graphics.codec.PNGEncoder;&lt;br /&gt;&lt;br /&gt;public class CameraMain extends Sprite&lt;br /&gt;{ &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CameraMain()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setCamera();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setSaveButton();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var video:Video;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var saveBtn:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function setCamera():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var camera:Camera = Camera.getCamera();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (camera != null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; video = new Video(camera.width * 2, camera.height * 2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; video.attachCamera(camera);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; video.x = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; video.y = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(video);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //trace("You need a camera.");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function setSaveButton():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!saveBtn)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; saveBtn = new Sprite();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; saveBtn.x = video.x + video.width + 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; saveBtn.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(saveBtn);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = saveBtn.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF0000, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 80, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; saveBtn.addEventListener(MouseEvent.CLICK, saveClickHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function saveClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var bitmap:BitmapData = new BitmapData(video.width, video.height, false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bitmap.draw(video);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var pngEncoder:PNGEncoder = new PNGEncoder();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var ba:ByteArray = pngEncoder.encode(bitmap);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var fr:FileReference = new FileReference();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.save(ba, "cam_test.png");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;참고로 위의 코드는 웹캠을 이용한 소스로 웹캠이 없으면 작동하지 않습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;mx 패키지에서 제공하는 PNGEncoder 클래스를 이용해 PNG이미지를 저장하는 샘플입니다.&lt;/P&gt;&lt;P&gt;아래처럼 나온다면 성공!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XPhRu1QiW8.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XPhRu1QiW8.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;웹캠이 없으신 분을 위해 스크린샷을 조금 찍어서 보여드리지요 ㅎㅎ&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XKtn5HH8SM.png" style="width:564px;height:385px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XBXAihErwa.png" style="width:640px;height:421px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XBXAihErwa.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XLiWamEEnA.png" style="width:449px;height:382px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 확인하시면 되겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이것으로 FileReference는 끗!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다음번엔 무얼할까요? ㅋㅋ&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-5069434372092635821?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/5069434372092635821/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=5069434372092635821&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/5069434372092635821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/5069434372092635821'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/filerefernce%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94-3.html' title='FileRefernce는 뭔가요? #3'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-283743089252093055</id><published>2010-03-16T00:25:00.000+09:00</published><updated>2011-01-11T21:59:07.148+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='FIleReference.download()'/><category scheme='http://www.blogger.com/atom/ns#' term='file download'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='filereference'/><title type='text'>FileRefernce는 뭔가요? #2</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;FileReference는 전에 말씀드렸다시피 사용자 PC와 서버사이의 파일 업로드, 다운로드를 할 수 있게해준다고 했는데요.&lt;/P&gt;&lt;P&gt;일단 지난시간엔 업로드에 대해 알아봤었는데 이번시간에 다운로드를 해볼까 합니다.&lt;/P&gt;&lt;P&gt;다운로드를 하기 위해선 일단 파일이 필요하지요.&lt;/P&gt;&lt;P&gt;지난번에 우리가 만들었던 php 파일을 조금 수정할까 합니다.&lt;/P&gt;&lt;P&gt;업로드를 한 파일에 대해 서버경로를 보여줄 수 있게 해주는 거지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$errors = array();&lt;br /&gt;$data = "";&lt;br /&gt;$success = "true";&lt;br /&gt;$uploadURL = "";&lt;br /&gt;&lt;br /&gt;function return_result($success,$errors,$data,$uploadURL)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo("&amp;lt;?xml version=\"1.0\" encoding=\"utf-8\"?&amp;gt;");&lt;br /&gt;&amp;nbsp; &amp;nbsp; ?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;results&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;success&amp;gt;&amp;lt;?=$success;?&amp;gt;&amp;lt;/success&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;?=$data;?&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;?=echo_errors($errors);?&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;upload_url&amp;gt;&amp;lt;?=$uploadURL;?&amp;gt;&amp;lt;/upload_url&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/results&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;?&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function echo_errors($errors)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; for($i=0;$i&amp;lt;count($errors);$i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;error&amp;gt;&amp;lt;?=$errors[$i];?&amp;gt;&amp;lt;/error&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;?&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;switch($_REQUEST['action'])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; case "upload":&lt;br /&gt;&amp;nbsp; &amp;nbsp; $file_temp = $_FILES['file']['tmp_name'];&lt;br /&gt;&amp;nbsp; &amp;nbsp; $file_name = iconv("UTF-8", "EUC-KR", $_FILES['file']['name']);&lt;br /&gt;&amp;nbsp; &amp;nbsp; $file_path = $_SERVER['DOCUMENT_ROOT']."/upload";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //checks for duplicate files&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(!file_exists($file_path."/".$file_name))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //complete upload &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $filestatus = move_uploaded_file($file_temp,$file_path."/".$file_name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $uploadURL = "/upload/".$file_name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!$filestatus)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $success = "false";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array_push($errors,"Upload failed. Please try again.");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $success = "false";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array_push($errors,"File already exists on server.");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; default:&lt;br /&gt;&amp;nbsp; &amp;nbsp; $success = "false";&lt;br /&gt;&amp;nbsp; &amp;nbsp; array_push($errors,"No action was requested.");&lt;br /&gt;}&lt;br /&gt;return_result($success,$errors,$data, $uploadURL);&lt;br /&gt;?&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;중간에 보면 "$uploadURL = "/upload/".$file_name;" 이라고 하는 구절 보이시나요? 42번째 라인입니다.&lt;/P&gt;&lt;P&gt;그리고 return_result 함수에 파라미터가 하나 늘었습니다. 이 이유는 업로드를 하고 난뒤에 어떤 경로로 업로드가 됐는지 알려주기 위해서 입니다. 일단 다운로드를 하려면 업로드가 되어야하니깐요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그럼 Flex 코드도 좀 수정해보도록 하지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.MouseEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.DataEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.Event;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.IOErrorEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.ProgressEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.FileReference;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLRequest;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLVariables;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLRequestMethod;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private const HOST:String = http://127.0.0.1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private const UPLOAD_HOST:String = "/upload.php";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private var fr:FileReference;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private var downloadAdd:String;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function configureListeners():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(IOErrorEvent.IO_ERROR, frIOErrorHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(ProgressEvent.PROGRESS, frProgressHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, frDataUploadCompleteHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(Event.SELECT, frSelectHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function selectBtnClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!fr)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr = new FileReference();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; configureListeners();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // File 선택 창 띄우기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.browse();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function uploadBtnClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var requestData:URLVariables = new URLVariables();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestData.action = "upload";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var request:URLRequest = new URLRequest(HOST + UPLOAD_HOST);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.method = URLRequestMethod.POST;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.data = requestData;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.upload(request, "file");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frSelectHandler(event:Event):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uploadBtn.enabled = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileName_lb.text = fr.name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileSize_lb.text = fr.size + "bytes";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileType_lb.text = fr.type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch(e:Error)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //파일 다운로드시에는 get size() 프로퍼티 요청시 exception 에러 발생&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frIOErrorHandler(event:IOErrorEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("File upload IO Error 발생.", "Error");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frProgressHandler(event:ProgressEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; progress.setProgress(event.bytesLoaded, event.bytesTotal);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frDataUploadCompleteHandler(event:DataEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trace(event.data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var xmlData:XML = new XML(event.data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xmlData.success == "true")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("File Upload Complete", "Success");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; downloadAdd = xmlData.upload_url;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; downloadBtn.enabled = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show(xmlData.error, "Error");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function downloadClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var request:URLRequest = new URLRequest(HOST + downloadAdd);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.download(request);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Panel title="File Upload Sample" width="350" height="300" paddingTop="5" paddingBottom="5" paddingRight="5" paddingLeft="5"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:VBox width="100%" height="100%"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Form&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormHeading label="File Information" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Name : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileName_lb" width="150" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Size : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileSize_lb" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Type : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileType_lb" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:Form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:ProgressBar id="progress" width="100%" direction="right" mode="manual" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:HBox width="100%" horizontalAlign="right"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Button id="selectBtn" label="select File" click="selectBtnClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Button id="uploadBtn" label="upload File" enabled="false" click="uploadBtnClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Button id="downloadBtn" label="download File" enabled="false" click="downloadClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와 같이 코딩을 하면 아래와 같은 화면이 등장하게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XSq6egwrcC.png" style="width:516px;height:433px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"download File"이라는 버튼도 새로 생겼고 Panel의 사이즈도 좀 늘어났고 중요한건 파일 업로드가 성공했을 때 돌아오는 xml값도 조금 바뀐다는 사실.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &amp;lt;results&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;success&amp;gt;true&amp;lt;/success&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;upload_url&amp;gt;/upload/Kingnare.zip&amp;lt;/upload_url&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/results&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;기존에는 success여부만 넘어오던것이 업로드된 경로도 같이 반환하게 되었습니다. &lt;/P&gt;&lt;P&gt;download File을 클릭하게 되면 방금 업로드한 파일을 다시 받아올 수 있게 한것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그래서 download File을 클릭하게 되면 아래와 같은 화면이 등장하게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xe8eF2TEBs.png" style="width:640px;height:510px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/Xe8eF2TEBs.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;그리고 "저장"버튼을 누르게 되면 다운로드를 진행하게 하는데 이때 ProgressEvent가 발생하면서 ProgressBar가 다운로드 받는 양을 표시하게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;FileReference의 꽃 save() 메서드가 남았습니다.&lt;/P&gt;&lt;P&gt;이 기능은 Flash Player 10이 나오면서 등장한 기능으로 SDK가 최신 버젼이 아니면 사용할 수가 없습니다.&lt;/P&gt;&lt;P&gt;아, 물론 Flash Player도 버젼이 10이 되어야겠지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다음 시간엔 FileReference.save() 를 알아보도록 하겠습니다.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-283743089252093055?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/283743089252093055/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=283743089252093055&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/283743089252093055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/283743089252093055'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/filerefernce%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94-2.html' title='FileRefernce는 뭔가요? #2'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-6009216982384326261</id><published>2010-03-15T15:49:00.000+09:00</published><updated>2011-01-11T21:59:06.420+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fileupload'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='filereference'/><title type='text'>FileRefernce는 뭔가요? #1</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;사실 이 블로그를 만들면서 스스로 다짐한것이 하루에 꼭 하나씩은 블로깅하자.&lt;/P&gt;&lt;P&gt;단, 주말은 쉬자. 였는데 지난주 목요일에 하루쉬는 바람에 오늘은 두개를 올려야겠다고 생각했습니다.&lt;/P&gt;&lt;P&gt;그래서 시작합니다. FileReference.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;간혹 Flash에서 파일을 업로드하는 기능이 있는지 궁금해 하시는 분들이나&lt;/P&gt;&lt;P&gt;파일업로드를 어떻게 하는지 질문하시는 분들이 종종 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이 두가지 질문에 대해서 답변드리자면&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1번. 업로드가 가능합니다.&lt;/P&gt;&lt;P&gt;2번. 서버사이드 언어(php, jsp, asp 와 같은..)로 파일을 업로드 할 수 있는 서블릿 파일에 접속하여 파일을 업로드 할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;라고 말씀 드릴 수 있지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그럼 일단 FileReference에 대해 Language Reference에서는 뭐라고 하는지 찾아보도록 할까요?&lt;/P&gt;&lt;P&gt;Language Reference에서 제공된 내용중 제일 처음 언급된 내용은 아래와 같습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: 13px" class=Apple-style-span&gt;The FileReference class provides a means to upload and download files between a user's computer and a server&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#ff6600&gt;FileReference 클래스는 사용자의 컴퓨터와 서버사이의 파일 업로드와 다운로드 수단을 제공합니다.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;느낌이 오시나요? FileReference는 업로드, 다운로드등등등을 제공합니다.&lt;/P&gt;&lt;P&gt;오. 괜찮군요. 오늘은 일단 한번 업로드만 해보도록 할께요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;업로드는 몇가지 준비물이 있습니다. 아까 말했던 파일을 업로드할 수 있는 서블릿 파일. 그리고 테스트 환경을 만들기 위한 로컬 서버 구축이 그것이지요.&lt;/P&gt;&lt;P&gt;아! 로컬 서버 구축 어려운거 아닌가? 라고 생각하실지 모르겠지만 5분만에 만들수가 있습니다.&lt;/P&gt;&lt;P&gt;APM(Aphach PHP, MySQL)이라는 것 때문이지요. &lt;A href="http://www.apmsetup.com/" target=_blank&gt;여기&lt;/A&gt;에 가보시면 APMSETUP이라는 프로그램을 받을 수가 있습니다. 로컬서버를 자동으로 만들어주는 프로그램이지요. Aphach와 PHP, 그리고 MySQL을 자동으로 설치해주고 셋팅해줍니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;a href="http://www.apmsetup.com/" target="_blank"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XKZaEXm6UD.png" style="width:320px;height:197px;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다운로드 경로 : &lt;A href="http://kldp.net/frs/download.php/5636/APMSETUP7_2010010300.exe"&gt;http://kldp.net/frs/download.php/5636/APMSETUP7_2010010300.exe&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다운로드를 받고 설치해보도록합시다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XPvggKy5AY.png" style="width:585px;height:358px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;계속 "다음"을 클릭하고 "동의함"을 클릭하면 알아서 죄다 설치하고 셋팅을 합니다.&lt;/P&gt;&lt;P&gt;그리고 아래와 같은 창을 띄우지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XeyDYhkZW2.png" style="width:640px;height:323px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XeyDYhkZW2.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XfXA7fEzJu.png" style="width:585px;height:358px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XDR4NFmpFe.png" style="width:89px;height:82px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;이런 창들이 뜨고 작업표시줄 Tray에 AMP 아이콘이 떴다면 일단 설치가 완료되었다고 보시면 됩니다.&lt;/P&gt;&lt;P&gt;요녀석이 제대로 작동하는지 보고 싶으시다면 저 Tray 아이콘을 더블클릭해서&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XHHyhoGLk4.png" style="width:349px;height:270px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와같은지 확인해보고 브라우져를 띄워서 127.0.0.1을 입력합니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XQTyHNiZbA.png" style="width:609px;height:589px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위의 화면이 나왔다면 로컬 서버 셋팅은 완료되었습니다.&lt;/P&gt;&lt;P&gt;그리고 아래와 같은 php파일을 만드시면 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code php]&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$errors = array();&lt;br /&gt;$data = "";&lt;br /&gt;$success = "true";&lt;br /&gt;function return_result($success,$errors,$data) {&lt;br /&gt;echo("&amp;lt;?xml version=\"1.0\" encoding=\"utf-8\"?&amp;gt;");&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;results&amp;gt;&lt;br /&gt;&amp;lt;success&amp;gt;&amp;lt;?=$success;?&amp;gt;&amp;lt;/success&amp;gt;&lt;br /&gt;&amp;lt;?=$data;?&amp;gt;&lt;br /&gt;&amp;lt;?=echo_errors($errors);?&amp;gt;&lt;br /&gt;&amp;lt;/results&amp;gt;&lt;br /&gt;&amp;lt;?&lt;br /&gt;}&lt;br /&gt;function echo_errors($errors) {&lt;br /&gt;for($i=0;$i&amp;lt;count($errors);$i++) {&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;error&amp;gt;&amp;lt;?=$errors[$i];?&amp;gt;&amp;lt;/error&amp;gt;&lt;br /&gt;&amp;lt;?&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;switch($_REQUEST['action']) {&lt;br /&gt;case "upload":&lt;br /&gt;$file_temp = $_FILES['file']['tmp_name'];&lt;br /&gt;$file_name = iconv("UTF-8", "EUC-KR", $_FILES['file']['name']);&lt;br /&gt;$file_path = $_SERVER['DOCUMENT_ROOT']."/upload";&lt;br /&gt;//checks for duplicate files&lt;br /&gt;if(!file_exists($file_path."/".$file_name)) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; //complete upload &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; $filestatus = move_uploaded_file($file_temp,$file_path."/".$file_name);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; if(!$filestatus) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; $success = "false";&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; array_push($errors,"Upload failed. Please try again.");&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;$success = "false";&lt;br /&gt;array_push($errors,"File already exists on server.");&lt;br /&gt;}&lt;br /&gt;break;&lt;br /&gt;default:&lt;br /&gt;$success = "false";&lt;br /&gt;array_push($errors,"No action was requested.");&lt;br /&gt;}&lt;br /&gt;return_result($success,$errors,$data);&lt;br /&gt;?&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이 소스를 만들고 공개해주신 Cahlan 님께 감사합니다.&lt;/P&gt;&lt;P&gt;(Thanks Cahlan. Your source was very useful for me.)&lt;/P&gt;&lt;P&gt;원본 링크 : &lt;A href="http://weblog.cahlan.com/2006/09/uploading-files-with-flex-and-php.html"&gt;http://weblog.cahlan.com/2006/09/uploading-files-with-flex-and-php.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;중간에 iconv 함수를 이용해서 UTF-8의 문자셋으로 되어있는 파일명을 EUC-KR로 바꿔주는데요. 이는 APMSETUP으로 구축된 서버는 EUC-KR 문자셋으로 되어있기 때문입니다. (이걸 UTF-8로 바꿔주고 싶은데 서버쪽은 전혀.. 문외한이라;; 누구 아시는 분 없으신가요??)&lt;/P&gt;&lt;P&gt;어쨌든 이렇게 서블릿 파일도 만들어졌겠다 ActionScript 작업만 하면되겠습니다.&lt;/P&gt;&lt;P&gt;음.. 오늘은 Flex로 작업해야겠어요. 아무래도 UI 만드는 작업이 오래걸려서;;&lt;/P&gt;&lt;P&gt;아, 물론 ActionScript로 업로드하는건 Flash에서도 동일하게 적용됩니다.&lt;/P&gt;&lt;P&gt;UI 인터렉션만 Flex라고 생각하시면 되요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;업로드 샘플은 아래와 같습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.MouseEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.DataEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.Event;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.IOErrorEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.ProgressEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.FileReference;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLRequest;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLVariables;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.net.URLRequestMethod;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private const UPLOAD_HOST:String = "http://127.0.0.1/upload.php";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private var fr:FileReference;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function configureListeners():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(IOErrorEvent.IO_ERROR, frIOErrorHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(ProgressEvent.PROGRESS, frProgressHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, frDataUploadCompleteHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.addEventListener(Event.SELECT, frSelectHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function selectBtnClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!fr)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr = new FileReference();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; configureListeners();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // File 선택 창 띄우기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.browse();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function uploadBtnClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var requestData:URLVariables = new URLVariables();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestData.action = "upload";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var request:URLRequest = new URLRequest(UPLOAD_HOST);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.method = URLRequestMethod.POST;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.data = requestData;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fr.upload(request, "file");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frSelectHandler(event:Event):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uploadBtn.enabled = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileName_lb.text = fr.name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileSize_lb.text = fr.size + "bytes";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileType_lb.text = fr.type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frIOErrorHandler(event:IOErrorEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("File upload IO Error 발생.", "Error");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frProgressHandler(event:ProgressEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; progress.setProgress(event.bytesLoaded, event.bytesTotal);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function frDataUploadCompleteHandler(event:DataEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var xmlData:XML = new XML(event.data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xmlData.success == "true")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show("File Upload Complete", "Success");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show(xmlData.error, "Error");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Panel title="File Upload Sample" width="300" height="300" paddingTop="5" paddingBottom="5" paddingRight="5" paddingLeft="5"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:VBox width="100%" height="100%"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Form&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormHeading label="File Information" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Name : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileName_lb" width="150" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Size : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileSize_lb" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:FormItem label="File Type : "&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Label id="fileType_lb" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:Form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:ProgressBar id="progress" width="100%" direction="right" mode="manual" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:HBox width="100%" horizontalAlign="right"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Button id="selectBtn" label="select File" click="selectBtnClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mx:Button id="uploadBtn" label="upload File" enabled="false" click="uploadBtnClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;아, 깜빡하고 말을 안했는데 APMSetup이 설친된 폴더에 가보시면 "htdocs"이라는 디렉토리가 있습니다.&lt;/P&gt;&lt;P&gt;그 안에 upload.php라고 만들어두면 http://127.0.0.1/upload.php 로 접근이 가능해집니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XK2shhw0DM.png" style="width:519px;height:203px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그리고 upload라고 디렉토리를 만들어둡니다. 그럼 업로드를 해볼까요?&lt;/P&gt;&lt;P&gt;일단 swf를 실행하면 아래와 같은 화면이 나옵니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XfwKXxmbd9.png" style="width:365px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;음.. 그럴싸한데요 ㅎ&lt;/P&gt;&lt;P&gt;select File 버튼을 클릭하게 되면 36번째 행의 FileReference.browse() 메서드가 실행되면서&amp;nbsp; 아래와 같은 화면이 나타나게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XR5gsKhjYv.png" style="width:640px;height:373px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XR5gsKhjYv.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오! 왠지 파일을 업로드 할 수 있을것만 같은 화면이 등장합니다.&lt;/P&gt;&lt;P&gt;일단 아무파일이나 선택해볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;저는 sample_1.swf 이라는 파일을 선택했습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XcNZnnUprU.png" style="width:365px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;선택함과 동시에 FileReference.name, FileReference.size, FileReference.type 속성을 읽어와 화면에 표시해주지요. 일단 업로드할 파일도 만들었으니 업로드 한번 해볼까요? upload File 버튼을 클릭합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XTAT3aFDwd.png" style="width:365px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XRR0Cg3adt.png" style="width:365px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;와우! 파일 업로드에 성공했습니다!&lt;/P&gt;&lt;P&gt;업로드 된 파일은 아까 만들었던 upload 디렉토리에 저장되게 됩니다.&lt;/P&gt;&lt;P&gt;한번 확인해볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XVVwUDgUVc.png" style="width:496px;height:183px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;성공적이군요!&lt;/P&gt;&lt;P&gt;파일 업로드는 소스를 보시면서 천천히 분석해보시면 될것 같습니다.&lt;/P&gt;&lt;P&gt;서버사이드와 붙어서 작업되는거라 처음 하시는 분들은 겁을 먹고 어렵지 않을까 고민하시는 분들이 많지만&lt;/P&gt;&lt;P&gt;사실은 별거 없습니다. 모두들 한번씩 도전해 보시는 것이 어떨까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다음 시간은 FileReference.download 메서드에 대해 한번 알아보는 시간을 가져볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s FileFilter라는 클래스가 있는데 여기에 대해서는 개인적으로 알아보는 시간이 있으셨으면 좋겠어요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-6009216982384326261?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/6009216982384326261/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=6009216982384326261&amp;isPopup=true' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/6009216982384326261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/6009216982384326261'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/filerefernce%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94-1.html' title='FileRefernce는 뭔가요? #1'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1243157345350211440</id><published>2010-03-15T12:45:00.000+09:00</published><updated>2011-01-11T21:59:05.726+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interpolate'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='point'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Point 클래스의 미학 #3</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;Point 클래스의 마지막 시간입니다.&lt;/P&gt;&lt;P&gt;오늘은 interpolate의 사용하는 방법에 대해 설명하려고 합니다만&lt;/P&gt;&lt;P&gt;요 메서드가 어떤 역할을 하는지가 한번 살펴보도록해요.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XdLbo20J7O.png" style="width:335px;height:44px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;음. static 함수고 두점사이의 sepcified를 밝힌다고 써있는데 이 이야기가 무어냐.. 하면&lt;/P&gt;&lt;P&gt;두 접사이의 비율지점을 알려준다는 이야기입니다. "악 영어로도 모르겠고 한글로 풀어도 모르겠다!" 라고 한다면 한번 예제를 만들어 볼까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.KeyboardEvent;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.geom.Point;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;import flash.text.TextFieldType;&lt;br /&gt;import flash.ui.Keyboard;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Costructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createCircle();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createTextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var cir1:Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var cir2:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var cir3:Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var textField:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var betweenRatio:Number = 0.5;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods : About Object Create..&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; TextField 만들기&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createTextField():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!textField)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.x = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.width = 150;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.height = 20;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTextFieldProperties(textField, TextFieldType.INPUT, TextFieldAutoSize.NONE, true);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.text = "";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(textField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 원을 그려서 화면에 붙이기&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createCircle():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!cir1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir1 = new Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drawCircle(cir1, 0xFF0000);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir1.x = 20;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir1.y = 100;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir1.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(cir1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!cir2)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir2 = new Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drawCircle(cir2, 0x00FF00);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir2.x = 200;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir2.y = 100;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir2.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(cir2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!cir3)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir3 = new Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drawCircle(cir3, 0x0000FF);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var p:Point = Point.interpolate(new Point(cir1.x, cir1.y),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new Point(cir2.x, cir2.y),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.5);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir3.x = p.x;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir3.y = p.y;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(cir3);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 원을 그린다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; target &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 원을 그려낼 타겟&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; color &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 원의 색상(uint 형으로 입력)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; radius &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 원의 반지름(픽셀)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function drawCircle(target:Sprite, color:uint, radius:Number = 10):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = target.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(color, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawCircle(0, 0, 10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; TextField의 속성을 설정한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; textField &amp;nbsp; &amp;nbsp; &amp;nbsp; 속성을 설정할 TextField&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TextFieldType.INPUT 인지 TextFieldType.DYNAMIC 인지 결정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; autoSize &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TextFieldAutoSize를 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; background &amp;nbsp; &amp;nbsp;&amp;nbsp; 배경색을 보일지 안보일지 결정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; backgroundColor 배경색 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; multiline &amp;nbsp; &amp;nbsp; &amp;nbsp; multiline 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function setTextFieldProperties(textField:TextField,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type:String = "dynamic",&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; autoSize:String = "left",&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; background:Boolean = false,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; backgroundColor:uint = 0xFFFFFF,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; multiline:Boolean = false):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.type = type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.backgroundColor = backgroundColor; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.background = background;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.multiline = multiline;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.autoSize = autoSize;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods : About Point Move..&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; cir3의 좌표를 interpolate를 이용해 이동&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function movePoint():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var p:Point = Point.interpolate(new Point(cir1.x, cir1.y),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new Point(cir2.x, cir2.y),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; betweenRatio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir3.x = p.x;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cir3.y = p.y;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Event Handlers&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function keyDownHandler(event:KeyboardEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(event.keyCode == Keyboard.ENTER || !event)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //숫자 확인&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(isNaN(Number(textField.text)) ||&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Number(textField.text) &amp;gt; 1 ||&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Number(textField.text) &amp;lt; 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.text = "";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; betweenRatio = Number(textField.text);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movePoint();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function mouseUpHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sprite(event.currentTarget).stopDrag();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movePoint(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function mouseDownHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sprite(event.currentTarget).startDrag();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위와 같이 코딩하면 아래와 같은 결과물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XboADWS67k.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XboADWS67k.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;빨간 원과 녹색 원을 드래그해서 이동시키거나 혹은 TextField에 입력된 값에 따라서 그 가운데 파란점이 적절한 비율을 유지하며 빨간 원과 녹색원 사이에 배치되게 됩니다.&lt;/P&gt;&lt;P&gt;아, 여기서 TextField에 입력되는 값은 (0 &amp;lt;= x =&amp;lt; 1) &amp;nbsp;입니다. 그러면 interpolate 메서드의 f:Number값에 대입되어 비율을 계산하게 하는 것이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;interpolate에 대해서 조금 이해가 되셨는지 모르겠습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Point 클래스는 이정도 까지만 하구요.. Display 객체에 대해 좀더 다뤄볼까 하다가&lt;/P&gt;&lt;P&gt;통신쪽을 한번 다뤄보는게 좋겠구나 싶어서 다음시간엔 FileRefernce에 대해 알아보는 시간을 가져볼까 합니다.&lt;/P&gt;&lt;P&gt;기대하세용~&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1243157345350211440?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1243157345350211440/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1243157345350211440&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1243157345350211440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1243157345350211440'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/point-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EB%AF%B8%ED%95%99-3.html' title='Point 클래스의 미학 #3'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-8545744168099455692</id><published>2010-03-12T12:58:00.000+09:00</published><updated>2011-01-11T21:59:04.941+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DisplayObject'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='embed'/><category scheme='http://www.blogger.com/atom/ns#' term='metatag'/><title type='text'>저렴하게 디자인 요소 삽입하기</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;원래는 Point #3을 이야기 해야하는데 왠지 날도 꿀꿀하고 업무가 많아&lt;/P&gt;&lt;P&gt;간단하게 포스팅할 수 있는 것으로 뭐가 있을까 하다가&lt;/P&gt;&lt;P&gt;이미지 요소를 삽입하고 싶을때 어찌하면 좋을까 고민하시는 분들이 계실까봐 적어봅니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;보통 Flex에서는 별도의 디자인툴(Builder에서 제공하고 있긴합니다만...)이 없어서&lt;/P&gt;&lt;P&gt;이미지를 Flash에서처럼 삽입할 수 있을지에 대해서 고민하곤 합니다만&lt;/P&gt;&lt;P&gt;Flex SDK를 이용하시면 [Embed] 메타테그를 이용해 간단히 해결할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 보통 플렉스에서 개발할때는 이런식으로 코드를 넣지요?&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Embed(source="/assets/shutUp.jpg")]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private const DONT_DELETE:Class;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:Image source="{DONT_DELETE}" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;물론 로드방식으로 넣는것도 있지만 제목에서 보셨듯이 "삽입"하는거니까요.&lt;/P&gt;&lt;P&gt;암튼 이렇게 Embed해서 이미지를 넣어두면 아래와 같은 결과가 나옵니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XA38w3BYAO.png" style="width:640px;height:531px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XA38w3BYAO.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오호.. 그렇다면 Flex 를 이용하지 않고 ActionScript에서는 어떻게 될까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.DisplayObject;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; [Embed(source="/assets/shutUp.jpg")]&lt;br /&gt;&amp;nbsp; &amp;nbsp; private const SHUT_UP:Class;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stage.align = "TL";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stage.scaleMode = "noScale";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createImage();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var shutUpImage:DisplayObject;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createImage():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutUpImage = new SHUT_UP();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(shutUpImage);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;위와 같이 코딩하면 되겠습니다. 결과화면은 아래 보시는 바와 같습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XEWECDWDcW.png" style="width:640px;height:515px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XEWECDWDcW.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그냥 [Embed] 메타테그를 이용하면 간편하지요.&lt;/P&gt;&lt;P&gt;아, 물론 이미지의 사이즈를 조정하려면 width와 height만으로도 충분히 제어가 가능합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;하지만 이런 질문이 들어올 수도 있습니다.&lt;/P&gt;&lt;P&gt;"Flash에서는 Embed 메타테그 따위는 없는데 어떻게 하느냐!"&lt;/P&gt;&lt;P&gt;라고 하신다면 사실 제 포스트는 "저렴한"개발이기 때문에 Flash와 같은 툴을 이용한다는건 본래취지와 어긋나는 관계로 모르겠다! 라고 하고 싶지만 그럴 수는 없으니 하나 소개시켜 드리자면&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Flash에서 Flex SDK의 라이브러리를 추가하여 [Embed] 테그를 이용할 수 있게끔 하는 방법을 소개해놓은 글이 있습죠.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;글을 찾은 곳 : &lt;A href="http://grotesq.tistory.com/104"&gt;http://grotesq.tistory.com/104&lt;/A&gt;&lt;/P&gt;&lt;P&gt;실재 링크 : &lt;A href="http://www.adobe.com/devnet/flash/articles/embed_metadata.html"&gt;http://www.adobe.com/devnet/flash/articles/embed_metadata.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이것을 이용하면 Flash에서도 메타테그를 사용할 수 있습니다.&lt;/P&gt;&lt;P&gt;멋지지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;담시간에 Point 마지막 시간을 갖도록 해요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-8545744168099455692?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/8545744168099455692/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=8545744168099455692&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8545744168099455692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8545744168099455692'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/%EC%A0%80%EB%A0%B4%ED%95%98%EA%B2%8C-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%9A%94%EC%86%8C-%EC%82%BD%EC%9E%85%ED%95%98%EA%B8%B0.html' title='저렴하게 디자인 요소 삽입하기'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-3678187570868439303</id><published>2010-03-10T14:41:00.000+09:00</published><updated>2011-01-11T21:59:04.269+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Point 클래스'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='액션스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='point'/><category scheme='http://www.blogger.com/atom/ns#' term='Point.polar'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Point 클래스의 미학 #2</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;Point 클래스가 할 수있는 일은 정말 다양합니다.&lt;/P&gt;&lt;P&gt;특히나 제 생각엔 polar() 메서드 같은경우가 그렇습니다.&lt;/P&gt;&lt;P&gt;polar() 메서드엔 2가지 파라미터가 필요한데 그것은 length, angle 입니다.&lt;/P&gt;&lt;P&gt;그림으로 설명하면 이렇게 되겠지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XMxqU9QdBn.png" style="width:204px;height:206px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XMxqU9QdBn.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Length는 0, 0에서 부터의 길이고 Angle은 보시는 것과 같이 중심점으로 부터의 "각"을 이야기 합니다. &lt;/P&gt;&lt;P&gt;polar() 메서드는 이 두가지 값을 이용해 하나의 Point를 만들어 내게 됩니다. 잘 모르시겠다면 예제를 만들어 보는게 좋을거 같습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘 예제는 좀 많이 길군요;;;;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.geom.Point;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.events.KeyboardEvent;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldType;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;import flash.ui.Keyboard;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Constructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; Contructor.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TextField 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createTextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createButton();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Variables&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; length 입력 텍스트필드&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var lengthField:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; angle 입력 텍스트 필드&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var angleField:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; spriteButton&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var spriteButton:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods : About Sprite Button..&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createButton():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!spriteButton)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton = new Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = spriteButton.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF0000, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 50, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.x = 400;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.buttonMode = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.useHandCursor = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.addEventListener(MouseEvent.ROLL_OVER, buttonRollOverHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.addEventListener(MouseEvent.ROLL_OUT, buttonRollOutHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.addEventListener(MouseEvent.MOUSE_DOWN, buttonDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spriteButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(spriteButton);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods : About TextField..&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; TextField 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createTextField():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // length 관련 TextField 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!lengthField)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // length 표시&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var lengthText:TextField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthText.text = "length : ";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthText.x = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthText.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTextFieldProperties(lengthText);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(lengthText);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // length 입력&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField = new TextField();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.x = lengthText.textWidth + 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.width = 150;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.height = 20;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTextFieldProperties(lengthField, TextFieldType.INPUT, TextFieldAutoSize.NONE, true);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.restrict = "0-9";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.text = "";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lengthField.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(lengthField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // angle 관련 TextField 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!angleField)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // angle 표시&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var angleText:TextField = new TextField();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleText.text = "angle : ";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleText.x = lengthField.x + lengthField.width + 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleText.y = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTextFieldProperties(angleText);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(angleText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // angle 입력&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.x = angleText.x + angleText.textWidth;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.width = 150;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.height = 20;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTextFieldProperties(angleField, TextFieldType.INPUT, TextFieldAutoSize.NONE, true);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.restrict = "0-9";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.text = "";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; angleField.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(angleField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; TextField의 속성을 설정한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; textField &amp;nbsp; &amp;nbsp; &amp;nbsp; 속성을 설정할 TextField&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TextFieldType.INPUT 인지 TextFieldType.DYNAMIC 인지 결정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; autoSize &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TextFieldAutoSize를 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; background &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;배경색을 보일지 안보일지 결정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; backgroundColor &amp;nbsp;배경색 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @param&amp;nbsp; multiline &amp;nbsp; &amp;nbsp; multiline 설정&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function setTextFieldProperties(textField:TextField,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type:String = "dynamic",&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; autoSize:String = "left",&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; background:Boolean = false,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; backgroundColor:uint = 0xFFFFFF,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; multiline:Boolean = false):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.type = type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.backgroundColor = backgroundColor;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.background = background;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.multiline = multiline;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.autoSize = autoSize;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; Methods : About Point polar Method..&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 라인 그리기&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function drawPoint():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cx:Number = stage.stageWidth / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cy:Number = stage.stageHeight /2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var length:Number = Number(lengthField.text);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var angle:Number = Number(angleField.text);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var p:Point;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p = Point.polar(length, (Math.PI * 2 * angle) / -360);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics=&amp;nbsp; this.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.lineStyle(1, 0x000000);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.moveTo(cx, cy);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.lineTo(cx + length, cy);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.moveTo(cx, cy);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.lineTo(p.x + cx, p.y + cy);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; EventHandler&lt;br /&gt;&amp;nbsp; &amp;nbsp; //&lt;br /&gt;&amp;nbsp; &amp;nbsp; //-----------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; TextField에서 Enter를 눌렀을때 처리&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function keyDownHandler(event:KeyboardEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(event.keyCode == Keyboard.ENTER)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drawPoint();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 버튼 이벤트 처리&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function buttonRollOverHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = Sprite(event.currentTarget).graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF5500);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 50, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 버튼 이벤트 처리&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function buttonRollOutHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = Sprite(event.currentTarget).graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF0000);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 50, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 버튼 이벤트 처리&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function buttonDownHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = Sprite(event.currentTarget).graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFFFF55);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 50, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; @private&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; *&amp;nbsp; 버튼 이벤트 처리&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function buttonClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = Sprite(event.currentTarget).graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF5500);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 50, 20);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; drawPoint();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;위의 코드의 산출물은 아래와 같습니다.&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XdZUIuHnmV.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XdZUIuHnmV.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;코드로만 다 그려내려니 많이 길어졌지만 기본적으로 Point의 polar 메서드를 이용해 정해진 길이와 각도로 그림을 그려낼 수 있게 하였습니다.&lt;/P&gt;&lt;P&gt;코드가 너무 길어져 주석을 달게 되었네요.. ㅎㅎ 뭐.. 개발자의 기본자세지요. 주석. 허허&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Point클래스에는 nomalize나 add, subtract, offset, interpolate같은 메서드들도 있으나 전부를 다루기엔 내용이 너무 많아지니 다음시간에 interpolate 메서드 까지만 하고 Point는 정리하는게 좋을 것 같습니다.ㅎㅎ&lt;/P&gt;&lt;P&gt;그럼 다음시간에 ㅎㅎ&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-3678187570868439303?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/3678187570868439303/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=3678187570868439303&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3678187570868439303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3678187570868439303'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/point-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EB%AF%B8%ED%95%99-2.html' title='Point 클래스의 미학 #2'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-3430671366394327412</id><published>2010-03-09T17:31:00.000+09:00</published><updated>2011-01-11T21:59:03.297+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flashvars'/><category scheme='http://www.blogger.com/atom/ns#' term='flashplayer'/><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='FlashPlayer parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><title type='text'>Flash Player로 SWF 실행할때 파라미터체크?</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;우리는 보통 HTML안에 SWF 를 삽입할 때 아래처럼 작성하곤하는데 &lt;P&gt; &lt;P&gt;[code html]&lt;br /&gt;&amp;lt;object width='100%' height='100%' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' id='test'&amp;gt;&lt;br /&gt;&amp;lt;param name='movie' value='test.swf'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='wmode' value='transparent'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='FlashVars' value='id=1590'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='allowScriptAccess' value='always'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;embed src='test.swf' type='application/x-shockwave-flash' wmode='transparent' width='100%' height='100%' allowScriptAccess='always'&amp;gt;&amp;lt;/embed&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&lt;br /&gt;[/code] &lt;P&gt; &lt;P&gt;중간에 FlashVars 라는 파라미터 값을 Command Line 상에서 Flash Player를 실행하면서 전달할 수 있을까 하는 점이 문제가 되어 테스트를 하게 되었습니다. 일단 아래의 Flex 소스를 위에 제시된 HTML 태그를 이용해 표시하는 것부터 테스트 해봐야 겠다고 생각해서.. &lt;P&gt; &lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" &lt;br /&gt;&amp;nbsp; &amp;nbsp; creationComplete="creationCompleteHandler(event)"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.events.FlexEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.controls.Alert;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.utils.ObjectUtil;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function creationCompleteHandler(event:FlexEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alert.show(ObjectUtil.toString(Application.application.parameters));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이런 Flex코드와 아래의 HTML 코드를 이용해 테스트 했습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code html]&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;object width='100%' height='100%' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' id='test'&amp;gt;&lt;br /&gt;&amp;lt;param name='movie' value='Main.swf'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='wmode' value='transparent'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='FlashVars' value='id=1590'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name='allowScriptAccess' value='always'&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;embed src='Main.swf' type='application/x-shockwave-flash' wmode='transparent' width='100%' height='100%' allowScriptAccess='always'&amp;gt;&amp;lt;/embed&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;결과는 성공.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XNWDM9wDaY.png" style="width:565px;height:440px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 값은 넘어가는게 확인 되었고.. Comman Line에서 값을 넘겨야할때는 어떻게 하느냐가 문제가 되었다.&lt;/P&gt;&lt;P&gt;여느 프로그램 실행시키듯 한번 추가해볼까..&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XJQ4s4izZd.png" style="width:401px;height:50px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XJQ4s4izZd.png')" /&gt;&lt;/div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XCcAEIyI0k.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;안된다.. 어쩐다.. 하면서 구글을 검색하다가 하나 걸린 것이 Flex Developer Guide의 어떤 한 페이지였습니다.&lt;/P&gt;&lt;P&gt;&lt;A href="http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_3.html"&gt;http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_3.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;flashVars를 넘겨주는 방법에 대해서 나와있는 페이지인데 commandLine에서 값을 넘겨주는 방법은 안나와있지만&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XQLHWpy2K2.png" style="width:640px;height:110px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XQLHWpy2K2.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이런식으로도 flashVars 파라미터를 넘긴다니!&lt;/P&gt;&lt;P&gt;그래서 명령어를 바꿔보았지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XO0JmuXiET.png" style="width:640px;height:45px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XO0JmuXiET.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XdO7wZkwhA.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;넘어간다!!! 사실 약 한시간여 삽질끝에 알아낸 방법이라 눈물을 왈칵 쏟을뻔했습니다.&lt;/P&gt;&lt;P&gt;그냥 간단하게 웹에서 파라미터 넘기듯이 넘기면 되는 줄알았으면... 아아.. 내 한시간 삽질...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s 값을 여러개 넘기고 싶을때는 어떻게 해야할지 아직 모르겠습니다..혹시 아시는 분?..-_-;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-3430671366394327412?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/3430671366394327412/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=3430671366394327412&amp;isPopup=true' title='10개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3430671366394327412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/3430671366394327412'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/flash-player%EB%A1%9C-swf-%EC%8B%A4%ED%96%89%ED%95%A0%EB%95%8C-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EC%B2%B4%ED%81%AC.html' title='Flash Player로 SWF 실행할때 파라미터체크?'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-2043169524925873640</id><published>2010-03-08T11:52:00.000+09:00</published><updated>2011-01-11T21:59:02.751+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Point 클래스'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='액션스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='point'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Point 클래스의 미학 #1</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;Point 클래스라는 것에 대해 간단히 짚고 넘어가야 할 듯 합니다.&lt;/P&gt;&lt;P&gt;사실 저는 데이터 처리나 파싱같은것에 관심이 많아서 그 쪽으로 많은 작업을 하지만&lt;/P&gt;&lt;P&gt;나름 Front-END 개발자다 보니 기본적인 Display 객체에 대한 이해는 있어야 할듯 하여 짧게나마&lt;/P&gt;&lt;P&gt;글을 적어보려고 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Point라는 클래스는 그냥 "점"입니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XElXB2juES.png" style="width:640px;height:348px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XElXB2juES.png')" /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;좌표를 나타내는 점이지요. Point라는 것에 대해 원래 많은 의미가 있지만 적어도 ActionScript에서는 방위를 나타내는 점을 의미합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;하지만 점이라는 것이 항상 그렇듯 그저 x, y의 기본 좌표만 갖고 있기엔 Point 클래스의 의미가 너무 약하고.. 그럴바에야 왜 클래스로 만들어서 사람 머리 복잡하게 하는걸까 라고 생각하기엔 Point라는 클래스는 의외로 많은 역할을 하고 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;예를 들어 점과 점 사이의 거리를 한번 구해보도록 할까요?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. distance() 메서드&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;간단히 점과 점사이의 거리를 구해라. 라고 말한다면 여러가지 방법(?)이 있을지 모르겠지만 난 적어도 한가지 방법을 알고 있습니다. "피타고라스의 정리"를 이용하면 되는데 이 방법은 삼각함수의 기초가 되는 정리인데요. 이 distance() 메서드는 방금 말했던 "피타고라스의 정리"를 고민할 필요없이 그냥 점과 점사이의 거리를 계산 할 수 있게 합니다. 이렇게 말이지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.IEventDispatcher;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.geom.Point;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createPoints();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createTextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var point1:Sprite;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var point2:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var textField:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var isDragging:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createTextField():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!textField)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField = new TextField();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.width = 150;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.height = 30;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.x = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.y = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.text = "distance : ";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(textField);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function createPoints():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!point1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point1 = new Sprite();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g = point1.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF0000, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawCircle(0, 0, 5);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point1.x = 50;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point1.y = 50;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(point1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; configureListeners(point1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!point2)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point2 = new Sprite();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g = point2.graphics;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0x00FF00, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawCircle(0, 0, 5);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point2.x = 100;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; point2.y = 100;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(point2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; configureListeners(point2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function configureListeners(dispatcher:IEventDispatcher):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dispatcher.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dispatcher.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dispatcher.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function displayNewPoint():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var p1:Point = new Point(point1.x, point1.y);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var p2:Point = new Point(point2.x, point2.y);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; textField.text = "distance : " + Point.distance(p1, p2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function mouseDownHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sprite(event.currentTarget).startDrag();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDragging = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function mouseMoveHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(isDragging)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; displayNewPoint();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function mouseUpHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sprite(event.currentTarget).stopDrag();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDragging = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code] &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;아무래도 저렴하게 개발하려다 보니 Flash를 사용하지 않아 코드가 점점 길어지는군요;;&lt;/P&gt;&lt;P&gt;아무튼 이렇게 코딩하고 컴파일을 돌려서 확인합니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XBasFGXnQf.png" style="width:541px;height:85px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1.2kb짜리 파일이라니.. Flex에선 감히 상상도 못할 용량이로군요.. 이렇게 컴파일을 하면 아래와 같은 산출물이 생겨나게 됩니다. (아래의 산출물에 있는 두개의 점을 드래그 해보세요)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XTTOmt2DI3.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XTTOmt2DI3.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;피타고라스의 정리를 사용하려고 직각삼각형을 만들어서 빗변의 길이의 제곱을 루트해줄 필요가 없이 Point클래스에 있는 distance 메서드 만으로도 거리를 측정할 수 있습니다.(물론 내부적으로는 피타고라스의 정리를 이용했을거라고 추측합니다만..)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다음 시간엔 Point의 polar() 메서드를 알아보도록해요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-2043169524925873640?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/2043169524925873640/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=2043169524925873640&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2043169524925873640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2043169524925873640'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/point-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EB%AF%B8%ED%95%99-1.html' title='Point 클래스의 미학 #1'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-7924280511983711969</id><published>2010-03-05T15:56:00.000+09:00</published><updated>2011-01-11T21:59:02.204+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='stopPropagtion'/><category scheme='http://www.blogger.com/atom/ns#' term='cancelable'/><category scheme='http://www.blogger.com/atom/ns#' term='이벤트'/><category scheme='http://www.blogger.com/atom/ns#' term='stopImmediatePropeagation'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='preventDefault'/><title type='text'>이벤트란 무엇인가요? #4</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;이벤트에 대해 쓰면 쓸 수록 점점더 내용이 많아지는 것 같아 걱정입니다.&lt;/P&gt;&lt;P&gt;일단 여기까지 진행하면서 배운건&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;addEventListener, 사용자 정의 이벤트, bubbles, target, currentTarget 정도가 되겠네요.&lt;/P&gt;&lt;P&gt;아, dispatchEvent도 포함시켜서.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘할 cancelable만 마저 정리하고 이벤트는 마치는걸로...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;cancelable이라는걸 본적이 있으신지 모르겠습니다.(액션스크립트를 하면서 늘 궁금했었더랬죠.. 저는)&lt;/P&gt;&lt;P&gt;레퍼런스에 보면 이렇게 저렇게 적혀있는데..&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XTdbitD1wY.png" style="width:549px;height:101px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;번역기를 돌려보겠습니다. 왜냐하면 한글말로 되어있어도 모를거 같은데 영어로 된걸 보면 머리아프니까;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYGuahQYxZ.png" style="width:571px;height:125px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;번역기를 돌려봐도 외국어 같은게 무슨말인지 모르겠습니다.&lt;/P&gt;&lt;P&gt;이런땐 구글에 검색을 요청해야겠지요.(아래 링크를 클릭하세요)&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 17px; FONT-FAMILY: dotum; COLOR: rgb(102,102,102)" class=Apple-style-span&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 17px; FONT-FAMILY: dotum; COLOR: rgb(102,102,102)" class=Apple-style-span&gt;&lt;A href="http://www.lmgtfy.com/?q=ActionScript Event cancelable" target=_blank&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 17px; FONT-FAMILY: dotum; COLOR: rgb(102,102,102)" class=Apple-style-span&gt;http://www.lmgtfy.com/?q=ActionScript Event cancelable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;/SPAN&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Gulim; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="LINE-HEIGHT: 17px; FONT-FAMILY: dotum; COLOR: rgb(102,102,102)" class=Apple-style-span&gt;위의 링크는 장난이었구요&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;실제로 도움이 되었던 링크는 &lt;A href="http://vulcan9.tistory.com/28" target=_blank&gt;http://vulcan9.tistory.com/28&lt;/A&gt;&amp;nbsp;여기 입니다.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;cancelable 자체는 큰 역할이 있는게 아니라 이벤트의 Default함수 호출을 할 수 없게끔 막아 줄 수 있는 문을 하나 만들어 둔다고 생각하면 됩니다.&lt;/P&gt;&lt;P&gt;실재로 Default 함수 호출을 막는 메서드는&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XVagfhUsJC.png" style="width:545px;height:312px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이 메서드 입니다. preventDefault 메서드는 Event.cancelable 속성이 true 일 경우 이벤트가 발생해서 Listener에 등록된 핸들러 내에서 Default 함수 처리를 하지 못하도록 막게 할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그렇다면 bubble phase를 막으려면 어떻게 해야할까요.&lt;/P&gt;&lt;P&gt;stopPropagation()이라는 메서드와 stopImmediatePropagation() 메서드. 이 두가지 메서드가 마련 되어있습니다. 이 두가지 메서드의 차이는 다음과 같습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;stopPropagtion() : 현재 이벤트를 Listen 하고 있는 객체에서만 이벤트 흐름을 중단하게 됩니다. 결국 다음 객체에 이벤트를 계속해서 전파하게 하지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;stopImmediatePropagation() : 이벤트를 그냥 죄다 멈추게 합니다. 더이상의 전파도 없고 단절시켜서 이벤트의 흐름을 막지요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;다만 위의 두 메서드는 Default 함수 호출에 대한 행동은 막을 수 없습니다. 그것은 preventDefault 메서드를 참조해야하구요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사실상 cancelable에 관련되어 메서드 호출가부가 결정되는것은 preventDefault 메서드 입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;cancelable에대해 설명한다고 했으나 많이 부족한듯 하여 아쉽네요.&lt;/P&gt;&lt;P&gt;cancelable이 첨엔 있으나 없으나 별것 없구나.. 싶은듯 하지만 이벤트 흐름과도 관계가 있는 부분이라 함부로 하기 어려운 속성입니다. 이해하기도 어렵구요.(글을 쓰고 있는 저도 어려워요..-_-;)&lt;/P&gt;&lt;P&gt;샘플이라도 있었으면 좋으련만. 오늘은 개인적인 사정으로 그 것은 어려울 듯하고 조만간에 어서 만들어 올리도록 하겠습니다.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-7924280511983711969?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/7924280511983711969/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=7924280511983711969&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7924280511983711969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/7924280511983711969'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94-4.html' title='이벤트란 무엇인가요? #4'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1238948443498809750</id><published>2010-03-04T16:29:00.000+09:00</published><updated>2011-01-11T21:59:01.646+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bubbles'/><category scheme='http://www.blogger.com/atom/ns#' term='currentTarget'/><category scheme='http://www.blogger.com/atom/ns#' term='이벤트'/><category scheme='http://www.blogger.com/atom/ns#' term='저렴한'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='개발이야기'/><category scheme='http://www.blogger.com/atom/ns#' term='target'/><title type='text'>이벤트란 무엇인가요? #3</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;이벤트 이야기 세번째입니다.&lt;/P&gt;&lt;P&gt;오늘은 bubbles와 cancelable에 대해서 설명해보려고 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 bubbles를 알아야 cancelable에 대해서 알아 볼 수 있지요.&lt;/P&gt;&lt;P&gt;bubbles라는 것에 대해 Language Reference에서 확인을 좀 해봤습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYaPzx07E9.png" style="width:539px;height:229px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;....&lt;/P&gt;&lt;P&gt;무슨 소리지? -_-&lt;/P&gt;&lt;P&gt;해서 구글번역기로 돌려봤습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XC343NShy8.png" style="width:562px;height:238px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;영어를 한글로 바꾼다는 것이 좀 문제가 있으니 저정도의 어휘들은 이해하도록 하고.....-_-;;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 거품이라는게 bubble을 직역을 하다보니 저렇게 표시가 된건데 이것은 이벤트가 어떤 거품이 터지는것과 비유하여 사용하게 되었다 합니다.(사실 어디선가 주워들은 이야기 ㅎ)&lt;/P&gt;&lt;P&gt;우리가 집중해서 봐야할 부분은 "이벤트 흐름의 세 단계를 통해 이동" 이라는 부분인데요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이벤트에 대해서 이해하기 전에 사실 액션스크립트에서는 객체들을 XML로 뽑아내어줄 수 있다는 사실을 알고 있는게 좀 도움이 될 것 같습니다.(flash.utils.describeType() 메서드를 보면 도움이 될까요?) 이는 곧 무슨이야기냐 하면 어떤 객체가 있다면 그 객체 내부적으로 어떤 객체를 갖고 있을 수 있는지 XML로 파악할 수 있다는 이야기이고 그런 하이라키(Hierarchy)구조에서는 각 객체들의 계층관계를 파악할 수 있다는 이야기지요.&lt;/P&gt;&lt;P&gt;위에서 표시되는 "대상 노드"라는 것은 방금 이야기한 XML의 각 노드라고 이해하면 됩니다.(객체간 관계가 정리되어있는 XML의 각 노드지요. 족보라고 생각하면 이해가 빠릅니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;그래서 이벤트가 발생되는 단계를 세단계로 쪼개서 확인해보면 &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. 대상 노드가 표시 목록 계층 구조의 상단에서 노드의 흐름을 캡처 단계직전.&lt;/P&gt;&lt;P&gt;- 이 이야기는 어떤 객체가 이벤트가 발생했을 때 이를 수신하는 상위 객체가 이벤트를 받기 직전의 상태를 이야기 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. 이벤트를 받는 순간&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;3. 상위 노드로 이벤트를 계속적으로 발생시킬지에 대한 판단&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 나눌 수 있습니다. 여기서 3번과정에서 판단의 기준이 되는 것이 bubbles 가 되겠습니다. 이해하기 어렵다면 예제를 만들어보면 쉽게 이해할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 클래스 구조를 이런 형태로 만들어 볼까요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XT7i09yDaQ.png" style="width:348px;height:260px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P align=center&gt;(위의 그림에서 화살표는 데이터의 흐름을 의미합니다.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;각각의 객체들은 Main 클래스 하위에 붙어있고 실질적으로 이벤트를 발생시키는 곳은 SubClass뿐입니다.&lt;/P&gt;&lt;P&gt;이벤트를 수신하는 곳은 Main클래스와 ExampleClass 이렇게 두 곳으로 두고 있습니다.&lt;/P&gt;&lt;P&gt;여기서 주의 할 점은 Main은 ExampleClass에서 이벤트를 수신한다는것을 조건으로 해야 이번에 만드는 샘플이 의미가 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;오늘 샘플은 Flex로 만들어 볼까요? (그래야 만들기 쉬우니까요...)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/Main.mxml&lt;br /&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:example="classes.example.*"&lt;br /&gt;&amp;nbsp; &amp;nbsp; creationComplete="creationCompleteHandler(event);"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.MouseEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.events.FlexEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import classes.events.CustomEvent;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function creationCompleteHandler(event:FlexEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.addEventListener(CustomEvent.SAMPLE_EVENT, exampleRectSampleEventHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.sub.addEventListener(CustomEvent.SAMPLE_EVENT, subSampleEventHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function bubblesChkClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.bubbles = bubblesChk.selected;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function subSampleEventHandler(event:CustomEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += ("event Listen : subClass eventListen\n");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function exampleRectSampleEventHandler(event:CustomEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "event Listen : exampleRect event Listen\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:TextArea id="ta" width="300" height="200" editable="false" /&amp;gt;&lt;br /&gt;&amp;lt;mx:CheckBox label="bubbles" id="bubblesChk" click="bubblesChkClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;lt;example:Example id="exampleRect" width="30" height="30" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/classes/example/Example.as&lt;br /&gt;[code as3]&lt;br /&gt;package classes.example&lt;br /&gt;{&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;import mx.core.UIComponent;&lt;br /&gt;&lt;br /&gt;import classes.example.SubClass;&lt;br /&gt;&lt;br /&gt;public class Example extends UIComponent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Example()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private var rect:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public var sub:SubClass;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public var bubbles:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public var cancelable:Boolean = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!rect)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rect = new Sprite();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rect.addEventListener(MouseEvent.CLICK, rectClickHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(rect);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!sub)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sub = new SubClass();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(sub);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(rect)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var g:Graphics = rect.graphics;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.beginFill(0xFF0000, 1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.drawRect(0, 0, 30, 30);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g.endFill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; private function rectClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sub.test(bubbles, cancelable);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/classes/example/SubClass.as&lt;br /&gt;[code as3]&lt;br /&gt;package classes.example&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;import classes.events.CustomEvent;&lt;br /&gt;&lt;br /&gt;public class SubClass extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function SubClass()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function test(bubbles:Boolean = false, cancelable:Boolean = false):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; { &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dispatchEvent(new CustomEvent(CustomEvent.SAMPLE_EVENT, bubbles, cancelable));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;/classes/events/CustomEvent.as&lt;br /&gt;[code as3]&lt;br /&gt;package classes.events&lt;br /&gt;{&lt;br /&gt;import flash.events.Event;&lt;br /&gt;&lt;br /&gt;public class CustomEvent extends Event&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public static const SAMPLE_EVENT:String = "sampleEvent";&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function CustomEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = true)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super(type, bubbles, cancelable);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/P&gt;&lt;P&gt;위의 예제대로 만드셨다면 컴파일 ㄱㄱ&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XYITBoBjOO.png" style="width:558px;height:83px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;음. 확실히 flash 패키지만으로 코딩한 것과는 용량 차이가 많습니다. Flex는 용량이 커요. 역시. 하지만 그만큼 제공되거나 개발 속도도 flash 패키지만으로 작업한것보다 더 좋은건 사실입니다. 딜레마에요. 딜레마.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;어찌되었든 컴파일이 성공적으로 이뤄졌다면 결과물을 확인해봐요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="350" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XZjYephiwF.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XZjYephiwF.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;bubbles 를 체크한것과 체크하지 않은 것에 대해 이벤트 버블링이 어떻게 처리되는지 확인 할 수 있습니다.&lt;/P&gt;&lt;P&gt;자신이 속해있는 디스플레이 객체에만 전달할 것인지 아니면 그보다 상위 객체에 전달하게 할것인지 결정할 수 있다는 이야기인데요. bubbles 속성이 true인 대표적인 이벤트가 MouseEvent 입니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XAeSuHEtk2.png" style="width:466px;height:74px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;자. 그럼 여기서 문제로 거론되는 건데요.&lt;/P&gt;&lt;P&gt;bubbles가 true인 이벤트를 받았을때 addEventListener 되는 객체가 실제로 해당 객체인지 아닌지에 대해 고민해 볼 필요가 있습니다.&lt;/P&gt;&lt;P&gt;위의 예제를 살펴보면 Example 클래스에서 addEventListener해도 받을 수 있고 Example클래스 안에있는 SubClass라는 클래스에서도 받을 수 있지요. 하지만 실질적으로 Example에서 받은 이벤트는 실제로 Example 클래스에서 발생시킨게 아니지요. 이벤트를 실제로 발생시킨 객체와 이벤트를 bubbles의 여부에 따라 중계해준 클래스. 이 두개의 상황에 대해 이벤트는 아주 괜찮은 방법을 제시하고 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;currentTarget과 target이라는 속성들이지요.&lt;/P&gt;&lt;P&gt;이것들을 레퍼런스에서 확인해보면&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xc6e1n0beb.png" style="width:549px;height:167px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;라고 정의 되어있습니다.&lt;/P&gt;&lt;P&gt;사실 저는 무슨말인지 번역기를 돌려봐도 모르겠어서 그냥 위에서 만든 샘플을 조금 손보기로 했습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/Main.mxml&lt;br /&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:mx="&lt;A href="http://www.adobe.com/2006/mxml"&gt;http://www.adobe.com/2006/mxml&lt;/A&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlns:example="classes.example.*"&lt;br /&gt;&amp;nbsp; &amp;nbsp; creationComplete="creationCompleteHandler(event);"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import flash.events.MouseEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import mx.events.FlexEvent;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import classes.events.CustomEvent;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function creationCompleteHandler(event:FlexEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.addEventListener(CustomEvent.SAMPLE_EVENT, exampleRectSampleEventHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.sub.addEventListener(CustomEvent.SAMPLE_EVENT, subSampleEventHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function bubblesChkClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exampleRect.bubbles = bubblesChk.selected;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function subSampleEventHandler(event:CustomEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += ("event Listen : subClass eventListen\n");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "sub currentTarget : " + event.currentTarget + "\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "sub target : " + event.target + "\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private function exampleRectSampleEventHandler(event:CustomEvent):void&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "event Listen : exampleRect event Listen\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "example currentTarget : " + event.currentTarget + "\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ta.text += "example target : " + event.target + "\n";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:TextArea id="ta" width="300" height="200" editable="false" /&amp;gt;&lt;br /&gt;&amp;lt;mx:CheckBox label="bubbles" id="bubblesChk" click="bubblesChkClickHandler(event);" /&amp;gt;&lt;br /&gt;&amp;lt;example:Example id="exampleRect" width="30" height="30" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 수정하고 확인해보면 이렇습니다.&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XZc07bnLQW.png" style="width:325px;height:284px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P align=center&gt;(이미지입니다. 클릭해서 낚이는 불상사는 피해주세요)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Example에서 수신된 이벤트의 currentTarget은 이벤트를 발생시킨 SubClass가 아닌 자신을 반환하고&lt;/P&gt;&lt;P&gt;target은 실제로 이벤트를 발생시킨 SubClass인것을 확인할 수 있습니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;사실 이번시간에 cancelable까지 다 손을 보려고 했습니다만 너무 양이 많아졌네요.&lt;/P&gt;&lt;P&gt;cancelable은 다음시간에 이야기하도록 해요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;p.s 마지막에 target과 currentTarget을 확인하려고 만든 샘플은 이 밑에 있어요.&lt;/P&gt;&lt;P&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="350" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XA7ieOg4jJ.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XA7ieOg4jJ.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1238948443498809750?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1238948443498809750/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1238948443498809750&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1238948443498809750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1238948443498809750'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94-3.html' title='이벤트란 무엇인가요? #3'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-4909381615578509444</id><published>2010-03-03T19:11:00.000+09:00</published><updated>2011-01-11T21:59:01.082+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='코드적 차이점'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Flex를 해볼까?</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;P&gt;음.. 사실 이벤트 세번째 이야기를 하긴해야하는데 target과 currentTarget을 어떻게 설명해야할까..&lt;/P&gt;&lt;P&gt;고민하다가 적당히 생각이 안나서 Flex 이야기를 먼저해보려고 합니다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"Flex랑 Flash랑 뭐가 다른가요?" 라는 질문들이 많은데 사실 Flash랑 Flex랑 뭐가 다른지에 대해 한마디로 설명하자면 "그냥 툴이 달라요" 정도랄까.&lt;/P&gt;&lt;P&gt;사실 Flex와 Flash는 사용하는 "툴"외에 다른걸 궂이 꼬집자면 태그를 이용해서 개발할 수 있다는 정도일까..&lt;/P&gt;&lt;P&gt;뭐 대충 그런식이다.&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&lt;/P&gt;&lt;P&gt;보통 맨처음 Flex를 배울때는 이런식으로 테스트 하곤한다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="Hello World" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XbZHHEhTZD.png" style="width:552px;height:91px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;이렇게 컴파일 하고 나면 &lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XN2jsVFXvk.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;이렇게 결과물이 나오게 됩니다.&lt;/P&gt;&lt;P&gt;이걸 ActionScript로 개발해볼까? 하고 생각하면 낭패를 봅니다.&lt;/P&gt;&lt;P&gt;왜냐하면 Application을 확장해 만들게 되면 오류가 발생하니까.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XZtNaLmWv2.png" style="width:504px;height:177px;" alt=""  /&gt;&lt;/div&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;(왜 이런오류가 나는지 아시는 분 있으면 말씀 좀 주세요)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;어쨌든 가상으로 코딩하게되면 아마도 이렇게 되지 않을까&lt;/P&gt;&lt;P&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import mx.core.Application;&lt;br /&gt;import mx.controls.Label;&lt;br /&gt;&lt;br /&gt;public class Main extends Application&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public var tempLabel:Label;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function createChildren():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.createChildren();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!tempLabel)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tempLabel = new Label();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addChild(tempLabel);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; override protected function commitProperties():void&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.commitProperties();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(tempLabel)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tempLabel.text = "Hello World";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;왜 Flex로 개발하는지 알겠는 분들은 손을을 들어주세요.&lt;/P&gt;&lt;P&gt;Flex mxml로 개발하게되면 4줄이면 만들 수 있는 것을 만약 as 코드로 개발한다면 30줄도 넘게 코딩이 되어야한다는 문제도 있고 컨포넌트를 이용하는데 있어서 간편하기 때문입니다.&lt;/P&gt;&lt;P&gt;그렇다고 Flex가 모든게 좋은것만은 아니에요.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;모션을 만드는데도 힘들거니와 리소스를 많이 잡아먹기때문에 상황에 따라 잘 선택해야합니다.&lt;/P&gt;&lt;P&gt;아.. 오늘은 건강이 안좋군요. &lt;/P&gt;&lt;P&gt;그래서 오늘은 여기까지만 하겠습니다.&lt;/P&gt;&lt;P&gt;다음엔 이벤트 4번째이야기를 계속할께요.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-4909381615578509444?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/4909381615578509444/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=4909381615578509444&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4909381615578509444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4909381615578509444'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/03/flex%EB%A5%BC-%ED%95%B4%EB%B3%BC%EA%B9%8C.html' title='Flex를 해볼까?'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-4511988853553711656</id><published>2010-02-26T14:13:00.000+09:00</published><updated>2011-01-11T21:59:00.506+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript event'/><category scheme='http://www.blogger.com/atom/ns#' term='이벤트'/><category scheme='http://www.blogger.com/atom/ns#' term='사용자정의 이벤트'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='이벤트 만들기'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash evnet'/><category scheme='http://www.blogger.com/atom/ns#' term='custom event'/><title type='text'>이벤트란 무엇인가요? #2</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;#1 에서 이벤트 등록하고 핸들러를 작동하는 것까지 확인해봤는데요..&lt;DIV&gt;어차피 이벤트라는게 다 사람이 만든건데 그거 내가 만들어서 작동 못할것도 없잖아요.&lt;/DIV&gt;&lt;DIV&gt;그래서 만들어봅니다. 커스텀 이벤트!&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;근데 커스텀 이벤트를 만들겠다고 거창하게 이야기했지만 결국 뭐 부터 시작해야할지 모르겠군요.&lt;/DIV&gt;&lt;DIV&gt;일단 우리가 흔히 보는 MouseEvent를 한번 확인해보도록 하지요.&lt;/DIV&gt;&lt;DIV&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XMtaaGyixh.png" style="width:356px;height:167px;" alt=""  /&gt;&lt;/div&gt;&lt;/DIV&gt;&lt;DIV&gt;Language Reference에서 보면 MouseEvent의 족보에 대해 파악해 볼수가 있습니다.&lt;/DIV&gt;&lt;DIV&gt;flash.events 패키지에 위치하고 있고 public class고 Event를 상속받았군요.&lt;/DIV&gt;&lt;DIV&gt;Subclasses들은 뭐.. MouseEvent를 상속받은 놈들을 알려주는 거니까요. 지금은 신경쓸 필요는 없어 보이네요.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;일단 Event라는 놈들은 원래 죄다 flash.events.Event 클래스를 상속받습니다. 물론 Event클래스를 만들 수도 있을지 모르겠습니다만 나중에 이벤트를 발생시킬때 Event 를 상속받은 놈들만 발생시킬 수 있거든요.&lt;/DIV&gt;&lt;DIV&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XRFO2kBPle.png" style="width:307px;height:71px;" alt=""  /&gt;&lt;/div&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;그렇다면 일단 Event를 상속받아 보지요.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;[code as3]&lt;br /&gt;package classes.events&lt;br /&gt;{&lt;br /&gt;import flash.events.Event;&lt;br /&gt;&lt;br /&gt;public class CustomEvent extends Event&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(type, bubbles, cancelable);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;요렇게 하면 일단 이벤트는 상속받았고.. 일단 Event를 만들었으니 잘 작동하나 볼까?... 했지만 이것만 갖고는 뭘 어떻게 해야할지 감이 안옵니다.&lt;/DIV&gt;&lt;DIV&gt;좀 그럴싸하게 이벤트 상수를 만들어보도록해요.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;[code as3]&lt;br /&gt;package classes.events&lt;br /&gt;{&lt;br /&gt;import flash.events.Event;&lt;br /&gt;&lt;br /&gt;public class CustomEvent extends Event&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public static const SAMPLE_EVENT:String = "sampleEvent";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(type, bubbles, cancelable);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;저렇게 해놓고 이벤트를 발생시킬 클래스가 필요하니 클래스를 하나더 만들어보아요.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;[code as3]&lt;br /&gt;package classes.example&lt;br /&gt;{&lt;br /&gt;import flash.events.EventDispatcher;&lt;br /&gt;&lt;br /&gt;import classes.events.CustomEvent;&lt;br /&gt;&lt;br /&gt;public class ExampleEventDispatcher extends EventDispatcher&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function ExampleEventDispatcher()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function checkDispatch():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dispatchEvent(new CustomEvent(CustomEvent.SAMPLE_EVENT));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;그럼 chkeckDispatch메서드를 호출생하기만 하면 CustomEvent.SAMPLE_EVENT가 발생하게 됩니다.&lt;/DIV&gt;&lt;DIV&gt;그럼 한번 테스트 해볼까요.. 테스트할 Main.as 는 이렇게 만들어 봅시다.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;&lt;br /&gt;import classes.events.CustomEvent;&lt;br /&gt;import classes.example.ExampleEventDispatcher;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setTextField();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setGreenButton();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setExample();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var textField:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var greenBtn:Sprite;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var exam:ExampleEventDispatcher;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function setExample():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!exam)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exam = new ExampleEventDispatcher();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exam.addEventListener(CustomEvent.SAMPLE_EVENT, examSampleEventHandler);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function setTextField():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!textField)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField = new TextField();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.width = 200;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.height = 300;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.y = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.multiline = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.background = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.backgroundColor = 0xFFFFFF;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addChild(textField);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function setGreenButton():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!greenBtn)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn = new Sprite();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var g:Graphics = greenBtn.graphics;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.beginFill(0x00FF00, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.drawRect(0, 0, 50, 50);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn.x = 210;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn.y = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn.buttonMode = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn.useHandCursor = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;greenBtn.addEventListener(MouseEvent.CLICK, greenBtnClickHandler);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addChild(greenBtn);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function greenBtnClickHandler(evnet:MouseEvent):void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exam.checkDispatch();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function examSampleEventHandler(event:CustomEvent):void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;textField.appendText("Listen from ExampleEventDispatcher\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;컴파일을 하고 실행시키면 아래처럼 나오게 되면 성공..&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XLNFsGzB3a.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XLNFsGzB3a.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;녹색버튼을 마구마구 누르면 왼쪽의 텍스트 필드에 메시지가 찍히게 됩니다. 이게 바로 사용자 정의 이벤트. 커스텀 이벤트의 기초적인 내용이에요. 좀더 복잡한 내용이 있지만 오늘은 여기까지.&lt;/DIV&gt;&lt;DIV&gt;궁금한게 있다면 Google을 애용해주세요. ㅎ&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;이벤트란 무엇인가요? #3 예고편! 두둥!&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;1. bubbles는 뭔가요? cancelable은요?&lt;/DIV&gt;&lt;DIV&gt;2. target? currentTarget? 다 거기서 거기 아닌가요?&lt;/DIV&gt;&lt;DIV&gt;3. 악 왜 에러가 나는거에요! clone 메서드의 존재이유.&lt;/DIV&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-4511988853553711656?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/4511988853553711656/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=4511988853553711656&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4511988853553711656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4511988853553711656'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94-2.html' title='이벤트란 무엇인가요? #2'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-4692743370780418011</id><published>2010-02-26T02:01:00.000+09:00</published><updated>2011-01-11T21:58:59.977+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='저렵한 AIR 개발'/><category scheme='http://www.blogger.com/atom/ns#' term='AIR 개발환경 만들기'/><title type='text'>저렴하게 AIR 개발하기</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;p&gt;새벽에 잠이 들어야하는데 (아침 출근길이 걱정입니다) 잠이 안와 이벤트 시리즈와는 별도로 저렴하게 AIR를 개발하는 법을 소개하려고 합니다.&lt;/p&gt;&lt;p&gt;Flex Builder나 그외 IDE 툴로 개발하면 무척이나 편리하지만 기본적인 원리를 알게 되면&lt;/p&gt;&lt;p&gt;혹여나 다른 열악한 환경에서도 개발하게 되더라도 도움이 되지 않을까 생각되서 소개하려고 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;일단 AIR는 Flex와는 다르게 좀 환경이 복잡합니다. 기본적으로 소개는 &lt;a href="http://livedocs.adobe.com/flex/3/html/Part5_AIR_1.html" target="_blank"&gt;여기&lt;/a&gt;를 확인하면 됩니다. &lt;/p&gt;&lt;p&gt;AIR를 개발하려면 (Ajax AIR는 제 전문분야가 아니라서 생략하도록 할께요) 기본적으로 "AIR application descriptor file" 이라는 것을 작성해야합니다.&lt;/p&gt;&lt;p&gt;Builder에서 개발할때 기본적으로 만들어지는 코드 파일 외에 [프로젝트명_app.xml] 파일이 생겨날 것인데 이게 바로 방금 말했던 AIR application descriptor file 입니다.&lt;/p&gt;&lt;p&gt;이 파일에는 AIR를 실행하거나 혹은 패키징할때 필요한 정보들을 담게 되는데요. 이 파일이 없으면 아무것도 할 수 없습니다. 그러니 이 셋팅은 매우 중요합니다.(&lt;a href="http://livedocs.adobe.com/flex/3/html/SDKHelloWorld_1.html#1030300" target="_blank"&gt;여기를 참고하세요&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flex 3 Developer Guide에 명시된 내용을 한번 볼까요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;application xmlns="http://ns.adobe.com/air/application/1.0"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;samples.flex.HelloWorld&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;0.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;filename&amp;gt;HelloWorld&amp;lt;/filename&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;initialWindow&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;content&amp;gt;HelloWorld.swf&amp;lt;/content&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;visible&amp;gt;true&amp;lt;/visible&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;systemChrome&amp;gt;none&amp;lt;/systemChrome&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;transparent&amp;gt;true&amp;lt;/transparent&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;width&amp;gt;400&amp;lt;/width&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;height&amp;gt;200&amp;lt;/height&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/initialWindow&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;[/code]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;요래 적혀있습니다. 각 노드마다 설명은 다음과 같습니다.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;id : 어플리케이션의 기본 아이디로 어떤 어플리케이션인지 알만한 단어로 써주면 좋습니다.&lt;/li&gt;&lt;li&gt;version : 어플리케이션의 버젼인데 나중에 배포할때 이것을 기준으로 업데이트 할지 말지 결정합니다.&lt;/li&gt;&lt;li&gt;filename : 어플리케이션의 메인 파일이 무엇인지 명시합니다. 이때는 확장자는 제외합니다.&lt;/li&gt;&lt;li&gt;initialWindow : 어플리케이션 실행시 표시되는 윈도우 속성들은 제어합니다.&lt;/li&gt;&lt;li&gt;content : 어플리케이션에서 표시될 content가 무슨 파일인지 명시합니다.&lt;/li&gt;&lt;li&gt;visible : 우리가 알고 있는 일반적인 visible 속성과 같습니다.&lt;/li&gt;&lt;li&gt;systemChrome, transparent : 설명이 기니 &lt;a href="http://livedocs.adobe.com/flex/3/html/WorkingWithWindows_2.html#1031305" target="_blank"&gt;링크&lt;/a&gt;를 따라가세요.&lt;/li&gt;&lt;li&gt;width, height : 어플리케이션 윈도우의 너비와 높이입니다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;일단 이만큼만으로도 샘플 파일을 컴파일하거나 실행시킬 수 있습니다.&lt;/p&gt;&lt;p&gt;그 외에 아이콘이라던가 하는 부분들도 있습니다만 오늘은 살짝 맛만 보도록하지요. ㅎ&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;그럼 일단 위의 모양대로 파일을 하번 만들어 보지요. 이왕에 하는거 HelloWorld.as 파일도 만들어 보아요.&lt;/p&gt;&lt;p&gt;HelloWorld.as 파일의 내용은 아래처럼 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;public class HelloWorld extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function HelloWorld()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trace("Hello World");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;컴파일을 해야겠는데 AIR 컴파일은 amxmlc 명령어로 컴파일합니다.&lt;/p&gt;&lt;p&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XWaixxALtI.png" style="width:580px;height:73px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XWaixxALtI.png')" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이렇게 컴파일을 하고 난 뒤에 우리 한번 실행을 해야겠는데 무턱대고 swf 를 Flash Player로 실행하면 안됩니다. 이때 명령어는 adl 이라는 것을 이용하는데요. 이것은 AIR Debug Launcher 의 약자로 디버그용으로 확인할때 사용합니다.&lt;/p&gt;&lt;p&gt;개발중에 패키징하고 인스톨해서 실행해보는 모든과정을 일일이 하면 얼마나 귀찮습니까. 그래서 adl을 통해 실행합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;일단 오늘은 맛만 보는거니까 이렇게만 실행해 볼까요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;참. 아까도 적어놨지만 실행을 할때는 AIR application descriptor file를 이용해서 실행합니다.&lt;/p&gt;&lt;p&gt;이렇게...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XIYgOFnXVS.png" style="width:580px;height:58px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XIYgOFnXVS.png')" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;하려고 했으나 "error while loading initial content"라고 하면서 실행이 안됩니다. 왜 이러지? 라고 생각하면서 Developer Guide를 뒤지고 난리법석을 피웠었는데 이유는 의외의 곳에서 문제가 있습니다. SDK가 3.2 버젼 이후부터는 xmlns="http://ns.adobe.com/air/application/1.0"이게 아니라 xmlns="http://ns.adobe.com/air/application/1.5"로 &amp;nbsp;변경되었습니다.(Adobe 이것들. Developer Guide도 수정을 안해놓다니.. 사람 뻘짓하게..)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;게다가 systemChrome이라던가 transparent라던가 하는 옵션값을 좀 수정을 해야합니다.&lt;/p&gt;&lt;p&gt;왜냐하면 위에서 소개한 옵션으로는 투명한데다가 systemChrome도 없어서 어플리케이션이 실행되었어도 눈에 보이지 않기 때문이지요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;AIR application descriptor file을 아래와 같이 수정합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[code xml]&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;application xmlns="http://ns.adobe.com/air/application/1.5"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;HelloWorld&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;0.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;filename&amp;gt;HelloWorld&amp;lt;/filename&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;name&amp;gt;Hello World&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;initialWindow&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;title&amp;gt;Hello World&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;content&amp;gt;HelloWorld.swf&amp;lt;/content&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;systemChrome&amp;gt;standard&amp;lt;/systemChrome&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;transparent&amp;gt;false&amp;lt;/transparent&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;visible&amp;gt;true&amp;lt;/visible&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/initialWindow&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;[/code]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;그럼 좀전에 했던것 같이 컴파일 하고 adl을 이용해 실행해볼까요.&lt;/p&gt;&lt;p&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/Xf6JmRHFfc.png" style="width:580px;height:435px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/Xf6JmRHFfc.png')" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;위와같은 빈창이 뜨게 됩니다. 와우. 성공. 그리고 프롬프트 창을 확인하면&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XXXqHdAnPw.png" style="width:473px;height:60px;" alt=""  /&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;저렇게 Hello World를 화면에 표시해줍니다.&lt;/p&gt;&lt;p&gt;와우.. 그냥 웹용으로 개발할때는 그럭저럭 할만하다가 AIR로 개발할라 치니까 복잡해 죽겠네요. :)&lt;/p&gt;&lt;p&gt;셋팅할것도 많고.. 하지만 어느날 갑자기 이클립스도 어떻게 설치할 수 없는 열악한 상황에서도&lt;/p&gt;&lt;p&gt;이런 방법을 통해 개발을 진행할 수 있다는 것만 알아두세요.(평소엔 그냥 Builder 개발 고고)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;참고로 java 를 통해서도 컴파일이 가능하니 그건 Developer Guide를 참고 하시면 도움이 될거에요.&lt;/p&gt;&lt;p&gt;이제 슬슬 잠이 옵니다. 오늘은 이만할게요.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-4692743370780418011?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/4692743370780418011/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=4692743370780418011&amp;isPopup=true' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4692743370780418011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/4692743370780418011'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/%EC%A0%80%EB%A0%B4%ED%95%98%EA%B2%8C-air-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0.html' title='저렴하게 AIR 개발하기'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-1144343449842390392</id><published>2010-02-25T11:20:00.000+09:00</published><updated>2011-01-11T21:58:59.391+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='액션스크립트'/><category scheme='http://www.blogger.com/atom/ns#' term='이벤트'/><category scheme='http://www.blogger.com/atom/ns#' term='addEventListener'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>이벤트란 무엇인가요? #1</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;내가 처음 3.0을 접했을때가 불과 2년전이었는데 그때 가장 어렵게 느껴졌던게 &lt;DIV&gt;도무지 "이벤트"라는 녀석과 친해지기 어렵다는 사실이었다.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;도데체 왜 "이벤트"라는 놈을 갖고 코드를 작성해야만 할까.&lt;/DIV&gt;&lt;DIV&gt;"이벤트"없이 코딩할 수 있지 않을까?&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;라는 고민으로 수없이 많은 생각들을 하곤했었는데&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;그것에 대한 결론으로는 &lt;A href="http://www.kineticroad.com/blog/entry/ActionScript%EC%9D%98-%EB%8C%80%EA%B8%B0%EC%BD%94%EB%93%9C" target=_blank&gt;여기&lt;/A&gt;를 확인하면 좀 도움이 되리라 생각된다.&lt;/DIV&gt;&lt;DIV&gt;결론적으로는 ActionScript의 태생적 이유때문이라는 것인데 ECMAScript를 모태로 삼고있는&lt;/DIV&gt;&lt;DIV&gt;ActionScript로써는 개발자가 원하는 흐름대로 코드를 진행하기 위해서는 이벤트를 사용해야만 한다고&lt;/DIV&gt;&lt;DIV&gt;결론 지었다.&lt;/DIV&gt;&lt;DIV&gt;또다른 결론이 하나 더 있는데 이는 어플리케이션을 구성하는데 있어서 구조적으로 "약한결합"을 사용해야 유지보수, 클래스의 컨포넌트 화(化), 등이 용이하다는 결론.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;위와같은 결론 덕에 결국 이벤트를 사용하긴 해야겠는데 뭘 어떻게 써야하는 것인지 당최 배우기가 마땅찮다.&lt;/DIV&gt;&lt;DIV&gt;그래서 일단 이벤트를 추가하고(import), 등록하고(addEventListener), 행동(Handler) 하는 3가지 단계를 마스터 해보자.&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createSprite();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createTextArea();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var sp:Sprite;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var ta:TextField;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function createSprite():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!sp)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sp = new Sprite();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addChild(sp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;drawSprite();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function drawSprite():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(sp)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var g:Graphics = sp.graphics;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.beginFill(0x00FF00, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.drawRect(0, 0, 100, 100);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.endFill();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configureSpriteListeners();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function createTextArea():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!ta)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta = new TextField();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.width = 200;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.height = 300;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.x = 110;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.y = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.multiline = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.background = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.backgroundColor = 0xFFFFFF;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addChild(ta);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function configureSpriteListeners():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sp.addEventListener(MouseEvent.CLICK, spriteClickHandler);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function spriteClickHandler(event:MouseEvent):void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ta.appendText("click sprite! \n");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;위의 코드를 한글로 번역을 하자면 이렇다.&lt;/DIV&gt;&lt;DIV&gt;"sp라는 Sprite객체를 만들어서 너비 100, 높이 100 사이즈의 초록색 네모를 그린다음 클릭하면 "click sprite!"라는 메시지를 ta라는 TextField객체에 출력해라!"&lt;/DIV&gt;&lt;DIV&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;라는 것이다. 컴퓨터 나라말은 참 다양하지만(JAVA, C, C++, ActionScript, JavaScript.. 등등) 번역하고 보면 별거 없는 것같은 기분이다.&lt;/DIV&gt;&lt;DIV&gt;어쨌든 저 코드를 컴파일 해보자.&lt;br /&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XaDKnYwdyg.png" style="width:543px;height:88px;" alt=""  /&gt;&lt;/div&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;그럼 저 Main.swf를 실행해볼까.. (아래의 녹색 상자를 클릭해보세용)&lt;br /&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV align=left&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object height="300" width="400" data="http://ss.textcube.com/blog/7/70538/attach/XaZbZyxrcq.swf" type="application/x-shockwave-flash"&gt;&lt;param value="http://ss.textcube.com/blog/7/70538/attach/XaZbZyxrcq.swf" name="movie" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;간단하게 CLICK 이벤트를 등록하고 작동하게하는 예제를 만들어 봤다.&lt;br /&gt;나름 간단하게 작성된 예제인데 여기서 드는 의문점은 해당 클래스에 등록할 수 있는 이벤트들은 어디서 확인하느냐는 의문.&lt;br /&gt;그런 이벤트에 관련된 사항은 &lt;A href="http://livedocs.adobe.com/flex/3/langref/index.html" target=_blank&gt;Language Reference&lt;/A&gt;를 확인하면 된다.&lt;br /&gt;예를들어 방금 사용한 Sprite 클래스를 확인해보면&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XH0yTAVvxA.png" style="width:526px;height:285px;" alt=""  /&gt;&lt;/div&gt;&lt;br /&gt;어떤 이벤트를 등록(addEventListener) 할 수 있는지 확인할 수 있다.&lt;br /&gt;게다가 친절하게도 어떤 시점에서 이벤트가 발생하는지 설명도 해줬다. 좀 괜찮은데?&lt;br /&gt;&lt;br /&gt;예전에 같이 일하던 분이 요런 말씀을 해주셨더랬다.&lt;br /&gt;"궁금하면 API 뒤져봐"&lt;br /&gt;그말이 진리. ㅎㅎㅎ&lt;br /&gt;&lt;br /&gt;Sprite 클래스는 내부적으로 스스로를 클릭하면 CLICK 이벤트를 발생하게끔 설계되어있다.&lt;br /&gt;그럼 우리는 그런 이벤트를 수신할 수 있도록 addEventListener를 통해 이벤트를 등록한다.&lt;br /&gt;이때 같이 들어가는 Handler는 이벤트가 수신했을 때 실행하게 된다.&lt;br /&gt;&lt;br /&gt;대략 이런 모양.&lt;br /&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XTp8T3znWV.png" style="width:439px;height:284px;" alt=""  /&gt;&lt;/div&gt;&lt;/DIV&gt;&lt;DIV align=center&gt;&lt;FONT color=#999999&gt;이미지 출처는 제가 그렸으므로 함부로 퍼가면 안됩니다. 말씀은 해주시고 퍼가세요.&lt;br /&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV align=left&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV align=left&gt;Sprite는 addEventListener를 하든 말든 어차피 클릭을 하면 CLICK이벤트를 발생시킨다.&lt;br /&gt;그럼 어떤 누군가는 addEventListener를 해서 핸들러를 실행시키겠지.&lt;br /&gt;이벤트의 등록과 핸들러의 실행의 구조적인 모양새는 이런 모양이다.&lt;/DIV&gt;&lt;DIV align=left&gt;그럼 클래스도 누군가가 만들어 사용하는 걸텐데 (적어도 신이 만든건 아닐거 아냐) 나도 만들어 볼 수 있지 않을까??&lt;/DIV&gt;&lt;DIV align=left&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV align=left&gt;두둥. "이벤트란 무엇인가요? #2" 예고편.&lt;/DIV&gt;&lt;DIV align=left&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;DIV align=left&gt;1. 내가 만든 이벤트?&lt;/DIV&gt;&lt;DIV align=left&gt;2. dispatchEvent?&lt;/DIV&gt;&lt;DIV align=left&gt;3. 오오오오.....(뭐지???)&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-1144343449842390392?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/1144343449842390392/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=1144343449842390392&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1144343449842390392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/1144343449842390392'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94-1.html' title='이벤트란 무엇인가요? #1'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-8835548575066823402</id><published>2010-02-24T16:59:00.000+09:00</published><updated>2011-01-11T21:58:58.950+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Class 만들기'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex SDK 3.5'/><title type='text'>ActionScript Class 만들기(기본)</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;Actionscript 3.0 은 클래스 단위로 프로그램을 구성한다.(적어도 내 생각엔)&lt;div&gt;그럼 어떤 프로그램을 만들기 위해서 가장 먼저 선행되어야 하는 것은 클래스를 만들 줄 알아야한다는 것이니&lt;/div&gt;&lt;div&gt;한번 시작해보자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;일단 준비물을 살펴보자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Flex SDK 3.5.0 : &lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/download?build=3.5.0.12683&amp;amp;pkgtype=1" target="_blank"&gt;다운로드&lt;/a&gt;&lt;/div&gt;&lt;div&gt;빌더, 혹은 에디터 툴.(난 Editplus로 개발하니깐 Editplus)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;뭐 이정도로 간단하게 준비가 끝났으면 시작해보자.&lt;/div&gt;&lt;div&gt;일단 간단하게 소스 저장용 폴더와 파일 하나를 하나 만들자.&lt;/div&gt;&lt;div&gt;여기서 파일명은 Main.as 로 하자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XKoBNP2Xyf.png" style="width:451px;height:83px;" alt=""  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Main.as 파일에는 이렇게 코딩해볼까.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이러면 우리 클래스를 만든거다.&lt;/div&gt;&lt;div&gt;실행하려면 아까 우리가 준비했던 Flex SDK를 이용해 컴파일을 하면 swf 파일이 떨어진다.&lt;/div&gt;&lt;div&gt;아까 sdk 파일 폴더로 가자. 그 폴더안에 가보면 "bin" 이라는 폴더가 있는데&lt;/div&gt;&lt;div&gt;그 안에 살펴보면 mxmlc라는 파일이 있다.&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XICm76wMtv.png" style="width:380px;height:549px;" alt=""  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;저 명령어를 이용하면 된다.&lt;/div&gt;&lt;div&gt;아까의 작업폴더로 이동한 뒤(프롬프트 창에서) 아래와 같이 입력한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table style="width:450px;height:40px;border:none;" bgcolor="#aaaaaa" cellspacing="1" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr bgcolor="#ffffff"&gt;&lt;td width="135"&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "&gt;[mxmlc가 있던 sdk의 bin 폴더]\mxml Main.as -o Main.swf&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;결과화면은 아래와 같다.&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XOmc9cFdbh.png" style="width:500px;height:68px;" alt="" onclick="TC$PRIV_open_img('http://ss.textcube.com/blog/7/70538/attach/XOmc9cFdbh.png')" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;오. Main.swf 파일이 생성되었다. 556bytes 뿐이다.&lt;/div&gt;&lt;div&gt;폴더를 확인했더니&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XMKaWURn31.png" style="width:249px;height:181px;" alt=""  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;정상적으로 파일이 생성된것을 확인할 수 있다.&lt;/div&gt;&lt;div&gt;그럼 실행해볼까.&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XEs5F3nyd9.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;아무것도 없는 빈파일이다. 이렇게 그냥 끝내면 아쉬우니까 네모칸 하나 만들어 넣자.&lt;/div&gt;&lt;div&gt;아까의 Main.as 소스를 아래와 같이 수정한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[code as3]&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;&lt;br /&gt;public class Main extends Sprite&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;drawRect();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private function drawRect():void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var g:Graphics = this.graphics;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.beginFill(0xFF0000, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.drawRect(0, 0, 100, 100);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g.endFill();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;[/code]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;수정한뒤에 다시 첨에 했던것처럼 컴파일.&lt;/div&gt;&lt;div&gt;그담에 생성된 swf 파일을 확인해보자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/7/70538/attach/XBaR64FOad.png" style="width:508px;height:421px;" alt=""  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;예상한대로 빨간 사각형이 그려졌다.&lt;/div&gt;&lt;div&gt;음. 좋군. 클래스 만들기 별것 아니로구나.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;도움글 :&lt;/div&gt;&lt;div&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=Part2_DevApps_1.html"&gt;http://livedocs.adobe.com/flex/3/html/help.html?content=Part2_DevApps_1.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-8835548575066823402?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/8835548575066823402/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=8835548575066823402&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8835548575066823402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/8835548575066823402'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/actionscript-class-%EB%A7%8C%EB%93%A4%EA%B8%B0%EA%B8%B0%EB%B3%B8.html' title='ActionScript Class 만들기(기본)'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-2276924966277273209</id><published>2010-02-23T18:07:00.000+09:00</published><updated>2011-01-11T21:58:58.481+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='콜린 무크'/><category scheme='http://www.blogger.com/atom/ns#' term='용어비교'/><category scheme='http://www.blogger.com/atom/ns#' term='Essential'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>액션스크립트와 자바, C++ 용어비교</title><content type='html'>&lt;DIV align=center&gt;&lt;TABLE style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; WIDTH: 450px; HEIGHT: 40px; BORDER-TOP: medium none; BORDER-RIGHT: medium none" cellSpacing=1 cellPadding=0 bgColor=#aaaaaa align=center&gt;&lt;TBODY&gt;&lt;TR bgColor=#f2f2f2&gt;&lt;TD width=135&gt;&lt;P align=center&gt;액션스크립트&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=center&gt;자바&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;C++&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR bgColor=#f2f2f2&gt;&lt;TD width=135&gt;&lt;P align=left&gt;인스턴트 변수&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;필드 또는 인스턴스 변수&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;데이터 멤버&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR bgColor=#f2f2f2&gt;&lt;TD width=135&gt;&lt;P align=left&gt;인스턴스 메서드&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;메서드&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;멤버 함수&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR bgColor=#f2f2f2&gt;&lt;TD width=135&gt;&lt;P align=left&gt;static 변수 &lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;클래스 변수&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;static 데이터 멤버&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR bgColor=#f2f2f2&gt;&lt;TD width=135&gt;&lt;P align=left&gt;static 메서드&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;클래스 메서드&lt;/P&gt;&lt;/TD&gt;&lt;TD width=135&gt;&lt;P align=left&gt;static 멤버 함수&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;br /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;출처 : Essential ActionScript 3.0 (콜린 무크 저)&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-2276924966277273209?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/2276924966277273209/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=2276924966277273209&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2276924966277273209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2276924966277273209'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/%EC%95%A1%EC%85%98%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EC%9E%90%EB%B0%94-c-%EC%9A%A9%EC%96%B4%EB%B9%84%EA%B5%90.html' title='액션스크립트와 자바, C++ 용어비교'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-5290341895041695949</id><published>2010-02-22T13:27:00.000+09:00</published><updated>2011-01-11T21:58:57.270+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='야훔'/><category scheme='http://www.blogger.com/atom/ns#' term='Introduce'/><title type='text'>야훔.</title><content type='html'>사실 야훔이라는 대화명. 혹은, 닉네임은 큰 이유가 있어서 만들어진게 아니라는 사실인 것은 눈치가 빠른 사람은 알고 있을지 모르겠다.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;나의 아이디는 인터넷을 사용하기 시작한 1998년도부터 사용된 igna라는 것인데, "이그나"라고 발음한다.&lt;/div&gt;&lt;div&gt;히브리어로 "번개"라고 들었다.(사실확인유무는 거치지 않았으니 틀려도 상관없다)&lt;/div&gt;&lt;div&gt;실수로 한글 입력상태에서 igna를 타이핑하면 "ㅑ훔" 이라고 나오게 된다.&lt;/div&gt;&lt;div&gt;그래서 탄생한 닉네임 "야훔".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;지금은 네이버 "플래시 액션스크립트" 카페에서 활동중이고&lt;/div&gt;&lt;div&gt;Flex, AIR, Flash를 주요 툴로 ActionScript 2.0 /3.0 을 사용한다.&lt;/div&gt;&lt;div&gt;주로 SI 사업에서 뛰다가 요즘은 솔루션 개발쪽으로 틀었고&lt;/div&gt;&lt;div&gt;경험했던 통신환경은 HTTP통신, Socket통신, RTMP통신(LCDS, BlazeDS) 등.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;스터디 Team:FP(Flash Quick Crash Progress)를 운영중.&lt;/div&gt;&lt;div&gt;이정도면... 내소갠 끝난건가? ㅎ&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-5290341895041695949?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/5290341895041695949/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=5290341895041695949&amp;isPopup=true' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/5290341895041695949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/5290341895041695949'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2010/02/%EC%95%BC%ED%9B%94.html' title='야훔.'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7630007125298363569.post-2522335759488971538</id><published>2007-09-24T12:12:00.000+09:00</published><updated>2007-09-24T14:59:39.360+09:00</updated><title type='text'>Ajax가 리치 웹의 끝인가?</title><content type='html'>상당히 오랜만의 RSS 검색에서 읽어본 누군가의 Ajax와 리치웹에 대한 포스팅을 읽었다.&lt;br /&gt;요즘 내가 하는 고민중 하나였던&lt;br /&gt;"아, 내가 무슨 언어를 집중해서 파야 할까?"&lt;br /&gt;하는 것이엇다.&lt;br /&gt;세상에 웹 2.0플랫폼을 갖고 만들어진, 혹은 바라보고 만들어진 언어들이 어림잡아도&lt;br /&gt;5개, 6개.. 게다가 엑션스크립트나 Flex 2.0, MS에서 만들어진 Silverlight까지&lt;br /&gt;브라우져기반 어플리케이션들이 속속 등장하는 찰나에&lt;br /&gt;앞으로 5년간 웹 시장이 어떻게 변할지 거시적인 시야로 바라보기 힘들어졌다.&lt;br /&gt;그런데 이 블로거는 내 걱정같은 걸 날려버릴 한가지 방법을 제시했는데.&lt;br /&gt;"SW 엔지니어는 상황에 따라 다른 언어를 사용하는거다"&lt;br /&gt;라는 것이다. 고로 모든 언어를 다 사용할 줄 알아야한다는 것.&lt;br /&gt;사실 프로그래밍 언어라는 건 다 거기서 거기라 서로 다른 특징들을 조금만 알고 있으면&lt;br /&gt;배우는 데는 어렵지 않다.&lt;br /&gt;아래에 그 내용을 퍼왔다.&lt;br /&gt;(물론 내가 본 내용과 이 사람이 이야기한 내용이 다를 수 있지만..)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://channy.tistory.com/149"&gt;http://channy.tistory.com/149&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://channy.tistory.com/149" title="Ajax가 리치 웹의 끝인가?"&gt;Ajax가 리치 웹의 끝인가?&lt;/a&gt;&lt;/h2&gt;     &lt;span class="post-cat"&gt;               &lt;a href="http://channy.tistory.com/tag/Ajax" rel="tag"&gt;Ajax&lt;/a&gt;, &lt;a href="http://channy.tistory.com/tag/%EB%A6%AC%EC%B9%98%EC%9B%B9" rel="tag"&gt;리치웹&lt;/a&gt;         &lt;/span&gt;&lt;!--– google_ad_section_start ----&gt;           리치 웹 기술이 뜨고 있다. Ajax라고 하는 기술 접근을 통해 '소프트웨어 웹'을 구성하는 방법을 찾게 된 것이다. 아직도 MS guy들은 그걸 DHTML이라고 부르더라. DHTML과 Ajax의 차이는 무엇일까? 바로 공개 표준(Open Standards)과 공개 프레임웍(Open Framework)이다. 90년대 DHTML은 웹 브라우저의 상용 기술만 판쳤던 과거의 유물이다.&lt;br /&gt;&lt;br /&gt;웹2.0 의 가장 큰 이득은 웹을 플랫폼으로 봐 주었고 그걸로 돈을 벌수 있다는 증명을 해 준 것이다. 웹 브라우저  안에 잡지 웹을 데이터 웹으로 끌어 내 준 것이다. 이제 웹 플랫폼 기업들은 웹 브라우저 기반 잡지 수준에서 머물기 보다 오픈 API와 데이터 플랫폼을 지향한다. Ajax가 바로 그 선상에 있다. 브라우저 밖의 웹, 소프트웨어 웹을 가르키고 있는 것이다. 즉, Ajax는 리치 웹을 향한 최초의 제대로 된 접근이지 끝이 아니라는 말이다.&lt;br /&gt;&lt;br /&gt;LAMP(Linux+Apache+MySQL+PHP) 역시 기술에 대한 접근 방식이다. 즉, 오픈 소스와 빠른 웹 개발을 위한 경량 플랫폼의 성공을 말해 주는 것이다. 이와 마찬 가지로 Ajax는 기술 그 자체가 아니라 리치 웹을 위한 접근 방식이라는 것이다.&lt;br /&gt;&lt;br /&gt;리치 웹 기술은 몇 가지 공용 기술을 기반으로 발전하고 있다. XML 기반 GUI 기술, 동적 언어(Dynamic Languages), CSS 그리고 Data API이다. 잠깐 살펴 볼까?&lt;br /&gt;&lt;br /&gt;- Ajax : (X)HTML+CSS+ DOM+ JavaScript &lt;-&gt; Data API&lt;br /&gt;- WPF/e : XAML+CSS+XBL+CLR(JavaScript/Ruby/Python) &lt;-&gt; Data API&lt;br /&gt;- Flex: MXML+CSS+ActionScript  &lt;-&gt; Data API&lt;br /&gt;- Widget: HTML(Canvas)+ CSS+ JavaScript &lt;-&gt; Data API&lt;br /&gt;- Firefox: XUL+CSS+JavaScript(XPCOM) &lt;-&gt; Data API&lt;br /&gt;- WHATWG: HTML5 + CSS+ DOM+ JavaScript &lt;-&gt; Data API&lt;br /&gt;&lt;br /&gt;많 은 사람들이 Ajax, WPF/e, Apollo(Flex), HTML5 중에서 무엇을 공부해야 될 것인가를 나에게 물어 본다. 리치 웹 기술은 클라이언트 기반의 새로운 기술 셋을 제공하고 있다. 이 분야는 그동안 등한시 하였던 (서버 기반 개발자도 참여하고 있지만) 웹 디자이너, HTML 코더, UI 개발자 등이 관여해야될 문제이다.&lt;br /&gt;&lt;br /&gt;SW 엔지니어들은 그들이 사용하는 언어(Langauge)에 구애 받지 않는다. 자바를 쓰든 PHP를 쓰든 적절한 상황에 적절한 언어를 통해 개발을 할 뿐이다. 프로토 타입에 RoR을 쓰고 실 서비스에는 Java를 쓰더라도 백엔드 SW에는 PHP나 Python을 사용하는 게 생산성이 높듯이 말이다.&lt;br /&gt;&lt;br /&gt;따라서 리치 웹 개발자들도 기술 종류에 구애 받지 않고 자유 자재로 원하는 요구 사항에 적절한 기술을 사용할 것을 요구 받을 것이다. 리치 웹 벤더들은 공개 기술을 제공하기 시작했고 그것이 원하는 목표에 맞기 때문에 현재의 상황은 매우 희망적이라고 생각한다.&lt;br /&gt;&lt;br /&gt;Ajax가 가르키는 손가락을 보지 말고 소프트웹어 웹(Software Web)이 가르키는 미래를 바라봐야 할 것이다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7630007125298363569-2522335759488971538?l=igna84.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igna84.blogspot.com/feeds/2522335759488971538/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7630007125298363569&amp;postID=2522335759488971538&amp;isPopup=true' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2522335759488971538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7630007125298363569/posts/default/2522335759488971538'/><link rel='alternate' type='text/html' href='http://igna84.blogspot.com/2007/09/ajax.html' title='Ajax가 리치 웹의 끝인가?'/><author><name>Ready For Start</name><uri>http://www.blogger.com/profile/02195292826570671088</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
