'array'에 해당되는 글 3건
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 때문에 무지 편한 느낌이라.. ;^)

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

신고
Creative Commons License
Creative Commons License
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.10.30 16:22 신고 | PERMALINK | EDIT/DEL | REPLY
난 이 의견 반댈세
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.10.30 17:07 신고 | PERMALINK | EDIT/DEL | REPLY
외부 서버로부터 받은 데이터를 가공하지 않고 그대로 쓰는 건, 결합도를 높이는 지름길..
(이 주제는 예전에 구글톡에서도 한 번 의견을 나누었던것 같은데.. -_-;)

물론, 테스트용 어플리케이션, 프로토타입 등에선 나도 저런식으로 그냥 E4X로 긁어다 쓰긴 하는데, 딱 그 범위만 넘어서도, 기능이 한두가지만 엮여도, 별도의 객체 구조를 가져가는게 사용하기 편함..

결합도 vs 간편성은 항상 논란의 여지가 많은 부분이긴 한데,
최근 몇 년간의 추세는, 간편성도 매우 중요하지만, 결합도가 우선시되어야, 또는 선행되어야 한다는 쪽 우세하니까..

또 내 경험으로도, XML을 가공하는데 드는 비용은 그리 크지 않은 편이고, 반면에 깨끗한 코드를 유지할 수 있다는 이점은 참 버리기 아까운 부분..
Favicon of http://blog.handkstory.net BlogIcon 제주소년 | 2009.10.31 14:35 신고 | PERMALINK | EDIT/DEL
아.. DB와의 종속성을 없애기 위해 ORM을 사용하는 원리와 비슷한건가요?ㅎ
하긴 외부 서버의 데이터를 바로 사용한다면 결합도가 크게 상승하겠네요..
Flex용 ORM이 나와도 좋을듯.. =ㅅ=ㅋ
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.11.08 06:26 신고 | PERMALINK | EDIT/DEL
예, 비슷한 맥락입니다. :')
내용을 조금 더 보태자면, 결합도 문제는, 일반적으로 일정 기간이 지난 후에야 불거지는 성향이 있어, 개발 시에는 잘 고려하지 않는 부분이기도 합니다.
또한, 개발이 된 후 한참 뒤에야 발견되는 문제이기에, 오히려 심각성이 더 크기도 하지요. 이슈가 될 시점 즈음에는 코드를 잘 알고 있는 사람이 아무도 남아있지 않기 때문에.. ㅎㅎ
Favicon of http://minsangk.com BlogIcon 민상k | 2009.11.01 10:25 신고 | PERMALINK | EDIT/DEL | REPLY
저도 찬익님 의견처럼 결합도 때문에 Object-XML / XML-Object 간 변환 루틴을 힘겹게 만들었던 기억이 납니다.
그러나 결국 만들어보니 xml feeder 가 제 자신이라면 저런 결합도를 위한 노력이 아무 짝에도 쓸모 없음을 깨달았습니다 ㅋ
resultFormat 을 object 로 하는건 생각못했네요. resultFormat="e4x" 에 너무 익숙해져 있었나 봅니다.

좋은 글 잘 읽고 가요.
ps: 얼마전까지도 RSS 에서 찾아 들어오면 올블릿이 바로 떠서 주소를 찍어와야 했는데 오늘은 제대로 글이 뜨네요ㅋ
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.11.08 10:48 신고 | PERMALINK | EDIT/DEL
제 블로그 rss 주소는 http://blog.flashplatform.kr/rss 입니다. 아마 올블릿쪽 rss 을 참조하고 계신듯 하네요 ;)
방문 감사합니다.
최재영 | 2009.11.03 10:04 신고 | PERMALINK | EDIT/DEL | REPLY
결합도가 높아진다는건 이해하기 힘든 부분인데...
어차피 화면 구성은 해당 Application 에 의존적인 부분이고,
재사용 가능한 컴포넌트에서는 ICollectionView 의 사용으로
결합도하곤 상관없는듯...
결론: 그냥 e4x 를 사용한다
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.11.09 03:36 신고 | PERMALINK | EDIT/DEL
재영형 하이 ㅎㅎ
위에 언급한 결합도는 Service Architecture와의 coupling을 얘기한 것임.
예를 들면, RSS 리더라면 ATOM 등의 다른 포맷들도 지원해야하는데, 위 구조로는 추후에 포맷을 추가할 때마다 다소 진통이 있을 듯.
물론 국내의 기업용 어플리케이션들의 경우엔, '클라이언트를 위한 서버'를 개발하는 방식으로 클라이언트/서버 개발을 묶어서 진행되는 경우가 대부분이라 거부감이 없겠지만서도.. 이는 애초에 클라이언트/서버의 결합도를 100%로 놓고 시작하는거니까..

