'Dev/ActionScript'에 해당되는 글 6건
2009.07.01 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 한글문서에는 연관배열이 아닌 연결배열로 번역이 되어있더군요. 정확하게 무엇이 맞는지는 저도 잘 모르겠네요 :)

신고
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.07.13 12:01 신고 | PERMALINK | EDIT/DEL | REPLY
난 개인적으로 Dictionary 선호..
그나저나.. key.toString = function() { ... }
AS 3.0 이후로, 다른 사람이 쓰는 건 정말 간만에 보는 듯..
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.13 23:11 신고 | PERMALINK | EDIT/DEL
난 AS 3.0 부터 해서 어색한 사용법 ㅎㅎ
Favicon of http://as3.kr BlogIcon 우야꼬 | 2009.07.13 18:17 신고 | PERMALINK | EDIT/DEL | REPLY
맞아 연관배열을 배열의 기능으로 아는 사람 정말 많더라.
굿 포스팅~
마지막에 "클래스의 구현 목적대로 사용하여야"에 공감 100표 >.<)b
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.13 23:11 신고 | PERMALINK | EDIT/DEL
엉뚱하게 쓰면 곤란하단말야 :)
Favicon of http://hangunsworld.com BlogIcon Han Sanghun | 2009.07.13 21:15 신고 | PERMALINK | EDIT/DEL | REPLY
처음부터 배열을 연관배열로 사용하지 못하도록 막아 놓았으면 되는 것을,
정작 뒷문은 만들어 놓고 정문으로만 다니라는 것은 좀 프로답지 않은데요 ㅎㅎ
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.13 23:13 신고 | PERMALINK | EDIT/DEL
제가 보기에는 dynamic 클래스라서 맘대로 속성을 넣을 수 있었는데, 그게 어쩌다보니 연관배열처럼 쓸 수 있게 된건지도.;;
그래서 Array를 연관배열로 쓰지말아라.. 라고 LiveDocs에 넣은 것 같기도 ㅎㅎ
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2009.07.13 22:28 신고 | PERMALINK | EDIT/DEL | REPLY
난 Dictionary를 커스터마이징한 HashMap을 만들어 사용하고 있음~~ ^^
정말 필요할때 Dictionary의 부족한 점을 말끔히 해결해준다는 ~~
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.13 23:14 신고 | PERMALINK | EDIT/DEL
형님 그런건 공개하셔야죠! ㅋㅋㅋ
차차 | 2009.07.14 20:55 신고 | PERMALINK | EDIT/DEL | REPLY
ㅋㅋ오빠 메인사진 바꼈네요..깜놀-,.-
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.22 18:31 신고 | PERMALINK | EDIT/DEL
뭘 또 깜놀까지야 ㅋ
Favicon of http://jjaeko.tistory.com BlogIcon 째코 | 2009.07.15 00:02 신고 | PERMALINK | EDIT/DEL | REPLY
유익한 내용이네요.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.22 18:31 신고 | PERMALINK | EDIT/DEL
감사감사 :)
Favicon of http://douglas9.pe.kr BlogIcon douglas9 | 2009.07.20 12:16 신고 | PERMALINK | EDIT/DEL | REPLY
그런데 한가지 좋은 점은 아주 미묘하지만 Array가 조금 빠르 더군요.
다들 그래서 쓰는 건 아닌지... 하지만 그 정도의 미묘한 차이 보다는
안정성이 더 중요하겠죠^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.03.27 22:34 신고 | PERMALINK | EDIT/DEL
맹기완님이 좋은 글 적어주셨어요 ;)
http://www.diebuster.com/?p=690
치우비 | 2009.07.25 01:47 신고 | PERMALINK | EDIT/DEL | REPLY
음...... 잘보고 갑니다..
Favicon of http://7zelkova.tistory.com BlogIcon 성주 | 2009.08.02 00:20 신고 | PERMALINK | EDIT/DEL | REPLY
아아.. 내공 부족을 뼈저리게 느끼고 갑니다.
| 2010.04.25 06:35 신고 | PERMALINK | EDIT/DEL | REPLY
그렇다면... Object로 했을때 특정 KEY에 VALUE를 추가로 넣고싶을땐 어떤 명령을 써야하나요? Array라면 push를 쓰면 되는데.
저도 저 문구때문에 Object로 할려고 했는데...아 괴롭네요 벌써 5시간째 씨름하다가 걍 Array로 완성하긴했습니디만...음... 굽신굽신 조언좀부탁드립니다.
참고로
obj[x].key = value; 또는 obj.key[x] = value; 등등 뭐 이런것들은 안됩니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.04.25 17:24 신고 | PERMALINK | EDIT/DEL
obj[x].key = value; 라는 코드가 있을 때, x가 String 이 아니라면 일종의 객체키가 될 것입니다.
이럴 경우 Dictionary 를 사용하시면 될 것 같네요.

저는 본문에서 다루었던 것 처럼 연관배열로 사용할 경우가 아닌 경우에는 Object를 직접 사용하는 것을 꺼립니다. 예를 들어 obj[x].key 라고 정의하셨다면, x라는 키를 통해 받은 객체가 key라는 키를 이용해 값을 가지고 있게 될텐데, 이런 코드는 컴파일러 수준에서는 값이 존재하지 않다거나 하는 문제를 잡을 수 없게되죠. 런타임시에 문제가 발생하게 되므로 곤란해집니다. 특정 속성들을 사용하시는 경우에는 따로 클래스를 만드셔서 사용하시기를 권해드립니다.
울랄라 | 2010.07.30 16:16 신고 | PERMALINK | EDIT/DEL | REPLY
그럼 Object를 연관배열(해쉬처럼)처럼 사용할때,, 전체를 비우거나 일부만 비우려고 할때 어떤식으로 해야 하나여?
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.08.02 15:10 신고 | PERMALINK | EDIT/DEL
'Object가 연관배열로 사용하기 위해서 작성되었다기 보다는 연관배열로 사용이 가능하다.' 라고 생각하시면 쉽겠습니다.
말씀하신 기능은 추가로 구현하여야할 것 같네요.
Favicon of http://storyjava.tistory.com/ BlogIcon KevinKim | 2013.01.18 15:11 신고 | PERMALINK | EDIT/DEL | REPLY
검쉰님 좋을 글 너무 감사합니다. 생초보에 사수없이 혼자 개발하다보니 항상 어려운 점이 많은데, 좋은 글 너무 큰 도움이 되고있습니다.
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
2009.06.18 23:28
오랫만에 블로그로 인사드립니다. (__)

최근에 BMP 파일을 Flex 에서 읽어다 쓸 일이 생겼습니다.
Flex에서 이미지를 보여주는 컴포넌트인 Image 컴포넌트는 JPEG, PNG, GIF, SWF, SVG 같은 확장자만을 지원하고 BMP은 지원하고 있지 않기 때문에 BMP을 바로 넣을 수는 없습니다.(웹에서 BMP 를 쓰는 무식한 짓을 하면 안되겠죠.. ㅜㅜ 크기도 큰데 말입니다.)  JPG 파일이면 Image 컴포넌트에서 바로 읽어다 쓸 수 있을텐데 참 난감합니다.

