2008. 8. 19. 23:07

[Flex3] Comparing, including, and importing ActionScrip code

Reference : http://livedocs.adobe.com/flex/3/html/usingas_4.html#218626 

MXML 코드를 읽기 쉽게 하기 위해, 스크립트를 큰 블럭으로 삽입하는 대신 <mx:Script> 태그 안의 ActionScript 파일을 참조할 수 있다. ActionScript 파일을 인클루드 하거나 임포트 할 수 있다.

ActionScript 에서 코드를 인클루드 하는 것과 임포트 하는 것 사이에는 극명한 차이가 있다. 인클루딩(Including)include 문 위치에 붙여넣기를 하는 것처럼 한 파일에서 다른 파일로 코드를 복사하는 것이다. 임포팅(Importing) 은 클래스 파일이나 패키지에 에 참조를 추가하여 외부 클래스에서 정의된 객체와 속성에 접근할 수 있다. 임포트한 파일은 소스 경로에서 확인할 수 있어야 한다. 인클루드한 파일은 import 문을 사용한 파일에서 상대적인 위치에 있어야 한다. 그렇지 않으면 절대 경로를 사용해야 한다.

Flex 어플리케이션에 ActionScripot 코드를 추가하기 위해 include 문이나 <mx:Script source="filename"> 태그를 사용한다.

Flex 어플리케이션에서 사용 될 ActionScript 클래스와 패키지의 위치를 정의하기 위해 import 문을 <mx:Script> 블럭에서 사용한다.

Including ActionScript files

ActionScript 코드를 인클루드 하기 위해 <mx:Script> 태그에서 외부 ActionScript 파일을 참조한다. 컴파일 시, 마치 실제로 작성한 것처럼 컴파일러는 파일의 모든 내용을 MXML 어프리케이션에 복사한다. <mx:Script> 블럭 안의 AcitonScript 와 마찬가지로 ActionScript 문은 함수 내부에만 존재할 수 있다. 인클루드 된 파일도 상수와 네임스페이스를 선언할 수 있고, 다른 ActionScript 파일을 인클루드 할 수 있으며, 임포트 선언이 가능하고, 네임스페이스를 사용할 수 있다. 인클루드 된 파일에서 클래스를 정의할 수는 없다.

인클루드 된 ActionScript 파일 내부의 변수와 함수는 MXML 파일의 어떤 컴포넌트에서도 접근 가능한다. 인클루드된 ActionScript 파일은 임포트된 ActionScript 클래스와 같지 않다. Flex 가 인클루드 된 파일의 변수와 함수에 접근할 수 있도록 도와주지만 MXML 파일 자체가 하나의 클래스이기 때문에 새로운 클래스를 추가하지는 않는다.

인클루드 된 ActionScript 파일은 MXML 파일과 같은 디렉토리에 위치하지 않아도 된다. 하지만 논리적 디렉토리 구조에서 ActionScript 파일을 정리해야 한다.

Flex 어플리케이션에서 외부 ActionScript 파일을 인클루드 하는 방법엔 두 가지가 있다:

  • <mx:Script> 태그의 source 속성. 외부 AcitonScript 클래스 파일을 인클루드하는 일반적인 방법이다. 
  • <mx:Script> 블럭 내부의 include 문.

Using the source attribute to include ActionScript files
ActionScript 파일을 인클루드하기 위해 source 속성 사용하기

Flex 어플리케이션에서 외부 ActionScript 파일을 인클루드하기 위해 <mx:Script> 태그의 source 속성을 사용한다. 이 방법은 MXML 파일이 덜 흩어지게 하고, 다른 어플리케이션에서도 코드 재사용성을 높인다.

스크립트 파일의 이름을 어플리케이션 파일 이름과 다르게 정하라. 이름이 같으면 컴파일 에러가 발생한다.

아래의 예시는 IncludedFile.as 파일의 내용을 보여준다:


// usingas/includes/IncludedFile.as
public function computeSum(a:Number, b:Number):Number {
    return a + b;
}

아래의 예제는 IncludedFile.as 파일의 내용을 임포트한다. 이 파일은 includes 라는 하위 디렉토리에 위치한다.