결론 : (아키텍처 상의) 컴포넌트 간 결합도에 대한 얘기였음.
Favicon of http://me2day.pe.kr BlogIcon 이태호 | 2009.11.03 21:06 신고 | PERMALINK | EDIT/DEL | REPLY
우선 뭐.. 저는. 위 최재영님 스타일과 같구요. 단, XML데이터를 별도의 class가 raw한 데이터(xml)를 머금고 있도록 하고, 밖에서는 일종의 factoring을 해다 쓰는 편입니다. 어찌보면 절충안이라고 할 수 있죠. 한마디로 1 xml에 대한 명세를 1 data container class 만 가지고 있게 합니다. 그냥 갠적인 스타일~
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.11.08 10:41 신고 | PERMALINK | EDIT/DEL | REPLY
추가적으로, 코드의 가독성도 문제가 될 수 있다는 생각..
물론 문서화로도 해결 가능하나, 모든 가독성 문제는 문서화로 해결이 가능한 반면, 아무도 문서를 읽으려하지 않으므로..

추후 서비스의 운영/유지/보수 시, 위 RSS 리더의 경우, BlogPost 라는 Class를 두고 파싱하는 경우, 클래스명만으로도 대략의 로직을 이해할 수 있으나, rssData..item과 같은 경우, 해당 로직을 이해하기 위해서는 RSS의 Specification에 대해서도 추가적인 지식이 있어야 함. 물론, RSS는 널리 알려진 포맷이라 많은 개발자들이 내용을 숙지하고 있겠지만, FOAF이나 DOAC이라면 또 다를 것이고, XMPP나 또는 기업 내부에서만 사용하는 데이터 포맷이라면 더욱 그 차이가 심해짐.

단, 유지 비용과는 관계 없이 저럼한 개발 비용을 추구하는 국내 소프트웨어 개발 업계의 실정에는 본 답글 내용이 맞지 않을 수는 있다는 의견..
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.11.08 10:46 신고 | PERMALINK | EDIT/DEL
코드의 가독성의 문제에 대해서는 동의.
위의 RSS spec 을 숙지한 경우에는 상관 없겠으나 spec 을 모르는 상태에서의 저 코드는 대략난감이겠군.
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.11.09 04:15 신고 | PERMALINK | EDIT/DEL
흠.. 난 결합도 문제가 더 큰 문제라고 생각하는데..
최재영 | 2009.11.09 08:58 신고 | PERMALINK | EDIT/DEL | REPLY
음.. 방금도 대화했지만
이미 사용데이터는 Collection류로 추상화되어 있는데다,
서버(혹은 데이터)와의 coupling point 는
소스 데이터의 변화가 있는 경우 어차피 다시 작성되어야 함.
VO 가 있는 경우 소스데이터가 변하면 VO 도 수정해야하고..
(가독성 차원에서는 잘 생각해봐야 함. 어느 쪽이 비용이 더 적은지)
coupling point 에서의 추상화 레벨이 높아질수록,
코드 복잡도가 증가할 수록 쓸데없는 버그발생률만 높이게 되는 듯...
차라리 다른 곳에서의 재사용성을 높이는게
훨씬 더 이득이라는 생각...
(결합도 낮추기는 재사용성을 위해서 생각한거 맞지?)
Favicon of http://blog.chanik.com BlogIcon 찬익 | 2009.11.15 17:01 신고 | PERMALINK | EDIT/DEL | REPLY
음.. 역시 방금 다시 대화했지만.. (메신저가 편리하긴 편리한 듯.. 로그 정리가 안되는게 흠이지만)