그럼 방법이 없느냐? 아닙니다.
어떤 멋진 분께서 BMPDecoder 를 만들어놓으셨네요! :) 이미 FlexComponent 카페에서도 공유되었던 내용입니다.


위의 블로그에 들어가보시면 간단한 사용법에 대해서 나오고 BMPDecoder 라이브러리도 보입니다. 다만 BMPDecoder.as 파일이 다운로드가 안되네요. BMPDecoder.as 파일은 '삶의 향기'라는 블로그에  간단한 예제와 함께 업로드 되어 있으니 다운받아 사용하시면 되겠습니다.

간단하게 FP10 에서 추가된 FileReference의 load() 메소드를 이용해, BMP파일을 불러다  Image 컴포넌트에 넣는 예제를 만들어봤습니다.  예제 구성은 위에서 소개해드린 '삶의 향기' 블로그에 소개된 코드를 이용했습니다.


BMPDecoder.as 보기


BMP 파일을 선택하시면  Image 컴포넌트에 깔끔하게 출력되는 것을 보실 수 있습니다.

하지만 다음과 같은 버그가 존재합니다.
170픽셀 16bit BMP

170픽셀 16bit BMP

171픽셀 16bit BMP

171픽셀 16bit BMP 파일


위의 이미지에서 볼수 있는 것 처럼 BMP을 로드했을 때 이미지가 뒤틀려버리는 버그가 존재합니다.
왜 그럴까 한참을 고민했는데, 저희 팀장님이 힌트를 주시더군요. '윈도우어플에서도 비트맵 크기가 홀수일 경우 이미지가 저렇게 깨진다'고 말이죠. 실제로 테스트해보니 위와 같이 16bit이고 이미지의 너비가 홀수일 경우 위 처럼 이미지가 뒤틀려버리는 버그가 있습니다. (24bit, 32bit에서는 괜찮더군요)

이 버그에 해결책으로 저는 아래와 같이 decode() 메소드에서 이미지 너비를 결정해주는 로직 밑에 너비가 홀수일경우 강제로 1픽셀 늘리는 방법을 사용했습니다. 더 좋은 방법이 있을 것 같은데, 아시는 분은 알려주세요 :)


그럼 좋은 하루되세요!


예제파일 다운로드 :

신고
Favicon of http://hangunsworld.com BlogIcon Han Sanghun | 2009.06.20 08:25 신고 | PERMALINK | EDIT/DEL | REPLY
잘 뒤져보면 자주 쓰이는 파일 포멧들에 대한 인코더/디코더들이 많이 공개되어 있더라고요. 정말 좋은 세상인것 같아요. ^^
그렇지만 플래시 플레이어 성능의 한계상, 용량이 좀 큰 파일인 경우 스크립트 실행이 멈추는 문제가 종종 있더군요.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.20 14:25 신고 | PERMALINK | EDIT/DEL
정말 고마우신 분들이 많으십니다 ;)
예전에 JPEG의 EXIF 정보 읽어보려서 스펙뒤지고 했는데, 이미 만들어서 공개해두신 분이 계시더라는;;;;
용량 큰건 안습이죠... ㅜㅜ
Favicon of http://siking.tistory.com BlogIcon 윤연식 | 2009.06.23 20:53 신고 | PERMALINK | EDIT/DEL | REPLY
아하.. 그렇군요... 잘보고 갑니다 감사합니다...^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.24 11:24 신고 | PERMALINK | EDIT/DEL
생유~
차상욱 | 2009.06.24 11:43 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 자료 감사합니다.
그런데 제가 flex3 빌더를 사용하는데 여기서는 FileReference 안에 load() 메소드가 지원되지 않더군요
혹시 위에 빌더가 flex 2인가요??
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.24 15:02 신고 | PERMALINK | EDIT/DEL
저는 Builder 3를 사용하고 있습니다.
기본적으로 Builder 3에서는 FP 9가 기본인데요, 위에 설명에서 보시면 알 수 있듯, Flash Player 10 에서 load() 메소드가 추가되었습니다.
FP10 의 API를 이용하기 위해서는 프로젝트 생성 후 프로젝트 속성에서 Flex Compiler 선택해보시면 하단에 HTML wrapper 가 있습니다. 거기에 요구되는 Flash Player 버전을 10.0.0 이상을 맞춰주시면 정상적으로 실행됩니다. ;)
나그네 | 2010.01.12 18:34 신고 | PERMALINK | EDIT/DEL | REPLY
1픽셀 늘리는 패치를 사용할 경우 에러가 나는 경우가 있습니다. 24비트 bmp 디코드 시에 decode24BitBMP() 메소드에서 "파일의 끝입니다" IOError 가 발생하더군요.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.03.04 08:36 신고 | PERMALINK | EDIT/DEL
1픽셀 늘리게 수정한 뒤에 테스트는 못 해봤는데 ^^;;;
감사합니다! ^^
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2010.01.29 19:00 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 정보야~~~~
Favicon of http://stemp.tistory.com BlogIcon 문정환 | 2010.03.03 12:51 신고 | PERMALINK | EDIT/DEL | REPLY
좋은정보가 많이 있네요 ^^
많은 도움이 될것같습니다 좋은정보 감사드립니다^^
| 2012.09.11 11:34 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
2009.03.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 대신 이렇게.. 이 포스트를 참고 하시면 좋겠습니다.

간만에 글을 썼더니 꽤나 길어졌네요 :-) 다들 좋은 주말 되시길!
저작자 표시 비영리 변경 금지
신고
Favicon of http://okgosu.tistory.com BlogIcon okgosu | 2009.03.27 17:59 신고 | PERMALINK | EDIT/DEL | REPLY
컴백 하셨네요...
잘 보고 갑니다~

with okgosu (-..-)a 저도 굽신 굽신~
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.29 22:19 신고 | PERMALINK | EDIT/DEL
방문 감사합니다 ;)
Favicon of http://jidolstar.com/blog BlogIcon 지돌스타 | 2009.03.28 13:03 신고 | PERMALINK | EDIT/DEL | REPLY
좋아요~~~ 블로그의 세계로 돌아오신것을 환영합니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.29 22:20 신고 | PERMALINK | EDIT/DEL
다음 포스팅은 언제일 줄 모른다는... ㅎㅎ
박스농사 | 2009.03.30 09:39 신고 | PERMALINK | EDIT/DEL | REPLY
영어는 왜 다 잘나올까요?
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.30 09:43 신고 | PERMALINK | EDIT/DEL
비 영어권의 슬픔. =ㅁ=
Favicon of http://zommoc.tistory.com BlogIcon 좀모씨 | 2009.03.30 11:52 신고 | PERMALINK | EDIT/DEL | REPLY
많은 도움이 되었습니다^^

