etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 10. 7. 22:03
반응형

질문자 :intrepion


classinterface 를 만들고 상속을 처리 public , protectedprivate 과 같은 각 액세스 수정자를 언제 사용해야 하는지에 대한 명확한 규칙이 있습니까?



공식 튜토리얼 이 유용할 수 있습니다.


수업 패키지 아강
(동일한 패키지)
아강
(차이 패키지)
세계
public + + + + +
protected + + + +
수정자 없음 + + +
private +

+ : 접근 가능
공백: 액세스할 수 없음


David Segonds

(주의 사항: 저는 Java 프로그래머가 아닙니다. Perl 프로그래머입니다. Perl에는 공식적인 보호 기능이 없기 때문에 문제를 잘 이해하고 있습니다. :) )

사적인

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

패키지 프라이빗

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

보호됨

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

공공의

누구나 볼 수 있습니다.

게시됨

내가 제어하는 코드 외부에서 볼 수 있습니다. (Java 구문은 아니지만 이 논의에서 중요합니다).

C++는 "친구"라는 추가 수준을 정의하며 이에 대해 아는 것이 적을수록 좋습니다.

언제 무엇을 사용해야합니까? 전체 아이디어는 정보를 숨기기 위한 캡슐화입니다. 가능한 한 사용자에게 어떤 작업이 수행되는지에 대한 세부 정보를 숨기고 싶습니다. 왜요? 그러면 나중에 변경할 수 있고 다른 사람의 코드를 손상시키지 않을 수 있습니다. 이를 통해 방금 정밀 검사한 코드를 누군가가 사용하고 있다는 걱정 없이 버그를 최적화, 리팩터링, 재설계 및 수정할 수 있습니다.

따라서, 경험의 법칙은 사물이 필요한 만큼만 보이게 하는 것입니다. 비공개로 시작하여 필요한 경우에만 가시성을 추가하십시오. 사용자가 반드시 알아야 하는 정보만 공개합니다. 공개하는 모든 세부 사항은 시스템을 재설계하는 능력을 저해합니다.

사용자가 동작을 사용자 정의할 수 있게 하고 내부를 공개하여 재정의할 수 있도록 하려면 이러한 용기를 객체에 넣고 해당 인터페이스를 공개하는 것이 더 나은 아이디어인 경우가 많습니다. 그렇게 하면 단순히 새 개체를 연결할 수 있습니다. 예를 들어, CD 플레이어를 작성 중이고 "이 CD에 대한 정보 찾기" 비트를 사용자 정의하려면 해당 메서드를 공개하지 않고 모든 기능을 자체 개체에 넣고 개체 getter/setter만 공개합니다. . 이런 식으로 자신의 내장을 드러내는 데 인색하면 좋은 구성과 관심사의 분리가 촉진됩니다

개인적으로 저는 "비공개"와 "공개"만 고집합니다. 많은 OO 언어가 바로 그것을 가지고 있습니다. "보호됨"은 편리할 수 있지만 실제로는 속임수입니다. 인터페이스가 비공개 이상인 경우 제어할 수 없으며 다른 사람의 코드를 찾아 용도를 찾아야 합니다.

여기에서 "게시됨"이라는 아이디어가 나옵니다. 인터페이스를 변경(리팩토링)하려면 이를 사용하고 있는 모든 코드를 찾아서 변경해야 합니다. 인터페이스가 비공개인 경우 문제가 없습니다. 보호되는 경우 모든 하위 클래스를 찾아야 합니다. 공개된 경우 코드를 사용하는 모든 코드를 찾아야 합니다. 예를 들어 내부 전용인 회사 코드로 작업하는 경우 인터페이스가 공용인지 여부는 중요하지 않은 경우가 있습니다. 기업 리포지토리에서 모든 코드를 가져올 수 있습니다. 그러나 인터페이스가 "게시된" 경우 제어 외부에서 이를 사용하는 코드가 있는 경우 문제가 발생합니다. 해당 인터페이스를 지원해야 하며 그렇지 않으면 코드를 깨뜨릴 위험이 있습니다. 보호된 인터페이스도 게시된 것으로 간주될 수 있습니다(이 때문에 내가 보호된 인터페이스에 신경 쓰지 않습니다).