<?xml version="1.0"?>
<!-- usingas/SourceInclude.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="includes/IncludedFile.as"/>

    <mx:TextInput id="ta1st" text="3" width="40" x="170" y="24" textAlign="right"/>
    <mx:TextInput id="ta2nd" text="3" width="40" x="170" y="52" textAlign="right"/>

    <mx:TextArea id="taMain" height="25" width="78" x="132" y="82" textAlign="right"/>

    <mx:Button id="b1" label="Compute Sum"
        click="taMain.text=String(computeSum(Number(ta1st.text), Number(ta2nd.text)));"
        x="105"
        y="115"
    />

    <mx:Label x="148" y="52" text="+" fontWeight="bold" fontSize="17" width="23"/>
</mx:Application>

실행 파일은 아래와 같다:

<mx:Script> 태그의 source 속성은 상대적 경로와 절대적 경로를 모두 지원한다. 자세한 정보는 Referring to external files that have been included 에서 볼 수 있다.

<mx:Script> 태그의 source 속성을 정하면 그 태그에 ActionScript 코드를 추가할 수 없다. 파일을 인클루드 하고 MXML 파일에 ActionScript 를 작성하려면 두 개의 <mx:Script> 태그를 사용해야 한다.

Using the include directive
include 지시어 사용

include 지시어는 특정 파일의 내용을 MXML 파일로 복사하는 ActionScript 문이다. include 지시어는 아래와 같은 문법으로 사용된다:

include "file_name";

아래의 예제는 myfunctions.as 파일을 인클루드한다:

<?xml version="1.0"?>
<!-- usingas/IncludeASFile.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script><![CDATA[

        /*  myfunctions.as 파일은 String 을 리턴하는 두 개의 메쏘드를 정의한다. */
        include "includes/myfunctions.as";

    ]]></mx:Script>

    <mx:Button id="myButton"
        label="Call Methods in Included File"
        click="ta1.text=doSomething();ta1.text+=doSomethingElse()"
    />
    <mx:TextArea width="268" id="ta1"/>
    <mx:Button label="Clear" click="ta1.text=''"/>

</mx:Application>

실행 파일은 아래와 같다:

include 지시어마다 하나의 파일만 명시할 수 있지만 include 지시어는 여러 개를 사용할 수 있다. You can nest include directives; files with include directives can include files that have include directives.

include 지시어는 오직 상대 경로만 지원한다. 자세한 정보는 Referring to external files that have been included 에서 볼 수 있다.

여러 문장이 허용되는 곳에서는 include 만 사용할 수 있다.예를 들어 아래는 허용되지 않는다:

if (expr)
    include "foo.as"; // First statement is guarded by IF, but rest are not.
...

아래는 허용된다:

if (expr) {
    include "foo.as"; // All statements inside { } are guarded by IF.
}

괄호 안에서는 여러 문장을 추가할 수 있기 때문에 중괄호를 사용하면 여러 문장이 허용된다.

인클루드된 ActionScript 파일을 많이 사용하면 include 지시어를 사용하지 않는 것을 추천한다. You should try to break the code into separate class files where appropriate and store them in logical package structures.

Referring to external files that have been included
인클루드된 외부 파일 참조

<mx:Script> 태그의 source 속성include 지시어는 파일을 다른 방식으로 참조한다.

아래는 <mx:Script> 태그의 source 속성에서 참조된 외부 파일의 유효한 경로이다:

  • ../myscript.as 과 같은 상대적 URL. / 로 시작하지 않는 상대적 URL 은 is resolved relative to the file that uses it. If the tag <mx:Script source="../IncludedFile.as"> is included in "mysite/myfiles/myapp.mxml," the system searches for "mysite/IncludedFile.as".

ActionScript include 지시어에서 상대적 URL 만 참조할 수 있다. Flex 는 임포트된 클래스와 패키지의 소스 경로를 검색한다. Flex 는 include 지시어나 <mx:Script> 태그의 source 속성을 사용하여 인클루드 된 파일의 소스 경로는 탐색하지 않는다.