scaleform.minarto.com

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 1 본문

Core

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 1

미나토 2012. 5. 13. 10:59

http://scaleform.minarto.com/350 에서 이어집니다.


자 다시한번 코드를 보죠...


package  {

import flash.display.Sprite;

import flash.events.*;

public class test extends Sprite {

public var b:ButtonX;

public function test():void {

trace(b)

}

}

}


잘보면 ButtonX 가 임포트 되어있습니다.

ButtonX 가 패키지명이 있었다면 위쪽에 따로 임포트도 되어있었겠죠...

import com.minarto.ButtonX;

뭐 이런 식으로요...

어쨌든 임포트 되어있습니다. 그런데 이게 문제인겁니다.


기존에 버튼을 확장해서 만들어놓은 파일을 libs.swf 라고 하겠습니다.

그 파일은 이미 클래스 ButtonX 가 해당 버튼 무비클립에 매핑되어 컴파일이 되었죠...


그런데 여기서 또 test.as 파일 내에 ButtonX 가 임포트 되어 컴파일됩니다. 양쪽에 ButtonX 가 컴파일 된 셈입니다.

각 파일은 각각의 swf를 가지게 되었고, 각각 ButtonX 를 가지게 된 셈입니다. 별도의 파일이니까요...


여기서부터 충돌 문제가 생기는 겁니다.


test 파일이 실행되게 되면 먼저 라이브러리의 코드들을 불러옵니다. 그다음 클래스가 매핑되죠...

그렇게 되다보니 libs 파일을 컴파일 하고 나서 만약 

alpha = 0.3 이란 코드를 삭제하고선 test를 컴파일 한다고 해도...버튼의 라이브러리가 불러지면서 메모리 상에 먼저 선점되어집니다.

여전히 알파가 먹게되죠...


단순히 두파일만 가지고 설명을 해서 그렇지... 이게 수십개의 파일이 서로 공유하고 공유하고 하다보면...

개발자의 뇌가 폭파되는 것이죠...



여기서 잘못된 코드는 딱 한줄입니다.


import com.minarto.ButtonX;

public var b:ButtonX;


이 코드이죠... 이 코드는 이렇게 고쳐야 합니다.


import scaleform.clik.controls.Button;

public var b:Button;


몇몇 분은 이게 뭐냐고 하실 지 모르겠습니다. 난 ButtonX 를 임포트한 것이지 Button 을 임포트하지 않았다고요...


네 맞습니다. ButtonX를 임포트 하셨습니다.


그런데 그 임포트 된 ButtonX 는 Button 의 자식클래스 입니다.


그러다 보니 이쪽 코드에서는

Button = ButtonX as Button  뭐 이런식으로 암묵적인 형변환이 일어나게 됩니다.



마치 이런겁니다.


d:DisplayObject = new Sprite;

d.x = 100;


이런 코드가 익숙하신가요??? Sprite 로 생성했지만 생성과 동시에 바로 DisplayObject 로 형변환이 일어납니다.

as 를 쓰지 않았고, 생성자 함수로 감싸지 않았어도 말이죠...


그런데 이러면 말이죠...


test 에는 컴파일할 때 ButtonX 가 당연히 포함되지 않습니다. 보시다시피 임포트 한 적이 없거든요...

그러니 충돌이 일어날 클래스조차 존재하지가 않는 셈입니다.


libs 만 컴파일 하면 공유된 어떤 파일에도 똑같이 적용되게 되는겁니다. ButtonX 는 libs 말고는 컴파일된 적이 없거든요...



그런데 단지 이런 암묵적 형변환의 장점은 클래스 충돌 해결의 이점만 있는게 아닙니다.


속도 향상 또한 일어납니다.


http://scaleform.minarto.com/352 으로 이어집니다