재사용성하고 일부 겹치는 부분이긴 한데, 일단 결합도는 Flexibility를 염두에 두고 이야기 한 것..
아직은 실력이 부족으로.. 재사용성의 이점을 누리진 못하고 있어서..

개발 단계, 또는 운영 단계에서 기능의 추가/수정이 빈번히 일어나는 경우,
코드의 깨끗함을 유지한 채 지속적으로 기능을 추가할 수 있는 구조..라면
아무래도 VO 쪽에 조금 더 점수를 줄 수 있을 것 같다는 생각.

또, 역시 메신저에서 이야기 했듯이, 하나의 예로,
외부에서 가져온 한 가지 데이터를 다수의 Visual Component에서 사용하는 경우,
만약 특정 데이터의 노드명이 변했다면 (ex. pubDate->publishDate)
데이터를 그대로 가져와서 쓰는 경우, 모든 Visual Component에서 해당 값을 바꿔줘야 하지만,
VO는 파서에서 단 한 번만 수정해주면 되니..

코드 복잡도 문제는 나중에 다시 토론..
Favicon of http://vulcan9.tistory.com BlogIcon vulcan | 2009.12.05 17:15 신고 | PERMALINK | EDIT/DEL | REPLY
저두 걘적으로다가 [외부데이터-VO 클래스] 이렇게 항상 짝으로 사용합니다. 외부데이터를 파싱해서 적절하게 변형시켜주눈 Adapter 역할을 VO 클래스에 맡기는거죠. 아직까지는 데이터가 변하더라도 Vo클래스 밖으로 변경사항이 전파되는 일은 없었던거 같네요. 홍수났을때 물길 막아주는 칸막이 역할 - VO에 한표!
카시우스 | 2010.02.03 17:49 신고 | PERMALINK | EDIT/DEL | REPLY
글잘보고있습니다 ㅋㅋㅋ 근데너무어려움... ㅠㅠ 회사괜히와써.....나에게너무많은걸바래 ㅠㅠ
marie | 2011.11.23 11:24 신고 | PERMALINK | EDIT/DEL | REPLY
flex로 .. 검색해서 블로그들왔는데 잘봤습니당~ 10%정도 알아 들었나?ㅠ _ㅠ 어려워요 엉엉 ㅠㅠ
gottdanken | 2014.11.18 18:00 | PERMALINK | EDIT/DEL | REPLY
관리자의 승인을 기다리고 있는 댓글입니다
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
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 한글문서에는 연관배열이 아닌 연결배열로 번역이 되어있더군요. 정확하게 무엇이 맞는지는 저도 잘 모르겠네요 :)

신고
Creative Commons License
Creative Commons License
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
2008.07.10 01:44
제가 Flex를 처음 접했을 때 이해가 안되던 부분은 Array와 ArrayCollection 에 대한 것이었습니다. Array를 이용해서 ArrayCollection을 만들긴 했었는데, 왜 그렇게 만들어야 하는지 조차 이해를 못했었죠. ;)

우선 Array 에 대해서 알아봐야겠습니다.
Flex 에 Array 는 자바의  Array와는 달리 동적이어서 크기를 지정하지 않고 임의대로 push, pop 메소드를 이용하여 아이템을 추가 및 삭제할 수 있습니다. 다만, 특정 인덱스 위치에 아이템을 추가한다 던가, 삭제한다던가 하는 것은 불가능 합니다. splice 메소드를 이용하여 특정 위치의 값에 대해 컨트롤 할 수 있습니다만, 상당히 번거롭습니다. 그리고 Array의 특정 아이템이 변경될 경우에 그 변경여부를 즉각 알 수가 없습니다. (var array:Array = new Array() 하는 것 보다 var array:Array = [] 이렇게 하시는 것을 추천합니다. 전자는 느립니다. 왜그런지는 자세히는 모르겠습니다. 에이레네님의 글을 보고 알았거든요 ㅎ)


