'ActionScript 3.0'에 해당되는 글 22건
2009. 10. 30. 10:52
오랫만에 블로그 유입경로를 보다가 코리아몽키라는 분의 블로그를 알게 되었습니다.  [Actionscript 3.0] 간단하게 만들어 본 XML to arrayColection 함수 라는 글에서 제 글을 인용하셨더라구요. ;) 위의 글 말미에 코리아몽키님이 가진 의문이 있으셔서 덧글을 달다가 덧글이 좀 길어질 듯 하여, 간만에 포스팅을 하려고 합니다. ;)

'왜 XML을 Object로 파싱하여 그 데이터를 처리하고 이용하는 방법에 대해서 정리된 자료가 없는 것인가?' 라는 의문은 다른 각도로 접근해봐야 할 것 같습니다. '왜 방법이 없는가'에서 'XML을 Object로 파싱하지 않고 사용할 방법이 있는가?' 라는 것으로 말이죠. 단도직입적으로 말씀드리자면, XML 을 받은 것을 Object 로 변환해야할 필요성이 크지 않다는 것입니다(꼭 필요한 경우도 있겠습니다만). 게다가 XML 그대로 사용하는 것도 가능하고 HTTPService를 이용하면 XML을 Object로 변환 한 결과를 바로 받을 수도 있기 때문입니다.

그럼 먼저 HTTPService 를 이용하여 다양한 형태로 결과를 받는 방법에 대해서 알아보겠습니다.

HTTPService 의 resultFormat
HTTPService에는 resultFormat 이라는 속성이 존재합니다. 이는 HTTP를 호출하여 받은 결과값을 어떤 식으로 파싱할 것인지에 대해서 설정하는 속성인데, 아래의 표와 같이 총 6가지로 설정 가능합니다.

  object   ActionScript의 Object 들의 트리형식으로 XML 을 파싱하여 반환합니다. (기본값)
  array   ActionScript의 Object 들의 트리형식으로 XML 을 파싱하여 반환되나, 최상위의 Object가 Array가 아니라 새로 생성된 Array의 첫 번째 아이템이 됩니다. 만약 makeObjectsBindable 속성이 true로 설정되어 있을 경우 최상위 Array는 ArrayCollection으로 반환됩니다.
  xml   ActionScript 의 XMLNode Object로 이루어진 XML로 XML을 파싱하여 반환합니다.
  flashvars   ActionScript Object로 name과 value가 쌍으로 되어 있는(page=1) 텍스트를 파싱하여 반환합니다.
  text   받은 그대로를 text로 반환합니다.
  e4x   ECMAScript for XML(E4X)를 이용할 수 있는 ActionScript 의 XMLNode Object로 이루어진 XML로 XML을 파싱하여 반환합니다.

resultFormat를 object나 array로 설정하면 Object로 변환된 XML 데이터(서버측이 전달해준)를 전달받게 됩니다. 따로 파싱할 필요가 없는 것이죠. 물론 e4x나 xml로 설정하여  XML로 받아와서 사용할 수도 있습니다. 또는 특정 프로토콜에 의해 생성된 데이터라면 text로 설정하여 String 으로 받은 다음 프로토콜에 맞게 파싱하여 사용할 수도 있을 것입니다. (마치 구분자를 이용하여 소켓통신시 데이터 전달하는 것과 같이)

Object로 파싱하여 사용
rss 구조

rss 구조 (이미지 클릭하여 보세요.)

object로 resultFormat을 설정하여 데이터를 받아오는 예제를 한번 보겠습니다.
본 블로그의 rss를 읽어서 DataGrid에 넣어주는 예제인데, 우선 RSS 정보를 읽기 위해 구조를 먼저 보면 (우측이미지 참조) channel이라는 노드의 하위에 블로그의 정보들(타이틀, 주소, 이미지정보 등)이 있고 포스트의 정보는 item 이라는 노드들에 들어있습니다.

예제에서는 이 item 노드들을 가져다가 DataGrid에 넣어줄 것입니다.




위의 예제에서 resultHandler 메소드를 잠시 보시면 위에서 말한 item 노드들을 찾아서 DataGrid 에 넣어주는 구문을 보실 수 있으십니다. 위의 rss의 트리구조와 같이 Object 로 파싱되어 있기 때문에 동일하게 rss.channel.item 이런 식으로 item 을 읽어오고 있습니다. (하단 이미지 참조)

Object로 받아온 데이터

Object로 받아온 데이터



XML 그대로 사용하기
Flex의 DataGrid, Tree 와 같이 자주 사용하는 컴포넌트의 설계적 특성상 Object 혹은 XML 중 어떤 하나가 더 빠르다는 이야기는 둘째 치고라도 위의 예제같은 경우는 XML을 그대로 사용하시는 것이 오히려 개발 시에는 편할 수도 있습니다. 왜냐하면 resultHandler에 구현된 로직때문인데, resultFormat 속성을 e4x로 설정하여 결과로 받은 XML은 E4X를 사용할 수 있기 때문입니다. E4X에 대한 설명은 생략하도록 하겠습니다. 간단한 E4X에 대한 예제는 여기를 참고하세요.




resultFormat 속성을 e4x로 설정하고, resultHandler 메소드에서 e4x를 사용하여 간단하게 item을 DataGrid에 넣도록 구현하였습니다. 위의 예제와 비교하여 보셔도 크게 다른 것은 느끼지 못하실 것입니다. 오히려 위의 예제에서는 item 노드를 찾기가 훨씬 쉽게 되어있죠.

XML로 받아온 데이터

XML로 받아온 데이터



개발자 마다 스타일에 따라 차이는 있겠습니다만, 저의 경우는 HTTPService를 이용하는 어플의 경우 XML을 기반으로 데이터를 운용하고 있고, RemoteObject의 경우에는 VO를 기준으로 데이터를 운용하고 있습니다. 아무래도 HTTPService를 사용하는 경우는 서버와 주고받는 데이터를 XML기반으로 움직이는 것이 E4X 때문에 무지 편한 느낌이라.. ;^)

