Tip And Tech2008. 6. 25. 11:03

과거 AS1에서는 대부분의 클래스가 동적 클래스 이므로  런타임시 변수를 선언하고 값을 줄 수 있었다. 하지만 AS3로 오면서 Object와 Array클래스 MovieClip클래스를 제외한 대부분의 사용가능한 클래스가 동적객체가 아니고 일반 public으로 비동적 객체로 설정되어있다. 따라서 이러한 비동적 객체에 런타임 변수를 설정하고 할때는 Dictionary()클래스를 사용해야한다.

동적 객체는 런타임시 무비클립에 mc.testVar = "변수값" 이라고 변수와 값을 설정할 수 있지만 Sprite등의 비동적 객체에는 런타임 변수설정이 불가능하다.

* AS1처럼 동적 변수 설정(AS3에서도 동적객체이 이와 같이 선언 할 수 있다)
function init():void
{
var man1:Object = new Object()
var man2:Sprite = new Sprite(); 
var man3:MovieClip = new MovieClip();
var man4:Array = new Array()

man1.testVar = "var 1"
man2.testVar = "var 2" -> 비동적 클래스인 Sprite이므로 런타임 변수를 줄 수 없다(에러발생)
man3.testVar = "var 3"
man4.testVar = "var 4"
}

위의 코드처럼 동적 클래스는 Delegate된 인스턴스 네임에 직접 접근하여 따로 속성이 없어도 변수와 값을 설정할 수 있다.
그러나 플렉스에서 사용하는 대부분의 UI기능을 하는 클래스는 Sprite(프레임이 없는 클래스)를 사용한다. 이 Sprite클래스는 비동적 클래스이므로 내부에 public변수나 setter / getter등으로 자리를 컴파일 시 마련해 두어야 한다. 하지만 어떠한 상황에 따라 런타임 변수를 설정해야하는 경우 Dictionary를 이용해야한다.

* Dictionary()
변수명을 Dictionary의 클래스 Delegate로 사용하고 그 안에 참조할 인스턴스 객체를 대입시킵니다.
개념적으로는 사용할 변수를 미리 설정하고 참조대상을 정하면 그 참조대상에 변수와 값을 딕셔너리를 통해 참조할 수 있습니다.. 방식으로 보면 "객체.변수 = 값"과 같은 형태가 아니고 사용할 변수(딕셔너리클래스)를 미리 선언하고 어떤 객체가 쓸 것인가를 정하는 "변수[객체] = 값"으로 사용방법이 조금은 낯설어 보입니다.

var addr:Dictionary = new Dictionary( );
var nick:Dictionary = new Dictionary( );
var age:Dictionary = new Dictionary( );


addr[ man1 ] = "삼성동";
addr[ man2 ] = "청담동";
addr[ man3 ] = "역삼동";
addr[ man4 ] = "갈월동";
   
nick[ man1 ] = "man1"
nick[ man2 ] = "man2"
   
age[ man1 ] = "34";
age[ man2 ] = "36";
age[ man3 ] = "32";
age[ man4 ] = "28";


이처럼  참조할 변수를 Dictionary 클래스로 선언하여 변수의 그룹을 만들어 줍니다.. 가령 "학교, 주소 , 이름 .."등 사용할 변수를 미리 딕셔너리로 설정하고 그 변수를 참고해야할 클래스를 대입시킵니다.
위의 코드에서는 man1~man4는 주소와 나이를 모두 알수있는 dictionary()참조가 있지만 별명은 man1~man2만 보유하고 있습니다.

값의 참조는 addr[ man1 ]과 같이 합니다.
tracce( addr[ man1 ] )              // 출력 : "삼성동"

for(var i:int=1; i<=4; i++ ){
    trace(addr[ this["man"+i] ])    //출력 : "삼성동"  "청담동"  "역삼동"  "갈월동"

 }

* Dictionary() 클래스를 생성시 생성자 파라미터가 weakKeys라는 부울변수가 있다,
  이는 weak reference의 성분을 설정하여 가비지 컬렉터의 대상여부를 설정합니다.

Posted by 버터백통