programing

Java에서 public, protected, package-private 및 private의 차이점은 무엇입니까?

goodsources 2022. 8. 14. 12:27
반응형

Java에서 public, protected, package-private 및 private의 차이점은 무엇입니까?

각 를 .public,protected ★★★★★★★★★★★★★★★★★」private, 「 」를 작성하는 「 。class ★★★★★★★★★★★★★★★★★」interface속과과 ?련 ?? ????

공식 튜토리얼이 당신에게 도움이 될지도 모릅니다.


학급 패키지
pkg (동일 pkg)

(diff pkg)
세계
public + + + + +
protected + + + +
수식자 없음 + + +
private +

: + : "접근 가능"
: 불능 : " " " "

(동굴:저는 자바 프로그래머가 아니라 펄 프로그래머입니다.Perl에는 정식 보호가 없기 때문에 문제를 잘 이해하고 있을 것입니다. :)

사적인

생각하시는 것처럼 선언된 클래스만 볼 수 있습니다.

개인 패키지

이것은 선언된 패키지에 의해서만 표시 및 사용할 수 있습니다.이것은 Java의 디폴트입니다(실수로 간주되는 경우도 있습니다).

보호되고 있다

Package Private +는 서브클래스 또는 패키지 멤버에게 표시됩니다.

일반의

누구나 볼 수 있어요.

출판된

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

C++는 "friend"라고 불리는 추가 레벨을 정의합니다.그것에 대해 아는 것이 적을수록 좋습니다.

당신은 무엇을 사용해야 합니까?전체 아이디어는 정보를 숨기기 위한 캡슐화입니다.가능한 한, 유저에게 어떻게 행해지는지에 대한 자세한 것은 숨기고 싶다고 생각하고 있습니다.왜일까요?나중에 바꿀 수 있고 누구도 암호를 풀지 않을 수 있기 때문입니다.이를 통해 사용자가 방금 수정한 코드를 누군가가 사용하고 있다는 걱정 없이 버그를 최적화, 리팩터링, 재설계 및 수정할 수 있습니다.

그래서, 경험의 법칙은 사물이 보여야 할 만큼만 보이게 하는 것이다.프라이빗에서 시작하여 필요에 따라 가시성을 높입니다.사용자가 알아야 할 사항만 공개하십시오. 공개하는 모든 세부 사항에는 시스템을 재설계할 수 있는 능력이 저하됩니다.

사용자가 행동을 커스터마이즈할 수 있도록 하고 싶다면, 내부적인 것을 공개하지 않고, 그것들을 오브젝트에 삽입하여 그 인터페이스를 공개하는 것이 좋을 수 있습니다.이렇게 하면 새로운 오브젝트를 간단하게 접속할 수 있습니다.예를 들어 CD 플레이어를 쓰고 있을 때 "이 CD에 대한 정보를 찾아서"를 커스터마이즈할 수 있도록 하려면 이러한 방법을 공개하는 대신 모든 기능을 해당 오브젝트에 넣고 오브젝트 getter/setter만 공개해야 합니다.이렇게 하면 배짱을 드러내는 데 인색한 것이 좋은 구성과 관심사 분리를 촉진한다.

저는 '사적'과 '공공적'만을 고집합니다.많은 OO언어들이 그것만을 가지고 있다.'보호'는 편리할 수 있지만 속임수예요인터페이스가 프라이빗이 아닌 경우는, 유저의 관리 밖에 있기 때문에, 다른 유저의 코드를 조사해 용도를 찾아낼 필요가 있습니다.

여기서 '출판'이라는 아이디어가 떠오릅니다.인터페이스를 변경하려면 인터페이스를 사용하는 모든 코드를 찾아 변경해야 합니다.인터페이스가 프라이빗한 경우는 문제 없습니다.보호받고 있다면 모든 하위 클래스를 찾아야 합니다.공개되면 코드를 사용하는 모든 코드를 찾아야 합니다.예를 들어 사내에서만 사용하는 기업 코드를 사용하는 경우 인터페이스가 공개되어도 상관없습니다.기업 저장소에서 모든 코드를 가져올 수 있습니다.그러나 인터페이스가 "퍼블리시"된 경우, 사용자가 제어할 수 없는 범위 밖에서 사용하는 코드가 있는 경우, Hoosed됩니다.해당 인터페이스를 지원하지 않으면 코드가 깨질 위험이 있습니다.보호된 인터페이스도 퍼블리시된 것으로 간주할 수 있습니다(따라서 보호 대상이 되지 않습니다).

