[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으로 수정하는 방법이 있겠지만,
구현시에 컴파일 에러를 통해 수정하는 것은 시간도 오래 걸릴것이고 그다지 추천할만한 것은 아니다.
결국, 어떤 클래스로 구성 할 것인가, 어떠한 패키지로 구성 할 것인가에 대한 빈틈없는 설계가 중요한 것이 될 것이다.

Share

0 Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2012 blog.flasia.com | powered by WordPress with Barecity