.....지식인 질문자 채택글 같은;;;;;;
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.31 09:46 신고 | PERMALINK | EDIT/DEL
채택해주셔서 감사합니다?! ;)
Favicon of http://7zelkova.tistory.com BlogIcon 성주 | 2009.03.31 10:05 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 글 잘 보고 갑니다.
저도 System.useCodePage = true; 로 해 놓은게 있는데 수정해야겠네요
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.31 22:06 신고 | PERMALINK | EDIT/DEL
방문 감사감사 ;)
Favicon of http://lovedev.tistory.com BlogIcon lovedev | 2009.03.31 20:47 신고 | PERMALINK | EDIT/DEL | REPLY
^^ 다시 돌아 오셨군요 ^^)/ 화이팅
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.31 22:06 신고 | PERMALINK | EDIT/DEL
열심히 달려 보겠습니다 ;)
모지씨 | 2009.04.01 09:34 신고 | PERMALINK | EDIT/DEL | REPLY
좋은글 잘보고 갑니다 : )
이름 입력하라는곳 없어서 한참 찾았는데... 새로고침하니까 나오는군요 :-(
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.04.01 16:03 신고 | PERMALINK | EDIT/DEL
로그인 하면 좀 편함 ㅋ
Favicon of http://zommoc.tistory.com BlogIcon 좀모씨 | 2009.04.03 17:49 신고 | PERMALINK | EDIT/DEL
그럴 때 Q 를 눌러보시면 새로운 세계가~
Favicon of http://hangunsworld.com BlogIcon Han Sanghun | 2009.04.02 18:02 신고 | PERMALINK | EDIT/DEL | REPLY
명쾌하게 정리해 주셨네요 ^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.04.02 18:10 신고 | PERMALINK | EDIT/DEL
방문 감사드려요~ ;)
데스티 좀 잘 부탁드립니다? ㅋ
퍼플린 | 2009.04.10 11:02 신고 | PERMALINK | EDIT/DEL | REPLY
굿잡~
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.04.10 18:47 신고 | PERMALINK | EDIT/DEL
오예~ ㅋ
Favicon of http://me2day.pe.kr BlogIcon 이태호 | 2009.05.27 13:49 신고 | PERMALINK | EDIT/DEL | REPLY
검쉰님 오랫만에 들어와봤는데
이런 피같은 정보가. ^^
저도 이런 문제가 있어 어찌어찌 그 원인이란거 알고 해결은 했는데 내막이 이러하군요.
잘봤습니다.^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.02 10:13 신고 | PERMALINK | EDIT/DEL
언제 얼굴 한번 봐야죠~ ㅎㅎ
Favicon of http://www.ddongkang.com BlogIcon 동강 | 2009.06.02 13:16 신고 | PERMALINK | EDIT/DEL | REPLY
딱 찾는 정보 였어요.ㅋㅋ 잘 보았습니다.ㅎ
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.06.15 18:31 신고 | PERMALINK | EDIT/DEL
감사합니다 ;) ㅎㅎ
Favicon of http://stemp.tistory.com BlogIcon 문정환 | 2010.02.17 17:06 신고 | PERMALINK | EDIT/DEL | REPLY
System.useCodePage = true;에 대해서 찾아보다가 좋은글 읽고 갑니다 ~
유익한글 감사드립니다.
태우 | 2010.03.20 07:48 신고 | PERMALINK | EDIT/DEL | REPLY
감사합니다.
Favicon of http://blog.naver.com/yell301 BlogIcon 기절이 | 2010.09.11 13:02 신고 | PERMALINK | EDIT/DEL | REPLY
명쾌한 좋은 정보 감사합니다~도움 많이 되었습니다~링크 담아가겠습니다~감사합니다~^^
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
2008.06.09 20:22
ActionScript 3.0 에 명령문(statement)중에 with 를 아십니까?

사용법 
with (object:Object) {
  // 명령문(statement)
}

출처 : flexdocs.kr


아래의 코드는 dataXML의 XML 데이터를 읽어 해당 컴포넌트를 화면에 동적 추가하는 예제입니다.
 


위의 코드에서 addComponent() 메소드에 보면 각종 값들을 할당하는 구문이 있습니다.
target.속성 = 값;
이런 식인데, with를 쓰면 target이라고 계속 할당하지 않아도 됩니다. 아래는 with를 사용하여 addComponent() 메소드를 수정한 예제입니다.


가장 큰 목적은 작성해야 하는 코드의 양을 줄여준다는 겁니다. (확실히 테스트 해보지는 않았지만, with를 쓰면 극소량의 용량이 늘어나는 듯도 하네요.) 위의 수정된 addComponent() 메소드를 반영한 결과물입니다. 결론은 잘 된다는 거죠. ;)  코드의 양만 줄여줄뿐 헷갈리고 퍼포먼스도 떨어진다고 합니다. 그냥 이런 것이 있다는 것만 알아두시면 되겠네요.





참고 : ActionSctipt 3.0 의 Label 에 대해서 알아봅시다.
신고
고은혁 | 2008.06.10 12:40 신고 | PERMALINK | EDIT/DEL | REPLY
삭제시에는 무엇을 적용해야 되나요?
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.10 13:00 신고 | PERMALINK | EDIT/DEL
삭제시 라면, 삭제하기 버튼을 말씀하시는 것 같네요.
자식객체중에 canvas 만 모조리 지우는 형식으로 작업해놨습니다.
Favicon of http://lovedev.tistory.com BlogIcon ActionDev | 2008.06.11 13:34 신고 | PERMALINK | EDIT/DEL | REPLY
AS2.0때에 나왔던 이야기인데요 ^^ with문은 코드의 혼란을 야기할 소지가 많다는 단점이 있어서 사용을 권고하지 않는다라고 들었던 기억이 있네요 ^^;
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.11 16:36 신고 | PERMALINK | EDIT/DEL
아하~ 그렇군요. ㅎㅎ
브라이언님이 속도도 느리다고 하시더라구요. ㅎㅎ
전 AS3 을 첨 써봐서 신기해서 포스트 해봤습니다. ㅎㅎ
Favicon of http://www.apollo9.net/blog BlogIcon 나야나 | 2008.06.13 16:24 신고 | PERMALINK | EDIT/DEL | REPLY
AS 도움말에 with를 사용하면 퍼포먼스가 안좋아서 엥간하면 쓰지말라고 문구가 있었던걸로 기억이 살짝 나네요 ㅎㅎ;
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.13 18:23 신고 | PERMALINK | EDIT/DEL
왜 안좋은걸 만들었을까요... ㅎㅎ
무명소녀 | 2008.06.17 16:20 신고 | PERMALINK | EDIT/DEL | REPLY
with 문 있다는 거만 알고 뭔지는 잘 몰랐는데, 저런거였고나...
ㅎㅎㅎ 좀 많이 늦었지만, 잠시 놀러왔어요.
대문 사진에 있는 사람이 본인인거임?
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.18 13:54 신고 | PERMALINK | EDIT/DEL
오... 방문 감사합니다 ;)
본인인데, 얼굴이 안보이니 좀 낫죠? ㅋㅋㅋ
Favicon of http://lostsin.tistory.com BlogIcon 시난 | 2008.06.20 08:44 신고 | PERMALINK | EDIT/DEL | REPLY
퍼포먼스가 떨어져도.. form 같은데 유효성 체크할 땐 ..자바스크립트로 많이 썼었는데..
어딘가 쓸만하지 않을까용? ^^;
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.20 09:51 신고 | PERMALINK | EDIT/DEL
쓸만한 곳을 찾으면 다시 글을 올리겠습니다 ^^;
방문 감사합니다 ;)
연월태생 | 2008.10.09 17:02 신고 | PERMALINK | EDIT/DEL | REPLY
편하게 쓸수 있어 좋죠...
그런데 그냥 코딩할때 속성 일일이 치기가 귀찬아 그냥 사용하고 말죠..
델파이에서도 저 넘 있는데 잘 안쓰니...
그냥 묻어 버리죠.. ㅎㅎ
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.10.13 10:01 신고 | PERMALINK | EDIT/DEL
아하. 그렇군요 ㅎㅎ
저도 좀 써볼랬더니 퍼포먼스 저하가 있다고 하시더라고요 ㅎㅎ
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
2008.06.05 14:40
 이 글은 http://kuwamoto.org/ 에 올라온 Avoid ints in ActionScript의 번역 포스팅입니다.
