[Actionscript] 순환문을 이용한 객체의 활용
- Nest
- Development
- Category
- ETC
- Hit
- 765
- Star
- 0
- as2.0때에는
this["name"+i]
으로 무비클립같은 객체에 접근했지만, as3.0에서는 상황이 많이 틀려졌다. - 모든 객체들은 클래스에서 참조하는 인스턴스들이기 때문에 인스턴스 네임을 임의로 부여할 수 없다.
- 아래의 코드들은 다양한 방식으로 순환문을 통해 만들어진 객체에 접근하는 법에대해 나열해놨다.
name속성을 인스턴스네임을 대신 사용하는 방법
// 객체 만들기
var item:MenuItem;
var i:int, len:int = 5;
for( i = 0; len > i; ++i ) {
item = new MenuItem();
item.name = "item" + i; // 이렇게 name 속성에 넘버링
addChild( item );
}
// 객체 호출하기
var item:MenuItem = getChildByName( "item1" ) as MenuItem;
item.doSomething();
// 물론 DisplayObject 수준의 속성을 제어하는 거라면 간단하게 아래와 같이 해도 됩니다.
getChildByName( "menu1" ).y = 10;
배열에 넣어서 활용하는 방법 (추천)
var itemList:Array = [];
var item:MenuItem;
var i:int, len:int = 5;
for( i = 0; len > i; ++i ) {
item = new MenuItem();
itemList.push( item ); // 배열에 push()
addChild( item );
}
var item:MenuItem = itemList[ 1 ];
item.doSomething();
// 배열 원소는 실제 객체를 참조하고 있기 때문에 별도의 캐스팅 없이 간단하게 아래와 같이 사용할 수도 있습니다. 단, 개발환경에 따라 코드힌트를 받지 못할수도 있습니다.
itemList[ 1 ].y = 10;
오브젝트에 넣어서 활용하는 방법
var itemList:Object = new Object();
var item:MenuItem;
var i:int, len:int = 5;
for( i = 0; len > i; ++i ) {
item = new MenuItem();
item.x = item.width * i;
addChild( item );
itemList[ "id" + i ] = item;
}
trace( itemList.id1 ); // 출력 : [object MenuItem]
itemList.id1.y = 100; // 이렇게 속성에도 자유롭게 접근됩니다.
for each .. in을 이용한 순환문 활용
var xml:XML = <data>
<menu>
<name>첫번째 메뉴</name>
<url>path/myurl_1.html</url>
<target>_self</target>
</menu>
<menu>
<name>두번째 메뉴</name>
<url>path/myurl_2.html</url>
<target>_self</target>
</menu>
<menu>
<name>세번째 메뉴</name>
<url>path/myurl_3.html</url>
<target>_blank</target>
</menu>
</data>;
var itemList:Array = [];
var item:MenuItem, node:XML, i:int;
for each( node in xml.menu ) {
item = new MenuItem();
//item.updateXml( node ); // 이런식으로 XML 을 객체로 넘겨 내부에서 url 등을 처리하도록 함
i = node.childIndex(); // index 값이 필요하면 xml 의 childIndex() 를 사용
item.x = item.width * i;
item.txtName.text = item.name = node.name;
addChild( item );
itemList[ i ] = item;
trace( item.name );
}
var item:MenuItem;
for each( item in itemList ) {
trace( item.name );
item.doSomething();
}
순환문 객채를 사용하다가 index번호가 필요할 때
- 순환문 객체에서는 일정한 번호가 필요할때가 많다.
- 아래 코드는 각 상황에 따른 번호코드
별도의 변수 index++ 를 사용
var item:MenuItem;
var i:int = 0;
for each( item in itemList ) {
item = new MenuItem();
item.x = item.width * i;
i++;
}
XML노드는 childIndex()
var item:MenuItem;
var node:XML, i:int;
// XML 을 순환하고 있음에 유의
for each( node in xml.menu ) {
item = new MenuItem();
i = node.childIndex();
item.x = item.width * i;
}
Array는 indexOf()
var itemList:Array = [];
// 배열에 객체 생성하고 넣는 과정 코드는 생략
var item:MenuItem;
// 배열을 순환하고 있음에 유의
for each( item in itemList ) {
i = itemList.indexOf( item );
item.x = item.width * i;
}
Object는 변수에 넘버링
var itemList:Object = new Object();
// 객체 생성하고 Object에 넣는 과정 코드는 생략
// Object 내부에 생성된 변수명은 item0, item1, ...
var item:MenuItem;
var i:int;
var len:int = 10; // 객체를 생성한 갯수를 저장 (예시)
// for each..in 순환문은 Object 내부의 변수를 순차적으로 순환하지 못하므로 index를 이용해 순환하고 있음에 유의
for( i = 0; len > i; ++i ) {
item = itemList[ "item" + i ];
item.x = item.width * i;
}
DisplayObjectContainer는 getChildIndex()
// xml 객체는 생략
var container:Sprite = new Sprite();
var item:MenuItem, node:XML, i:int;
// XML 을 순환하고 있음에 유의
for each( node in xml.menu ) {
item = new MenuItem();
container.addChild( item );
i = container.getChildIndex( item );
item.x = item.width * i;
}
참조 및 인용: http://ufx.kr/blog/485