다른 분들은 어떻게 데이터를 운용하시는지 저도 궁금하네요. ;^) 트랙백 부탁드립니다.

2009. 7. 1. 10:16
Flex3 in Action 이미지 출처 : 강컴

Flex3 in Action 이미지 출처 : 강컴

ActionScript에서 배열은 Array 를 사용하게 됩니다.
Java 와 달리 동적배열이어서 크기를 정하지 않고 임의대로 push, pop 등의 메소드를 통해 편리하게 사용할 수 있습니다. (Java에서는 ArrayList를 사용하시면 편리하죠!)

얼마전에 읽었던 Flex3 in Action 에 보면 'Working with ActionScript' chapter에 Array에 대해서 설명하고 있는데요, 여기에 다름과 같이 배열에 대해서 정의를 하고 있습니다.

1. Indexed arrays
2. Associative arrays

1번 Indexed arrays 는 우리가 흔히 사용하는 Array를 말합니다. 숫자 인덱스를 가지고 다음과 같이 값에 접근을 하게됩니다.

그리고 2번 Associative arrays는 흔히 연관배열 또는 해시(Hash)라고 부르는 배열로 key 값을 가지고 접근하게 됩니다. 책의 예제는 다음과 같습니다.


위의 예제는 이상없이 잘 동작합니다만, ActionScript 에서 연관배열(해시)를 위와 같이 사용하면 안됩니다.
그 이유는 Livedocs 에 잘 나와있습니다.

Array 클래스를 사용하여 번호가 매겨진 요소 대신 명명된 요소가 들어 있는 데이터 구조인 연결 배열(해시) 을 만들지 마십시오. 연결 배열을 만들려면 Object 클래스를 사용해야 합니다. ActionScript에서 Array 클래스를 사용하여 연결 배열을 만들 수는 있지만 이렇게 하면 연결 배열에 Array 클래스 메서드나 속성을 사용할 수 없습니다.
Livedocs 에서 발췌

ActionScript 에서는 Object 클래스를 이용하여 해시를 구현하라고 설명하고 있습니다. 물론 Object가 모든 클래스의 기본이 되기때문에, Array를 이용하여 연관배열(해시)를 만들 수는 있습니다. 하지만 해당 클래스를 만든 의미가 없어지죠. Array는 index를 이용한 배열로 설계된 것이기 때문입니다. 예를 들어 임의로 인스턴스화 시킬 수 있는 Sprite 객체를 연관배열로 사용한다는 것은 정말 황당한 일이라고 할 수 있겠습니다. 해당 목적에 맞게 사용해야 된다는 것이죠 ;)
아래에 Object로 연관배열을 사용하는 방법에 대해서 발췌했습니다.
Object 클래스를 사용하여 연결 배열을 만들 수 있습니다. 기본적으로 연결 배열은 Object 클래스의 인스턴스이며 키-값 쌍은 각각 속성과 속성 값으로 표현됩니다. 결합적 배열을 Object 데이터 유형을 사용하여 선언해야 하는 또 다른 이유는 이 경우 객체 리터럴을 사용하여 결합적 배열을 채울 수 있기 때문입니다. 단, Object 데이터 유형으로 선언하는 경우에만 가능합니다. 다음 예제에서는 객체 리터럴을 사용하여 연결 배열을 만들고 도트 연산자와 배열 액세스 연산자를 사용하여 항목에 액세스한 다음 새 속성을 만들어 키-값 쌍을 새로 추가합니다.

Livedocs 에서 발췌

위와 같이 Object를 이용하여 연결배열(해시)를 만들수 있습니다.
그리고 추가적으로 해당 값의 키(Key)값을 다른 객체로 하기 위해서 ActionScript 3.0에서는 Dictionary 클래스를 제공합니다.

Dictionary 클래스를 사용하면 키 비교에 완전 항등 연산자(===)를 사용하는 동적 속성 컬렉션을 만들 수 있습니다. 객체를 키로 사용하는 경우 객체에 toString()을 호출하여 반환되는 값이 아니라 객체의 ID가 객체를 찾는 데 사용됩니다.

다음 명령문은 Dictionary 객체와 키 객체 사이의 관계를 보여 줍니다.

Livedocs 에서 발췌


실제 해당 클래스의 구현 목적대로 사용하여야 오동작을 막을 수 있습니다.  게다가 협업시에 큰 걸림돌이 될 수 도 있습니다.
이 글을 읽으시는 분들은 사용하시는 클래스가 구현된 목적대로 사용하고 계신가요?

좋은 하루 되세요 :-)

ps. 책이 한글판으로 발간된다는 소식은 없는데, 만약 된다면 위의 오류에 대해서는 수정해서 나왔으면 좋겠네요.
ps2. AS 한글문서에는 연관배열이 아닌 연결배열로 번역이 되어있더군요. 정확하게 무엇이 맞는지는 저도 잘 모르겠네요 :)

2009. 4. 1. 21:45
안녕하세요? 검쉰입니다.

제가 Flex를 처음 접하고, '이거 정말 멋지다!' 라고 생각을 했습니다. 그 뒤로 이어지는 생각은 '이거 한글 입력은 왜 이리 느려?'. 몇 년이 지난 아직도 한글 입력은 느리기만 한데, 언제 수정될지는 아무도 모른다죠. 비 영어권의 설움이라고 할까요? 과학적이고 독창적인 자랑스런 한글을 쓰는게 죄(?)가 되는 이상한 상황.

이런 상황을 헤쳐나가고자 지난 1월 이희덕님의 제안으로 'Flash Platform 한글문제 공동대응팀'이 생겼습니다. (짝짝짝)
그간 오프모임을 진행하면서 팀원간 의견도 나누고, 최근 Flex SDK 3.2 + FP 10 에서의 한글 입력문제가 해결되는 기쁨을 맛보기도 하였습니다.

사용자 삽입 이미지

