지금까지 수백번 creationComplete라는놈은 그냥 써 왔지만, 그 진정한 의미를 모르고 그냥 써왔습니다. 그냥 어플리케이션이 실행될 때 creationComplete이벤트가 발생 됐을 때 처리하는 함수인줄로만 알고 있었습니다. 

아니.... 사실 creationComplete가 이벤트라는 사실도 못랐습니다. 그냥 MXML테그 속성으로, 테그가 실행될 때 발생하는 이벤트로만 알고있었습니다.  

 

 Flex LifeCycle을 공부하면서  테메테르님의 강의를 듣던 중 creationComplete에 대해 아주 명쾌하게 설명해주신 것을 정리해봤습니다.

 

creationComplete이라는 놈을 이해하기 위해서는 먼저 MXML이 컴파일 되면 ActionScript코드로 변환된다는 것을 아셔야 합니다. 즉, Flex는 원천은 ActionScript입니다. 다른 말로는 Flex는 하나의 ActionScript Framework이라고도 할 수 있죠.  어떻게 아냐구요? 증명해 볼까요?

 

① 먼저 'Example'이라는 이름의 프로젝트를 하나 생성하겠습니다. 생성 후 Package Explorer에서 Example 프로젝트를 선택하시고, 오른쪽버튼을 클릭하여 속성에 들어갑니다.

 

 

② 속성 들어가시면 Flex Compiler의 Additional compiler arguments부분에 컴파일 기본 옵션값으로 '-locale en_US' 라고 되어있습니다. 여기에 -keep-generated-actionscript 옵션을 추가합니다. actionscript코드를 유지한다는 옵션입니다.

 

 

③ bin-debug폴더에 보시면 generated라는 폴더가 생기고 여기에 Example-generated.as 파일이 생기는 것을 확인하실 수 있습니다.

 

 

④ 파일을 열어보시면, MXML 어플리케이션 이름이 actionscript 클래스 이름으로 되어있고, Application클래스를 상속받고 있는 것을 알 수 있습니다. 이와 같이 모든 MXML은 actionscript로 컴파일 된다는 것을 확인하실 수 있습니다.

 

 

 

⑤ 증명이 끝났으니 다시 creationComplete이벤트로 돌아가서, MXML에 다음과 같이 작성하고 Example-generated.as 파일을 보시면 creationComplete라는 이벤트가 추가되었음을 확인하실 수 있습니다. 그리고 컴파일러가 자동으로 리스너함수를 만드네요~ 그 함수안에 init()가 들어있습니다. 이 말인 즉, MXML테그의 creationComplete="init()" 의 의미는 "creationComplete이벤트가 발생 됐을 때 처리하는 함수" 의 의미가 아니라 creationComplete이벤트가 발생됐을 때 처리하는 함수는 MXML에서 자동으로 만들어 주고 init()는 컴파일러가 자동으로 만든 함수안의 하나의 문장일 뿐입니다.

참고사항으로 this.addEventListener("creationComplete", ___Example_Application1_creationComplete); 에서 ___Example_Application1_creationComplete의 의미는 ___Example_Application1_creationComplete함수의 시작주소번지를 기억하고 있는 상수값입니다. 함수이름이 아닙니다!

 

 

 

정리하면 5가지 Point로 요약이 되네요~

 

1. 모든 MXML파일이 컴파일 되면 actionscript코드로 바뀐다.

2. 프로젝트 컴파일 속성 옵션을 변경하면, 컴파일된 actionscript코드를 확인할 수 있다.

3. 테그의 속성으로 이벤트가 올 수 있다.

4. 테그에 creationComplete 속성으로 이벤트를 발생시키면 컴파일러가 자동으로 리스너함수를 생성해준다.

5. addEventListener("TMP", Test); 에서 Test는 Test라는 함수의 시작주소번지를 가지고 있는 상수값이다. 

AND