programing

Java: 정적 클래스 대 내부 클래스

prostudy 2022. 8. 31. 21:37
반응형

Java: 정적 클래스 대 내부 클래스

스태틱 네스트 클래스와 비 스태틱네스트 클래스의 차이점은 무엇입니까?

내부 클래스는 정의상 스태틱할 수 없습니다.따라서 "스태틱 네스트 클래스와 비 스태틱네스트 클래스의 차이점은 무엇입니까?"라고 질문을 다시 캐스트합니다.

비정적 네스트 클래스는 네스트된 클래스 멤버에 대한 풀액세스를 가집니다.스태틱 네스트클래스는 네스트인스턴스에 대한 참조가 없기 때문에 스태틱네스트 클래스는 네스트된 클래스 인스턴스의 비 스태틱메서드를 호출하거나 비 스태틱필드에 액세스할 수 없습니다.

Joshua Bloch의 효과적인 자바에 대한 지혜의 출처를 알아보겠습니다.

엄밀히 말하면, 정적 내부 클래스 같은 것은 없습니다.Effective Java에 따르면 올바른 용어는 정적 중첩 클래스입니다.비 스태틱 네스트 클래스는 어나니머스 클래스 및 로컬클래스와 함께 실제로 내부 클래스입니다.

이제 인용하겠습니다.

비정적 네스트클래스의 각 인스턴스는 포함된 클래스의 둘러싸인 인스턴스와 암묵적으로 관련되어 있습니다.둘러싸인 인스턴스에서 메서드를 호출할 수 있습니다.

스태틱 네스트클래스는 둘러싸인 인스턴스에 액세스할 수 없습니다.공간도 적게 사용합니다.

스태틱 내부 클래스와 비 스태틱 내부 클래스에는 두 가지 차이가 있습니다.

  1. 멤버 필드 및 메서드를 선언하는 경우 스태틱하지 않은 내부 클래스에는 스태틱필드와 메서드를 사용할 수 없습니다.단, static inner 클래스의 경우 static 필드와 non static 필드와 메서드를 사용할 수 있습니다.

  2. non static inner class 인스턴스는 정의된 outer class 객체의 참조를 사용하여 생성됩니다.즉, interstance는 inters를 둘러싸는 것을 의미합니다.그러나 Static inner 클래스의 인스턴스는 Outer 클래스의 참조 없이 생성됩니다.즉, 엔클로징된 인스턴스는 존재하지 않습니다.

이 예를 참조해 주세요.

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. 스태틱 내부 클래스는 스태틱멤버와 비 스태틱멤버를 모두 선언할 수 있습니다스태틱 메서드는 메인클래스의 스태틱멤버에 액세스 할 수 있어요단, 스태틱하지 않은 내부 클래스 멤버에는 액세스할 수 없습니다.non-static inner 클래스의 멤버에 액세스하려면 non-static inner 클래스의 오브젝트를 작성해야 합니다.

  3. 정적 내부 클래스는 정적 필드 및 정적 메서드를 선언할 수 없습니다.정적 또는 최상위 유형으로 선언해야 합니다.이 경우 "static 필드는 static 또는 top level type에서만 선언됩니다."라는 오류가 발생합니다.

  4. non-static inner 클래스는 값을 얻는 절차 스타일로 엔클로징 클래스의 static 멤버와 non-static 멤버 모두에 액세스할 수 있지만 static inner 클래스의 멤버에는 액세스할 수 없습니다.

  5. 둘러싸인 클래스는 내부 클래스의 개체를 만들기 전까지 내부 클래스의 멤버에 액세스할 수 없습니다.non-static 클래스의 멤버에 액세스 할 때 메인클래스가 non-static 내부 클래스의 오브젝트를 작성할 수 있습니다.

  6. static inner class 멤버에 액세스하는 메인클래스의 경우 다음 두 가지 경우가 있습니다.

    • 케이스 1: 스태틱멤버의 경우 스태틱내부클래스의 클래스명을 사용할 수 있습니다.
    • 케이스 2: 비 스태틱멤버의 경우 스태틱내부 클래스의 인스턴스를 생성할 수 있습니다.

중첩된 클래스에 대해 논의하는 중...

차이점은 스태틱한 네스트된 클래스 선언을 둘러싸는 클래스 외부에서 인스턴스화할 수 있다는 점입니다.

정적이지 않은 중첩된 클래스 선언이 있는 경우 Java는 둘러싸인 클래스를 통해서만 인스턴스화할 수 있습니다.내부 클래스에서 생성된 객체는 외부 클래스에서 생성된 객체에 연결되므로 내부 클래스는 외부 필드를 참조할 수 있습니다.

, 스태틱한 경우 링크가 존재하지 않고 외부 필드에 액세스할 수 없으므로(다른 개체와 마찬가지로 일반 참조를 통해서만) 중첩된 클래스를 인스턴스화할 수 있습니다.

static inner class: static 멤버와 non static 멤버를 선언할 수 있지만 부모 클래스의 스태틱멤버에만 접근할 수 있습니다

non static inner class : 비 스태틱멤버만 선언할 수 있지만 부모 클래스의 스태틱멤버 및 비 스태틱멤버에는 접근할 수 있습니다

내부 클래스는 스태틱할 수 없기 때문에 "스태틱과 비 스태틱네스트 클래스의 차이점은 무엇입니까?"라는 질문을 다시 캐스트합니다.

당신이 여기서 말한 것처럼 내부 계층은 정적일 수 없습니다...static...reason이 부여된 아래 코드를 찾았습니다.또는 어떤 것이 맞습니까?

네, 스태틱네스트 타입의 시멘틱스에서는 이를 저지할 수 있는 것은 없습니다.이 토막은 정상적으로 동작합니다.

    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

반응형