이제 다른 많은 Flash Platform 개발자 분들과 만나, 한글문제와 개발 노하우를 이야기해보고자 합니다.

 *행사 개요

     날짜 : 2009년 4월 11일 (토)
     장소 : 숭실대학교 벤처관 3층 대강의실
     시간 : 오후 2시 ~ 6시
     주최 : Flash Platform 한글문제 공동대응팀
     주관 : 숭실대학교 글로벌미디어학부
     후원
Agenda

     14:00 ~ 14:10 : 학교 시설 사용과 관련된 안내 (이희덕)
     14:10 ~ 14:30 : 한글 대응팀 소개 및 기조연설 (이희덕)
     14:30 ~ 15:00 : Flash Platform 게임개발 노하우 (이정웅)
     15:00 ~ 15:30 : FlarToolKit으로 구현하는 증강 현실 (옥상훈)
     15:30 ~ 16:00 : Flash Platform 한글문제 (이희덕)
     16:00 ~ 16:40 : 토론의 장 (대응팀 전원)
     16:40 ~ 17:20 : 잡부 Flex 개발자를 위한 Flex 스킨 (김학영)
     17:20 ~ 17:50 : Creating Visual Experiences with Flex (이준하)
     17:50 ~ 18:00 : 정리 및 폐회




행사 참석 신청 및 자세한 소개는 온오프믹스 를 통해 신청해주시면 감사하겠습니다. ;)
많은 참석 부탁드립니다 !!!
함께해요~ ㅎㅎ


2009. 3. 27. 15:36
안녕하세요? 검쉰입니다. 오랫만에 블로그 포스트로 인사드립니다.
그동안 티스토리에서 문제가 되었던 Flash Player 10에서 swf 로드가 안되던 문제가 해결이 되었네요. ;) 기존의 제 포스트들도 정상으로 보이고요. 이사하려다가 그 것또한 귀차니즘에 의해 좌절. ^ㅂ^; 아무튼 다시 오랫만에 글로 인사드려요. ;^)

흔히 자주 쓰시는 Flash로 만든 네비케이터 바 에서 메뉴정보를 외부의 XML 로 받아오는 경우와 같이 외부의 데이터를 읽어오는 과정에서 한글이 깨지는 경험을 한번쯤은 하셨을 겁니다. 이런 경우 커뮤니티에서 검색해보시면 System.useCodePage = true; 를 넣어라. 라는  답변을 많이 볼 수 있습니다. 심지여 이 것을 "한글 깨짐 방지 코드"라고 부르는 경우도 있더군요. 옛 속담에 '선무당이 사람잡는다'라는 이야기가 있습니다. 정확하게 이해하지 못하고 쓰게 되면 뒷일 감당하기 힘들게 되는 법!!. 왜 System.useCodePage = true; 를 넣으면 한글이 안꺠지는지 알아보도록 하겠습니다.

'EUC-KR' 이라고 많이 보셨을 겁니다. 한글을 정의한 캐릭터 셋(charset)입니다. 보통 한글 윈도우에서 제작한 파일은 'EUC-KR' 캐릭터 셋으로 저장되는 경우가 많습니다. 이 때 캐릭터 셋이란 글자들의 집합을 정의한 것이라고 생각하시면 됩니다. (보다 자세한 건 위키백과의 설명을 참조하시길 바랍니다.)
이러한 캐릭터 셋이 다르게 되어 있는 데이터를 읽어오게 되면 한글이 깨지게 되는데요, Flash 내부에서는 유니코드(UTF-8)를 기본으로 사용하기 때문입니다. 'EUC-KR'로 제작된 파일을 'UTF-8'로 읽었으니 당연히 서로 다른 캐릭터 셋을 사용하게 되므로 한글이 깨지게 되는 겁니다. 이러한 경우에 바로 System.useCodePage = true; 를 사용하면 한글이 깨어지지 않는데, 그 이유는 LiveDocs 에도 잘 나와있습니다.

useCodePage 속성  
useCodePage:Boolean  [읽기/쓰기]
언어 버전: ActionScript 3.0
런타임 버전: AIR 1.0, Flash Player 9

Flash Player에서 외부 텍스트 파일을 해석하는 데 사용할 코드 페이지를 지정하는 부울 값입니다. 이 속성을 false로 설정하면 외부 텍스트 파일이 유니코드로 해석됩니다. 이러한 파일은 저장할 때 유니코드로 인코딩되어야 합니다. 이 속성을 true로 설정하면 외부 텍스트 파일이 Flash Player가 실행되는 운영 체제의 일반 코드 페이지로 해석됩니다. useCodePage의 기본값은 false입니다.

flash.display.Loader.load(), flash.net.URLLoader, flash.net.URLStream 또는 XML 클래스를 사용하여 외부 파일로 로드하는 텍스트를 Flash Player에서 유니코드로 인식하려면 이러한 파일을 유니코드로 저장해야 합니다. 외부 파일을 유니코드로 인코딩하려면 Windows 2000의 메모장과 같이 유니코드를 지원하는 응용 프로그램에서 파일을 저장해야 합니다.

유니코드로 인코딩되지 않은 외부 텍스트 파일을 로드하려면 useCodePagetrue로 설정합니다. 이렇게 하려면 데이터를 로드하는 SWF 파일의 첫 번째 프레임에 다음 코드를 첫 코드 행으로 추가합니다.

System.useCodePage = true;

이 코드를 추가하면 외부 텍스트가 Flash Player가 실행되고 있는 운영 체제의 일반 코드 페이지로 해석됩니다. 영문 Windows 운영 체제의 경우 대개 CP1252이고 한국어 운영 체제의 경우 EUC-KR입니다. 만약 useCodePagetrue로 설정하면 Flash Player 6 이상 버전은 Flash Player 5와 같은 방법으로 텍스트를 처리합니다. Flash Player 5에서는 모든 텍스트를 Flash Player 실행 운영 체제의 일반 코드 페이지를 사용하는 것으로 간주하고 처리했습니다.

