본문 바로가기

ActionScript/Tip

문자열로 클래스 생성하기

Starling 프레임워크 공부 겸해서 샘플코드를 보다가 재미있는 코드를 발견했다.

특정 클래스를 지칭하는 문자열을 저장해놓고 그문자열을 바탕으로 클래스를 런타임때 동적으로 생성하는 코드였다.

예전에 문자열 그대로 받아 클래스를 생성할 수 없을까 고민한적이 있었다.

예를 들자면 input 텍스트필드에 sprite를 적고 엔터를 누르면 sprite 객체가 생성!

적절한 비유는 아니지만 갑자기 예를 들려니 생각이 안난다 -_-...

어쨌든 분명 이러고 싶을때가 있다 ㅋㅋ;


불가능한건 아니였지만 switch 문이나 if문등을 이용해야 했었는데 그냥 하는방법이 요기잉네..



문제의 함수들.

flash.utils 패키지에 속해있다.

var str:String = getQualifiedClassName(클래스); 형태로 문자열을 받아

var someClass:Class = getDefinitionByName(str) as Class; 식으로 클래스의 참조를 가져온다.


아래는 샘플코드



document 클래스
package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	public class TestGetDefinitionAndGetQualifiedClass extends Sprite
	{
		public function TestGetDefinitionAndGetQualifiedClass()
		{
			var btn:Sprite = new Sprite();
			btn.graphics.beginFill(0xffff00);			
			btn.graphics.drawRect(0,0,100,100);
			btn.graphics.endFill();
			btn.buttonMode = true;			
			btn.name = getQualifiedClassName(Box);
			
			btn.addEventListener(MouseEvent.CLICK,function(){
				var nameClass:Class = getDefinitionByName(btn.name) as Class;
				var box:Box = new nameClass() as Box;
				box.y = btn.height + 10;
				addChild(box);
			});
			addChild(btn);
		}
	}
}



Box 클래스
package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class Box extends Sprite
	{
		public function Box()
		{
			graphics.beginFill(0xff0000);
			graphics.drawRect(0,0,200,100);
			graphics.endFill();
			var tf:TextField = new TextField();
			tf.text = "BoxClass";
			addChild(tf);
		}
	}
}


노란색 버튼을 누르면 Box 객체가 생성된다.


활용할 곳이 많을 것 같다. 역시 고수들의 코드를 보면 배우는것이 많다 -..-ㅋ