사실 이 내용은 3일밤낮을 머리싸매고 고민하며 온갖 방법들을 이용해서 Deep copy를 시도하다가 모르겠어서 맘먹고 구글링을 한 3시간 해서 찾아낸 결과이다. 정말 힘들었다. ㅠㅠ
학생들을 가르치다보면 벽에 부딪히는 부분이 가끔 있다. Call by value 와 Call by reference의 차이를 이해를 못 한다는 것이었다. C언어를 가르칠 때 포인터를 설명하며 알려주면 쉽게 이해하는 부분이었지만, 요즘 대부분은 모바일의 여파 때문인지 JAVA를 먼저 배우는 것 같다.(즉 안드로이드 때문 --;) 그래서 그 들에게 설명할 때 내 머릿속에는 포인터로 이해되어있는 내용을 포인터란 단어를 꺼내지 않고 설명하는 것은 상당히 곤란한 일이었다. 그래서 언제나 예시로 배열을 하나 생성해서 대입을 해주고 값을 바꿔서 '자 신기하지? 단순 자료형이 아닌 경우는 그 주소를 참조하게 되는거야'라고 하며 배열 모양의 메모리에 주소들을 붙이고 주소값을 넣는다며 그 배열 객체 자체를 출력하며 알려주었던 기억이 난다.
요즘 대부분의 언어는 객체간의 대입 기호(=)를 reference형으로 연산을 한다. 그건 어떻게 보면 엄청 좋은 것이지만, 어떤 면으로는 엄청 짜증날 때가 있는데 동일한 객체를 복사해야 할 때이다.물론 클래스의 원형을 갖고 new를 이용하면 되겠지만 비용 소모적인 문제도 있으나 결정적으로 MovieClip을 받아왔을 때 new로 상속받는 방법은 굉장히 까다로우며 후임자가 봤을 경우 몹시 화가날 경우가 있다고 생각했다. 경우에 따라 매번 새롭게 할당받을 수 있으나 그 경우는 트래픽 문제 상 게임엔 적합하지 않다고 생각하여, 리소스로 넘어오는 swf파일에 최대한 추가 작업을 하지 않고 받아오는 방법에 대해서 생각해보아서 다음과 같은 물음에 도달했다.
"shallow copy가 아닌 deep copy를 as3에서 사용할 수는 없나?"
예전 as2 시절에는 duplicateMovieClip이라는 함수가 있었다고 하지만 지금은 존재하지 않으며, 인터넷 검색결과 대부분 ByteArray로 파일을 재 할당하여 대입하는 것을 알 수 있었다.
소스는 다음과 같이 구성되어있다.
public function createClone(source:*):*
{
var clone:ByteArray;
clone = new ByteArray();
clone.writeObject(source);
clone.position = 0;
return (clone.readObject());
}
위와 같은 방식으로 구성하면 되는데 위의 방법에 문제가 있다.
그래서 아래와 같은 방식을 이용한다고 한다. 대부분의 외국사이트들도 아래와 같은 방식을 채택하고 있다. 사용자정의 클래스를 복사하려면 이 방법이 더 좋은 것 같다.
public function createClone(source: *):*
{
var className:String = getQualifiedclassName(source);
try
{
getClassByAlias(className);
}
catch(e:ReferenceError)
{
registerClassAlias(className, getDefinitionByName(className) as Class);
}
var clone:ByteArray;
clone = new ByteArray();
clone.writeObject(source);
clone.position = 0;
return clone.readObject();
}
결론은 MovieClip을 DeepCopy를 하기 위해선 위와 같은 함수를 추가해서 풀어야 한다는 말이다.
도움을 준 이근배(터칭시그널) 님과 전수열(Joyfl) 님에게 감사드립니다.
<출처 : http://oddly.tistory.com/50>