useCodePagetrue로 설정하는 경우 플레이어가 실행되는 운영 체제의 일반 코드 페이지에 외부 텍스트 파일에 사용되는 문자가 포함되어 있어야 텍스트가 표시됩니다. 예를 들어 중국어 문자가 포함된 외부 텍스트 파일을 로드하는 경우 CP1252 코드 페이지에는 중국어 문자가 없으므로 이 코드 페이지를 사용하는 시스템에서 중국어 문자가 표시되지 않습니다.

모든 플랫폼에서 SWF 파일에 사용된 외부 텍스트 파일을 볼 수 있게 하려면 모든 외부 텍스트 파일을 유니코드로 인코딩하고 useCodePagefalse로 설정된 상태로 두어야 합니다. 이렇게 하면 Flash Player 6 이상에서 텍스트가 유니코드로 해석됩니다.


LiveDocs 에도 나와 있는 것 처럼 useCodePage 를 true로 설정하면 유니코드가 아닌 운영체제의 codepage로 해석이 되는 것이죠. 한글 윈도우의 기본 codePage는 'EUC-KR(51949)' 입니다. 그래서 외부의 'EUC-KR'로 되어있는 문서가 깨지지 않고 읽히게 되는 것입니다.

더 이상의 문제가 없어보입니다만,  실제 그렇지 않습니다. 해당 swf 를 로드하는 사용자가 외국어 OS를 사용하고 있다면 어떨까요? 열심히 만든 어플을 정식으로 런칭했는데, 그걸 외국의 한국인이 본다면???

이론적으로 보면 'EUC-KR'로 되어 있는 문서를 해당 OS의 codePage로 읽게 될텐데, 다른 언어의 OS는 codePage가 설마 'EUC-KR(51949)'일까요?? 위의 livedocs의 설명에도 나와 있듯, 다른 나라의 OS는 한국어 OS와 codePage가 다르다는 군요. (다른 나라 언어의 캐릭터 셋에 대해서 궁금하시다면 여기에서 확인해보시면 되겠습니다.)

실제로 그런지 확인을 위해서 아래와 같은 간단한 swf 파일을 만들어 봤습니다. 소스코드는 다음과 같습니다.
Flex 로 만든 App.

로드한 XML 파일



동일한 XML 파일을 'UTF-8', 'EUC-KR'로 각각 저장해서 useCodePage를 각각 false, true 로 설정해 영어, 일어 Windows 에서 IE로 읽어봤습니다.
클릭하셔서 확인해보세요.
Windows XP 영문판에서 swf 로드

Windows XP 영문판에서 swf 로드

Windows XP 일어판에서 swf 로드

Windows XP 일어판에서 swf 로드



UTF-8로 되어있는 파일은 어떤 OS든지 간에 잘 로드가 되고 있고, 'EUC-KR'로 되어있는 것을 System.useCodePage = true; 로 설정한 것은 한글이 여지없이 깨져보이는 것을 확인 할 수 있습니다. 외국에 서비스 할 생각이 없는 어플이라 하더라도, 기본적으로 'UTF-8'로 파일들을 저장해 놓으시면 한글문제를 잘 피해가실 수 있다고 생각합니다. 단순이 파일만이 아니라, HTTPService로 load 하는 데이터 또한 'UTF-8' 로 제작되어야 하겠죠?

하지만 할 수 없이 'EUC-KR'을 사용해야 할 때가 있습니다.네이버 카페의 경우 'EUC-KR'로 되어 있는데요, 이 것 때문에 useCodePage를 true로 설정할 수 는 없는 것 아니겠습니까? 이런 고민을 제가 존경하는 원강민님께서 블로그에 이미 포스팅 하신 적이 있습니다.
System.useCodePage 대신 이렇게.. 이 포스트를 참고 하시면 좋겠습니다.

간만에 글을 썼더니 꽤나 길어졌네요 :-) 다들 좋은 주말 되시길!
2009. 1. 15. 11:18
드디어 강의 종료!!

드디어 강의 종료!!


지난번 근황글에서 ActionScript 3.0 강의를 하고 있다고 말씀드렸는데, 드디어 이번주 화요일(2009. 1. 13)을 마지막으로 강의가 종료되었습니다. 작년부터 시작한 것이니 햇수로 2년간(?) 강의를 했네요. 같이 강의하시느냐 고생많으셨던 원강민님도 고생하셨습니다. ;)

강사 뿐만이 아니라 땜빵해준다고 고생해주신 공룡님,
강의장소 제공 및 동영상 녹화에 고생해주신 그날님 및 밥사마, 차차님
그리고 가장 중요한 강의프로그램 wow-Cast 만들어주신 류님 등등~

이렇게 많은 분들이 고생해주시지 않았다면 강의는 커녕 시작도 못했겠지요. 물론 늦은 밤 같이 밤 지새워가며 강의들어주신 많은 수강자분들께도 감사의 인사를 전합니다. (마지막 강의때 들어와주신 분들은 더욱 Thanks!!! )

저와 원강민님의 ActionScript 3.0 강의는 Flex4U 카페에 동영상 오픈자료실에서 카페 회원가입 후 보실 수 있으니 참고하시면 좋겠네요. (끝나고 나서 이야기지만 하다가 예제가 잘 안돌아서 얼버무린 것도 있고 말이 꼬여서 어버버하던 것도 있어서 좀 부끄럽긴 합니다.; )

제 2008년 목표가 이런 강의를 하는 것이었는데, 잘 마무리 된 듯 합니다. ;)
이제 당분간 좀 주말에 가벼운 마음으로 놀러다닐 수 있겠네요~!!! 화요일 강의라 주말은 강의준비를 해야되서 심적으로 부담이 좀 되더라구요. :)
얼마전 에이콘출판사에서 트랙백 이벤트로 드리밍 인 코드 를 한권 받았는데(황대산님의 사인과 함께) 그 것도 빨리 읽어서 리뷰를 써야겠습니다.

요즘 통 블로그에 기술적인 글을 못 올렸는데, 이번 주말에는 꼭 하나 올리도록 하겠습니다. ;)
막상 글 쓰려니 다 아시는 것인가 싶기도 하고요.... ㅎ