이를 가능하도록 하여주는 것이 ArrayCollection 입니다.
다 시 말해서 ArrayCollection은 Array의 wrapper 클래스로 Array의 데이터를 핸들링해주는 역할을 합니다. 엄밀히 말해서는 ArrayCollection이 상속받은 ListCollectionView 클래스에서 지원해주죠. ArrayCollection은 단지 Array를 받을 source 라는 속성과 클래스 직렬화를 위한 readExternal, writeExternal 메소드(IExternalizable 인터페이스를 구현)만이 작성되어 있습니다.


그렇다면 ListCollectionView에 대해서 알아봐야겠습니다. 
ListCollectionView ICollectionView, IList, IMXMLObject 이렇게 3가지의 인터페이스를 구현하고 있습니다.(ListCollectionView 는 ArrayCollection과 XMLListCollection이 상속받고 있습니다. ArrayCollection은 Array에 대해서 컨트롤 하지만, XMLListCollection은 XML의 List 형태인 XMLList에 대해 컨트롤 합니다.) 여기서 중요하게 보아야 할 것은 처음 2개인 ICollectionView, IList 인터페이스입니다.

ICollectionView 인터페이스는 해당 Collection에서 데이터를 변경하지 않고, 데이터의 정렬 또는 필터링을 가능하게 해줍니다. 또한 해당 Collection에서 IViewCursor를 제공하여서 데이터에 대한 접근 및 변경을 지원합니다.


IList 인터페이스는 ICollectionView에서 IViewCursor를 이용한 순차적인 데이터접근과 달리 인덱스를 기반으로 하여 데이터에 대한 접근 및 변경을 지원합니다.


여기서 한가지 재미있는 것은 ListCollectionView는 내부적으로 IList 인터페이스를 이용하여 원본 데이터를 관리하고 있습니다. 위의 ArrayCollection에서 source에 Array를 반영해줄때 list 라는 변수에 넣어주는데 이 list 변수가 ListCollectionView에 보면
private var _list:IList;
와 같이 선언되어 있음을 알 수 있습니다.
ArrayCollecton 의 경우 Array, XMLListCollection의 경우 XMLList가 그 원본 데이터가 됩니다. 하지만 Array 와 XMLList 는 IList 인터페이스를 구현하고 있지 않습니다. 그렇기때문에 ArrayCollection에서는 IList를 구현하는 ArrayList, XMLListCollection에서는 XMLListAdapter 클 래스를 이용합니다. 이 2개의 클래스는 레퍼런스에서도 설명되어있지 않고, 빌더에서 Content Assist로도 나타나지 않습니다. 사용하기 원치 않았던 듯 합니다. ;) 하지만 ArrayCollection을 사용하기는 싫고 간편하게 데이터 접근이 필요한 경우에는 ArrayList를 사용해보는 것도 괜찮을 것 같습니다. (자바의 ArrayList 랑 똑같다고 생각이 듭니다.)


그럼 이상으로 간단하게 ArrayCollection에 대해 정리해보았습니다. 저도 이만 자야겠습니다. ;)
신고
Creative Commons License
Creative Commons License
이전 댓글 더보기
다롱이 | 2008.07.10 13:27 신고 | PERMALINK | EDIT/DEL | REPLY
역시.. 검쉰님이에요 최고♡
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.10 17:15 신고 | PERMALINK | EDIT/DEL
3번 정독! ㅋ
Favicon of http://genial12.tistory.com BlogIcon 일이아리 | 2008.07.10 16:02 신고 | PERMALINK | EDIT/DEL | REPLY
우올~~좋은자료!
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.10 17:15 신고 | PERMALINK | EDIT/DEL
방문 감사드려요~ ;)
고고당 | 2008.07.11 08:56 신고 | PERMALINK | EDIT/DEL | REPLY
카페보다가 링크타고 들어왔는데... 와 정말 좋은자료 많네요 감사합니다. 정독중 ^^
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.11 11:23 신고 | PERMALINK | EDIT/DEL
글 보시고 덧글 좀. ㅋㅋ
dilu | 2008.07.11 09:38 신고 | PERMALINK | EDIT/DEL | REPLY
ArrayList라는 게 있었군요 - 하지 말라는 건 더 하고 싶죠 ㅎㅎ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.11 11:24 신고 | PERMALINK | EDIT/DEL
그러게요.. 써보니 편하긴 하더군요 ㅋ
Favicon of http://blog.empas.com/chaniks BlogIcon 찬익 | 2008.07.11 11:33 신고 | PERMALINK | EDIT/DEL | REPLY
ㅎㅎ 심도학습이네요
딱 한 가지만 정정을 하자면, Array의 경우에도
Array.splice를 이용하면 특정 인덱스의 값을 추가, 삭제할 수 있습니다.

