java - 자바 private 접근




공용, 보호, 패키지 개인 및 개인 Java의 차이점은 무엇입니까? (16)

은밀한

  • 메소드, 변수 및 생성자

private로 선언 된 메소드, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다.

  • 클래스 및 인터페이스

개인 액세스 수정자는 가장 제한적인 액세스 레벨입니다. 클래스와 인터페이스는 private 일 수 없습니다.

노트

공용 getter 메서드가 클래스에 있으면 private로 선언 된 변수를 클래스 외부에서 액세스 할 수 있습니다. 수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메서드 및 생성자는 다른 패키지의 하위 클래스 또는 보호 된 멤버 클래스의 패키지 내의 모든 클래스에서만 액세스 할 수 있습니다.

보호 된

  • 클래스 및 인터페이스

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다.

메소드, 필드는 protected로 선언 할 수 있지만 인터페이스의 메소드와 필드는 protected로 선언 할 수 없습니다.

노트

보호 된 액세스는 하위 클래스가 도우미 메서드 또는 변수를 사용할 수있는 기회를 제공하고 관련없는 클래스가이를 사용하지 못하게합니다.

공공의

공용으로 선언 된 클래스, 메소드, 생성자, 인터페이스 등은 다른 클래스에서 액세스 할 수 있습니다.

따라서 공용 클래스 내에서 선언 된 필드, 메소드, 블록은 Java Universe에 속한 모든 클래스에서 액세스 할 수 있습니다.

  • 다른 패키지

그러나 우리가 액세스하려고하는 public 클래스가 다른 패키지에 있으면 public 클래스를 가져와야합니다.

클래스 상속 때문에 클래스의 모든 공용 메서드와 변수는 하위 클래스에 상속됩니다.

기본 없음 - 키워드 :

기본 액세스 수정자는 클래스, 필드, 메소드 등에 대한 액세스 한정자를 명시 적으로 선언하지 않음을 의미합니다.

  • 동일한 패키지 내에서

액세스 제어 수정 자없이 선언 된 변수 또는 메소드는 동일한 패키지의 다른 클래스에서 사용할 수 있습니다. 인터페이스의 필드는 암시 적으로 public static final이며 인터페이스의 메서드는 기본적으로 public입니다.

노트

정적 필드를 오버라이드 할 수 없습니다. 오버라이드를 시도하면 오류가 표시되지 않지만 우리는 무엇을 제외하고는 작동하지 않습니다.

관련 답변

참조 링크

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

자바에서는 classinterface 를 만들고 상속을 처리하면서 각 액세스 수정 자, 즉 기본 (패키지 개인), public , protectedprivate 각 사용시기에 대한 명확한 규칙이 있습니까?


(경고 : 나는 자바 프로그래머가 아니다, 나는 펄 프로그래머이다. 펄은 공식적인 보호 장치가 없다. 어쩌면 나는 그 문제를 잘 이해하고있다.))

은밀한

당신이 생각하는 것처럼, 그것이 선언 된 클래스 만이 그것을 볼 수 있습니다.

비공개 패키지

패키지 가 선언 된 패키지 에서만 보이고 사용할 수 있습니다. 이것은 Java에서 기본값입니다 (일부는 실수로 표시됨).

보호 된

Package Private +는 하위 클래스 또는 패키지 멤버가 볼 수 있습니다.

공공의

누구나 볼 수 있습니다.

Published

내가 제어하는 ​​코드 외부에 표시됩니다. (Java 구문은 아니지만이 토론에서는 중요합니다.)

C ++은 "친구"라고 불리는 추가 레벨을 정의합니다.

무엇을 사용해야합니까? 전체 아이디어는 정보를 숨기기위한 캡슐화입니다. 가능한 한 많이 사용자가 수행 한 작업의 세부 사항을 숨기려고합니다. 왜? 왜냐하면 나중에 그들을 바꿀 수 있고 다른 사람의 코드를 깨지 않기 때문입니다. 이를 통해 누군가가 방금 분해 한 코드를 사용하고 있다는 걱정없이 버그를 최적화, 리팩터링, 재 설계 및 수정할 수 있습니다.