2008. 12. 3. 15:14
TextInput 으로 사용자에게 어떤 입력을 받게 되는 경우가 있습니다. 이때에 보다 많은 내용(예를 들어 사용자의 자기소개 같은 값)을 입력 받아야 하는 경우가 생기는데, 이때 사용하면 좋은 컴포넌트가 TextArea 입니다. TextArea 컴포넌트로 여러줄로 입력을 받게되면 사용자는 필연적으로 엔터키를 눌러 개행(줄바꿈)을 하게 되는데 오늘 이야기해보고자 하는 것은 이 개행에 대한 처리입니다.

문자열에 엔터를 처리하기 위해서 이스케이프 문자인 백슬래시(\)를 사용하여 처리를 하게 되는데, 보통 흔히 알고 있기로는 엔터를 처리하기 위해 \r\n 을 문자열에 포함시키면 된다고 아실 겁니다. 저도 학교에서 C수업을 들을때 그렇게 배웠습니다.

\r   : 캐리지리턴(carriage return) -  커서를 해당 줄의 처음으로 옮김
\n   : 라인피드(linefeed) - 커서를 해당 줄의 다음줄로 옮김

커서를 해당줄의 왼쪽으로 옮겨 다음줄로 내리면 엔터키를 친 것과 동일한 효과가 나오게 됩니다.
하지만 TextArea 에서는 \r 만으로 엔터키 처리를 하고 있습니다.




위와 같이 엔터키를 넣게 되면 실제로 TextArea의 text 속성에서 받는 문자열에는 "텍스트\r입력" 이라고 들어있게 되는 것이죠.

사용자에게 입력받은 해당 데이터를 서버에 저장하고 불러와 다시 TextArea 에 넣어줄때에 아무런 처리를 하지 않아도 상관없습니다. 어짜피 넣어진대로 다시 넣는 것이니까요. 하지만 서로 다른 언어에서 같은 데이터를 사용시에는 문제가 됩니다. 언어들마다 엔터의 처리가 다르기 때문이죠.

위에서 처럼 \r\n 으로 엔터키를 처리하는 경우도 있고, \r 만으로도, \n 만으로도 처리하는 경우가 있습니다. 만약 \r\n으로 엔터를 처리하는 시스템에서 만들어 놓은 문자열을 TextArea 에 대입하면 어떻게 될까요? "텍스트\r\n입력" 이라고 TextArea의 text 속성에 넣으면 아래와 같은 현상이 발생합니다.


위에서 보시는 것 처럼 \r\n 둘다 엔터키로 인식되네요.

참고로 말씀드리자면 MXML 상에서 위의 이스케이스 문자를 인식시키실때는 아래와 같이 하시면 됩니다.


아무튼, 저는 이와 같은 문제를 자바로 구성된 서버를 이용하면서 겪게 되었습니다. 해당 서버를 이용하는 또다른 쪽이 델파이로 구성되어 있는데, 델파이에서는 \r\n 으로 엔터키를 표현하는데, 플렉스에서 받아오니 엔터가 2번 입력되는 것 처럼 보이는 것은 물론 Flex 쪽에서 생성한 문자열은 델파이에서 엔터키가 없는 상태로 출력되는 것이었습니다.
물론 더 좋은 방법들이 있을꺼라 생각되지만, 저는 플렉스쪽에서 변환해서 쓰고 저장시에도 변환해서 보내기로 결정을 했습니다.
그래서 아래와 같은 코드를 구현하였습니다.



네이밍이 좀 별로네요.. ;;
엔터키의 처리가 다르다는 것을 알아두시면 좋겠네요. ;)


ps. Flash Player 10 이 공개된 이후 FP10 이 설치된 브라우저에서 이전 포스트의 swf 파일을 로드하지 못하는 경우가 생기네요.
정확하게 이유는 모르겠습니다. 티스토리 포럼에 같은 내용의 버그신고가 이어지고 있는데, 자세히 알아봐야겠습니다.

2008. 11. 7. 17:38
안녕하세요! 검쉰입니다.

요즘 전혀 블로그에 글을 못쓰고 있습니다. 반성중이예요. ㅜㅜ
회사에서 하고 있는 프로젝트가 이제 막바지에 들어서면서 요구사항도 수정되고 정신이 없네요 ;-( 아마도 12월까지는 쭈욱~ 바쁠듯 합니다. 그래도 이제 좀 한숨 돌렸습니다. 게다가 덕분에 여러분께 알려드릴만한 것들을 또 알게되었네요.  좋은 글꺼리가 생겼습니다.

요즘은
Flex4U 라는 카페에서 ActionScript 3.0 강좌를 진행하고 있습니다.
지난달 10월 28일부터 매주 화,목 밤 11시에 저와 영구기님이 각자 화, 목에 강좌를 진행하고 있답니다.
교재는 ActionScript 3.0 Programming 을 사용하고, 영구기님은 Display,  저는 Non-Display 강의를 맡고 있어요. 
가끔 대타로 공룡님께서 해주시기로 했고요. ;)
이제 2주째 강의가 진행되었는데, 생각보다 준비해야 될 것이 많네요.
몸이 피곤한 날은 무슨 말한건지도 잘 모르겠고 ^^
강의 들어주시는 분들이 이쁘게 봐주셔서 재미있게 강의 중입니다.

관심있는 모든 분들이 다 들으셨으면 좋겠습니다만, 서버 최대 접속자 문제로 모든 분이 참여하실 수는 없고, 대신 아프리카로 동일시간에 중계중이니 관심있으신 분은 카페에 가입하셔서 접속 관련 정보 얻으셔서 같이 들으시면 좋겠습니다. ;) 이전 강의와 마찬가지로 현재 강의도 동영상으로 녹화하고 있으니 참고해보시는 것도 좋겠어요. (물론 일정 시간 후에 공개됩니다. ㅎ)