ArrayCollection의 존재 이유는,
Array의 경우, EventDispatcher가 아니어서 그렇습니다.

EventDispatcher가 아니기 때문에 Array의 특정 인덱스의 값이 변경되었을 때,
propertyChanged 이벤트가 발생하지 않습니다. :')
(즉, 데이터 바인딩이 직관적으로 이루어지지 않습니다. 내부 값이 변경되어도, 별도의 핸들링을 해주지 않으면 View가 바뀌지 않지요.)

이러한 문제를 Object Proxy와 기타 간편한 인터페이스로 해결한 것이
ArrayCollection입니다. :')

보다 자세한 내용은, ListCollectionView의 내부 구현 중,
flash_proxy 네임스페이스로 묶인 부분을 보시면 자세히 알 수 있어요 ㅎㅎ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.11 12:55 신고 | PERMALINK | EDIT/DEL
역시!! 멋지십니다. ;)
수정하도록 하겠습니다. ㅎㅎ
flash_proxy 관련해서는 제가 공부를 더 해서 다음글에 한번 올려볼께요 ;)
Favicon of http://blog.empas.com/chaniks BlogIcon 찬익 | 2008.07.11 15:11 신고 | PERMALINK | EDIT/DEL
AS 3.0에서 처음 소개된 flash.utils.Proxy..

재밌겠다 싶어서 AS 3.0 처음 나왔을때부터
단 한 번만이라도 써보려고, 벼르고 또 벼르고 있는데,
여태 한 번도 못 써봤어요 ㅎㅎ
Favicon of http://2rang.tistory.com BlogIcon 꽃녀 | 2008.07.24 22:29 신고 | PERMALINK | EDIT/DEL | REPLY
음 멋진 내용입니다.
검쉰님 블로그에는 효율적인 코딩에 관한 내용도 많이 있구요.
Array 와 ArrayCollection에 대해서도 잘 보았습니다.
좋은 블로그 친구(?)를 만나게 된 것 같아 기분이 좋습니다.
많이 배우고 갑니다.! :)
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.24 22:38 신고 | PERMALINK | EDIT/DEL
덧글 달아주셔서 감사합니다. :)
온라인뿐만이 아니라 오프라인에서의 만남도 좋아합니다. 언제 시간 되실때 한번 뵈었으면 좋겠네요.
Favicon of http://blog.naver.com/danxer BlogIcon 교학상장 | 2008.10.03 12:06 신고 | PERMALINK | EDIT/DEL | REPLY
궁금했던 부분을 잘 배우고 갑니다.
감사합니다 검쉰님 ^O^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.10.03 21:03 신고 | PERMALINK | EDIT/DEL
트랙백 걸려있는 지돌스타님의 글도 읽어보시길 권합니다 ;)
박스농사 | 2008.10.30 17:11 신고 | PERMALINK | EDIT/DEL | REPLY
저도 사실 ICollectionView때문에 골탕먹은적이 있어서 일주일동안 안되는 번역실력가지고 사전뒤적거려가면서 본적이있는데
좋은글 감솨~
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.11.11 19:31 신고 | PERMALINK | EDIT/DEL
박스농사도 좋은 글 좀 생산좀...
쟈키 | 2008.11.11 16:43 신고 | PERMALINK | EDIT/DEL | REPLY
초보가 Array와 ArrayCollection에 대한 차잇점이 궁금해 서핑하였는데 한방에 이해되었어요 감사합니다 ^^
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.11.11 19:32 신고 | PERMALINK | EDIT/DEL
어익후~ 덧글도 남겨주시고 황공합니다. :)
춥고배고파 | 2008.12.19 11:00 신고 | PERMALINK | EDIT/DEL | REPLY
정말 잘 배우고 갑니다....정말 친절하게 잘 나왔네염
....어넝 배워서 고수 대야짐
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.12.23 00:14 신고 | PERMALINK | EDIT/DEL
좋은 정보 되셨다니 다행입니다. ;)
오이날다 | 2009.04.17 18:39 신고 | PERMALINK | EDIT/DEL | REPLY
정말 왠만하면 귀찮아서 글을 잘 올리지 않는데..ㅋㅋ