따라서 엄지 손가락의 규칙은 사물을 보이는 대로만 보이게 만드는 것입니다. 비공개로 시작하고 필요에 따라 더 많은 가시성을 추가하십시오. 사용자가 알기에 절대적으로 필요한 것을 공개 만하면 공개하는 모든 세부 사항이 시스템을 재 설계 할 수있는 능력을 손상시킵니다.

사용자가 행동을 사용자 정의하여 내선을 공개 할 수 없도록 공개하기보다는 행동을 사용자 정의 할 수있게하려면 이러한 내장을 객체로 이동하여 해당 인터페이스를 공개하는 것이 좋습니다. 그렇게하면 새 객체를 간단하게 연결할 수 있습니다. 예를 들어, CD 플레이어를 작성하고 "이 CD에 대한 정보 찾기"비트를 사용자 정의 할 수있게하려는 경우 해당 메소드를 공용으로 만들지 않고 모든 해당 기능을 자체 객체에 넣고 객체 getter / setter를 public으로 설정하십시오 . 이런 식으로 귀하의 용기를 드러내는 것에 대한 인색감은 좋은 구성과 관심사의 분리를 조장합니다.

개인적으로 나는 단지 "사적"과 "대중"만을 고집합니다. 많은 OO 언어가 가지고 있습니다. "Protected"는 편리 할 수 ​​있지만 정말 속임수입니다. 인터페이스가 개인적인 것 이상으로되면 컨트롤을 벗어나기 때문에 다른 사람의 코드를보고 용도를 ​​찾아야합니다.

인터페이스의 변경 (리팩토링)을 위해서는 인터페이스를 사용하고있는 모든 코드를 찾고 변경해야합니다. 인터페이스가 비공개 인 경우 문제가 없습니다. 그것이 보호되면 모든 하위 클래스를 찾아야합니다. 공개 된 경우 코드를 사용하는 모든 코드를 찾아야합니다. 때로는 가능합니다. 예를 들어 회사 코드를 사용하여 내부 용으로 만 작업하는 경우 인터페이스가 공용인지 여부는 중요하지 않습니다. 회사 저장소에서 모든 코드를 가져올 수 있습니다. 그러나 인터페이스가 "게시"된 경우 컨트롤 외부에서 코드를 사용하면 코드가 붙습니다. 해당 인터페이스 또는 위험 코드를 지원해야합니다. 보호 된 인터페이스조차도 게시 된 것으로 간주 될 수 있습니다 (이것이 내가 보호받는 것에 신경 쓰지 않는 이유입니다).

많은 언어에서는 공개 / 보호 / 개인의 계층 적 특성이 너무 제한적이며 현실과 일치하지 않는 것으로 나타납니다. 이를 위해 특성 클래스 의 개념이 있지만 또 다른 쇼입니다.


경험 법칙 :

  • private : 클래스 범위.
  • default (또는 package-private ) : 패키지 범위.
  • protected : 패키지 범위 + 자식 (패키지와 같지만 다른 패키지에서 하위 클래스로 분류 할 수 있음). 보호 된 수정자는 항상 "부모 - 자식"관계를 유지합니다.
  • 공개 : 모든 곳.

결과적으로 액세스 권한을 세 가지 권한으로 나누면

  • (D) irect (같은 클래스 내의 메소드로부터 호출).
  • (R) eference (클래스에 대한 참조를 사용하거나 "점"구문을 통해 메소드를 호출).
  • (I) 상속 (서브 클래 싱을 통해).

다음 우리는이 간단한 테이블을 가지고 있습니다 :

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

그 차이점은 이미 제공된 링크에서 찾을 수 있지만 일반적으로 사용하는 링크는 "최소 지식의 원칙"에 있습니다. 필요한 최소한의 가시성 만 허용하십시오.


실제로는 간단한 그리드 쇼보다 약간 더 복잡합니다. 그리드는 액세스가 허용되는지 여부를 알려주지 만 액세스를 정확하게 구성하는 것은 무엇입니까? 또한 액세스 수준은 복잡한 방식으로 중첩 클래스 및 상속과 상호 작용합니다.