에이레네님이 올리신 글을 보고 알게 된 포스트인데 상당히 좋은 내용이라서 번역하여 올려봅니다.
엉터리로 번역되었을 가능성 다분함.. 태클환영..;

2009. 8. 19. 내용 추가

이 글은 작성시 부터 여러 많은 개발자 분들이 내용에 오류가 있다고 지적해주셨습니다. 글의 내용에 대해서 지적해주시고 하는 것은 정말 감사드립니다. 제가 부족한 점이 많아 이해를 제대로 못하였거나, 글 작성에 문제가 있을 수 있기때문에 여러분의 덧글 하나하나가 정말 도움이 많이 되고 있습니다.

제가 본문을 수정하거나 혹은 이 글을 삭제하려고 했으나, 혹시 필요하신 분들이 있을 것 같아 본문을 수정하거나 삭제하지는 않겠습니다. 글을 다 읽으신 후 밑에 다른 분들의 덧글도 읽어보시면 더욱 좋은 것들을 배우실 수 있다고 생각합니다.

ActionScript 에서 int는 피하자구요!
Flex에 대해 알아갈수록, int에 대해서 알게 될수록, int를 사용하지 않게 되었습니다.
int가 정말 필요하지 않는 이상 int는 더 이상 사용하지 않을 것입니다.

이유 1 : Number가 int보다 실제적으로 더 빠릅니다.

놀랍게도, 사실입니다. ECMAScript Edition 4는 ECMAScript 이전 버전과 호환이 가능하게 설계되었습니다.
그래서 수학적으로 완전 무결하게 옳다라는 것을 보장하기가 어렵습니다.



어떤 방법이 더 빠를 것 같은가요? 제가 사용하는 컴퓨터에서는 int 를 사용하여 331ms 걸렸고, Number 는 291ms 걸렸습니다.



▲ 실제로 이 글을 읽는 분이 걸린 시간.

왜 그럴까요? 다음의 표현식을 보시죠.


만약 여러분이 j = 2^23 - 1 로 값을 시작했으면 어떠할 것 같습니까? 일부 프로그래밍 언어에서는 15번 더하자 마자 오버플로우 문제가 나타날 것입니다. 그러나 ECMAScript는 수의 개념이 좀 느슨합니다. 시스템에서 필요시 int에서 double로 변환되는 것을 지원하고 있습니다. 이 때문에 실질적으로 모든 수학적 계산은 내부적으로 int가 아니라 Number로 합니다.

Number로 모든 것이 완료되는 것을 감안해보면 int를 Number로 변환하는 비용과 그 만큼의 시간이 왜 int 를 사용하면 시간이 더 걸리는지에 대한 이유입니다.

다음은 Number는 실제로 int 보다 정확하게 정수 값을 저장시키기 때문에, int보다 Number 를 써야 되는 이유입니다.  

이유 2 : Number는 더 많은 bit를 가집니다.

이 이유는 후에 확실하게 할게된 Number에 대한 놀라운 사실입니다. 어떻게 알게된 것인지 설명해보겠습니다.

Date 객체에는 1970년 1월 1일 자정 부터의 시간을 milliseconds 단위의 숫자로 반환하는 time 이라는 속성이 있습다. 그 값은 정수형 값이고 ActionScript에는 long 타입이 없기 때문에, 반환 타입이 진짜 int (아니면 아마도 uint) 라고 가정했습니다.



왜 버그가 나는 걸까요?
 back of the envelope calculation 에서 1970년 1월 1일부터 2^32 milisecond 보다 더 값을 가지기 때문에 결과가 오버플로우 난다는 것을 알려주고 있습니다. 바보같은 실수죠.

int로 받으면 2,129,587,200, Number로 받으면 1,209,015,397,376. (2008년 4월 24일 기준)
위의 값으로 Date() 객체에 다시 넣어보면 각각 1970년 1월 26일, 2008년 4월 24일 이 출력됨. - 검쉰


그렇다면 int의 bit보다 더 큰 수를 써야할 때, ActionScript는 Long 타입이 없는 상태에서 어떻게 오버플로우나 이런 부정확한 값을 해결할 수 있을까요?



속을 살펴보면, Number는 아래에 있는 숫자형을 포함하고 있습니다.

  • int
  • uint
  • IEEE double

저는 항상 정수의 계산를 위해 double 형태를 사용하는 것을 피했습니다. 왜냐하면 모든 자리수가 보존될 것이라고 전혀 확신할 수 없었기 때문입니다. 왜냐하면, 개인적인 견해로는 정확성 측면에서 보자면 double은 int 보다 더 큰 범위의 수를 저장하기 때문입니다.

결국엔 ActionScript 의 경우에, Number는 더 큰 수의 범위를 저장할 수 있습니다. 그리고 어떤 정수형보다 정확합니다. 그건 아마도 ActionScript 는 64bit 의 정수형 타입이 없기 때문인 것 같습니다.

IEEE double 포멧은 다음과 같이 구현되어 있습니다.


부호를 위한 1 bit, 지수를 위한 11 bit, 숫자부분을 위한 52 bit. 따라서, 정밀도의 손실 없이 int보다 더 큰 bit의 수를 확실히 저장할 수 있습니다.

언제 int를 사용해야 될까요?

다음은 int의 적당한 사용방법입니다.

  1. 메모리를 절약하고 싶을 때 (비록 아주아주 많은 양의 저장공간이 있다 하더라도 결국에는 좋지 않은 영향을 줄 것입니다)
  2. 정수 값으로 강제변환 시 (예를 들어 var i: int = j / 2)
  3. 클라이언트에서 서버쪽으로 정수값을 보낼 때 버그를 줄이기 위해서 (값 전달용 객체안에 int 필드가 있을 때).