많은 언어는 public/protected/private의 계층적 특성이 너무 제한적이며 현실과 일치하지 않는다는 것을 알게 됩니다. 이를 위해 특성 클래스 의 개념이 있지만 그것은 또 다른 쇼입니다.


Schwern

여기에 모듈에 대한 열도 포함된 더 나은 버전의 테이블이 있습니다.

Java 액세스 수정자

설명

  • private 멤버( i )는 선언된 것과 동일한 클래스 내 에서만 액세스할 수 있습니다.

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

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

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


어떤 수정자를 선택할 것인가?

액세스 한정자는 실수로 캡슐화(*)가 깨지는 것을 방지하는 데 도움이 되는 도구입니다. 구성원이 클래스, 패키지, 클래스 계층 구조 내부에 있는 것이거나 내부가 아닌 것으로 의도한 것인지 자문하고 그에 따라 액세스 수준을 선택하십시오.

예:

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

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


aioobe

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

Abdull

쉬운 규칙. 모든 것을 비공개로 선언하는 것으로 시작하십시오. 그런 다음 요구 사항이 발생하고 디자인이 보증하는 대로 대중을 향해 진행합니다.

구성원을 노출할 때 표현 선택 또는 추상화 선택을 노출하는지 자문해 보십시오. 첫 번째는 관찰 가능한 동작보다 실제 표현에 너무 많은 종속성을 도입하므로 피하고 싶은 것입니다.

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

또한 재정의할 때 @Override 주석을 사용하여 리팩토링할 때 문제가 발생하지 않도록 합니다.


John Nilsson

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

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

요약

이 액세스 지정자가 있는 구성원에 대한 액세스가 허용됩니까?

  • Member is private : 멤버가 호출 코드와 동일한 클래스 내에서 정의된 경우에만.
  • 멤버가 패키지 개인임: 호출 코드가 멤버의 바로 둘러싸는 패키지 내에 있는 경우에만.
  • 멤버가 protected : 동일한 패키지 또는 멤버가 호출 코드를 포함하는 클래스의 수퍼클래스에 정의된 경우.
  • 회원은 public : 예.

액세스 지정자가 적용되는 항목

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

최상위 범위에 있는 클래스의 경우 public 및 package-private만 허용됩니다. 이 디자인 선택은 아마도 protectedprivate 이 패키지 수준에서 중복되기 때문일 것입니다(패키지의 상속이 없음).

모든 액세스 지정자는 클래스 멤버(생성자, 메서드 및 정적 멤버 함수, 중첩 클래스)에서 가능합니다.

관련: Java 클래스 접근성

주문하다

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

공개 > 보호 > 패키지 개인 > 개인

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

노트

  • 클래스의 메소드 같은 클래스의 다른 객체의 private 멤버에 액세스할 수 있습니다. 보다 정확하게는, 클래스 C의 메소드는 C의 모든 서브클래스의 객체에 있는 C의 private 멤버에 액세스할 수 있습니다. Java는 클래스별로만 액세스 제한을 지원하지 않습니다. private[this] 사용하여 지원하는 Scala와 비교하십시오.)
  • 개체를 생성하려면 생성자에 액세스해야 합니다. 따라서 모든 생성자가 비공개인 경우 클래스는 클래스 내에 있는 코드로만 생성할 수 있습니다(일반적으로 정적 팩토리 메서드 또는 정적 변수 이니셜라이저). 패키지 전용 또는 보호된 생성자의 경우와 유사합니다.
    • 개인 생성자가 있다는 것은 또한 클래스를 외부적으로 서브클래싱할 수 없다는 것을 의미합니다. 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

몇 가지 관련 질문:


Mechanical snail

경험상:

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

그 결과 접근권한을 세 가지로 나누면 다음과 같다.

  • (D)직접 (동일한 클래스 내의 메서드에서 호출하거나 "this" 구문을 통해 호출).
  • (R) 참조(클래스에 대한 참조를 사용하거나 "점" 구문을 통해 메서드를 호출).
  • (I) 상속 (하위 분류를 통해).

다음과 같은 간단한 테이블이 있습니다.

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

Hoa Nguyen

아주 짧게

  • public : 어디서나 접근 가능.
  • protected : 동일한 패키지의 클래스와 모든 패키지에 있는 하위 클래스에서 액세스할 수 있습니다.
  • 기본값(지정된 수정자 없음): 동일한 패키지의 클래스에서 액세스할 수 있습니다.
  • private : 같은 클래스 내에서만 접근 가능