"기본"액세스 (키워드 없음으로 지정)는 package-private 이라고도 package-private . 예외 : 인터페이스에서 수정자는 공용 액세스를 의미하지 않습니다. 공개 이외의 수식어는 금지됩니다. 열거 형 상수는 항상 공개됩니다.

개요

이 액세스 지정자가있는 멤버에 대한 액세스가 허용됩니까?

  • 멤버가 private 임 : 멤버가 호출 코드와 동일한 클래스 내에 정의 된 경우에만.
  • 멤버는 패키지 전용입니다. 호출 코드가 멤버의 바로 묶는 패키지 내에있는 경우에만.
  • Member is protected : 같은 패키지이거나 멤버가 호출 코드를 포함하는 클래스의 수퍼 클래스에 정의되어있는 경우.
  • 회원은 public . 예.

어떤 액세스 지정자가에 적용됩니까?

지역 변수 및 형식 매개 변수는 액세스 지정자를 사용할 수 없습니다. 범위 규칙에 따라 외부에 본질적으로 접근 할 수 없기 때문에 사실상 사적입니다.

최고 범위에있는 클래스의 경우 public 및 패키지 개인 만 허용됩니다. 이 디자인 선택은 protected 되고 private 이 패키지 수준에서 중복되므로 (패키지의 상속이 없음) 아마도 그럴 것입니다.

모든 액세스 지정자는 클래스 멤버 (생성자, 메서드 및 정적 멤버 함수, 중첩 클래스)에서 사용할 수 있습니다.

관련 항목 : Java 클래스 내게 필요한 옵션

주문

액세스 지정자는 엄격하게 명령 할 수 있습니다.

public> protected> package-private> private

public 이 가장 많은 액세스를 제공하고 private 는 가장 적은 것을 의미합니다. 비공개 멤버에 대해 가능한 모든 참조는 패키지 비공개 멤버에게도 유효합니다. package-private 멤버에 대한 참조는 보호 된 멤버에서 유효하며, 등등. (보호 된 멤버에게 동일한 패키지의 다른 클래스에 대한 액세스 권한 부여는 실수로 간주되었습니다.)

노트

  • 클래스의 메소드 같은 클래스의 다른 객체의 private 멤버에 액세스 할 수 있습니다. 보다 정확하게는, 클래스 C의 메소드는 C의 서브 클래스의 오브젝트에 대해 C의 전용 멤버에 액세스 할 수 있습니다. Java는 클래스에 의해서만 인스턴스에 의한 액세스를 제한하는 것을 지원하지 않습니다. ( private[this] 사용하여 스칼라를 지원합니다.)
  • 객체를 생성하려면 생성자에 액세스해야합니다. 따라서 모든 생성자가 private 인 경우 클래스는 클래스 내에있는 코드 (일반적으로 정적 팩터 리 메서드 또는 정적 변수 초기화 프로그램)로만 생성 할 수 있습니다. 패키지 전용 또는 보호 된 생성자에 대해서도 마찬가지입니다.
    • 전용 생성자 만 있으면 클래스가 외부 적으로 서브 클래 싱 될 수 없음을 의미합니다. Java는 서브 클래스의 생성자가 암시 적으로 또는 명시 적으로 수퍼 클래스 생성자를 호출해야하기 때문에 클래스를 외부 적으로 서브 클래 싱 할 수 없음을 의미합니다. 그러나 하위 클래스가 포함 된 중첩 클래스를 포함 할 수 있습니다.

내부 수업

또한 내부 클래스와 같이 중첩 된 범위를 고려해야합니다. 복잡성의 예로 내부 클래스에는 멤버가 있으며 액세스 수정자를 사용할 수 있습니다. 그래서 당신은 public 멤버와 함께 private 클래스를 가질 수 있습니다; 회원이 액세스 할 수 있습니까? (아래 참조) 일반적으로 범위를보고 재귀 적으로 생각하여 각 수준에 액세스 할 수 있는지 확인해야합니다.

그러나 이것은 매우 복잡하며 자세한 내용 은 Java 언어 사양을 참조하십시오 . (예, 과거에 컴파일러 버그가있었습니다.)

이러한 상호 작용 방식을 맛 보려면이 예제를 고려하십시오. 내부의 내부 클래스를 "누설하는"것이 가능합니다. 이것은 대개 경고입니다.

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