강좌때문에 고생해주시는 많은 분들이 계십니다.
  • 우선 이런 강좌를 계획하시고 진행해주시며 고생하시는 공룡(유성용)
  • 항상 뒤에서 버팀목이 되시며 매번 늦은 시간까지 강좌 동영상 편집하여 주시는 그날(이정칠)
  • 강의 프로그램을 짜주신 류(류종택)
  • 같이 강의하신다고 고생 많으신 영구기(원영국)(결혼축하드려요!! - 내일 부산에서 결혼하신답니다-)
  • 신입이라 바쁘실텐데, 매번 늦은 시간까지 동영상 녹화 백업해주시는 밥사마(박영관)
  • 여타 다른 많은 수강생 여러분 들~
좋은 분들 많이 알게되어 정말 영광입니다. ;) 앞으로도 잘 부탁드려요!


이건 잡담입니다만,
제 노트북 문제로 집에서 강의진행이 불가하여, 이정칠님 회사에서 강의를 매주 하고 있답니다.
매주 나가는 택시비가 아까워 자전거를 한대 사려고 하는데, 옆에 있는 스트라이다(Strida)라는 녀석이 맘에 들더군요. 그런데 가격이 가격인지라...;

접이식이 꼭 필요(골목많은 동네에 사는 처지라, 집안에 들여놓지 않으면 잃어버리기 쉽상)해서 찾던 도중에 찾은건데, 너무 비싸요.. ㄷㄷ 누구 저한테 중고라도 파실 분~~ ㅋ
아니면 유사한 것들이라도 사야되나... (가격이 절반쯤 하더군요 ㅋ)
다른 자전거도 봤는데, 눈에 들어오는 것들은 엄청 비싸더군요.....
브롬튼(brompton) 이라는 것은  더 비싸더란....;

아무튼 이런 것에도 고민중입니다. ㅎㅎ



회사 프로젝트와 강좌, 기타 제가 스스로 계획한 일들 떄문에 몸도 마음도 힘듭니다만, 그래도 열심히 해야겠죠?
다들 좋은 주말 보내시고(저는 좀 쉬고), 곧 좋은 포스트으로 찾아뵙겠습니다. ;) 
2008. 9. 28. 22:30
단도직입적으로 말씀드리자면, new 키워드는 비용이 비쌉니다. 많은 리소스를 사용하게 된다는 말이죠. 물론 안쓸 수야 없죠. 새로운 객체를 생성하려면, 당연히 써야됩니다. 하지만, 사용하게 되면 그만큼의 연산과 메모리의 차지는 어쩔 수가 없습니다. 이런 문제들로 인해 좀 더 효율적인 객체의 사용을 위해 객체 풀(Object Pool) 을 구성하여 사용한다던가 하는 방법을 고민하게 되죠.
본 포스트에서는 객체 풀에 대해서 설명하지는 않겠습니다. 위에 링크로 걸어놓은 영구기님의 포스트를 참고하시도록 하시고요, 이번 포스트에서 제가 설명하고자 하는 것은 new 키워드를 사용하지 않고서도 사용할 수 있는 타입들에 대한 사용방법입니다.

데이터형태는 아래와 같이 2가지의 데이터형이 존재합니다.

Primitive Data Type : Boolean, int, uint, Null, Number, String, void
Complex Data Type : Object, Array, Date, Error, Function, RegExp, XML, XMLList


기본적인 데이터 형태(Primitive Date Type)의 변수선언시에는 물론 new 키워드는 사용하지 않습니다. 하지만 사용하지 못한다는 것은 아닙니다.
문자열을 저장할 때에 String 를 사용하게 됩니다. 이 String 형 변수는 다음과 같이 선언하게 됩니다.

하지만 아래와 같이 new String() 이라고 할 수도 있습니다.

int, uint, Number, Boolean 도 마찬가지로 new 키워드를 이용하여 변수에 할당해줄 수 있습니다. 허나 그렇게 사용하지는 마십시오. 기본적인 데이터 형태의 변수는 new 키워드를 사용하지 않아도 메모리가 할당되게 됩니다. 게다가 더 빠르고 간편합니다.

그래도 확인하고 넘어가는 차원에서 Number 형태의 변수의 할당에 대해 살짝 실험해보도록 하겠습니다. 아래의 코드를 보시면 Number 변수를 할당시에 new Number()를 사용하는 것과 직접 값을 입력하는 것에 대해서 속도를 비교해보고 있습니다. new 키워드를 사용하지 않는 것이 더 간편합니다. 그 아래에는 실제 결과물입니다. 테스트 버튼을 클릭하셔서 테스트 해보시기 바랍니다.



그렇다면 보다 복잡한 데이터 형태(Complex Data Type)의 변수를 선언시에는 new 키워드를 어떻게 쓰지 말라는 말일까요?
가장 먼저 많이 사용하는 Array에 대해서 말씀드려보겠습니다. 우선 Array를 선언시에 아래와 같이 선언할 수 있습니다.

이전 포스트에 살짝 언급하였습니다만, Array의 경우는 [] 를 이용하여 새로운 Array를 할당할 수 있습니다.

이와 비슷하게 Object를 할당할 때에도 new Object()  대신에 {} 를 이용하여 새로운 Object 할당이 가능합니다.
아래와 같은 선언을 다른 예제 소스코드에서 흔히 보셨을겁니다.

위에서 설명드린 것과 같이 Array 를 할당시에 [] 를 이용하고 Array 내부의 값을 {}를 이용하여 Object 형태로 정의하였습니다.
만약 [], {} 없이 선언하려고 한다면 아래와 같이 하여야할 것입니다. (물론 이렇게 사용할 일은 거의 없죠. 매우 극단적인 예랄까요? )


RegExp 같은 경우도 new 키워드를 사용하지 않고 선언 가능합니다.


XML 도 마찬가지입니다. 아래와 같이 흔히 사용하시고 있죠?
2번째 라인에 있는 것처럼 사용하실 일은 없을 듯합니다. 물론 String 형태의 XML 데이터라면 XML 로 변환하려면 2번째 라인처럼 해야겠죠.