Ravi

Java에서 가장 잘못 이해된 액세스 한정자는 protected 입니다. 하위 클래스가 볼 수 있다는 한 가지 예외를 제외하고는 기본 수정자와 유사하다는 것을 알고 있습니다. 하지만 어떻게? 다음은 혼란을 명확히 하는 예입니다.

  • 2개의 클래스가 있다고 가정합니다. 각각의 패키지에 포함된 FatherSon

     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 } }

Eng.Fouad

사적인

  • 메서드, 변수 및 생성자

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

  • 클래스 및 인터페이스

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

메모

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


보호됨

  • 클래스 및 인터페이스

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

메소드, 필드는 보호로 선언될 수 있지만 인터페이스의 메소드 및 필드는 보호로 선언될 수 없습니다.

메모

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


공공의

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

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

  • 다른 패키지

그러나 액세스하려는 공개 클래스가 다른 패키지에 있는 경우에도 공개 클래스를 가져와야 합니다.

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


기본값 - 키워드 없음:

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

  • 동일한 패키지 내

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

메모

정적 필드를 재정의할 수 없습니다. 재정의하려고 하면 오류가 표시되지 않지만 우리가 제외하고 작동하지 않습니다.

관련 답변

참조 링크

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


Nambi

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


Joe Phillips

Private : 수업에만 접근이 제한됨

기본값(수정자 없음) : 클래스 및 패키지에 대한 제한된 액세스

Protected : 클래스, 패키지 및 하위 클래스에 대한 제한된 액세스(패키지 내부 및 외부 모두)

Public : class, package(all), subclass에 접근 가능... 한마디로 모든 곳.


samkit shah

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(); } }

출력:안녕하세요

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(); } }

출력: 안녕하세요

여기에 이미지 설명 입력


Afee

액세스 수정자는 여러 수준에서 액세스를 제한하기 위해 있습니다.

공개: 기본적으로 동일한 패키지에 있든 없든 모든 클래스에서 액세스할 수 있을 만큼 간단합니다.

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

기본값: 모든 패키지 클래스의 동일한 패키지에서 액세스할 수 있습니다.

액세스하려면 클래스의 개체를 만들 수 있습니다. 그러나 패키지 외부에서 이 변수에 액세스할 수 없습니다.

보호됨: 동일한 패키지의 변수와 다른 패키지의 하위 클래스에 액세스할 수 있습니다. 따라서 기본적으로 기본 + 상속된 동작입니다.

기본 클래스에 정의된 보호 필드에 액세스하려면 자식 클래스의 개체를 만들 수 있습니다.

비공개: 같은 클래스에서 액세스할 수 있습니다.

비정적 메서드에서는 이 참조(생성자에서도) 때문에 직접 액세스할 수 있지만 정적 메서드에서 액세스하려면 클래스의 개체를 만들어야 합니다.


Prashant

  • public - 애플리케이션의 어디에서나 액세스할 수 있습니다.

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

  • protected - 패키지 및 다른 패키지의 하위 클래스에서 액세스할 수 있습니다. 또한

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


Shailendra Singh

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

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

전 세계에 표시됩니다( 공개 ).

패키지 및 모든 하위 클래스( protected )에서 볼 수 있습니다.

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

 String name = "john"; public int age(){ return age; }

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

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

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

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

예:

 Public class Details{ private String name; public void setName(String n){ this.name = n; } public String getName(){ return this.name; } }

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

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

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

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

예시:

 public void cal(){ }

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

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

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

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

 class Van{ protected boolean speed(){ } } class Car{ boolean speed(){ } }

amila isura

이 페이지는 protected 및 default 액세스 수정자에 대해 잘 씁니다.

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

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


dameng

Java 액세스 수정

여기에 이미지 설명 입력

class , field [About] , method 적용할 수 있습니다. 이것을 액세스하거나 서브클래스화하거나 재정의하십시오.

  • field 또는 method 액세스 class 통해 이루어집니다.
  • 상속 및 개방형 폐쇄 원칙 .
    • 후속 class (하위 클래스) 액세스 수정자는 모든 .
    • 후속 method (재정의) 액세스 한정자는 동일하거나 확장해야 합니다.