컴파일러 출력 :

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

몇 가지 관련 질문 :


아주 짧게

  • public : 모든 곳에서 액세스 할 수 있습니다.
  • protected : 같은 패키지의 클래스 및 임의의 패키지에있는 서브 클래스에서 액세스 할 수 있습니다.
  • default (변경자가 지정되지 않음) : 동일한 패키지의 클래스가 액세스 할 수 있습니다.
  • private : 같은 학급에서만 접근 가능.

여기에 더 나은 버전의 테이블이 있습니다. (모듈에 대한 열을 가진 미래의 증거.)

설명

  • 전용 멤버는 선언 된 클래스와 동일한 클래스 내 에서만 액세스 할 수 있습니다.

  • 액세스 한정자가없는 멤버는 동일한 패키지의 클래스에서만 액세스 할 수 있습니다.

  • 보호 된 멤버는 동일한 패키지의 모든 클래스 다른 패키지의 하위 클래스에서 액세스 할 수 있습니다.

  • 공용 멤버는 모든 클래스에서 액세스 할 수 있습니다 (선언 된 패키지를 내 보내지 않는 module 에있는 경우 제외).

선택할 수있는 수정자는 무엇입니까?

액세스 수정자는 실수로 캡슐화 (*) 를 방지하는 데 도움이되는 도구입니다. 클래스, 패키지, 클래스 계층 구조의 내부 또는 내부 클래스가 아닌 멤버를 내부 클래스가 아닌 내부 클래스가 아닌 외부 클래스로 지정하려는 경우에는 스스로에게 질문하십시오.

예 :

  • 필드 long internalCounter 는 아마도 변경 가능하고 구현 세부 사항이므로 비공개이어야합니다.
  • 팩토리 클래스 (동일한 패키지 내)에서만 인스턴스화되어야하는 클래스는 패키지 외부에서 직접 호출 할 수 없으므로 패키지 제한 생성자를 가져야합니다.
  • 렌더링 전에 바로 호출되고 서브 클래스에서 후크로 사용되는 내부 void beforeRender() 메서드는 보호되어야합니다.
  • GUI 코드에서 호출되는 void saveGame(File dst) 메소드는 public이어야합니다.

(*) 정확히 캡슐화 란 무엇입니까?


패키지에 표시됩니다. 기본값. 한정자가 필요하지 않습니다.

수업에만 공개 ( 비공개 ).

세계에 공개 ( 공개 ).

패키지 및 모든 하위 클래스 ( 보호됨 )에 표시됩니다.

변수 및 메소드는 호출되는 수정 자없이 선언 될 수 있습니다. 기본 예제 :

String name = "john";

public int age(){
    return age;
}

비공개 액세스 수정 자 - 비공개 :

private로 선언 된 메소드, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다. 개인 액세스 수정자는 가장 제한적인 액세스 레벨입니다. 클래스와 인터페이스는 private 일 수 없습니다.

공용 getter 메서드가 클래스에 있으면 private로 선언 된 변수를 클래스 외부에서 액세스 할 수 있습니다.

private 한정자를 사용하는 것은 객체가 자체를 캡슐화하고 외부 세계의 데이터를 숨기는 주요 방법입니다.

예 :

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

공용 액세스 수정 자 - 공개 :

공용으로 선언 된 클래스, 메소드, 생성자, 인터페이스 등은 다른 클래스에서 액세스 할 수 있습니다. 따라서 공용 클래스 내에서 선언 된 필드, 메서드, 블록은 Java 유니버스에 속한 모든 클래스에서 액세스 할 수 있습니다.

그러나 액세스하려고하는 공용 클래스가 다른 패키지에 있으면 공용 클래스를 가져와야합니다.

클래스 상속 때문에 클래스의 모든 공용 메서드와 변수는 하위 클래스에 상속됩니다.

예:

public void cal(){

}

보호 된 액세스 수정 자 - 보호 :

수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메서드 및 생성자는 다른 패키지의 하위 클래스 또는 보호 된 멤버 클래스의 패키지 내의 모든 클래스에서만 액세스 할 수 있습니다.

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다. 메소드, 필드는 protected로 선언 할 수 있지만 인터페이스의 메소드와 필드는 protected로 선언 할 수 없습니다.

