ActionScript 3.0에서는 클래스 내에 정의된 속성에 대한 액세스를 제어하는 네 가지 특수 특성인 public, private, protected 및 internal이 제공됩니다.
public 특성을 사용하면 스크립트의 모든 위치에서 속성을 참조할 수 있습니다. 예를 들어 해당 패키지 외부의 코드에서 메서드를 사용할 수 있게 하려면 메서드를 public 특성으로 선언해야 합니다. 이는 var, const 또는 function 등 속성을 정의하는 데 사용된 키워드에 관계없이 모든 속성에서 마찬가지입니다.
private 특성을 사용하면 해당 속성이 정의된 클래스 내에서만 속성에 액세스할 수 있습니다. 이 private 특성의 비헤이비어는 ActionScript 2.0에서 하위 클래스가 수퍼 클래스의 전용 속성에 액세스하도록 허용했던 비헤이비어와는 다릅니다. 또한 런타임 액세스 비헤이비어에도 중요한 차이점이 있습니다. ActionScript 2.0에서는 private 키워드를 사용하면 컴파일 타임에만 액세스가 금지되었고 런타임에는 이러한 제한을 쉽게 피할 수 있었습니다. ActionScript 3.0에서는 더 이상 그렇지 않습니다. private으로 표시된 속성은 컴파일 타임과 런타임 시 모두 사용할 수 없습니다.
예를 들어 다음 코드에서는 전용 변수 하나가 있는 PrivateExample이라는 간단한 클래스를 만든 다음 클래스 외부에서 전용 변수에 액세스합니다.
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.
ActionScript 3.0의 경우 myExample.privVar과 같이 도트 연산자를 사용하여 전용 속성에 액세스하려고 하면 엄격 모드를 사용하는 경우 컴파일 타임 오류가 발생합니다. 그렇지 않은 경우에는 myExample["privVar"]과 같이 속성 액세스 연산자를 사용한 경우처럼 런타임에 오류가 보고됩니다.
다음 표에서는 동적이 아닌 봉인 클래스에 속한 전용 속성에 액세스한 결과를 보여 줍니다.
|
엄격 모드
|
표준 모드
|
도트 연산자(.)
|
컴파일 타임 오류
|
런타임 오류
|
대괄호 연산자([])
|
런타임 오류
|
런타임 오류
|
dynamic 특성으로 선언된 클래스의 경우에는 전용 변수에 액세스해도 런타임 오류가 발생하지 않습니다. 대신 값을 참조할 수 없으므로 undefined 값이 반환됩니다. 그러나 엄격 모드에서 도트 연산자를 사용하면 컴파일 타임 오류가 발생합니다. 다음 예제는 이전 예제와 동일하지만 PrivateExample 클래스가 동적 클래스로 선언됩니다.
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // output: undefined
동적 클래스를 사용하면 클래스 외부 코드에서 전용 속성에 액세스할 때 일반적으로 오류가 발생하는 대신 undefined 값이 반환됩니다. 다음 표를 보면 엄격 모드에서 도트 연산자를 사용하여 전용 속성에 액세스할 때만 오류가 발생함을 알 수 있습니다.
|
엄격 모드
|
표준 모드
|
도트 연산자(.)
|
컴파일 타임 오류
|
undefined
|
대괄호 연산자([])
|
undefined
|
undefined
|
ActionScript 3.0에서 새로 도입된 protected 특성을 사용하면 자체 클래스나 하위 클래스에서 속성에 액세스할 수 있습니다. 즉, protected 속성은 자체 클래스 내에서 또는 상속 계층 구조에서 해당 클래스 아래쪽에 있는 모든 클래스에서 사용할 수 있습니다. 하위 클래스가 수퍼 클래스와 같은 패키지에 있는지 또는 다른 패키지에 있는지에 관계없이 하위 클래스에서 protected 속성을 사용할 수 있습니다.
ActionScript 2.0에 익숙한 사용자에게 이 기능은 ActionScript 2.0의 private 특성과 비슷하고, ActionScript 3.0의 protected 특성은 Java의 protected 특성과 비슷합니다. 그러나 Java 버전의 경우 같은 패키지 내에 있는 호출자에도 액세스할 수 있다는 차이점이 있습니다. protected 특성은 하위 클래스에 필요한 변수 또는 메서드를 상속 체인 외부에 있는 코드로부터 숨기려는 경우에 유용합니다.
ActionScript 3.0에서 새로 도입된 internal 특성을 사용하면 자체 패키지 내에서 속성을 호출할 수 있습니다. 이는 패키지 안에 있는 코드의 기본 특성이며 다음 특성이 지정되지 않은 모든 속성에 적용됩니다.
public
private
protected
사용자 정의 네임스페이스
internal 특성은 Java의 기본 액세스 제어와 비슷하지만 Java의 경우에는 이 액세스 수준에 명시적으로 지정된 이름이 없으며 이 액세스 수준을 사용하려면 다른 액세스 수식어를 모두 생략해야 합니다. ActionScript 3.0에서 internal 특성을 사용하면 자체 패키지 내에서만 속성을 호출하도록 하려는 의도를 명시적으로 나타낼 수 있습니다.