최상위 클래스(첫 번째 수준 범위)는 publicdefault 수 있습니다. Nested class [정보] 는 이들 중 하나를 가질 수 있습니다.

package 가 패키지 계층에 적용되지 않습니다.

[신속한 접근 수정자]


yoAlex5

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

시간이 지남에 따라 일부 클래스를 패키지 비공개로 만들어야 할 때와 서브클래스에서 사용하기 위해 보호된 특정 메소드를 선언해야 할 때를 이해하게 될 것입니다.


Dov Wasserman

참고: 이것은 허용된 답변에 대한 보충 사항일 뿐입니다.

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

Java 액세스 수정자에서 :

Java 액세스 수정자는 지정된 클래스와 해당 필드, 생성자 및 메서드에 액세스할 수 있는 클래스를 지정합니다. 액세스 한정자는 클래스, 해당 생성자, 필드 및 메서드에 대해 별도로 지정할 수 있습니다. Java 액세스 수정자는 일상 생활에서 Java 액세스 지정자라고도 하지만 정확한 이름은 Java 액세스 수정자입니다. 클래스, 필드, 생성자 및 메소드는 다음 네 가지 Java 액세스 수정자 중 하나를 가질 수 있습니다.

  • 목록 항목
  • 사적인
  • 기본값(패키지)
  • 보호받는
  • 공공의

액세스 제어에서 클래스 멤버에 대한 자습서:

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

  • 최상위 수준 - 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 ║ ╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

액세스 수준은 두 가지 방식으로 영향을 미칩니다. 첫째, Java 플랫폼의 클래스와 같이 다른 소스에서 가져온 클래스를 사용할 때 액세스 수준은 자신의 클래스에서 사용할 수 있는 해당 클래스의 구성원을 결정합니다. 둘째, 클래스를 작성할 때 클래스의 모든 멤버 변수와 모든 메서드가 가져야 하는 액세스 수준을 결정해야 합니다.


ישו אוהב אותך

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

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

  1. 클래스는 공개 또는 기본값일 수 있습니다.
  2. 클래스 멤버는 공개, 보호, 기본 또는 비공개일 수 있습니다.

Private은 클래스 외부에서 액세스할 수 없습니다. Default는 패키지에서만 액세스할 수 있습니다. 패키지와 그것을 확장하는 모든 클래스에서 보호됩니다. 공개는 모두에게 열려 있습니다.

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


richa_v

나는 종종 모든 언어의 기본 개념을 기억하는 것이 실제 유추를 통해 가능하다는 것을 깨달았습니다. 다음은 Java의 액세스 수정자를 이해하기 위한 비유입니다.

당신이 대학교 학생이고 주말에 당신을 방문할 친구가 있다고 가정해 봅시다. 캠퍼스 한가운데에 대학 설립자의 큰 동상이 있다고 가정합니다.

  • 그를 캠퍼스에 데려오면 당신과 당신의 친구가 가장 먼저 보는 것은 이 동상입니다. 캠퍼스를 걷는 사람이라면 누구나 대학의 허가 없이 동상을 볼 수 있다는 뜻이다. 이것은 동상을 PUBLIC으로 만듭니다.

  • 다음으로 친구를 기숙사에 데려가고 싶지만 방문자로 등록해야 합니다. 이것은 그가 캠퍼스의 다양한 건물에 들어갈 수 있는 액세스 패스(당신과 동일)를 얻는다는 것을 의미합니다. 이것은 그의 액세스 카드를 PROTECTED 로 만들 것입니다.

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

  • 마지막으로 친구가 웹사이트에 게시된 학기의 진행 보고서를 읽고 싶어합니다. 그러나 모든 학생은 캠퍼스 웹사이트의 이 섹션에 액세스하기 위해 자신의 개인 로그인을 가지고 있습니다. 이것은 이러한 자격 증명을 PRIVATE 로 만듭니다.

도움이 되었기를 바랍니다!


Greedy Coder

공개, 비공개, 기본 및 보호 액세스 수정자의 차이점

이 이미지를 통해 public, private, protected 및 기본 액세스 수정자의 기본적인 차이점을 쉽게 이해할 수 있습니다. 기본 수정자는 코드에서 ant 접근 수정자를 선언하지 않을 때 자동으로 발생합니다.


