IT이야기

외부 Java 클래스가 내부 클래스 개인 구성원에 액세스할 수 있는 이유는 무엇입니까?

cyworld 2022. 6. 29. 21:14
반응형

외부 Java 클래스가 내부 클래스 개인 구성원에 액세스할 수 있는 이유는 무엇입니까?

외부 클래스가 내부 클래스 개인 인스턴스 변수에 액세스할 수 있다는 것을 알게 되었습니다.이것이 어떻게 가능한 걸까요?다음으로 같은 것을 나타내는 샘플코드를 나타냅니다.

class ABC{
    class XYZ{
        private int x=10;
    }

    public static void main(String... args){
        ABC.XYZ xx = new ABC().new XYZ();
        System.out.println("Hello :: "+xx.x); ///Why is this allowed??
    }
}

왜 이 동작이 허용됩니까?

내부 클래스는 원래 외부 클래스에 속하는 일부 기능을 깔끔하게 분리하는 방법입니다.2가지 요건이 있을 때 사용합니다.

  1. 외부 클래스의 일부 기능은 다른 클래스에 구현되어 있는 경우에 가장 명확합니다.
  2. 비록 다른 클래스에 속해 있지만, 기능은 외부 클래스의 작동 방식과 매우 밀접하게 관련되어 있습니다.

이러한 요건을 고려할 때 내부 클래스는 외부 클래스에 완전히 액세스할 수 있습니다.기본적으로 외부 클래스의 멤버이기 때문에 외부 클래스의 메서드 및 속성(프라이빗 포함)에 액세스 할 수 있습니다.

내부 클래스의 개인 멤버를 숨기려면 공용 멤버와의 인터페이스를 정의하고 이 인터페이스를 구현하는 익명 내부 클래스를 만들 수 있습니다.아래 예:

class ABC{
    private interface MyInterface{
         void printInt();
    }

    private static MyInterface mMember = new MyInterface(){
        private int x=10;

        public void printInt(){
            System.out.println(String.valueOf(x));
        }
    };

    public static void main(String... args){
        System.out.println("Hello :: "+mMember.x); ///not allowed
        mMember.printInt(); // allowed
    }
}

내부 클래스는 (액세스 제어의 목적으로) 포함 클래스의 일부로 간주됩니다.이것은 모든 특무원에 대한 완전한 접근을 의미합니다.

이 구현 방법은 통합 패키지 보호 방법을 사용하는 것입니다.inner 클래스는 같은 패키지의 다른 클래스(ABC$XYZ)로 컴파일 됩니다.JVM은 이 분리 수준을 직접 지원하지 않기 때문에 바이트 코드레벨 ABC$XYZ에서는 외부 클래스가 개인 메서드/필드에 도달하기 위해 사용하는 패키지로 보호된 메서드를 가집니다.

다음과 같은 다른 질문에 대한 정답이 나타납니다.네스트된 클래스의 개인 멤버는 왜 엔클로징 클래스의 메서드로 액세스 할 수 있습니까?

JLS의 개인 범위 정의 - 접근성 확인:

