sourcecode

클래스를 보호 클래스로 정의할 수 없는 이유는 무엇입니까?

copyscript 2022. 9. 6. 22:24
반응형

클래스를 보호 클래스로 정의할 수 없는 이유는 무엇입니까?

왜요?protected

그럴 수 없다는 걸 알지만, 왜?뭔가 특별한 이유가 있을 거야

말이 안되니까.

보호된 클래스 멤버(메서드 또는 변수)는 서브클래스에서도 액세스할 수 있다는 점을 제외하고 패키지 개인(기본 가시성)과 동일합니다.
Java에는 'subpackage'나 'package-inheritance'와 같은 개념이 없기 때문에 클래스 보호 또는 패키지-프라이빗을 선언하는 것은 동일합니다.

그러나 중첩된 클래스와 내부 클래스를 보호됨 또는 개인 클래스로 선언할 수 있습니다.

디폴트는 패키지레벨 액세스용이고 보호는 패키지레벨과 비패키지 클래스용이지만 이 클래스는 확장됩니다(여기서 주의할 점은 클래스가 표시되어 있는 경우에만 확장할 수 있습니다!).다음과 같이 설명하겠습니다.

  • 보호된 최상위 클래스는 해당 패키지의 클래스에 표시됩니다.
  • 패키지(서브클래스) 외부에 표시되도록 하는 것은 조금 혼란스럽고 까다롭습니다.보호 클래스를 상속할 수 있도록 허용해야 하는 클래스는 무엇입니까?
  • 모든 클래스가 서브클래스가 허용되면 퍼블릭액세스 지정자와 비슷합니다.
  • 없는 경우 기본값과 비슷합니다.

이 클래스는 몇 개의 클래스만으로 서브클래스가 되는 것을 제한할 수 없기 때문에(패키지 또는 패키지 외부에서 사용 가능한 모든 클래스 중 몇 개의 클래스만으로 클래스가 상속되는 것을 제한할 수 없기 때문에) 최상위 클래스에는 보호된 액세스 지정자를 사용할 수 없습니다.따라서 허용되지 않습니다.

public class A
{
    protected class B
    {
    }
}

필드 보호를 정의하면 상속을 통해서만 패키지 내부 및 패키지 외부에서 해당 필드에 액세스할 수 있습니다(자녀 클래스 내부만).

따라서 클래스를 보호할 수 있는 경우 패키지 내에서 매우 쉽게 액세스할 수 있지만 패키지 외부에서 해당 클래스에 액세스하려면 먼저 이 클래스가 정의된 엔티티인 패키지를 확장해야 합니다.

또한 패키지를 확장할 수 없기 때문에(가져올 수 있기 때문에) 보호된 클래스를 정의하면 패키지가 다시 private가 됩니다.이것은 이미 할 수 있는 디폴트로 정의하는 것과 비슷합니다.따라서 클래스를 비공개로 정의해도 아무런 이득이 없으며, 애매하게 만들 뿐입니다.

자세한 내용은 외부 Java 클래스가 비공개 또는 보호되지 않는 이유를 참조하십시오.

@Nikita Rybak의 답변은 좋은 점도 있지만, 세세한 부분까지 없기 때문에, 스스로 깊이 생각하지 않고서는 간단하게 아이디어를 얻을 수 없기 때문에, 이하와 같은 생각을 해, 그 이유를 완전하게 이해할 수 있게 되었다.