Mushfiqur Rahman Abir

접근 한정자를 생각할 때 다음과 같이 생각하십시오( 변수메서드 모두에 적용됨).

public --> 어디에서나 액세스 가능
private --> 선언된 동일한 클래스 내에서만 액세스 가능

default protected 와 관련하여 혼란이 발생합니다.

default --> 액세스 수정자 키워드가 없습니다. 이것은 클래스의 패키지 내에서 엄격하게 사용할 수 있음을 의미합니다. 어디에도 해당 패키지 외부에서 액세스 할 수 없습니다.

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


Pritam Banerjee

내 2센트 :)

사적인:

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

인스턴스 변수 -> 클래스에서만 액세스할 수 있습니다. 클래스 외부에 액세스할 수 없습니다.

패키지 개인:

class -> 최상위 클래스는 패키지 전용일 수 있습니다. 동일한 패키지에서만 액세스할 수 있습니다. 하위 패키지가 아니라 외부 패키지가 아닙니다.

인스턴스 변수 -> 동일한 패키지에서 액세스할 수 있습니다. 하위 패키지가 아니라 외부 패키지가 아닙니다.

보호:

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

인스턴스 변수 -> 동일한 패키지 또는 하위 패키지에서만 액세스할 수 있습니다. 클래스를 확장하는 동안에만 패키지 외부에 액세스할 수 있습니다.

공공의:

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

인스턴스 변수 -> 패키지/하위 패키지/다른 패키지에서 액세스 가능

여기에 자세한 답변이 있습니다

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


Mudassar

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

가장 제한적인(비공개)로 시작하여 나중에 덜 제한적인 수정자가 필요한지 확인하십시오.

우리는 모두 private, public, ...과 같은 메서드와 멤버 수정자를 사용합니다. 하지만 너무 적은 수의 개발자가 패키지를 사용하여 코드를 논리적으로 구성합니다.

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

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

또 다른 점은 서로 많이 의존하는 클래스가 결국 동일한 패키지에 포함될 수 있으며 종속성이 너무 강한 경우 결국 리팩토링되거나 병합될 수 있다는 것입니다.

반대로 모든 것을 공개 로 설정하면 액세스해야 할 항목과 액세스하지 말아야 할 항목이 명확하지 않아 많은 javadoc(컴파일러를 통해 아무 것도 적용하지 않는...)을 작성할 수 있습니다.


Christophe Roussy

private-protected-public-perfect-analogy-for-the-variable-data-types

다음 블록 다이어그램은 파생 클래스 액세스 모드가 private일기본 클래스 의 데이터 멤버가 어떻게 상속 되는지 설명합니다.

여기에 이미지 설명 입력

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

출처 : 액세스 지정자 – 비공개, 공개 및 보호


leonidaa

  • 공공의

    클래스 멤버가 public으로 선언되면 어디에서나 액세스할 수 있습니다.

  • 보호받는

    클래스 멤버가 protected 키워드로 선언되면 동일한 클래스 멤버, 동일한 패키지 내의 외부 클래스 멤버 및 상속된 클래스 멤버에서 액세스할 수 있습니다. 클래스 멤버가 보호되는 경우 외부 패키지 클래스가 상속되지 않는 한, 즉 다른 패키지 수퍼클래스를 확장하지 않는 한 외부 패키지 클래스에서 액세스할 수 없습니다. 그러나 보호된 클래스 멤버는 항상 동일한 패키지 클래스에서 사용할 수 있습니다. 동일한 패키지 클래스가 상속되는지 여부는 중요하지 않습니다.

  • 기본

    Java에서 기본값은 액세스 수정자 키워드가 아닙니다. 클래스 멤버가 액세스 수정자 키워드 없이 선언되면 이 경우 기본 멤버로 간주됩니다. 기본 클래스 멤버는 항상 동일한 패키지 클래스 멤버가 사용할 수 있습니다. 그러나 외부 패키지 클래스 멤버는 외부 클래스가 보호된 멤버와 달리 하위 클래스인 경우에도 기본 클래스 멤버에 액세스할 수 없습니다.

  • 사적인

    클래스 멤버가 protected 키워드로 선언된 경우 이 경우 동일한 클래스 멤버만 사용할 수 있습니다.