이제 다 설명했으니, 저는 이제 제 코드의 대부분의 Number를 확인해 볼 것입니다.


 4. loop 시에 카운터로 사용 - 예를 들어 for(var i:int = 0; i < X.length; i++)


--- 2008년 6월 16일에 추가

참고 : 제가 추가로 좀 더 서술하자면, 위에서 int보다 Number가 더 빠르다는 것은 특정 상황에 대해서 그렇다는 것입니다.

 int로 어떤 연산을 진행하는 것이 int보다 더 큰 Number로 연산을 진행하는 것 보다 더 빠른 것이 당연합니다. int가 Number보다 처리해야할 bit가 적으니까요. (var i:int = 0; i++; 이런경우) 다만, int형으로 연산중에 int형의 크기보다 더 큰 수를 처리해야하는 경우에 다른 언어에서는 잘못된 값이 출력이 됩니다만(이유 2에서 이런 문제를 지적하고 있습니다), AS3는 자동으로 Number 로 변환하여 연산을 진행합니다.
 이런 이유에서 "int가 내부적으로 Number로 변환되는(int의 크기를 넘어서는 연산) 경우에는 Number로 진행하는 것이 더 빠르다." 라는 것이 이 포스트의 속도 문제에서의 핵심입니다.

원저자가 약간 int에 대한 매우 안좋은 감정이 있긴 한 모양입니다만, 이 글을 보신 분들은 때에 따라서 잘 사용하시면 좋겠죠?


신고
Favicon of http://sunyoungheo.tistory.com BlogIcon 다롱냥 | 2008.04.24 15:04 신고 | PERMALINK | EDIT/DEL | REPLY
요호... 유용한 정보네염 꺅, 검쉰님은 머쨍이 히히
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.04.25 11:17 신고 | PERMALINK | EDIT/DEL
감사감사
Favicon of http://lovedev.tistory.com BlogIcon lovedev | 2008.04.25 11:46 신고 | PERMALINK | EDIT/DEL | REPLY
저도 느낌만으로 int는 절약할 때
Number는 정확한 숫자결과를 찾고 싶을때(나눗셈이나 좌표에 대한 controll을 할 때등) 사용하고 있었는데
이 글에서 명확하게 설명해 주셨네요.
좋은 정보 감사드립니다 : )
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.04.25 15:27 신고 | PERMALINK | EDIT/DEL
어설픈 번역으로 잘못된 정보를 접하신건 아닌지 더 걱정이. ^^;
방문해주셔서 감사합니다.
CyD707 | 2008.05.07 19:37 신고 | PERMALINK | EDIT/DEL | REPLY
저는 몇번을 테스트해봐도 number보다 int가 2배정도 더 빠른데요..;;;;
제 컴퓨터가 이상한건가요=_=;;;;
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.07 23:02 신고 | PERMALINK | EDIT/DEL
회사컴이나 제 노트북, 기타 등등 에서 본 페이지 열어서 해봐도 Number 가 빠른 걸로 나오긴 합니다만.. ^^;

컴퓨터 사양이 어떤가요?
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2008.05.10 14:21 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 정보입니다. 적절하게 잘 사용하면 될거라 생각해요.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.10 22:34 신고 | PERMALINK | EDIT/DEL
이 포스트 번역하고 깨달은 사실인데,
레퍼런스에는 항상 루프 카운터는 int 로 쓰더군요 ㅎ
Favicon of http://blog.naver.com/kieat_seo BlogIcon 남남남 | 2008.05.12 12:25 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요... actionscript를 사용하면서 오래전에 생겼던 의문이 하나 있는데요... 늘 해답을 찾지 못하고 있는데 좀 도와주시겠어요?
http://blog.naver.com/kieat_seo 에 와보시면 제가 포스팅해놓은게 있습니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.12 17:40 신고 | PERMALINK | EDIT/DEL
AS3 의 버그인 것으로 사료됩니다.
저도 예전에 비슷한 문제를 겪었는데, 난감하더군요.
제가 겪었던 문제는 소수점 아래의 값들이 제대로 계산이 안되는...;;;
공룡 | 2008.05.14 00:43 신고 | PERMALINK | EDIT/DEL | REPLY
소수 부분이 2진수의 배수로 처리되서 나오는 어쩔수 없는 오차 입니다.
컴퓨터 자체의 처리 오차 죠...

2진수 :1 1 1 1 1 1 1 1 1 1 1 1 1
자릿수:4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8
값 :16 8 4 2 1 0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125
비교해 보시면, 실제 0.4을 만들기 위해서는 0.25 + 0.0.... 이런 식으로 2진수의 1/2승수로 밖에 갈수 없어 가장 유사한 수를 가지고 계산 하게됩니다.

그래서 0.5는 2진수 0.1 로 나오나 특정의 수는 완전 일치 하는 수가 나올수 없는, 즉 최악의 경우 1/2^52의 오차가 생기게됩니다.
이를 근본적으로 해결하면, 실수가 아닌, (문자열) Decimal 처리 식이 있으나, 속도및 메모리의 문제로 인하여, 아주 정밀한 연산에서만 설계되어 사용됩니다.
<span class="name" | 2008.05.14 01:43 신고 | PERMALINK | EDIT/DEL
아하.. 그런 이유가 있었군요 ;)
좋은 정보 감사합니다.

그렇다면 정밀한 연산을 플렉스에서 한다는 자체가 부담이겠네요.... 음..
<span class="name" | 2008.05.14 11:41 신고 | PERMALINK | EDIT/DEL
String(mynum)대신에 mynum.toFixed(2)를 사용하니까 오차가 안 생기고 결과값이 딱 0.05씩 증가하더군요... ^^제 블로그에 수정한 swf파일을 업로드 했습니다....
박스농사 | 2008.05.21 15:07 신고 | PERMALINK | EDIT/DEL | REPLY
닌텐도 파는날 모이는건가요?
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.21 15:08 신고 | PERMALINK | EDIT/DEL
벌써 팔았답니다?
dongland | 2008.05.30 18:06 신고 | PERMALINK | EDIT/DEL | REPLY
j 랑 m 에 연산 부분에서 "/" 나누기 등 연산땜에 느려지는 듯 싶습니당
걍 단순히 연산을 ++ 증감 해두고 계산해 보면... Number 가 더 느립니다.
int 가 더 빠르더군요. 즉.. 속도가 int 가 더 느리다는 아닌듯 싶네요~


var intTime : Number;
var numberTime : Number;

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

intTime = (new Date()).time;
for (i=0; i&lt;10000000; i++)
j++;

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

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

numberTime = (new Date()).time;
for (n=0; n&lt;10000000; n++)
m++;

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

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

