[AS 3.0] 액세스 제어 지정자 (private, protected, internal, public)
액세스 제어 지정자란 상속에 있어서 접근의 권한을 어떻게 할 것인가를 정의하는 것이라고 할 수 있다.
각 지정자에 대해서 간단히 정의해 보면
1. 내부 이용자 (자기 자신) – private
2. 계승 이용자 (서브급) – protected
3. 외부 이용자 (동일 package의 제3자) – internal
4. 외부 이용자 (다른 package의 제3자) – public
즉, 상속된 것인가? 같은 Package인가? 에 따라 2X2의 4종류로 나뉘게 된다.
| 코드 위치 | public | internal | protected | private |
| 변수가 정의된 클래스의 안쪽 | 접근가능 | 접근가능 | 접근가능 | 접근가능 |
| 변수가 정의된 클래스와 그 클래스의 자손 |
접근가능 | 접근가능 | 접근가능 | 접근불가 |
| 같은 패키지의 다른 클래스 | 접근가능 | 접근가능 | 접근불가 | 접근불가 |
| 다른 패키지에서의 접근 | 접근가능 | 접근불가 | 접근불가 | 접근불가 |
그럼 간단한 예를 통해 알아보자.
package x {
public class A {
private var v1:int;
protected var v2:int;
internal var v3:int;
public var v4:int;
public function A() {
v1 = 1; // OK
v2 = 2; // OK
v3 = 3; // OK
v4 = 4; // OK
}
}
}
자기 자신에 대해서는 모두 OK
package x {
public class B extends A {
public function B() {
v1 = 1; // Error
v2 = 2; // OK
v3 = 3; // OK
v4 = 4; // OK
}
}
}
동일 Package내에서의 상속의 경우
- private : Error //자기 자신이 아니기 때문에 접근불가
- protected : OK //상속되었기 때문에 접근가능
- internal : OK //동일 Package이기 때문에 접근가능
- public : OK //접근가능
package x {
public class C {
public function C() {
var a:A = new A();
a.v1 = 1; // Error
a.v2 = 2; // Error
a.v3 = 3; // OK
a.v4 = 4; // OK
}
}
}
동일 Package내에서의 다른 클래스(제3자)의 경우
- private : Error //자기 자신이 아니기 때문에 접근불가
- protected : Error //상속되지 않았기 때문에 접근불가
- internal : OK //동일 Package이기 때문에 접근가능
- public : OK //접근가능
package y {
import x.A;
public class D extends A {
public function D() {
v1 = 1; // Error
v2 = 2; // OK
v3 = 3; // Error
v4 = 4; // OK
}
}
}
다른 Package에서 상속받은 경우
- private : Error //자기 자신이 아니기 때문에 접근불가
- protected : OK //상속되었기 때문에 접근가능
- internal : Error //동일 Package가 아니기 때문에 접근불가
- public : OK //접근가능
package y {
import x.A;
public class E {
public function E() {
var a:A = new A();
a.v1 = 1; // Error
a.v2 = 2; // Error
a.v3 = 3; // Error
a.v4 = 4; // OK
}
}
}
다른 Package에서 상속받지 않은 경우
- private : Error //자기 자신이 아니기 때문에 접근불가
- protected : Error //상속되지 않았기 때문에 접근불가
- internal : Error //동일 Package가 아니기 때문에 접근불가
- public : OK //접근가능
임기응변적인 방식으로, 처음에는 전부 private로 두고, 어디에서 사용될지에 의해 protected→internal→public으로 수정하는 방법이 있겠지만,
구현시에 컴파일 에러를 통해 수정하는 것은 시간도 오래 걸릴것이고 그다지 추천할만한 것은 아니다.
결국, 어떤 클래스로 구성 할 것인가, 어떠한 패키지로 구성 할 것인가에 대한 빈틈없는 설계가 중요한 것이 될 것이다.