넘 감사합니다 좋은글
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.04.18 22:00 신고 | PERMALINK | EDIT/DEL
덧글 적어주셔서 감사합니다 ;)
신난밧드 | 2009.06.01 11:07 신고 | PERMALINK | EDIT/DEL | REPLY
감사합니다. 제가 항상 갈구하던 내용이었어요 ㅎㅎㅎㅎㅎㅎㅎㅎ
츄리닝 | 2009.07.17 16:58 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 글 감사합니다...많은 도움이 됐네요..
근데, 질문이 하나 생겼는데요...
var myAL:ArrayList = new ArrayList(array); 에서 Array말고 Object가 들어가도 myAL.getItemIndex가 사용이 되나요??
예를 들어 new ArrayList(Object)에 들어가는 Object가 {label:하루, data:1},{label:이틀, data:2}....로 된 Object라면요...
myAL.getItemIndex(하루)라고 해도 검색이 되나요??
한다고 해봤는데 안되는것같아서요...
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.17 17:43 신고 | PERMALINK | EDIT/DEL
안됩니다.
getItemIndex()라는 메서드는 ArrayList에 구현된 메서드인데, Object 형태에서는 구현된 바 없으니 되지 않는 것이 당연합니다.

A를 상속받은 B가 있다 할때
var b:B = new A();
이 구문 차체가 문제가 됩니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.07.17 17:45 신고 | PERMALINK | EDIT/DEL
마치 연필 깎아 쓰는게 불편해서 샤프펜슬을 만들었다고 할때

var s:샤프펜슬 = new 연필();
s.눌러서_심_나오게_하기();
이런 식인데, s 변수가 보고 있는 실체는 연필이고, 연필은 아무리 머리를 눌러도 심은 안나오죠.
독학시작 | 2009.11.13 12:58 신고 | PERMALINK | EDIT/DEL | REPLY
혼자 시작해서 이것저것 모르는것 투성인데ㅋㅋ
맨날 눈팅으로 도움만 받다가 제 블로그로 퍼갔슴니다
도움 많이 받네요^^
이원주 | 2010.01.14 15:37 신고 | PERMALINK | EDIT/DEL | REPLY
워낙초보라 아직 이해가 잘 안가긴 하지만.. 일단 감사드려용~
퍼갈께요
핫산 | 2010.03.22 16:58 신고 | PERMALINK | EDIT/DEL | REPLY
좋은글 정리해주셔서 감사합니다. 도움이 많이 되네요^^
Favicon of http://imincheol.net BlogIcon 이민철 | 2010.04.09 09:46 신고 | PERMALINK | EDIT/DEL | REPLY
좋은글 고맙습니다.
그로밋 | 2011.01.25 20:51 신고 | PERMALINK | EDIT/DEL | REPLY
좋은 글 잘 보고 갑니다^^ 정말 많은 도움이 되었네요~ 내용 너무 좋습니다 짱짱!@!
이글스 | 2011.05.31 22:20 신고 | PERMALINK | EDIT/DEL | REPLY
정말 좋은 내용 감사드립니다^^
말로만 듣던 검쉰님의 홈페이지가 여기 있었군요!
김광연1 | 2014.02.12 13:55 | PERMALINK | EDIT/DEL | REPLY
관리자의 승인을 기다리고 있는 댓글입니다
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
prev"" #1 next