많은 언어들이 공공/보호/사설의 계층적 특성이 너무 제한적이고 현실과 맞지 않는다고 생각합니다.그러기 위해서는 특성 클래스라는 개념이 있지만, 그것은 또 다른 쇼입니다.

모듈용 컬럼도 포함된 더 나은 버전의 표를 보여 줍니다.

Java 액세스 수식자

설명

  • 개인 회원(i)는 선언된 클래스 내에서만 액세스할 수 있습니다.

  • 액세스 수식자가 없는 멤버(j)는 할 수 ).

  • 보호 멤버(k)는, 같은 패키지의 모든 클래스와 다른 패키지의 서브 클래스내에서 액세스 할 수 있습니다.

  • 퍼블릭 멤버(l모든 클래스에 액세스 할 수 있습니다(패키지가 선언된 패키지를 내보내지 않는 모듈에 존재하지 않는 한).


어떤 수식어를 선택할까요?

액세스 수식자는 캡슐화가 잘못 중단되는(*) 것을 방지하기 위한 도구입니다.구성원을 클래스, 패키지, 클래스 계층 내부 또는 내부가 아닌 내부 구성원으로 할 것인지 자문하고 그에 따라 액세스 단계를 선택하십시오.

예:

  • A 필long internalCounter변경 가능하고 구현 세부사항이기 때문에 개인 정보여야 합니다.
  • 팩토리 클래스(같은 패키지 내)에서만 인스턴스화되어야 하는 클래스에는 패키지 외부에서 직접 호출할 수 없으므로 패키지 제한 생성자가 있어야 합니다.
  • 부 an 。void beforeRender()렌더링 직전에 호출되어 하위 클래스의 후크로 사용되는 메서드는 보호되어야 합니다.
  • A void saveGame(File dst)GUI 공개

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

____________________________________________________________________
                | 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         |       ✔       |     ✘     |       ✘       |   ✘    
____________________________________________________________________

쉬운 규칙입니다.모든 것을 비공개로 선언하는 것부터 시작하세요.그리고 필요에 따라 대중을 향해 나아가고 디자인이 그것을 보증합니다.

구성원을 노출할 때 표현 선택과 추상화 선택 중 어느 쪽을 노출하고 있는지 자문합니다.첫 번째는 관찰 가능한 동작보다는 실제 표현에 너무 많은 의존성을 초래하기 때문에 피하고 싶은 것입니다.

일반적으로 하위 분류를 통해 메서드 구현을 재정의하는 것을 피하려고 합니다. 논리를 망치는 것은 너무 쉽습니다.재정의하려는 경우 추상 보호 메서드를 선언합니다.

또한 재정의할 때 @Override 주석을 사용하여 리팩터 시 파손되지 않도록 합니다.

사실 단순한 그리드가 보여주는 것보다 조금 더 복잡합니다.그리드를 통해 접근이 허용되는지 알 수 있지만, 정확히 어떤 것이 액세스를 구성합니까?또한 액세스 수준은 중첩된 클래스 및 상속과 복잡한 방식으로 상호 작용합니다.

디폴트 액세스(키워드가 없는 것으로 지정)는 패키지 전용라고도 불립니다.예외: 인터페이스에서는 수식자는 퍼블릭액세스를 의미하지 않습니다.퍼블릭 이외의 수식자는 금지됩니다.열거형 상수는 항상 공개됩니다.

요약

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

  • 는 「」입니다.private: 코드와 내에 되어 있는 멤버가 발신자 코드와 같은 클래스 내에 정의되어 있는 경우에만.
  • 멤버는 패키지 개인:발신자 코드가 멤버의 바로 동봉 패키지 내에 있는 경우에만.
  • 는 「」입니다.protected: 의 슈퍼 되어 있는 같은 패키지 또는 발신 코드를 포함한 클래스의 슈퍼 클래스에 멤버가 정의되어 있는 경우.
  • 는 「」입니다.public - 네. - 네. - 네.

적용되는 액세스 지정자

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

범위 내의 " "만"public【package-private】【package-private】은 아마도 '이것'이 원인일 입니다.protected ★★★★★★★★★★★★★★★★★」private패키지 레벨에서는 용장화됩니다(패키지의 상속은 없습니다).

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

관련: Java 클래스의 접근성

주문

액세스 지정자는 엄밀하게 정렬할 수 있습니다.

public> protected > package-private

라는 의미입니다.public는 가장 액세스를 합니다.「 장 、 [ ] 。private에 대한 보호 됩니다).프라이빗 멤버에 대한 참조는 패키지 프라이빗멤버에게도 유효합니다.패키지 프라이빗멤버에 대한 참조는 보호된 멤버에서도 유효합니다(같은 패키지의 다른 클래스에 대한 보호된 멤버에 대한 접근을 허용하는 것은 오류로 간주됩니다).

