노무현 대통령 배너

AS2.0과 AS3.0의 무비클립 부모자식 관계 차이점 이해

by on 4.30, 2009, under AS3.0 API

AS2.0의 무비클립의 포함 관계에서는 대상을 참조하기 위해서 . (dot:점) 을 찍고 계속 참조할 수 있습니다.
실제로 무비클립의 참조에서는 부모 무비클립 안에 자식 무비클립이 들어가 있죠.

그런데 AS3.0의 addChild 는 메소드명이 그래서 그런지 AS2.0처럼 실제 부모안으로 자식을 집어넣는다고 이해하는 경우가 종종 있는것 같습니다.

가령 아래와 같은 코드가 있을때

0
1
2
3
4
//mc는 스테이지에 놓여져 있는 무비클립
var k:MovieClip = new MovieClip();
mc.addChild( k );
 
trace( mc.k ) // 출력 : undefined

이렇게 참조하려고 할 수 있겠습니다. 그러나 출력 결과에서 보시듯이 undefined 가 나오게 됩니다. 이것은 addChild를 AS2.0의 무비클립의 포함관계, 또는 계층구조로 이해하려고 하는 습관 때문입니다.
아래의 코드를 보시면,

0
1
2
3
4
5
6
var k:MovieClip = new MovieClip();
k.name = "name_k"; // 이렇게 인식하기 좋도록 name 속성을 주고.
mc.addChild( k );
 
trace( mc.getChildByName( "name_k" ) ); //출력 : [object MovieClip]
trace( mc.getChildAt( 1 ).name ); // 출력 : name_k (mc 안에 도형이 하나만 있어서 도형이 index가 0이고 k의 index가 1이 되므로 k를 가리키게 됨.)
trace( k ); // 출력 : [object MovieClip]

이 trace 구문들을 보고 뭔가 무릎을 탁 치고 느끼는게 있다면 AS3.0 앞에 놓인 벽 하나를 넘은 셈이 됩니다.

AS2.0에서의 무비클립의 부모자식 관계와 마찬가지로, AS3.0에서도 드로잉 툴에서 무비클립을 만들어 자식을 포함시켜 나가면 AS2.0과 동일하게 점찍고 참조도 가능합니다. AS3.0에서도 당연히 물리적으로(시각적) 무비클립을 포함하는 관계를 만들수도 있죠.

그러나 addChild 로 엮어진 관계는 그런 포함관계가 아니라 수평적으로 엮인 관계 입니다. 실제 인간세상에 비유하자면 양부모와 양자녀 관계라고 할 수 있을것 같습니다.
즉 물리적으로 부모클립에 들어가는 관계가 아니라 논리적으로 엮인 관계인 것이죠.
위의 코드에서 보듯이 점찍고 호적문의 ( getChildByName ) 를 해서 참조도 가능하고, 직접 k 를 잡고 핸들링도 가능합니다. AS2.0 에 비해 참조 방법이 늘어나서 좀더 수월하다고 느낄 수도 있을 것입니다.

 

이 글은 플생사모의 질문 글에 대한 답변으로 작성되었습니다. ( http://cafe.naver.com/flashdev/37371 )

이 글을 복사해서 퍼가시는건 허용하지 않습니다. 글의 주소를 다른곳에 알려주시는 것은 환영합니다.

관련된 글

:, , , , , , , ,

12 Comments for this entry

  • 아이창피해No Gravatar

    아 ~ 정말 완전 감동 입니다.
    2.0.. 습관이라는 게 정말이지 ㅎㅎ

    • 종선No Gravatar

      이 포스트 외에도 AS2.0 에서 AS3.0 으로 넘어가는 경우 혼동되거나 개념정리가 필요한 몇가지 사항이 있습니다.
      그런 포스트가 몇개 추가될 예정이고요. 아래 포스트도 읽어보시면 도움이 되실것 같습니다.
      http://ufx.kr/blog/23

  • 동훈No Gravatar

    AS3.0 은 2.0을 모르는 사람이 더 배우기 쉬울거라고 누가 한말이 생각나네요…2.0습관;;
    처음에 addChild 자체가 이해가 안가 경로탐색해보고 이리저리 해봤던 생각들이 ;;
    암튼 딱 정리되는 글이었습니다. ^^

    • 세계의끝No Gravatar

      “addChild 메서드는 부모 무비클립에 실제로 자식을 집어 넣지 않아도 넣은 효과를 똑같이 낼 수 있다”라는 것을 이해하는 것이 이 포스트의 요점이죠. ^^

  • 게스트No Gravatar

    아 정말 감사합니다 덕분에 정말 좋은 개념 하나 건졌습니다

  • 쵸류빈No Gravatar

    좋은 정보 감사합니다~
    3.0부터는 객체지향형인가 보군요. 플래쉬를 공부하면서 2.0과 3.0의 차이때문에
    고생을 많이 했습니다. 좀 공부를 제대로 하고 접근했었다면 덜 고생했을 텐데 하는 생각이 드네요~ 앞으로 자주 들러서 공부하게 될것 같네요~ ^^ 감사합니다~

    • 세계의끝No Gravatar

      AS2.0도 객체지향적으로 개발할 수 있긴 하지만 우리나라에서는 그냥 fla 파일에 자바스크립트 코딩하듯 날코딩 하는 것 이외에는 제대로 된 프로그래밍 움직임은 없었다고 할 수 있죠.
      AS3.0에 와서 객체지향 프로그래밍에 필요한 여러가지 장치들이 제대로 마련되어서 현재는 많은 라이브러리들이 쌓이고 있습니다.

  • 나그네No Gravatar

    “AS3.0에서도 드로잉 툴에서 무비클립을 만들어 자식을 포함시켜 나가면 AS2.0과 동일하게 점찍고 참조도 가능합니다.”

    플래시에서 스테이지에 텍스트 필드, 버튼 또는 무비 클립 심볼을 배치하고 속성패널에서 인스턴트 네임을 넣어주면, 컴파일시 플래시 내부적으로 (인스턴트 네임과 같은 이름으로) 변수 선언을 해주고 객체 인스턴트를 만든 다음 변수에 해당 객체를 넣어주기 때문에 말씀하신 것처럼 점찍고 참조가 가능한 것으로 알고 있습니다. ^^;

    • 세계의끝No Gravatar

      네. 정확히 말하면 개발자 대신 컴파일러가 무비클립 클래스를 이용하여 스테이지의 여러 상황에 맞게 MainTimeline_fla 클래스에 객체를 만들어 주는거죠.

  • 나그네No Gravatar

    코드로 addChild가 아닌, 플래시 스테이지에서 무비클립(mc)안에 무비클립(mc2)을 넣어도 코드적으로 빼낼수 있기 때문에, 굳이 물리적인 부모 자식의 관계로 규정하기가 모호하지 않나 싶네요…^^; 글 잙 읽었습니다…

    var mc2:MovieClip = this.mc.mc2;
    this.addChild(mc2);

    • 세계의끝No Gravatar

      쓰신대로 스테이지상 실제 무비클립에 포함되어 있는 친부모자식 관계를 떼어내 다른 부모에 addChild() 한다면, 이 글에서는 친부모를 떠나 양부모에 입양되는걸로 보는겁니다.
      이 글은 AS3.0 의 DisplayObjectContainer 구조를 초보개발자에게 이해시키기 위한 글이므로, 이 경우에는 “코드로도 얼마든지 가능하다” 라는 이야기는 오히려 역효과를 가져옵니다.
      실제로 개념상 다르게 처리가 되야하는 부분이 존재하고 말이죠. ^^

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Meta