trace(message);
-------------
결과
-------------
int version: 63ms
Number version: 78ms
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.30 18:56 신고 | PERMALINK | EDIT/DEL
나누기 연산이 키 포인트입니다. ;)
증감 같은 경우는 당연히 크기가 작은 int가 더 빠릅니다. 하지만, 나누기 같은 경우는 내부적으로 int도 Number로
변환해서 작업을 하기때문에 그냥 Number로 하는 것 보다 더 시간이 오래 걸리는 것이지요. (이유1에 마지막에 서술)

들어주신 예처럼 j++ 경우는 int가 더 빠르기때문에 for문의 카운터로 이용하면 좋다. 라고 제가 글의 마지막 부분에 추가 서술해놓았습니다.

상황에 맞게 선택해서 사용하면 좋겠습니다. ;)
의견 감사합니다. ;)
Favicon of http://hangunsworld.com BlogIcon Han Sanghun | 2008.06.09 08:53 신고 | PERMALINK | EDIT/DEL | REPLY
이게 CPU에 따라서 다른 결과가 나오는 것인지???
어떤 컴퓨터에서는 int가 어떤 컴퓨터에서는 Number가 더 빠르네요.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.09 09:48 신고 | PERMALINK | EDIT/DEL
대부분의 컴퓨터에서는 Number 가 빠르게 나옵니다만,
몇몇 분들이 int가 더 빠르다고 하시네요 ^^;
약간 의심 가는 상황이 있습니다만, 정확하진 않네요 ^^;
혹시 알게되면 좀 가르켜주세요 ^^;;;
Favicon of http://wooyaggo.tistory.com BlogIcon wooyaggo | 2008.06.16 11:48 신고 | PERMALINK | EDIT/DEL | REPLY
아 제가 이 부분을 만나는 분들마다 설득하느라 가끔 고생하는데
검쉰님도 이부분을 오해하고 계신거 같습니다.

예전 Flash 9 알파때 해외 블로거의 포스트에서 발발된 내용인데
물론 아직도 갑론을박하는 분들도 계시는거 같은데
결론은 "쓰임새에 맞게 사용하면 int 가 더 빠른것이 맞다." 입니다.

즉 굳이 Number 타입을 int 에 넣는 행위를 반복하는 테스트로
int 가 느리다라는 결론은 옳지 않다는 것입니다.
AVM 은 Number 타입을 int 에 대입할때는
소숫점을 버리고 int 형으로 계산하는 과정을 거치게 되므로 당연히 그만큼의 시간이 더 걸리게 되죠.

int 에 정수값을 넣고 테스트하고
Number 에도 정수값을 넣고 테스트해야지만 올바른 테스트가 아닐까 합니다.

즉 이 테스트의 오류가 시작된 부분은 Number 에 유리한 숫자로 테스트를 진행했다라는 것입니다.

이상 제 의견이었습니다^0^
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.16 14:19 신고 | PERMALINK | EDIT/DEL
덧글 달아주신 내용은 충분히 이해하고 있습니다 ;)

이 포스트는 제가 작성한 것이 아니고 번역한 거라서.. ㅎㅎ 원본 포스트에서 제가 이해한 것은 지적하신 것과 같이 Number에 유리한 숫자로 진행한 경우에 int보다 Number가 더 빠르다... 라는 것입니다.
물론 int에 유리한 숫자(예를 들어 i++) 같은 경우는 int가 빠른게 당연하겠죠 ;)

상황에 따라 알맞게 사용하는게 가장 중요한 것 같습니다. ;)
drawtree | 2009.03.03 00:06 신고 | PERMALINK | EDIT/DEL | REPLY
http://www.onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf

25페이지를 참조하기 바랍니다.

ECMA스크립트 사양에서 일부 수치 연산시 int에서 Number로의 암시적 형변환이 일어나며, 이 식을 int를 요구하는 연산으로 바로 전달하면 다시 int로의 암시적 형변환이 일어납니다. 이 두번의 암시적 형변환 때문에 성능이 저하되는 것이며, 부동소수 형식에 내재된 오류를 보정해야 한다는 것을 생각하며, 실제로는 int가 훨씬 더 빠릅니다.

int가 유리한 상황이나 Number가 유리한 상황이 따로 존재하기는 하지만 위에 올려진 포스트는 그것과는 무관하며, 암시적 형변환을 생각하지 못했기 때문에 도출된 결론입니다.

