AS3에서 인터렉션을 적용하는데에 있어서 객체들간의 접근에 대한 부분들을 많이 고민하게 된다. 기존의 절차 지향에서 객체 지향으로 넘어온지 벌써 4개월이 흘렀다. 코드의 변화는 있지만 아직 객체 지향적인 스크립트를 사용하는데에 있어서 항상 고민을 한다. 고민하는 것은 인터렉션에 대한 설계와, 코딩 설계…
두 가지를 설계해야 하니 이 부분이 좀 난감하다. 기존에도 시간적인 여유가 그렇게 많지는 않았는데, 설계하는 시간까지 필요하게 되었기 때문이다. 그래서 얼마간 딜레마에 잠시 빠졌었다. 이제는 익숙해져서 코드 설계도 하긴 하지만 완벽하지는 않다. 그런 관계로 인하여 AS2에서 유용하게 사용한 “_global“, “_root” 두개의 접근에 대해서 생각을 해보게 되었다.
우선 메인 클래스인 “GlobalAndRoot“과 _global을 대표하는 클래시인 “GlobalVars“와 _global과 _root에 접근하기 위한 “AccessScope” 클래스를 만들었다. 그리고 “AccessScope” 클래스의 내부에서 객체를 생성하여 _root에 접근 하는 “AccessChildRoot” 클래스를 하나 더 만들어서 예제를 만들어 보았다.
하나씩 코드를 보자.
GlobalAndRoot.as
package { import flash.display.Sprite; import flash.events.MouseEvent; // 코드를 보면 짜임새를 알 수 있어야 하기 때문에 같은 패키지이지만 선언을 해준다. import GlobalVars; import AccessScope; public class GlobalAndRoot extends Sprite { public var rootName:String = "GlobalAndRoot.rootName" public function GlobalAndRoot() { // GlobalVars 클래스에 선어되어있는 정적 변수들 GlobalVars.vars = "jin_u" GlobalVars.varsArr = [0, 1, 2]; // AccessScope 클래스에서 global, root 접근 var accessScope:AccessScope = new AccessScope() addChild(accessScope) accessScope.traceFunc(); /* output : GlobalVars : jin_u GlobalVars : 0,1,2 accessScope : GlobalAndRoot.rootName */ } } }
GlobalVars.as
package { public class GlobalVars { public static var vars:String; public static var varsArr:Array = []; } }
AccessScope.as
package { import flash.display.Sprite; import GlobalVars; import GlobalAndRoot; import AccessChildRoot; public class AccessScope extends Sprite { public function AccessScope() { // Constructor } public function traceFunc():void { trace("GlobalVars : "+ GlobalVars.vars); trace("GlobalVars : "+ GlobalVars.varsArr); var _root:GlobalAndRoot = root as GlobalAndRoot; trace("accessScope : " + _root.rootName); var accessChildRoot:AccessChildRoot = new AccessChildRoot(); addChild(accessChildRoot); accessChildRoot.traceFunc(); /* output : AccessChildRoot : GlobalAndRoot.rootName */ } } }
AccessChildRoot.as
package { import flash.display.Sprite; import GlobalAndRoot; public class AccessChildRoot extends Sprite { public function AccessChildRoot() { // Constructor } public function traceFunc():void { var _root:GlobalAndRoot = root as GlobalAndRoot; trace("AccessChildRoot : "+_root.rootName); } } }
as2에서 사용했던 “_global“은 정적 프로퍼티를 사용하여야 하며 “_root“는 아래와 같이 메인 클래스를 캐스팅하여 “_root“에 접근할 수 있도록 한다.
var _root:GlobalAndRoot = root as GlobalAndRoot;
최상위 “root“에 접근해야 할 경우에 유용하게 사용할 수 있을꺼 같다.














1. Comment by Han Sanghun
12/Nov/2008 at 10:58 am
이런식으로 data 객체를 하나만 생성하고,
Global.data.param1 = 1;
Global.data.param2 = 2;
이렇게 접근해서 사용하는 것이 훨씬 효율적일듯.
2. Comment by jin_u
12/Nov/2008 at 11:46 am
아.. 그래? 예제로 임의로 넣은거긴 한데, 효율적인가 보군.
변수를 여러개 두는 것 보다 오브젝트를 하나 두는게 더 효율적이란 말인거지?
3. Pingback by root as MovieClip « jin_u as blog
13/Sep/2009 at 1:24 pm
[...] 작성했던 “root” 접근 코드는 어떨까? 줄이면 아래 코드와 같다. 2 var [...]