메모들

  • 클래스의 메서드는 동일한 클래스의 다른 개체의 개인 멤버에 액세스할 수 있습니다.보다 정확하게는 클래스 C의 메서드는 C의 서브클래스의 오브젝트 상에서 C의 프라이빗 멤버에 액세스 할 수 있습니다.Java는 인스턴스별 액세스 제한은 지원하지 않습니다.클래스별 액세스 제한은 지원하지 않습니다.(Scala와 비교하여private[this]
  • 개체를 생성하려면 생성자에 대한 액세스 권한이 필요합니다.따라서 모든 생성자가 개인인 경우 클래스(일반적으로 정적 공장 메서드 또는 정적 변수 이니셜라이저)에 있는 코드로만 클래스를 구성할 수 있습니다.마찬가지로 패키지 전용 컨스트럭터 또는 보호된 컨스트럭터도 마찬가지입니다.
    • Java는 서브클래스의 컨스트럭터가 암묵적으로 또는 명시적으로 슈퍼클래스 컨스트럭터를 호출하도록 요구하기 때문에 프라이빗 컨스트럭터만을 갖는다는 것은 클래스를 외부에서 서브클래스로 분류할 수 없다는 것을 의미합니다.(단, 서브클래스를 분류하는 네스트클래스를 포함할 수 있습니다).

내부 클래스

또한 내부 클래스와 같은 중첩된 범위도 고려해야 합니다.복잡성의 예로서 내부 클래스에는 멤버가 있으며, 멤버 자체는 액세스 수식자를 사용할 수 있습니다.공공회원과 개인 내부클래스를 할 수 있는데, 그 회원에 접속할 수 있나요?(아래 참조).일반적으로 각 레벨에 액세스할 수 있는지 확인하기 위해 범위를 보고 재귀적으로 생각하는 것이 규칙입니다.

다만, 이것은 매우 복잡합니다.자세한 것에 대하여는, 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

관련 질문:

경험에 비추어 볼 때:

  • private 범위 클래스 범위.
  • default (오류)package-private 범위: [ ] : [ ]
  • protectedpackage scope + child(패키지와 비슷하지만 다른 패키지에서 분류할 수 있습니다).보호된 수식자는 항상 "부모-자녀" 관계를 유지합니다.
  • public: 장소에서 처에있있 있있있다다

그 결과, 액세스권을 다음의 3개의 권리로 분할할 수 있습니다.

  • (D)직접(같은 클래스 내의 메서드에서 호출하거나 "this" 구문을 통해 호출합니다.
  • (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   |
+—————————————————+————————————+———————————+

한마디로

  • public 할 수 .: 어디에서나 액세스 할 수 있습니다.
  • protected: 같은 패키지의 클래스와 임의의 패키지에 있는 서브 클래스로 액세스 할 수 있습니다.
  • default(수식자 지정 없음): 같은 패키지의 클래스에서 액세스할 수 있습니다.
  • private에서만 접근 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

있는 는 " " " 입니다.protected기본 수식어와 비슷하지만 서브클래스가 볼 수 있는 예외는 하나 있습니다.지만어??? ??다음으로 혼란을 명확하게 하는 예를 제시하겠습니다.

  • 의 클래스가 가정해 보겠습니다.Father ★★★★★★★★★★★★★★★★★」Son인 패키지에 되어 있습니다

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • 보호된 방법을 foo()로로 합니다.Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • foo()문맥으로 수 . 즉, 4가지 문맥으로 수 있습니다.

    1. 「」와 패키지에 .foo()되어 있다정확정되어 있다.fatherpackage

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. , 에서는 " " "를 "this ★★★★★★★★★★★★★★★★★」super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. 유형이 같은 클래스인 참조:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. 타입이 부모 클래스이고 패키지 내에 있는 참조에 대해foo()되어 있다정확정되어 있다.fatherpackage[이것은 콘텍스트 번호1에 포함할 수 있습니다]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • 다음 상황은 유효하지 않습니다.

    1. 유형이 부모 클래스이고 패키지 외부에 있는 참조에 대해foo()되어 있다정확정되어 있다.fatherpackage

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. 서브클래스의 패키지 내에 있는 비서브클래스(서브클래스는 부모로부터 보호된 멤버를 상속받아 비서브클래스에 대해 비공개로 만듭니다).

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

사적인

  • 메서드, 변수 및 생성자

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

  • 클래스 및 인터페이스

프라이빗 액세스 수식자는 가장 제한적인 액세스레벨입니다클래스 및 인터페이스는 비공개로 할 수 없습니다.

메모

private로 선언된 변수는 public getter 메서드가 클래스에 존재하는 경우 클래스 외부에서 액세스할 수 있습니다.슈퍼 클래스에서 보호되고 있다고 선언된 변수, 메서드 및 생성자는 다른 패키지의 하위 클래스 또는 보호된 멤버 클래스의 패키지 내 모든 클래스에 있는 하위 클래스에서만 액세스할 수 있습니다.


보호되고 있다

  • 클래스 및 인터페이스

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

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

메모

보호된 액세스를 통해 하위 클래스는 도우미 메서드 또는 변수를 사용할 수 있으며 관련되지 않은 클래스는 이 메서드를 사용할 수 없습니다.


일반의

공개로 선언된 클래스, 메서드, 컨스트럭터, 인터페이스 등은 다른 모든 클래스에서 액세스할 수 있습니다.

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

  • 다른 패키지

그러나 액세스하려는 퍼블릭클래스가 다른 패키지에 있는 경우에도 퍼블릭클래스를 Import해야 합니다.

클래스 상속으로 인해 클래스의 모든 공용 메서드 및 변수는 하위 클래스로 상속됩니다.


기본 - No 키워드:

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

  • 같은 패키지 내

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

메모

Static 필드는 덮어쓸 수 없습니다. 덮어쓰기를 시도해도 오류가 표시되지 않지만, 예외로 동작하지 않습니다.

관련 답변

참조 링크

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

그 차이는 이미 제공된 링크에서 찾을 수 있지만, 어떤 링크를 사용할지는 대개 "최소한의 지식 원칙"에 따라 결정됩니다.필요한 최소한의 가시성만 허용하십시오.

개인:클래스 접근 제한

기본값(수식자 없음):클래스 및 패키지에 대한 접근 제한

보호:클래스, 패키지 및 서브클래스(내부 및 외부 패키지 모두)에 대한 접근 제한

공용: 클래스, 패키지(모두) 및 하위 클래스에 액세스할 수 있습니다.요컨대, 모든 곳에서요.

액세스 수식자는, 몇개의 레벨로 액세스를 제한합니다.

공용: 기본적으로 동일한 패키지에 있는지 여부에 관계없이 모든 클래스에서 액세스할 수 있는 만큼 간단합니다.

동일한 패키지에 있는 경우 에 액세스하려면 직접 액세스할 수 있지만 다른 패키지에 있는 경우 클래스의 개체를 만들 수 있습니다.

기본:그것은 어떤 대책의 클래스의에서 동일한 패키지에 액세스 할 수 있습니다.

액세스 하려면 당신은 클래스의 개체를 만들 수 있습니다.하지만 짐 밖에서 이 변수에 액세스 할 수 없다.

: 같은 패키지뿐만 아니라 서브 클래스 다른 패키지에서 변수에 액세스 할 수 있는 보호된.그래서 기본적으로 그것은 기본+Inherited 행동이다.

액세스 보호된 필드려면 아이가 수업의 개체를 만들 수 있는 기본 클래스에 정의된 것이다.

: 같은 반에, 할 수 있는 접근할 개인.

비정적 메서드에서 직접 당신에게 이 참조(생성자에)but 클래스의 개체를 만들어야 하는 정적 메서드에 액세스 하기 때문에 액세스 할 수 있습니다.

자바에서 접근성자 지정 한정자.

자바 액세스 한정자 자바의 접속 제어를 제공하기 위해 사용된다.

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. 프라이빗

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

어떤 클래스의 개인 멤버에 액세스하려고 하면 다른 클래스의 개인 멤버가 컴파일 오류를 발생시킵니다.예를들면,

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

여기에 이미지 설명을 입력하십시오.

Java 액세스 수정

여기에 이미지 설명 입력

, 「접근 수식자」에 할 수 .class,field[대략],method 합니다. 접근, 서브클래스 또는 덮어쓰기를 시도합니다.

  • " " " 에의 field ★★★★★★★★★★★★★★★★★」method하고 있다class.
  • 상속과 오픈 클로즈드[대략] 원칙
    • 「」class(subclass) 액세스 수식자는 임의입니다.
    • 「」method(7) 액세스 수식자는 같거나 확장해야 합니다.

최상위 클래스(최초 레벨 범위)는 다음과 같습니다.public ★★★★★★★★★★★★★★★★★」defaultNested class[대략] 어느 것이든 가질 수 있다

package package hierarchy'는 패키지 을 지원하지 않습니다.

[스위트 액세스 한정자]

패키지에 표시됩니다.디폴트.수식자는 필요 없습니다.

클래스에만 표시됩니다(개인).

세계에 공개됩니다(공용)

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

변수 및 메서드는 호출되는 수식자 없이 선언할 수 있습니다.기본 예:

String name = "john";

public int age(){
    return age;
}

개인 액세스 한정자 - 개인:

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

private로 선언된 변수는 public getter 메서드가 클래스에 존재하는 경우 클래스 외부에서 액세스할 수 있습니다.

개인 수식자를 사용하는 것은 개체가 자신을 캡슐화하고 데이터를 외부로부터 숨기는 주요 방법입니다.

예:

Public class Details{

    private String name;

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

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

퍼블릭 액세스 한정자 - 퍼블릭:

공개로 선언된 클래스, 메서드, 컨스트럭터, 인터페이스 등은 다른 모든 클래스에서 액세스할 수 있습니다.따라서 공용 클래스 내에 선언된 필드, 메서드, 블록은 Java Universe에 속하는 모든 클래스에서 액세스할 수 있습니다.

그러나 액세스하려는 퍼블릭클래스가 다른 패키지에 있는 경우 퍼블릭클래스를 Import해야 합니다.

클래스 상속으로 인해 클래스의 모든 공용 메서드 및 변수는 하위 클래스로 상속됩니다.

예:

public void cal(){

}

보호된 액세스 수식자 - 보호됨:

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

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

보호된 액세스를 통해 하위 클래스는 도우미 메서드 또는 변수를 사용할 수 있으며 관련되지 않은 클래스는 이 메서드를 사용할 수 없습니다.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
  • public - 응용 프로그램의 모든 위치에서 액세스할 수 있습니다.

  • default - 패키지에서 액세스할 수 있습니다.

  • protected - 다른 패키지의 패키지 및 하위 패키지에서 액세스할 수 있습니다.뿐만 아니라.

  • private - 클래스에서만 액세스할 수 있습니다.

이 페이지에는 보호된 액세스 수식자 및 기본 액세스 수식자에 대해 잘 기술되어 있습니다.

......보호: 보호되는 접근 수식자는 조금 까다롭습니다.기본 접근 수식자의 슈퍼셋이라고 할 수 있습니다.보호되는 멤버는 같은 패키지의 액세스에 관한 한 기본 멤버와 동일합니다.차이점은 보호된 멤버는 부모 클래스가 존재하는 패키지 외부에 있는 멤버가 선언된 클래스의 서브 클래스에도 액세스할 수 있다는 것입니다.

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

David의 답변은 각 액세스 수식자의 의미를 제공합니다.각각의 사용 시기에 대해서는 외부용(API)의 모든 클래스와 각 클래스의 메서드를 공개하고, 그 이외의 모든 것을 비공개로 하는 것을 추천합니다.

시간이 지남에 따라 일부 클래스를 패키지 전용으로 할 때와 하위 클래스에서 사용할 수 있도록 보호되는 특정 메서드를 선언할 시기를 파악할 수 있게 됩니다.

Public Protected Default 및 private는 액세스 수식자입니다.

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

  1. 클래스는 퍼블릭 또는 디폴트입니다.
  2. 클래스 멤버는 public, protected, default 또는 private 중 하나입니다.

클래스 이외에서는 프라이빗에 액세스 할 수 없습니다.기본값은 패키지에서만 액세스 할 수 있습니다.패키지와 이를 확장하는 모든 클래스로 보호됩니다.일반인은 누구나 이용할 수 있다.

일반적으로 멤버 변수는 비공개로 정의되지만 멤버 메서드는 공개됩니다.

주의: 이는 승인된 답변에 대한 보충 자료일 뿐입니다.

이것은 Java Access Modifier와 관련되어 있습니다.

Java 액세스 수식자에서:

Java 액세스 수식자는 특정 클래스와 해당 필드, 생성자 및 메서드에 액세스할 수 있는 클래스를 지정합니다.액세스 수식자는 클래스, 클래스 생성자, 필드 및 메서드에 대해 별도로 지정할 수 있습니다.Java 액세스 수식자는 일상 언어에서 Java 액세스 지정자라고도 불리지만 올바른 이름은 Java 액세스 수식자입니다.클래스, 필드, 컨스트럭터 및 메서드는 다음 4가지 Java 액세스 수식자 중 하나를 가질 수 있습니다.

  • 목록 항목
  • 사적인
  • default(디폴트)
  • 보호되고 있다
  • 일반의

클래스 구성원에 대한 액세스 제어 튜토리얼에서 다음을 수행합니다.

액세스 레벨 수식자는 다른 클래스가 특정 필드를 사용할 수 있는지 또는 특정 메서드를 호출할 수 있는지 여부를 결정합니다.액세스 컨트롤에는 다음 두 가지 레벨이 있습니다.

  • 최상위 레벨: public 또는 package-private(명시적인 수식자 없음).
  • 멤버 레벨: 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     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

액세스 레벨은, 2개의 방법으로 영향을 줍니다.먼저 Java 플랫폼의 클래스 등 다른 소스에서 가져온 클래스를 사용할 경우 액세스레벨에 따라 자신의 클래스가 사용할 수 있는 클래스 멤버가 결정됩니다.둘째, 클래스를 작성할 때 각 멤버 변수와 클래스 내의 모든 메서드가 가져야 할 액세스 수준을 결정해야 합니다.

어떤 언어의 기본 개념을 기억하는 것이 현실 세계의 유추를 만들어냄으로써 가능하다는 것을 종종 깨달았습니다.Java에서의 액세스 수식어를 이해하기 위한 제 비유는 다음과 같습니다.

여러분이 대학생이고 주말에 여러분을 찾아오는 친구가 있다고 가정해 봅시다.캠퍼스 한 가운데에 대학 설립자의 큰 동상이 있다고 가정해 보자.

  • 당신이 그를 캠퍼스에 데려왔을 때, 당신과 당신의 친구가 가장 먼저 보는 것은 이 조각상입니다.이것은 캠퍼스를 걷는 모든 사람이 대학의 허가 없이 동상을 볼 수 있다는 것을 의미한다.이로 인해 동상은 PUBLIC로 되어 있습니다.

  • 다음으로, 친구를 기숙사에 데려가고 싶지만, 그러기 위해서는 친구를 방문자로 등록해야 합니다.즉, 캠퍼스의 다양한 건물에 들어갈 수 있는 액세스 패스(당신과 같은 액세스 패스)를 취득하는 것입니다.그러면 접근 카드가 보호됨으로 표시됩니다.

  • 친구가 캠퍼스 WiFi에 로그인하려고 하는데 로그인하기 위한 자격 증명이 없습니다.그가 온라인에 접속할 수 있는 유일한 방법은 당신이 그와 로그인을 공유하는 것입니다.(대학에 다니는 모든 학생도 이 로그인 자격증을 가지고 있다는 것을 기억하십시오.그러면 로그인 자격 증명이 NO MODIFIER로 됩니다.

  • 마지막으로, 당신의 친구가 웹사이트에 게시된 당신의 학기 경과 보고서를 읽고 싶어 합니다.단, 모든 학생은 캠퍼스 웹사이트의 이 섹션에 접속하기 위한 개인 로그인을 가지고 있습니다.그러면 이러한 자격 증명이 PRIVATE로 됩니다.

이게 도움이 됐으면 좋겠네요!

퍼블릭, 프라이빗, 디폴트 및 보호된 접근 수식자의 차이

이 이미지를 통해 퍼블릭, 프라이빗, 보호 및 기본 액세스 수식자의 기본적인 차이를 쉽게 이해할 수 있습니다.기본 수식자는 코드에 개미 액세스 수식자를 선언하지 않을 때 자동으로 발생합니다.

액세스 수식자를 생각하고 있는 경우는, 다음과 같이 생각해 주세요(변수와 메서드 모두에 적용됩니다).

public서나 액세스 할 수 .-->어디서나 할 수 있습니다.
private에서만 합니다.--> " 」

default ★★★★★★★★★★★★★★★★★」protected

default--> access modifier 키워드가 없습니다.즉, 클래스 패키지 내에서만 사용할 수 있습니다.패키지 밖에서는 접근할 수 없습니다.

protected > > > > > > > > > > > > > > > > > > > > >default또한 동일한 패키지 클래스와는 별도로 선언된 패키지 외부의 하위 클래스에서 액세스할 수 있습니다.

private-protected-public-perfect-perfect-private-the-private-

다음 블록 다이어그램에서는 파생 클래스 액세스 모드가 비공개일 때 기본 클래스의 데이터 멤버가 상속되는 방법을 설명합니다.

여기에 이미지 설명 입력

주의: 개인 액세스 지정자를 사용하여 데이터 멤버를 선언하는 것을 데이터 숨김이라고 합니다.

출처 : 접근 지정자(프라이빗, 퍼블릭보호)

내 의견 :)

비공개:

class -> 최상위 클래스는 비공개로 할 수 없습니다.내부 클래스는 같은 클래스에서 액세스할 수 있는 개인 클래스일 수 있습니다.

instance variable -> 클래스 내에서만 접근할 수 있습니다.클래스 외부에서 액세스할 수 없습니다.

package-private:

class -> 최상위 클래스는 package-private로 할 수 있습니다.동일한 패키지에서만 액세스할 수 있습니다.서브 패키지도 외부 패키지도 아닙니다.

instance variable -> 같은 패키지에서 액세스 할 수 있습니다.서브 패키지도 외부 패키지도 아닙니다.

보호:

class -> 최상위 클래스를 보호할 수 없습니다.

instance variable -> 동일한 패키지 또는 서브패키지 내에서만 접근 가능합니다.클래스를 확장하는 동안 패키지 외부에서만 액세스할 수 있습니다.

공개:

클래스 -> 패키지/서브패키지/다른 패키지에서 액세스 가능

instance variable -> 패키지/서브패키지/다른 패키지에서 접근 가능

자세한 답변은 이쪽입니다.

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md

캡슐화(또는 Joe Phillips가 말했듯이 최소한의 지식)에 관한 것입니다.

가장 제한적인 (프라이빗)부터 시작하여 나중에 덜 제한적인 수식어가 필요한지 확인합니다.

우리는 모두 private, public 등의 메서드와 멤버 수식어를 사용하지만, 개발자가 패키지를 사용하여 코드를 논리적으로 정리하는 경우는 거의 없습니다.

예를 들어 다음과 같습니다.중요한 보안 방법을 '보안' 패키지에 넣을 수 있습니다.그런 다음 이 패키지의 일부 보안 관련 코드에 액세스하고 다른 보안 클래스 패키지는 비공개로 유지하는 공용 클래스를 넣습니다.따라서 다른 개발자는 (수식자를 변경하지 않는 한) 이 패키지 외부에서 공개 가능한 클래스만 사용할 수 있습니다.이것은 보안 기능은 아니지만 사용 방법을 안내합니다.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

또 다른 것은 서로에 많이 의존하는 클래스 학생들은 같은 패키지에 있을 것이고 만약 의존도를 지나치게 강하다 결국되거나 합병되 refactored 수 있게 될 수도 있다.

만약 반대로 당신들은 대중으로 모든 일이 액세스 할 해야 하해야 하는javadoc(는 컴파일러를 통해 아무것도 규정을 제대로 실시하지 않는다...)의 작문으로 이어질 수 있지 않을 것이다.

  • 일반의

    만약는 클래스 멤버 공개로 선언되서 어디에서든 접근할 수 있다.

  • 보호되고 있다

    만약는 클래스 멤버 키워드 보호로 선언되서 같은 클래스 멤버, 같은 패키지 및 상속된 클래스 멤버 내에서 수업 외에도 회원들에게 접근할 수 있다.만약는 클래스 멤버 보호되지 않는 한 외부 포장된 수업 즉 다른 패키지 슈퍼 확장하는 유전이 있다면 그것 밖에 패키지 클래스에서 액세스 하면 안 될 수 있다.하지만 보호된 클래스 멤버 항상 똑같은 패키지 수업에 그렇게 하지 않은 것 문제 같은 패키지 수업 또는 NOT상속됨 인지를 이용할 수 있다.

  • 체납

    자바에서 기본이 아닌 것은 액세스 한정자 키워드가 되고 있다.만약에 한반 구성원이었던 모든 액세스 한정자 키워드 없이 기본적 멤버로 간주된다 이 경우에로 선언된다.기본 클래스 멤버 항상 똑같은 소포 클래스 멤버에 사용할 수 있습니다.하지만 외부 패키지 클래스 멤벌 수 있지 접근 기본 클래스 멤버 보호된 멤버들과 달리더라도 외부 수업이 서브 클래스.

  • 사적인

    만약는 클래스 멤버 키워든 다음 이 경우에는 보호로 선언되죠 같은 클래스 멤버 전용 규약 군 이용할 수 있다.

액세스 Specifiers 자바로:에는 자바에서 4접속 지정자, 즉 개인,package-private(기본), 공공 접근 주문 증가에 보호된다.

민간:고 당신은 이 클래스 외부에 노출시키지 않도록 이 클래스의 멤버를 원하는 선수들은 수업을 개발하다면, 너는 사적인 것으로 신고하야 한다.민간 회원들은 그들이 보내 수업 즉 정의된 클래스에서만 액세스 할 수 있습니다.개인 구성원은 '이' 참조 및 이러한 구성원을 둘러싼 클래스의 다른 인스턴스에서도 액세스할 수 있지만, 이 클래스의 정의 내에서만 액세스할 수 있습니다.

Package-Private(기본값):이 액세스 지정자는 아래에 설명된 액세스 외에 개인 액세스 지정자에 의해 지정된 액세스를 제공합니다.

패키지 및 패키지 내의 클래스(Class1)를 개발하는 경우 기본 액세스 지정자(명시적으로 언급할 필요는 없음)를 사용하여 클래스 내의 멤버를 다른 클래스(같은)에 노출시킬 수 있습니다.이러한 다른 클래스(같은 패키지 내)에서는 Class1 인스턴스에서 이러한 기본 멤버에 액세스할 수 있습니다.또한 Class1의 서브클래스(예를 들어 Class2) 내에서 이러한 디폴트멤버에 액세스할 수도 있습니다(이 참조, Class1 인스턴스 또는 Class2 인스턴스).

기본적으로 동일한 패키지 내에서 클래스의 인스턴스에서 직접 또는 하위 클래스의 'this' 참조로 기본 멤버에 액세스할 수 있습니다.

보호:이 액세스 지정자는 아래에 설명된 액세스 외에 패키지 개인 액세스 지정자에 의해 지정된 액세스를 제공합니다.

패키지 및 패키지 내의 클래스(Class1)를 개발할 때 일반적으로 패키지 외부에서 이 멤버에 액세스하지 않고(예를 들어 API를 사용하는 클라이언트) 예외로 하고 싶다면 Class1 내의 데이터 멤버에 대해 보호된 액세스 지정자를 사용해야 합니다.클라이언트가 Class1을 확장하는 Class2라고 하는 클래스를 쓰는 경우에만 이 멤버에 대한 접근을 허용합니다.따라서 일반적으로 보호된 구성원은 파생 클래스에서 '이러한' 참조를 통해 접근할 수 있습니다.Class2 및 Class2의 명시적 인스턴스에 대해서도 마찬가지입니다.

주의:

  1. Class1의 명시적인 인스턴스에서 Class1에 액세스하려고 하면 Class2의 상속된 보호된 멤버에 액세스할 수 없습니다.
  2. Class2를 확장한 동일 또는 다른 패키지 내에 다른 Class3을 쓰는 경우 Class1로부터의 보호 멤버는 이 참조 및 Class3의 명시적인 인스턴스에서도 액세스할 수 있습니다.이는 확장된 계층에 적용됩니다. 즉, 보호된 구성원은 이 참조 또는 확장 클래스의 인스턴스에서 계속 액세스할 수 있습니다.Class3에서 Class2 인스턴스를 작성하면 Class1에서 보호된 멤버는 상속되지만 액세스할 수 없습니다.

, 이 다른 패키지의 일부 클래스가 보호된 멤버를 감싸고 있는 확장 클래스보호된 멤버를 확장 클래스의 '이' 참조 인스턴스 또는 명시적인 인스턴스에서 액세스할 경우에만 다른 패키지로 보호된 멤버에 액세스할있습니다.

public: 이 액세스 지정자는 다음에 설명된 액세스 외에 보호된 액세스 지정자에 의해 지정된 액세스를 제공합니다.

패키지 및 패키지 내의 클래스(Class1)를 개발하는 경우 이 멤버가 다른 패키지의 일부 클래스에서 생성된 Class1 인스턴스의 다른 패키지에서 액세스할 수 있도록 하려면 Class1 내의 데이터 멤버에 대해 퍼블릭액세스 지정자를 사용해야 합니다.기본적으로 이 액세스 지정자는 데이터 구성원을 조건 없이 월드에 노출하려는 경우에 사용해야 합니다.

변수/변수/변수를 클래스 외부에 표시하지 않으려면 private를 사용합니다.이 클래스의 자식만 해당 변수를 사용할 수 있도록 하려면 use protected를 사용합니다.use public은 변수/클래스/모듈에 어디서든 액세스할 수 있도록 하는 경우에 사용합니다.package-private는 변수/변수/변수를 해당 패키지 내에서만 사용하는 경우에 사용합니다.

언급URL : https://stackoverflow.com/questions/215497/what-is-the-difference-between-public-protected-package-private-and-private-in

반응형