또한 Number는 부동소수 형식이며, 연산오류가 누적되기 때문에, 특히 for문의 인덱서로는 거의 사용할 수 없습니다. 굳이 사용해야 한다면 매 회마다 정수로 보정해야 하기 때문에 성능이 좋을 수 없습니다. (int형이 없고 인덱싱 오류가 발생해도 좋은 상황에서만 사용됩니다. double연산이 int와 속도가 같다 해도, 이러한 이유들 때문에 Number는 for문에서 좋은 성능을 보일 수 없습니다. 본문에서 for문의 인덱서로 부동소수를 사용하면서 오류 보정을 하지 않고 있는데, 그것 자체가 버그입니다.

하지만, ECMA스크립트 명세상 Number로 암시적 형변환이 일어날 수 밖에 없는 상황이라도 결과식을 다시 int로 강제 형변환을 수행해주면 컴파일러가 전체 식을 int연산으로 추론할 수 있으므로 최적화할 수 있다고 위 문서에서 밝히고 있습니다.

주의할 것은, 일반적인 언어에서는 오버플로우를 무시나 예외로 해결하지만, ECMA스크립트에서는 더 큰 용량의 수로 암시적인 형변환을 통해 이를 해결합니다. 일반적인 C 계열 언어에서 i+1 과 같은 코드는 절대적으로 결과가 int일 것이 보장되지만, AS는 Number로 형변환합니다. 이러한 암시적 형변환에 대해 잘 알지 못하면 위와 같이 int가 느리다는 결론을 얻을 수도 있습니다.

또한 본문 중에 실제적으로 모든 수를 Number로 수행한다고 언급한 부분이 있는데, 위와 같이 형식을 강제해주면 컴파일러가 형변화을 피하도록 최적화할수 있으므로 그렇지는 않습니다.

그리고, Number가 가장 정확하다는 언급이 있는데, 이는 보는 관점에 따라 달라집니다. 단순히 실제 수치와 일치를 말한다면 Number는 정확하지 않습니다. 하지만 수치 표현 범위를 기준으로 비교한다면 좀 더 정확하다고 말할 수도 있습니다. 하지만 일반적으로 정확하다는 표현은 수치의 일치를 가리키고, 수치 표현 범위를 가리킬 때는 좀 더 '정밀하다'는 표현을 사용합니다. 원문에서 precise라는 단어를 사용해 혼란을 주고 있는데 accurate라고 하는 것이 일반적입니다.

int가 필요한 상황은 한가지밖에 없습니다. 수치적으로 정확한 고성능 정수 연산이 필요한 경우입니다. 하지만 대부분의 성능 문제는 for문이나 배열 엑세스같은 카운트나 인덱스에서 발생하고, 이런 곳에는 int 외에는 답이 없습니다.

제생각에 이 포스트의 제목은 잘못되었습니다. 성능 때문이라면 위와 같은 for문에서는 int를 더욱 적극적으로 사용해야 합니다. 위에서 언급된 성능 문제는 Number로의 형변환 때문에 생기는 것이지 int의 문제가 아닙니다.

제가 뭐라할 부분은 아니지만, 구글 광고를 게시하는 블로그에서 자극적인 제목의 잘못된 정보를 게시하는 것은 사실 좋게는 안보이지요.
태클환영이라 태클 좀 달아봤습니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.03.04 20:58 신고 | PERMALINK | EDIT/DEL
긴 글 쓰시느냐 고생많으셨겠습니다. 지적 감사합니다.

그리고 폼으로 달아놨던 구글광고는 삭제했습니다. 내용적인 부분에서 태클은 항상 환영합니다.
뭐라할 부분이 아닌데 뭐라해주셔서 기분이 썩 좋지는 않군요.

당분간 글을 쓰지 않을 생각입니다만, 앞으로도 글 내용에 문제가 있으면 태클걸어주시면 감사하겠습니다.
Favicon of http://www.iruis.net BlogIcon ☆~ | 2009.08.17 12:26 신고 | PERMALINK | EDIT/DEL | REPLY
글 내용은 좋지만 int, uint는 이제 버려라. 라는 내용으로 와닿는 것에 대한건 어쩔 수 없네요. drawtree님의 지적이 그렇기 때문인듯합니다.
(아마 직접 작성한 글 내용이 아니라 번역 한 글인데 저렇게까지 지적당한것에 불쾌하신게 아닐까 생각되네요. 이젠 번역하기에 앞서 문제점부터 알아봐야 할듯하네요.)

본론으로 들어가자면 위의 댓글 중 남남남님의 소숫점 버그란것은 엑션스크립트의 버그가 아닙니다. IEEE표준에 의해 처리 되는 모든 소숫점 처리에 공통으로 가지고있는 문제입니다(참고: http://msdn.microsoft.com/ko-kr/library/c151dt3s.aspx).
남남남님의 댓글에서 해당 문제에 대해 포스팅 해보겠다는 내용을 보았는데 포스팅이 되어 있지 않아서 혹시나 아직도 AS의 버그로 아시는건 아닐까... 하는 생각에 오래 지난 글이지만 이렇게 댓글을 답니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.08.19 10:36 신고 | PERMALINK | EDIT/DEL
오해의 여지가 있어 글 자체를 삭제하려다가 그냥 두었습니다. 번역한 글 자체를 지적하는 것은 상관없습니다만(제 글에 대해 내용적으로 반박하는 것도 환영입니다), 그외의 것인 제 블로그에 이래라저래라 하는 것이 불쾌한 것이죠.

보다 건설적인 방법으로는 위의 drawtree님처럼 저렇게 글 하나를 쓸 정도의 덧글을 쓰는 것 보다는 자신의 블로그에 해당 글을 올려서 공유한다면 더 유익하지 않을까요? 트랙백이라는 유용한 기능이 있으니까요.
제가 심심해서 번역한 것이 아니라 유익하다 판단하여 공유하고자 올린 글이기때문에 더더욱 제 블로그에 대해서 지적한 것이 불쾌합니다.
앞으로는 왠만하면 외국 블로거의 글을 번역하지는 않겠습니다. 해서 좋은 소리 못듣겠군요.

그리고 소숫점 버그에 대한 의견은 감사합니다. 공통적으로 가지고 있는 문제라면, 해당 문제에 대해 API 에서 공지하던지, 아니면 해결했어야 된다고 생각합니다. 저 같이 경험이 일천한 개발자로써는 해당 내용을 잘 몰랐으니까요.
관련 내용에 대해 글을 쓰셔서 다른 개발자들을 위해 공개해주시는 것은 어떨까요?
공명 | 2009.09.18 10:36 신고 | PERMALINK | EDIT/DEL | REPLY
이상하네요!!
왜 저는 int가 number 보다 빠르게 나올까요??
제 컴이 이상한걸까요??
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.09.20 02:01 신고 | PERMALINK | EDIT/DEL
이번에 새로 산 (Intel Q9550) 컴퓨터에서 테스트해보니, 저도 int 형이 더 빠르게 나오네요.
FP 는 10,0,32,18 입니다.

뭔가 바뀐 것이 있는 모양입니다.
그냥 적절하게 사용하여야 된다. 라고 이해해주시면 좋겠네요.
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.10.01 18:26 신고 | PERMALINK | EDIT/DEL | REPLY
둘다 1ms 1ms 나와서 성능 비교 불가 (...)
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.10.03 18:25 신고 | PERMALINK | EDIT/DEL
대충 짜자. -ㅁ-;;;
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
2008.05.09 13:39
사용자 삽입 이미지
머드초보님의 블로그 포스트에서 알게된 책중에 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기란 책이 있습니다. 제목이 너무 맘에 들어 바로 사서 요즘 출퇴근 길에 열독 하고 있습니다.  

잠 시 책 소개를 하자면, 초보 개발자 '나초보' 씨가 실력있는 선배 '김경험', '이튜닝' 같은 분들에게 하나씩 배워가는 스토리로 쓰여 있습니다. 참 읽기 편하네요. 저 역시 '나초보' 와 그닥 다를 바 없는 실력 형편없는 개발자인지라 공감도 많이 되고, 많이 읽으면서 배우고 있습니다. 저자이신 '이상민'님 정말 감사합니다. ;)

참 유용하니 꼭 읽어보시길 권해드립니다.

아무튼, 상당히 유용한 이야기들로 가득차 있는데요, 책 내용 중 간단하게 언급된 for문 관련 이야기중 ActionScript를 쓰는 개발자들에게도 유용할 것 같은 Tip 이라 포스팅해봅니다. (사실 저 같은 어리버리 개발자한테만 유용할지도?)
 
for문은 상당히 많이 쓰는 loop 중에 하나입니다.
하지만 프로그래머들이 흔히 간과할 수 있는 부분이 있습니다.
우선 for문에 대해서 알아봅시다.
for 루프를 사용하면, 특정의 범위의 값에 대한 변수의 반복 처리를 실행할 수가 있습니다.
for 명령문(statement)에는, 3 개의 식을 지정할 필요가 있습니다.
해당 식은,
1. 초기치로 설정하는 변수
2. 루프가 언제 종료하는지를 지정하는 조건문(conditional statement )
3. 각 루프로 변수의 값을 변경하는 식 입니다.
예를 들어, 다음의 코드는 5 회 루프 합니다. 변수 i 는 0 으로 시작되어, 4 로 끝납니다.
출력은 0 ~ 4 의 수치가 되어, 각 수치는 개별의 행에 출력됩니다.
 
출처 : flexdocs.kr


여기서 눈여겨 봐야할 것은 2번째 조건문 입니다.
만약 Array 에 값을 for 루프를 돌아 처리한다고 할 때, 흔히 아래와 같이 쓰게 됩니다.  



이 때 2번째 조건 명령문에 들어있는 dataArray.length 가 문제가 됩니다. 루프를 도는 도중에 계속 호출되어 배열의 길이를 알아오기 때문입니다.
이 것은 다음과 같이 변경하여 좀 더 빠르게 바꿀 수 가 있습니다.


변수 dataArrayLength에 배열의 길이를 담은 후에 조건문에 대입하므로서 불필요하게 dataArray.length 를 매번 호출하지 않아도 되죠.

이와 비슷한 경우가 종종 있을 경우가 있습니다.
예를 들어  Canvas에 있는 자식 객체들의 수를 구하기 위해 Container 클래스에 정의된 numChildren 속성을 호출한다던지 말이죠.
아래의 코드는 클릭 이벤트가 발생하면 클릭된 Canvas의 자식 객체에 대해서 어떤 동작을 하는 코드입니다.



이제 실제 테스트를 해보겠습니다.
테스트해본 코드는 다음과 같고요, 그 아래 실제 결과물로 이 포스트를 읽는 분들이 테스트를 해보세요!


(참고 : creationComplete 시에 init() 을 실행시켜 dataArray 에는 10,000,000개의 데이터를 넣었습니다.)

저는 length 사용시: 953ms, length 미사용시: 187ms  걸렸습니다. ;)