그 이외의 경우 멤버 또는 컨스트럭터가 비공개라고 선언된 경우 멤버 또는 컨스트럭터의 선언을 둘러싼 최상위 클래스( (7.6)의 본문 내에서 발생한 경우에만 접근이 허용됩니다.

Thilo는 당신의 첫 번째 질문인 "어떻게 이것이 가능한가?"에 대한 좋은 대답을 덧붙였습니다.두 번째 질문에 대해 조금 더 자세히 설명하겠습니다.왜 이 동작이 허용됩니까?

우선, 이 동작은 내부 클래스에만 한정되지 않으며, 정의상 비정적 중첩 유형입니다.이 동작은 네스트된 Enum 및 인터페이스를 포함하여 모든 네스트된 유형에 대해 허용됩니다.이 인터페이스는 스태틱해야 하며 인클로징인스턴스를 포함할 수 없습니다.기본적으로 이 모델은 다음과 같은 문장으로 요약됩니다.중첩된 코드는 동봉된 코드에 대한 전체 액세스 권한을 가집니다(반대도 마찬가지).

그럼, 왜?한 가지 예가 그 점을 더 잘 설명해 준다고 생각한다.

당신의 몸과 뇌를 생각해 보세요.팔에 헤로인을 주사하면 뇌가 흥분해요.만약 여러분의 뇌의 편도체 부위가 그가 믿는 것이 여러분의 개인 안전을 위협한다고 본다면, 예를 들어, 말벌은 여러분의 몸을 반대로 돌려 두 번 "생각"하지 않고 언덕으로 도망치게 할 것입니다.

그래서 뇌는 신체의 본질적인 부분이고, 이상하게도 그 반대도 마찬가지입니다.이와 같이 밀접하게 관련된 단체 간에 접근통제를 사용하면 그들의 관계 청구가 상실된다.액세스 제어가 필요한 경우 클래스를 완전히 다른 단위로 더 분리해야 합니다.그때까지 그들은 같은 단위이다.연구를 운전하는 예제 자바 Iterator 보통 구현된다 보는 것이다.

코드를 보내에서 중첩된 코드로 낼 수 있다는 것은 대부분, 이러한 중첩 형식의 필드와 메서드에 액세스 한정자를 추가할 쓸모 없도록 만든다.그렇게 하는 것은, 자바 프로그래밍 언어의 새로운 오는 손님들을 위해 안전에 대한 허위 의식을 제공할 수 도 없는 곳을 첨가하고 있다.

내부 수업에 대한 내 짧은 생각으로 중요한 활용 사례는 공장 패턴입니다.그 둘러싸는 클래스와 민간 접근 영광을 받을 것 외부 세계에 해당 인스턴스를을 건네주는 내부 클래스 w/o 접근 제한 사항의 인스턴스를 준비할 수 있다.

모순에서 클래스 정적 아래와 같이는 바깥쪽 클래스에 액세스 제한을 바꾸지 않는다 선언 abyx.또한 상위 클래스에서 정적 계층 간의 액세스 제한하고 있다.나는 놀라...

class MyPrivates {
    static class Inner1 { private int test1 = 2; }
    static class Inner2 { private int test2 = new Inner1().test1; }

    public static void main(String[] args) {
        System.out.println("Inner : "+new Inner2().test2);
    }
}

액세스 제한은 클래스 단위로 이루어집니다.클래스에서 선언된 메서드가 모든 인스턴스/클래스 멤버에 액세스할 수 없는 것은 아닙니다.이는 내부 클래스가 외부 클래스의 멤버에 대한 제한 없는 액세스와 외부 클래스가 내부 클래스의 멤버에 대한 제한 없는 액세스라는 것을 증명합니다.

클래스를 다른 클래스에 포함시킴으로써 클래스를 구현에 단단히 묶게 됩니다. 구현의 일부인 클래스는 다른 부분에 액세스할 수 있습니다.

내적 계급의 이면에 있는 논리는 외적 계급에 내적 계급이 생긴다면, 그것은 그들이 몇 가지를 공유할 필요가 있기 때문에, 그들이 가지고 있는 "일반" 계급보다 더 많은 유연성을 가질 수 있다는 것이다.

만약 당신의 경우, 클래스가 서로의 내면을 볼 수 있다는 것이 말이 안 된다면, 그것은 기본적으로 내부 클래스가 단순히 정규 클래스로 만들어졌을 수 있다는 것을 의미하며, 내부 클래스는 다음과 같이 선언할 수 있습니다.static class XYZ.사용.static상태를 공유하지 않는 것을 의미합니다(예를 들어new ABC().new XYZ()동작하지 않기 때문에,new ABC.XYZ().
하지만, 만약 그렇다면, 당신은 생각해봐야 한다.XYZ정말 내부 계층이어야 하고, 어쩌면 자신만의 파일을 만들 가치가 있을지도 모릅니다.스태틱 내부 클래스를 만드는 것이 적절할 수 있습니다(예를 들어 외부 클래스가 사용하고 있는 인터페이스를 구현하는 작은 클래스가 필요한 경우, 다른 곳에서는 도움이 되지 않습니다).하지만 그 시간의 절반 정도는 외부 클래스로 만들어졌어야 했다.

내부 클래스는 외부 클래스의 속성으로 간주됩니다.따라서 Inner 클래스 인스턴스 변수가 프라이빗이든 아니든 Outer 클래스는 다른 프라이빗 속성(변수)에 액세스하는 것과 마찬가지로 문제 없이 액세스할 수 있습니다.

class Outer{

private int a;

class Inner{
private int b=0;
}

void outMethod(){
a = new Inner().b;
}
}

왜냐하면 당신의main()메서드는ABCclass - 자체 내부 클래스에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members

반응형