4개의 액세스 수식자(첫 번째 레벨이 퍼블릭, 네 번째 레벨이 프라이빗이라고 가정합니다(순서대로 이 테이블에 근거합니다).가장 먼저 알아야 할 것은 왜 클래스가 최상위 레벨에서 비공개로 정의될 수 없는가 하는 것입니다.

따라서 "private class foo"(즉, 클래스 자체가 멤버인 경우)가 허용된다면, outer는 무엇입니까? 파일 범위? 아니요, 파일 outer는 단일 파일 내의 여러 클래스가 별도의 클래스 파일로 컴파일되기 때문에 의미가 없습니다.그래서 겉은 패키지입니다.그러나 세 번째 수준의 기본 액세스 수식자는 이미 "package-private"를 의미합니다.그 때문에, 제4 레벨의 프라이빗 액세스 수식자는 사용 또는 허가되지 않습니다.

그러나 다이렉트 아우터가 패키지가 아닌 클래스이기 때문에 네스트된 개인 클래스는 허용됩니다.예를 들어 다음과 같습니다.

class PrivateNestedMain {
    private static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}

'protected class foo'가 허용하는 경우 보호되는 메인 특성은 서브클래스이므로 (최신 범위에 따라 다르지만 옵션인) 외부(패키지)는 서브클래스 스타일(서브패키지)을 제공해야 합니다.package A extends package B하지만 우린 그런 걸 몰라요따라서 protected는 아우터가 패키지(즉, 서브패키지 없음) 최상위 수준에서는 full potential을 사용할 없지만, 아우터가 클래스(즉, 서브클래스일 수 있음)인 중첩 클래스에서는 full potential을 사용할 수 있습니다.

class ProtectedNestedMain {
    protected static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}

위에서 말한 "풀 퍼텐셜을 사용할 수 없습니다"는 단순히 외부 서브클래스가 없기 때문에 서브클래스 전체에 도달할 수 없기 때문입니다.즉, 실제로 보호되는 것은 허용되지 않습니다.이것은 외부 서브클래스가 아닌 경우 패키지-프라이빗 작업의 중복을 피하기 위한 선택 문제입니다.아래를 참조해 주십시오.

저의 혼란은 주로 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html에 있는 유명한 테이블에서 기인합니다.

여기에 이미지 설명 입력

1차 레벨(공용)과 3차 레벨(패키지-개인)이 허용되는 경우, 2차 레벨 사이의 중간 레벨(보호됨)은 도대체 어떻게 허용되지 않습니까?

공공지원 서브클래스는 오해를 일으키기 쉽습니다.이 표를 올바르게 읽는 방법은

public support 서브클래스(outer에 서브클래스 기능이 있는 경우).

package-private, package-private가 서브클래스(N in cell)를 지원하지 않는다고 해서 서브클래스 개념이 외부에 적용되는 것은 아닙니다.

즉, 서브클래스 기능을 외부에서 사용할 수 없는 경우 서브클래스 열을 무시해야 합니다.

여기에 이미지 설명 입력

현재 알 수 있듯이 보호 수준과 패키지-프라이빗 모두 동일한 수준(Y-Y-N)이므로 중간 수준이 허용되지 않는 이유에 대한 혼란은 없습니다.전체적으로 Java는 혼란을 피하기 위해 package-private over protected(선택의 문제일 뿐이지만 보호된 주요 특성은 서브클래스이기 때문에 package-private가 우수함)만을 선택합니다.그 결과 최상위 레벨에서는 2개의 접근 수식자만 허용됩니다.

최상위 레벨: public 또는 package-private(명시적인 수식자 없음).

보호는 공용과 유사하지 않습니다.Protected는 패키지 레벨의 액세스를 모두 갖추고 있으며 상속을 통해서만 패키지 외부에서 액세스할 수 있습니다.클래스가 패키지 외부에 있는 A가 다른 패키지의 클래스를 상속한다고 하면(INCERITANCE를 사용하여 보호된 메서드를 사용하여 보호된 메서드를 사용하는 경우) 이 클래스 B의 메서드에 액세스할 수 있지만 이 클래스에서 파생된 하위 클래스는 A가 보호된 메서드에 액세스할 수 없습니다.공공장소에서는 그 반대 현상이 일어난다.

예:

package 2;
class B
{
protected void method1()
{
}
}
package 1;
import 2.B;
class A extends B
{
//can access protected method
}
class C extends A
{
//can't access the protected method
}

외부 클래스가 protected로 선언된 경우 클래스는 동일한 패키지와 하위 클래스에서만 액세스할 수 있지만 다른 패키지에서만 액세스할 수 있습니다.그러나 보호되는 클래스에 대한 하위 클래스는 만들 수 없습니다. "class Dog extends Animal"을 쓸 때 보호되는 "Animal"은 하위 클래스에서만 액세스할 수 있기 때문입니다. 분명히 "Dog"는 "Animal" 하위 클래스가 아닙니다.

따라서 보호된 외부 클래스는 (기본값) 외부 클래스와 동일합니다.

"protected" = "default"+ "모든 패키지의 모든 하위 클래스에서 사용" 동작.

어쨌든 클래스에는 기본 액세스 수식자가 있습니다.보호된 액세스 수식자에서 얻을 수 있는 유일한 장점은 서브클래싱을 통해 패키지에서 사용하는 것입니다.그러나 서브클래스의 경우 부모 "protected" 클래스의 가시성은 비공개입니다.그래서 접근할 수 없어요.기본적으로 보호된 최상위 클래스가 있는 경우 하위 클래스를 통해 외부 클래스에 액세스할 수 없습니다.따라서 최상위 등급에 대한 보호는 무의미합니다.

보호됨 : 패키지 레벨에만 표시됨*.

클래스는 정의되어 있습니다. ---> 외부 패키지에서는 확장할 수 없습니다(표시되지 않음).

또한 확장할 수 없는 경우 기본 액세스허용되므로 보호 상태로 유지하는 것은 의미가 없습니다.

개인 정의된 클래스에도 동일하게 적용됩니다.

주의: 네스트 클래스 또는 내부 클래스는 보호 클래스 또는 개인 클래스를 정의할 수 있습니다.

* : 보호 키워드를 탐색합니다.이 답변은 간결하게 했습니다.

@Akash5288의 답변은 납득이 가지 않았습니다.

모든 클래스가 서브클래스가 허용되면 퍼블릭액세스 지정자와 비슷합니다.

이 클래스는 몇 개의 클래스만으로 서브클래스가 되는 것을 제한할 수 없기 때문에(패키지 또는 패키지 외부에서 사용 가능한 모든 클래스 중 몇 개의 클래스만으로 클래스가 상속되는 것을 제한할 수 없기 때문에) 최상위 클래스에는 보호된 액세스 지정자를 사용할 수 없습니다.따라서 허용되지 않습니다.

그런 다음 동일한 논리를 보호된 메서드 및 변수에 적용할 수 있습니다. 그런 다음 "퍼블릭"과 비슷합니다.패키지 외부의 모든 클래스는 퍼블릭 클래스를 확장하고 보호된 메서드를 사용할 수 있습니다.메서드와 변수를 확장 클래스로 제한하는 것은 괜찮은데 클래스 전체를 제한하는 것은 좋지 않은 이유는 무엇입니까?"공용과 유사"는 "공용과 동일"이 아닙니다.내 해석은 보호된 수업을 허용하는 것은 완벽하게 괜찮고, 보호된 방법을 허용하는 것은 괜찮다는 것이다.

"접근할 수 없는 클래스를 확장할 수 없습니다"라는 대답이 더 논리적입니다.

이 질문에서 이치에 맞는 것은 JVM은 C(Sun JVM)와 C++(oracle JVM)로 작성되기 때문에 컴파일 중에 Java 파일에서 .class 파일을 만들고 Protected 키워드를 사용하여 클래스를 선언하면 JVM에서 액세스할 수 없다는 것입니다.

보호된 클래스가 JVM에 의해 액세스되지 않는 이유는 보호된 필드는 상속을 통해서만 동일한 패키지 내 또는 다른 패키지에 액세스할 수 있고 JVM은 클래스를 상속하도록 작성되지 않기 때문입니다.이것이 이 질문을 만족시키기를 바랍니다:)