마지막으로 위에서 말씀드린 Array와 Object 의 new 키워드 사용 유무에 대한 속도차 테스트를 해보고 마무리 짓겠습니다.
(RegExp 는 속도차가 거의 없어서 생략하였고,  XML은 쓸일이 없을 것 같아 생략하였습니다. ㅎ)

아래는 Array를 테스트한 코드입니다.

아래는 Object를 테스트한 코드입니다.


뭐 결론은 new Array() 대신에 [], new Object() 대신에 {} 를 사용하자는 것입니다. ;)
긴 글 읽어주셔서 감사합니다. ;) 다 읽으신 후에는 덧글 하나 써주시는 센스!!

참고자료 :
객체 풀[Object pool]을 이용해 보자.  - 영구기님 블로그
ActionScript3.0 너는 누구냐? - 엄진영님 Flex 챔피언 블로그

2008. 9. 1. 01:07
사용자 삽입 이미지
일전에 소개해드렸던 'Adobe FLEX 3 실전 트레이닝 북' 의 뒤늦은 리뷰입니다. 예약판매 중이었던 것을 발견하고 예약을 하려고 했으니 여차저차한 사정에 의해서 예약을 하지 못해, 마냥 궁금해 하고만 있었습니다.
이 책의 원서인 'Adobe Flex 3 Training from the Source'의 flex 2 시절 책인 'Adobe Flex 2 Training from the Source'를 PDF로 사다가 Flex 공부를 시작했던게 제 첫 Flex 입문이었죠. 그 후로 옥상훈님의 '예제로 배우는 Adobe 플렉스'가 나와서 '한글이라서 좋구나~' 신나하며 읽었던 기억이 나네요. 한글로 된 서적이 없어서 안되는 영어로 구글님께 비나이다~ 비나이다~ 하며 찾아보곤 했었는데 말이죠.
그래서 이번 'Adobe FLEX 3 실전 트레이닝 북'에 대해서 상당히 기대가 컸습니다. (예약안한건 뭥미..-_-)  월급받으면 10% 넘는 돈이 책값으로 지불되는 상황이어서 그 당시 돈이 없었습니다; 사야지~ 하고 생각만 하고 있다가 한 몇주 까먹고 지내는 상황이...

하지만 또 지성이면 감천(그게 무슨 상관)이라고 책을 퍼낸 위키북스에서 선물로 책을 보내주셨습니다. ;) 정말 감사드립니다. (덕분에 돈을 아꼈습니다. ㅜㅜ 개발서 너무 비싸요.. 먹고 살기 힘들 지경-_-)

제가 책을 받기 전에 강컴에 강력한 서평이 올라왔었습니다. 한마디로 '번역이 형편없다' 라는 거죠. 저도 ㅎㄷㄷ 하고 있던 참에 책을 받았는데 '-keep-generated-액션스크립트'는 스티커로 수정되어 있더군요. 아마도 'ActionScript' 라고 적힌 것을 기계적으로 일괄 수정하다가 나타난 문제였던 것 같습니다.
실제 악플에 가까운 서평이 올라왔던 것과는 달리 제가 읽기에는 번역 자체의 퀄리티는 대부분 무리없이 읽을 수 있는 평이한 수준이었습니다. 책의 앞과 뒤쪽의 용어들의 번역들이 좀 일치하지 않는 느낌이더군요. 역자가 한분이 아니여서 그런 듯. (조금은 아쉬운 생각이 들긴 합니다만, 번역서 출간에 대해서 제가 알고 있는 바로는 번역에 대한 비난에 씁쓸한 웃음만 나오더군요. 번역비가 많이 나와서 부자가 되는 것도 아니고, 그렇다고 번역의 질이 어떻니 하며 신경만 곤두서고 말이죠. 참... 안타까웠습니다. 거의 자원봉사의 수준이라고 하던데 말이죠.번역하실 분들이면 원서 읽기도 무리가 없으실 분들이 자원봉사정신이 없으시다면 번역서가 나올리가..아쉬울 것 없으실 분들일텐데. 영어 한줄도 더듬거리며 해석 겨우 해내는 제가 이런말 하는게 좀 우습네요 ^^)
부분적으로 애매한 설명 같은 것은 수정을 좀 하셔서 차후에 다시 책을 찍을 때 반영이 되었으면 좋겠네요. 베타리더도 적극 도입하시면 좋겠습니다.

아무튼, 책 내용은 많은 분들이 말씀하신대로 참 좋습니다. Flex의 전체적인 것(레이아웃부터 FDS까지)을 설명하고 있기 때문에, 입문자에게 개념정리로써 상당히 도움이 될 듯합니다. 예전 Flex2 버전은 영어버전으로 공부했더니 이해를 잘못하고 있던 부분이 많았는데, 한글서적이라 참 좋네요 ㅎ Flex 3용으로 나오면서 추가된 여러가지 내용들도 참 쉽게 이해할 수 있었습니다.
좀 더 이미지가 많았으면 하는 생각도 했습니다. 텍스트로 서술되어 있는 경우가 많아 열심히 읽어야됩니다. ;)  조금 답답하다 할까요. 크게 문제될 부분은 아닙니다.
각각 실습시간이 나와있어서 또한 재미있습니다. 추후에 사내 Flex 관련 스터디가 진행된다면 이 책으로 하면 참 좋을듯.

제가 일전에 Flex ACE를 취득했는데, 이때도 참 달게 잘 보았습니다. 예를 들면 시험에 CSS부분에서 Type selector와 Class selector 에 대해서 나오는데, 처음보고는 이게 뭐지.. 하는 생각만 들더라고요. 용어가 너무 생소한 느낌이랄까요. 분명 개발할때 쓰고 있는데 말이죠. 그래서 저처럼 ACE를 취득하려고 준비하시는 분들께도 추천해드립니다. 꼭 한번 정독하시면 좋습니다. ;)


AIR in Action번역서가 나올 예정이라고 합니다. 9월 안(아마도 추석 전후..)에 나온다고 하는데요. 기대 완전 하고 있습니다. ;)
사용자 삽입 이미지

