[Actionscript] 순환문을 이용한 객체의 활용

Development ETC

[Actionscript] 순환문을 이용한 객체의 활용

  • 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