▲ 실제로 이 글을 읽는 분이 걸린 시간.

알고도 그냥 지나칠 수 있는 부분이니까 습관을 들이도록 합시다. ;)
긴 글 읽으신다고 고생하셨습니다.
신고
시드 | 2008.05.09 15:16 신고 | PERMALINK | EDIT/DEL | REPLY
오~~ 맨날 length로만 해결했다는 1人 -_ㅠ 속도차이가 심하게 나네요~~
좋은 정보 감사합니다~~!! 형~~ 닌텐도 팔고 밥사줘요~ ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.09 16:02 신고 | PERMALINK | EDIT/DEL
닌텐도 팔아서 뭐 남는다고..... ㅋ
남남남 | 2008.05.09 18:12 신고 | PERMALINK | EDIT/DEL | REPLY
저는 결과가 578ms,203ms 이렇게 나왔습니다.
컨디션 부분은 반복될때마다 다시 값을 계산하는군요...
오늘 처음 알았네요... 좋은 정보 감사합니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.09 18:32 신고 | PERMALINK | EDIT/DEL
방문해주셔서 감사합니다. ;)
레이 | 2008.05.10 10:26 신고 | PERMALINK | EDIT/DEL | REPLY
length 사용시: 295ms
length 미사용시: 135ms
2배이상 차이나는군요... 좋은정보 감사합니다
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.10 10:39 신고 | PERMALINK | EDIT/DEL
제 회사 컴에서는 엄청난 차이를 보이던데, 레이님 컴에서는 2배정도의 차이가 아는군요 ;)
컴이 좋으신듯? ㅎㅎ
방문해 주셔서 감사합니다.
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2008.05.10 14:19 신고 | PERMALINK | EDIT/DEL | REPLY
좋은글 감사해요. 저도 이것때문에 많이 애먹은적이 있어서요. ^^;
for 문뿐 아니라 XML node 참조할때도 마찬가지 입니다.

var myXML:XML =
&lt;customers&gt;
&lt;customer&gt;
&lt;name&gt;jidolstar&lt;/name&gt;
&lt;product&gt;
&lt;item id="1"&gt;&lt;name&gt;a&lt;/name&gt;&lt;/item&gt;
&lt;item id="2"&gt;&lt;name&gt;b&lt;/name&gt;&lt;/item&gt;
&lt;item id="3"&gt;&lt;name&gt;c&lt;/name&gt;&lt;/item&gt;
&lt;item id="4"&gt;&lt;name&gt;d&lt;/name&gt;&lt;/item&gt;
&lt;/product&gt;
&lt;/customer&gt;
&lt;customer&gt;
......
&lt;/customers&gt;

for each(var item:XML in myXML.customer.(name=="jidolstar").item )
{
trace("id="+item.@id + ", name" + item.name );
}

이런식보다.

var items:XML = myXML.customer.(name=="jidolstar").item;
for each( var item:XML in items )
{
trace("id="+item.@id + ", name" + item.name );
}

이 훨씬 빠르다는거~ ^^

반복하면서 하여튼 dom 형식으로 많이 접근하는 것보다는 참조변수를 만들어서 사용하는 방법이 훨씬 좋은 방법입니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.10 22:32 신고 | PERMALINK | EDIT/DEL
좋은 예제 감사합니다.
루프시에 항상 조건을 따지는 것 같아요.
다른 루프문들도 한번 테스트 해봐야겠습니다.
후니 | 2008.05.13 11:25 신고 | PERMALINK | EDIT/DEL | REPLY
ㅋㅋ 재미있는 시험 마니 하는 구나 ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 13:05 신고 | PERMALINK | EDIT/DEL
부러워요? ㅋㅋㅋ
공상 | 2008.05.13 13:20 신고 | PERMALINK | EDIT/DEL | REPLY
위에 코드출력하는 플러그인은 어떻게 하는거에요?
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 13:33 신고 | PERMALINK | EDIT/DEL
열이아빠님 블로그 http://koko8829.tistory.com/305
여기 참고하시면 되겠습니다 ;)
후니 | 2008.05.13 17:11 신고 | PERMALINK | EDIT/DEL | REPLY
NDSL 팔아서 맛난거 사죠 ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 17:56 신고 | PERMALINK | EDIT/DEL
왜 이러셈. =_+
박스농사 | 2008.05.21 14:58 신고 | PERMALINK | EDIT/DEL | REPLY
난 왜 9배차이가 나는거지?..
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.21 15:02 신고 | PERMALINK | EDIT/DEL
컴이 구려서? ㅋ
Favicon of http://singah.tistory.com BlogIcon 싱아 | 2008.06.21 04:02 신고 | PERMALINK | EDIT/DEL | REPLY
250ms , 98ms 나오는구먼
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.21 08:51 신고 | PERMALINK | EDIT/DEL
오.. 컴 좋은가봐? ㅎ
Favicon of http://butterguy.tistory.com BlogIcon 버터백통 | 2008.06.25 11:13 신고 | PERMALINK | EDIT/DEL | REPLY
아하 그렇군요~~ 전혀 생각지도 못했던 곳이였는데 좋은 정보 감사합니다~~
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.25 11:40 신고 | PERMALINK | EDIT/DEL
방문 감사합니다 ;)
Favicon of http://2rang.tistory.com BlogIcon 꽃녀 | 2008.07.24 22:06 신고 | PERMALINK | EDIT/DEL | REPLY
아주 멋진 정보입니다.
많이 알고 갑니다 ^^
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.24 22:28 신고 | PERMALINK | EDIT/DEL
방문해주셔서 감사합니다. ;)
건찌 | 2009.11.25 15:10 신고 | PERMALINK | EDIT/DEL | REPLY
오오 좋은정보 감사요^^
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
prev"" #1 next

티스토리 툴바