Vipul Verma

Java의 액세스 지정자: Java에는 4가지 액세스 지정자가 있습니다. 즉 private, package-private(기본값), protected 및 public 액세스 순서가 증가합니다.

Private : 어떤 클래스를 개발할 때 이 클래스의 멤버가 이 클래스 외부에 노출되지 않도록 하려면 private로 선언해야 합니다. private 멤버는 정의된 클래스(예: 둘러싸는 클래스)에서만 액세스할 수 있습니다. private 멤버는 'this' 참조와 이러한 멤버를 포함하는 클래스의 다른 인스턴스에서 액세스할 수 있지만 이 클래스의 정의 내에서만 액세스할 수 있습니다.

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

패키지를 개발하고 그 안에 있는 클래스(Class1)를 개발할 때 기본(명시적으로 언급할 필요는 없음) 액세스 지정자를 사용하여 클래스 내의 멤버를 (동일한) 패키지 내의 다른 클래스에 노출할 수 있습니다. 이러한 다른 클래스(동일한 패키지 내)에서는 Class1의 인스턴스에서 이러한 기본 멤버에 액세스할 수 있습니다. 또한 Class1의 하위 클래스, 예를 들어 Class2(이 참조 또는 Class1의 인스턴스 또는 Class2의 인스턴스) 내에서 이러한 기본 멤버에 액세스할 수 있습니다.

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

protected : 이 액세스 지정자는 아래에 설명된 액세스 외에 package-private 액세스 지정자가 지정한 액세스를 제공합니다.

어떤 패키지와 그 안에 있는 어떤 클래스(Class1)를 개발할 때 이 멤버가 패키지 외부에서 액세스되는 것을 원하지 않으면 Class1 내의 데이터 멤버에 대해 보호된 액세스 지정자를 사용해야 합니다(예: 소비자 패키지에서 일반적으로 패키지(예: API를 사용하는 클라이언트)이지만 클라이언트가 Class1을 확장하는 Class2라고 말하는 클래스를 작성하는 경우에만 예외를 만들고 이 멤버에 대한 액세스를 허용하려고 합니다. 따라서 일반적으로 보호된 멤버는 파생 클래스(예: Class2)의 'this' 참조와 Class2의 명시적 인스턴스에서 액세스할 수 있습니다.

참고:

  1. 클래스1의 명시적 인스턴스에 액세스하려고 하면 클래스2에 있는 클래스1의 상속된 보호 멤버에 액세스할 수 없습니다.
  2. Class2를 확장하는 동일한/다른 패키지 내에서 다른 클래스 Class3을 작성할 때 Class1의 보호된 멤버는 이 참조와 Class3의 명시적 인스턴스에서도 액세스할 수 있습니다. 이것은 확장된 모든 계층 구조에 적용됩니다. 즉, 보호된 멤버는 이 참조 또는 확장 클래스의 인스턴스에서 계속 액세스할 수 있습니다. Class3에서 Class2의 인스턴스를 생성하면 상속되더라도 Class1에서 보호된 멤버에 액세스할 수 없습니다.

따라서 결론은, 이 다른 패키지의 일부 클래스가 이 보호된 멤버를 둘러싸는 클래스를 확장하는 경우에만 다른 패키지에서 보호된 멤버에 액세스할 수 있으며, 확장된 정의 내에서 확장된 클래스의 'this' 참조 또는 명시적 인스턴스에서 보호된 멤버에 액세스할 수 있습니다. 수업.

public : 이 액세스 지정자는 아래에 설명된 액세스 외에 보호된 액세스 지정자가 지정한 액세스를 제공합니다.

어떤 패키지와 그 안에 어떤 클래스(예를 들어 Class1)를 개발할 때 다른 클래스에서 생성된 Class1 인스턴스의 다른 패키지에서 이 멤버에 액세스할 수 있도록 하려면 Class1 내의 데이터 멤버에 대해 공개 액세스 지정자를 사용해야 합니다. 패키지. 기본적으로 이 액세스 지정자는 조건 없이 데이터 멤버를 세계에 노출하려는 경우에 사용해야 합니다.


Tushar Baviskar

출처 : http:www.stackoverflow.com/questions/215497/what-is-the-difference-between-public-protected-package-private-and-private-in

반응형