마찬가지로 최상위 클래스는 비공개일 수 없습니다.설명:

클래스 프라이빗을 정의하면 어떻게 됩니까?이 클래스는 정의된 엔티티 내에서만 액세스할 수 있으며, 이 경우 해당 패키지는 패키지입니다.

따라서 클래스에 대한 프라이빗액세스를 정의하면 이미 default 키워드와 동일한 패키지 내에서 액세스할 수 있게 됩니다.따라서 클래스를 프라이빗하게 정의해도 문제가 애매해질 뿐입니다.

protected는 멤버가 다른 패키지에 있는 경우에도 동일한 패키지의 모든 클래스와 하위 클래스에서 액세스할 수 있음을 의미합니다.

예:

package a;
class parent{
 protected void p();
}
package b;
import a.p;
class child extends parent{
  //you can access method which is protected in the parent in the child 
}
class another extends child {
 //here you can not access the protected method 
}

보호된 수식자는 내부 클래스에서 허용됩니다.그러나 이 내부 클래스의 인스턴스는 외부 클래스를 확장하는 클래스 내에서 구성할 수 없습니다.구성 코드가 동일한 패키지 내에 있는 경우에만 컴파일러에 의해 허용됩니다.그러나 보호대상 수식자는 기본 접근성과 관련하여 어떤 차이가 있습니까?따라서 제 관점에서는 보호된 수식어는 최상위 클래스에서는 전혀 허용되지 않으며 포함된 클래스에서는 의미가 없습니다.

언급URL : https://stackoverflow.com/questions/3869556/why-can-a-class-not-be-defined-as-protected

반응형