보호 된 액세스는 하위 클래스가 도우미 메서드 또는 변수를 사용할 수있는 기회를 제공하고 관련없는 클래스가이를 사용하지 못하게합니다.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

이 페이지는 보호 된 기본 액세스 한정자에 대해 잘 작성합니다.

.... Protected : 보호 된 액세스 한정자는 다소 까다 롭습니다. 기본 액세스 한정자의 상위 집합이라고 할 수 있습니다. 보호 된 구성원은 동일한 패키지의 액세스와 관련하여 기본 구성원과 동일합니다. 차이점은 보호 된 멤버는 부모 클래스가있는 패키지 외부에있는 멤버가 선언 된 클래스의 하위 클래스에서도 액세스 할 수 있다는 것입니다.

그러나 이러한 보호 된 구성원은 "상속을 통해서만 패키지 밖에서 액세스 할 수 있습니다". 즉, 다른 서브 패키지에있는 서브 클래스에있는 클래스의 보호 된 멤버에 직접 액세스 할 수 있습니다. 그러나 보호 된 멤버는 부모 클래스의 참조를 사용하여 패키지 외부의 하위 클래스에서 액세스 할 수 없습니다. ....


Java의 수정 자 접근.

Java 액세스 수정자는 Java에서 액세스 제어를 제공하는 데 사용됩니다.

1. 기본값 :

동일한 패키지의 클래스에만 액세스 할 수 있습니다.

예를 들어,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

이 액세스는 공개 및 보호보다 더 제한적이지만 개인보다 제한이 적습니다.

2. 대중

어디서든 액세스 할 수 있습니다. (글로벌 액세스)

예를 들어,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

출력 : Hello

3. 비공개

동일한 클래스 내에서만 액세스 할 수 있습니다.

한 클래스의 private 멤버에 다른 클래스에 액세스하려고하면 컴파일 오류가 발생합니다. 예를 들어,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. 보호 된

같은 패키지 내의 클래스 및 서브 클래스에만 액세스 가능

예를 들어,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

출력 : Hello


Public Protected Default 및 private은 액세스 한정자입니다.

캡슐화, 또는 클래스의 내용을 숨기고 표시하기위한 것입니다.

  1. 수업은 공개 또는 기본값 일 수 있습니다.
  2. 클래스 멤버는 public, protected, default 또는 private 일 수 있습니다.

클래스 외부에서 비공개 액세스 할 수 없습니다. 기본값은 패키지에서만 액세스 할 수 있습니다. 패키지뿐만 아니라 그것을 확장하는 모든 클래스에서 보호됩니다. 대중은 모든 사람들을 위해 열려 있습니다.

일반적으로 멤버 변수는 private로 정의되지만 멤버 메서드는 public입니다.


David의 대답은 각 액세스 수정 자의 의미를 제공합니다. 각각을 언제 사용할 지에 관해서는 외부 사용 (API)을위한 모든 클래스와 각 클래스의 메서드를 공개하고 다른 모든 메서드는 private로 제안하는 것이 좋습니다.

시간이 지남에 따라 일부 클래스를 패키지 전용으로 만드는 경우와 하위 클래스에서 사용하도록 보호 된 특정 메서드를 선언 할시기에 대한 개념을 개발할 것입니다.


액세스 수정자를 생각할 때 이런 식으로 생각하면됩니다 ( 변수메소드 모두에 적용됨 ).

public-> 모든 곳에서 액세스 가능
private-> 선언 된 동일한 클래스 내에서만 액세스 가능

이에 관해서 이제 혼란이 발생 default하고protected

default-> 액세스 수정 자 키워드가 없습니다. 이는 클래스의 패키지 내에서 엄격하게 사용할 수 있음을 의미합니다. 그 패키지 밖에서는 아무 것도 액세스 할 수 없습니다.

protected-> default동일한 패키지 클래스 보다 약간 더 엄격 하고 덜 엄격 합니다. 선언 된 패키지 외부의 하위 클래스에서 액세스 할 수 있습니다 .


