4.4.1 가시성(Visibility)

4.4.1 가시성(Visibility)

필드는 기본적으로 private이며, 그 클래스와 그 하위 클래스만 접근할 수 있어요. public 접근 수정자를 사용하면 public으로 만들어 어디서든 접근을 허용할 수 있습니다.

class MyClass {
  static public function available() {
    unavailable();
  }

  static private function unavailable() {}
}

class Main {
  static public function main() {
    MyClass.available();
    // Cannot access private field unavailable
    MyClass.unavailable();
  }
}

MyClassavailable 필드에 대한 접근은 public으로 표시되어 Main 안에서 허용돼요. 반면 unavailable 필드는 MyClass 안에서는 접근이 허용되지만 Main 안에서는 허용되지 않아요. private이기 때문입니다(명시되어 있지만, 여기서는 사실상 중복된 식별자예요).

예제는 static 필드를 통한 가시성을 보여주지만, member 필드의 규칙도 동일해요. 다음 예제는 상속(inheritance)이 관련될 때의 가시성 동작을 보여줍니다:

class Base {
  public function new() {}

  private function baseField() {}
}

class Child1 extends Base {
  private function child1Field() {}
}

class Child2 extends Base {
  public function child2Field() {
    var child1 = new Child1();
    child1.baseField();
    // Cannot access private field child1Field
    child1.child1Field();
  }
}

class Main {
  static public function main() {}
}

child1.baseField()에 대한 접근은 child1이 다른 타입 Child1임에도 Child2 안에서 허용되는 것을 볼 수 있어요. 이는 그 필드가 그들의 공통 조상 클래스 Base에 정의되어 있기 때문이에요. 반면 child1Field 필드는 Child2 안에서 접근할 수 없습니다.

가시성 수정자를 생략하면 보통 가시성이 private으로 기본 설정되지만, public이 되는 예외가 있습니다(이 경우 인라인 매크로나 특정 접근 상황에서 발생해요). — 본문 참조.

출처: Visibility

본문

기본 가시성

필드는 기본적으로 private이며, 정의된 클래스와 그 하위 클래스만 접근할 수 있어요. public으로 만들면 어디서든 접근할 수 있습니다.

상속에서의 접근

private 필드는 정의된 클래스의 하위 클래스에서 접근할 수 있어요. 공통 조상에 정의된 필드는 형제 클래스에서도 접근이 가능합니다. 예를 들어 Child2Child1의 인스턴스의 baseField()(공통 조상 Base의 필드)에는 접근할 수 있지만, Child1 고유의 private 필드 child1Field에는 접근할 수 없어요.

더 알아보기