Programming

자바 : 정적 클래스와 내부 클래스

procodes 2020. 2. 29. 15:37
반응형

자바 : 정적 클래스와 내부 클래스


이 질문에는 이미 답변이 있습니다.

정적 중첩 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?


내부 클래스 는 정의상 정적 일 수 없으므로 "정적 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?"

정적이 아닌 중첩 클래스는 중첩 된 클래스의 멤버에 대한 모든 액세스 권한을 갖습니다. 정적 중첩 클래스에는 중첩 인스턴스에 대한 참조가 없으므로 정적 중첩 클래스는 정적이 아닌 메소드를 호출하거나 중첩 된 클래스 인스턴스의 정적이 아닌 필드에 액세스 할 수 없습니다.


그러한 질문에 대한 지혜의 근원을 살펴 보겠습니다. Joshua Bloch의 Effective Java :

기술적으로 정적 내부 클래스는 없습니다. Effective Java 에 따르면 올바른 용어는 정적 중첩 클래스 입니다. 정적이 아닌 중첩 클래스는 실제로 익명 클래스 및 로컬 클래스와 함께 내부 클래스입니다.

그리고 지금 인용하자면 :

정적이 아닌 중첩 클래스 의 각 인스턴스는 포함하는 클래스 의 엔 클로징 인스턴스 와 암시 적으로 연결됩니다. 엔 클로징 인스턴스 에서 메서드를 호출 할 수 있습니다.

정적 중첩 클래스는 둘러싸는 인스턴스에 액세스 할 수 없습니다. 공간도 적게 사용합니다.


정적 내부 클래스와 비 정적 내부 클래스에는 두 가지 차이점이 있습니다.

  1. 멤버 필드 및 메소드를 선언하는 경우 비 정적 내부 클래스는 정적 필드 및 메소드를 가질 수 없습니다. 그러나 정적 내부 클래스의 경우 정적 및 비 정적 필드 및 메소드를 가질 수 있습니다.

  2. 정적이 아닌 내부 클래스의 인스턴스는 정의 된 외부 클래스의 객체 참조를 사용하여 작성되며, 이는 인스턴스를 둘러싸고 있음을 의미합니다. 그러나 정적 내부 클래스의 인스턴스는 외부 클래스의 참조없이 생성되므로 인스턴스를 둘러싸고 있지 않습니다.

이 예를 참조하십시오

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}

  1. 정적 내부 클래스는 둘러싸는 클래스의 비 정적 멤버에 액세스 할 수 없습니다. 객체를 만들지 않고 값을 얻는 절차 스타일과 같은 클래스를 묶는 정적 멤버 (인스턴스 필드 및 메서드)에 직접 액세스 할 수 있습니다.

  2. 정적 내부 클래스는 정적 멤버와 비 정적 멤버를 모두 선언 할 수 있습니다. 정적 메소드는 기본 클래스의 정적 멤버에 액세스 할 수 있습니다. 그러나 정적이 아닌 내부 클래스 멤버에는 액세스 할 수 없습니다. 비 정적 내부 클래스의 멤버에 액세스하려면 비 정적 내부 클래스의 객체를 만들어야합니다.

  3. 비 정적 내부 클래스는 정적 필드 및 정적 메소드를 선언 할 수 없습니다. 정적 또는 최상위 유형으로 선언해야합니다. "정적 필드는 정적 또는 최상위 레벨 유형으로 만 선언됩니다"라고 말하면이 오류가 발생합니다.

  4. 정적이 아닌 내부 클래스는 가치를 얻는 절차 적 스타일로 둘러싸는 클래스의 정적 및 비 정적 멤버 모두에 액세스 할 수 있지만 정적 내부 클래스의 멤버에는 액세스 할 수 없습니다.

  5. 엔 클로징 클래스는 내부 클래스의 개체를 만들 때까지 내부 클래스의 멤버에 액세스 할 수 없습니다. 정적이 아닌 클래스의 멤버에 액세스하는 경우 기본 클래스는 정적이 아닌 내부 클래스의 오브젝트를 작성할 수 있습니다.

  6. 정적 내부 클래스의 멤버에 액세스하는 기본 클래스의 경우 두 가지 경우가 있습니다.

    • 사례 1 : 정적 멤버의 경우 정적 내부 클래스의 클래스 이름을 사용할 수 있습니다
    • 사례 2 : 비 정적 멤버의 경우 정적 내부 클래스의 인스턴스를 만들 수 있습니다.

중첩 클래스 토론 ...

차이점은 정적 인 중첩 클래스 선언을 둘러싸는 클래스 외부에서 인스턴스화 할 수 있다는 것입니다.

static아닌 중첩 클래스 선언이 있으면 Java는 둘러싸는 클래스를 제외하고 인스턴스화 할 수 없습니다. 내부 클래스에서 생성 된 객체는 외부 클래스에서 생성 된 객체에 연결되므로 내부 클래스는 외부의 필드를 참조 할 수 있습니다.

그러나 정적 인 경우 링크가 존재하지 않고 외부 필드에 액세스 할 수 없으며 (다른 객체와 같은 일반 참조를 제외하고) 중첩 클래스를 자체적으로 인스턴스화 할 수 있습니다.


정적 내부 클래스 : 정적 및 비 정적 멤버를 선언 할 수 있지만 부모 클래스의 정적 멤버에만 액세스 할 수 있습니다.

비 정적 내부 클래스 : 비 정적 멤버 만 선언 할 수 있지만 부모 클래스의 정적 및 비 정적 멤버에 액세스 할 수 있습니다.


내부 클래스는 정적 일 수 없으므로 "정적 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?"

u가 여기에서 말했듯이 내부 클래스는 정적 일 수 없습니다 ... 정적으로 주어진 아래 코드를 찾았습니다 .... 이유? 또는 맞습니다 ....

예, 정적 중첩 유형의 시맨틱에는 그렇게하지 못하게하는 것이 없습니다. 이 스 니펫은 잘 작동합니다.

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

이것은이 웹 사이트에 게시 된 코드입니다 ...

질문 ---> 정적 중첩 클래스를 여러 번 인스턴스화 할 수 있습니까?

대답은 --->

물론, 중첩 형식은 자체 인스턴스 제어 (예 : 개인 생성자, 단일 패턴 등)를 수행 할 수 있지만 중첩 형식이라는 사실과는 관련이 없습니다. 또한 중첩 형식이 정적 열거 형이면 전혀 인스턴스화 할 수 없습니다.

그러나 일반적으로 정적 중첩 형식은 여러 번 인스턴스화 할 수 있습니다.

기술적으로 정적 중첩 형식은 "내부"형식이 아닙니다.


정적 중첩 클래스는 다른 최상위 클래스와 마찬가지로 외부 클래스 및 다른 클래스의 인스턴스 멤버와 상호 작용합니다. 실제로 정적 중첩 클래스는 패키징 편의를 위해 다른 최상위 클래스에 중첩 된 최상위 클래스입니다.

참고 URL : https://stackoverflow.com/questions/1353309/java-static-vs-inner-class



반응형