표지가 나왔네요 ;)


저도 책 한권 써볼까 싶은 생각이 절로 납니다 ;)
2008. 8. 7. 14:21
Flex에는 크게 MXML과 ActionScript 로 구현되고 있는데, 내부적으로 MXML이 ActionScript 로 변환되어 SWF로 빌드 됩니다. MXML이 ActionScript 로 변환되는 것을 볼 수도 있는데요, keep-generated-actionscript 속성을 바꿔주면 됩니다. 속성 지정 방법은 시난님의 블로그에서 잘 정리해놓으셨습니다. (SliverLight의 경우는 Flex와 다르게 CS 코드가 XAML을 변환시키는 구조라고 하더군요)

실제로 간단하게 속성을 지정하여 변환을 하여 보면 참 새로운(이해 잘 안되는) 코드들이 마구 쏟아져나옵니다. 특정 MXML Application을 생성하면 관련된 파일 4개가 생성이 됩니다. (다른 것들은 보통 특정 스타일 지정 ActionScript 클래스이거나 속성 관련)

예를 들어 test.mxml 파일이 있다면 아래와 같이 생성이 되게 됩니다.
  • test-generated.as
  • test-interface.as
  • _test_FlexInit-generated.as
  • _test_mx_managers_System.as
본 포스트에서 살펴볼 것은 처음에 있는 xxx-generated.as 입니다. 이해를 쉽게 돕기 위해서 간단하게 MXML Application을 만들어보겠습니다. MXML.mxml 이라고 이름 붙혀보았습니다. (조악한 네이밍. ㅜㅜ)


위와 같이 MXML이 생성이 되었다면 아래와 같이 MXML-generated.as 가 생성이 됩니다.
(설명할 부분만 수록하도록 하겠습니다. - 길이가 길어서...)



MXML Application 이기 때문에 클래스는 Application 을 상속받고 있습니다. 그 바로 밑에 보면 흔히 쓰이지 않는 UIComponentDescriptor 타입의 변수가 보입니다.

UIComponentDescriptor 인스턴스는, 비주얼 컴퍼넌트의 인스턴스의 MXML 태그로 지정된 정보를 캡슐화합니다.

MXML 파일내의 대부분의 태그는, UIComponent object의 트리를 설명하는 것입니다. 예를 들어,<mx:Application> 태그는 UIComponent object를 나타내, 그 child containers와 컨트롤도 모두 UIComponent object입니다.

MXML 컴파일러는, 각각의 MXML 태그를 UIComponentDescriptor 인스턴스에 컴파일 합니다. 엄밀하게는, MXML 컴파일러는 ActionScript 데이터 구조를 자동 생성합니다. 이것은, UIComponentDescriptor object의 트리가 됩니다.

실행시에, Container 클래스의 createComponentsFromDescriptors() Methods는, 컨테이너의 childDescriptors 배열의 UIComponentDescriptor object내의 정보를 사용해, 컨테이너의 아이인 실제의 UIComponent object, 및 한층 더 깊은 자손을 작성합니다. 컨테이너의 property creationPolicy 의 값에 따라서는, 어플리케이션의 기동시에 컴퍼넌트의 일부가 표시될 때, 또는 어플리케이션의 개발자가 수동으로 createComponentsFromDescriptors() Methods를 호출했을 때에, 자손이 작성되는 일이 있습니다.

통상, UIComponentDescriptor 인스턴스를 스스로 작성할 것은 없습니다. Container 클래스의 childDescriptors 배열을 경유해, MXML 컴파일러가 자동 생성한 인스턴스에 액세스 할 수 있습니다.

출처 : flexdocs.kr


설 명이 좀 어려운데요, 다시 말해서 MXML로 정의된 정보를 모두 가지고 있게 된다는 것입니다. 내부적으로 트리형태로 자식 컴포넌트들도 다 가지고 있게 되는데, 실제로 UIComponentDescriptor 타입의 _documentDescriptor_ 변수가 Application 이고, 그 자식으로 추가된 Button 컴포넌트는 childDescriptors로 추가되어 있습니다. 물론 Button 컴포넌트도 UIComponentDescriptor 타입이 되죠. 만약 버튼에 자식 컴포넌트가 존재했다면 childDescriptors 에 정의되어 있을겁니다.

여기서 잠시 Application에 childDescriptors로 정의된 Button 을 다시 한번 보겠습니다.

여기서 잠시 보실 것은 Button에 설정해놓은 click 이벤트입니다. 클릭시에 "___MXML_Button1_click" 를 호출하도록 되어 있는데요, 해당 메소드로 가보면 제가 정의한 clickEventHandler 를 호출하도록 하고 있습니다.


특정 이벤트에 대해서 이벤트 핸들러(event handler)를 설정하게 되면 1. 해당 이벤트에 대해서 호출된 메소드를 생성하고 2. 그 메소드가 이벤트 핸들러를 호출하게 하는 방식입니다.

저는 이 구조를 처음 봤을 때 전부터 궁금했던 의문점이 하나 풀렸습니다.

위와 같은 코드가 있다고 할때에 이 것을 ActionScript 로는 어떻게 할까 하는 것이었습니다. ActionScript 로는 addEventListener 메소드를 이용해야 되는데, 핸들러 메소드에게 따로 파라미터를 던질 방법이 없었던 거죠. 커뮤니티에도 이와 같은 질문들이 가끔씩 올라왔기도 했고, 저도 상당히 궁금했었습니다.

살짝 감이 잡히시나요?

각 버튼의 이벤트 핸들러가 생성되고 그 이벤트 핸들러에서 위에서 지정한 clickEventHandler를 호출하게 됩니다. 참 난감하더군요 ;)

아무튼 뭐 살짝 MXML이 ActionScript 로 변환되는 과정에 대해 살짝 알아보았습니다. ;)
PopupManager 관련 글은 아직 준비중입니다.. ㅜㅜ



2008-08-20 본문 복구 완료
prev"" #1 #2 #3 next