이 페이지의 대부분의 답변을 포함하여 매우 일반적으로 잘못된 세부 정보를 다루기를 원합니다. "기본"액세스 (액세스 한정자가없는 경우)는 package-private과 항상 같지는 않습니다 . 그것은 무엇이 무엇인지에 달려 있습니다.

  • 비 멤버 형 (즉, 클래스, enums, 인터페이스, 및 다른 형 내에 선언되어 있지 않은 주석 형)은 디폴트로 package-private입니다. ( JLS §6.6.1 )

  • 클래스 멤버와 생성자는 기본적으로 패키지 전용입니다. ( JLS §6.6.1 )

  • 열거 형 생성자는 기본적으로 비공개 입니다. 실제로 열거 형 (enum) 생성자 비공개 여야 하며 공용 또는 보호 대상으로 설정하는 것은 오류입니다. 열거 형 상수는 public이며 액세스 지정자를 허용하지 않습니다. 열거 형의 다른 멤버는 기본적으로 package-private입니다. ( JLS §8.9 )

  • 인터페이스 및 주석 유형의 모든 멤버는 기본적으로 public 입니다. (사실, 인터페이스 및 주석 유형의 구성원이 있어야 공개하고, 그들이 개인 또는 보호를 만들려고하면 오류가 발생합니다.) ( 9.5 JLS §9.3 )


참고 : 이것은 단지 허용 된 답변을 보충 하기위한 것입니다.

이것은 Java Access Modifiers 와 관련이 있습니다.

에서 자바 액세스 수정 :

Java 액세스 수식자는, 어느 클래스가 지정된 클래스, 그 필드, 생성자 및 메소드에 액세스 할 수 있는지를 지정합니다. 액세스 수정자는 클래스, 해당 생성자, 필드 및 메소드에 대해 개별적으로 지정할 수 있습니다. Java 액세스 수정자는 일별 음성에서 Java 액세스 지정자라고도하지만 올바른 이름은 Java 액세스 수정 자입니다. 클래스, 필드, 생성자 및 메소드는 네 가지 다른 Java 액세스 수정 자 중 하나를 가질 수 있습니다.

  • 목록 항목
  • 은밀한
  • 기본값 (패키지)
  • 보호 된
  • 공공의

클래스 구성원에 대한 액세스 제어 에서 자습서 :

액세스 수준 수정자는 다른 클래스가 특정 필드를 사용하거나 특정 메서드를 호출 할 수 있는지 여부를 결정합니다. 액세스 제어에는 두 가지 레벨이 있습니다.

  • 최상위 - 공개 또는 패키지 - 개인 (명시 적 수정 자 없음).
  • 멤버 레벨 - public, private, protected 또는 package-private (명시 적 한정자 없음).

클래스는 수정 자 public으로 선언 할 수 있습니다.이 경우 해당 클래스는 모든 클래스의 모든 곳에서 볼 수 있습니다. 클래스에 수정자가 없으면 (기본값, package-private이라고도 함) 자체 패키지 내에서만 볼 수 있습니다

다음 표는 각 수정 자에서 허용하는 멤버에 대한 액세스를 보여줍니다.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

첫 번째 데이터 열은 클래스 자체가 액세스 수준에 의해 정의 된 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 보시다시피 클래스는 항상 자체 멤버에 액세스 할 수 있습니다. 두 번째 열은 클래스와 동일한 패키지의 클래스가 해당 패밀리에 관계없이 해당 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 세 번째 열은이 패키지 외부에서 선언 된 클래스의 하위 클래스가 멤버에 액세스 할 수 있는지 여부를 나타냅니다. 네 번째 열은 모든 클래스가 멤버에 액세스 할 수 있는지 여부를 나타냅니다.

액세스 수준은 두 가지면에서 영향을줍니다. 우선, Java 플랫폼의 클래스와 같은 다른 소스에서 가져온 클래스를 사용할 때 액세스 수준에 따라 클래스에서 사용할 수있는 클래스의 멤버가 결정됩니다. 둘째, 클래스를 작성할 때 모든 멤버 변수와 클래스의 모든 메소드가 가져야하는 액세스 레벨을 결정해야합니다.


                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    






access-modifiers