Java Language중첩 클래스 및 내부 클래스

소개

Java를 사용하여 개발자는 다른 클래스에서 클래스를 정의 할 수 있습니다. 이러한 클래스를 중첩 클래스 라고합니다. 중첩 된 클래스는 정적이 아닌 것으로 선언 된 경우 내부 클래스라고 부릅니다. 그렇지 않은 경우 정적으로 중첩 된 클래스라고합니다. 이 페이지는 Java Nested 및 Inner Class를 사용하는 방법에 대한 예제를 문서화하고 세부 사항을 제공합니다.

통사론

  • 공용 클래스 OuterClass {public class InnerClass {}} // 내부 클래스는 private 일 수도 있습니다.
  • 공용 클래스 OuterClass {public static class StaticNestedClass {}} // 정적 중첩 클래스는 private 일 수도 있습니다.
  • public void method () {private class LocalClass {}} // 로컬 클래스는 항상 비공개입니다.
  • SomeClass anonymousClassInstance = 새로운 SomeClass () {}; // 익명 내부 클래스의 이름을 지정할 수 없으므로 액세스가 확실하지 않습니다. 'SomeClass ()'가 abstract 인 경우, 본문은 모든 추상 메소드를 구현해야합니다.
  • SomeInterface anonymousClassInstance = 새로운 SomeInterface () {}; // 본문은 모든 인터페이스 메소드를 구현해야합니다.

비고

용어 및 분류

Java 언어 스펙 (JLS)은 다음과 같이 다양한 종류의 Java 클래스를 분류합니다.

최상위 클래스 는 중첩 클래스가 아닌 클래스입니다.

중첩 된 클래스 는 다른 클래스 또는 인터페이스의 본문 내에서 선언이 발생하는 클래스입니다.

내부 클래스 는 명시 적 또는 암시 적으로 정적으로 선언되지 않은 중첩 클래스입니다.

내부 클래스는 비 정적 멤버 클래스 , 로컬 클래스 또는 익명 클래스 일 수 있습니다. 인터페이스의 멤버 클래스는 암시 적으로 정적이므로 내부 클래스로 간주되지 않습니다.

실제로 프로그래머는 내부 클래스를 "외부 클래스"로 포함하는 최상위 클래스를 참조합니다. 또한 "중첩 된 클래스"를 사용하여 정적 중첩 클래스에만 (명시 적으로 또는 암시 적으로) 참조하는 경향이 있습니다.

익명의 내부 클래스와 람다 사이에는 밀접한 관계가 있지만 람다는 클래스입니다.

의미 차이

  • 최상위 클래스는 "기본 사례"입니다. 액세스 수정 자 의미에 기반한 일반 공개 규칙에 따라 프로그램의 다른 부분에서 볼 수 있습니다. 비 추상화의 경우, 액세스 수식 자에 근거 해 관련하는 생성자가 표시되는 모든 코드에 의해 인스턴스화 할 수 있습니다.

  • 정적 중첩 클래스는 두 가지 예외를 제외하고 최상위 클래스와 동일한 액세스 및 인스턴스화 규칙을 따릅니다.

    • 중첩 된 클래스는 private 로 선언 될 수 있습니다. 따라서 중첩 된 클래스는 해당 최상위 수준 클래스 외부에서 액세스 할 수 없습니다.
    • 중첩 클래스는 상위 레벨 클래스와 테스트 된 모든 클래스의 private 멤버에 액세스 할 수 있습니다.

    정적 인 중첩 된 클래스는 타이트한 추상화 경계 내에서 여러 "엔터티 유형"을 나타내야 할 때 유용합니다. 예를 들어 중첩 된 클래스가 "구현 세부 사항"을 숨기는 데 사용되는 경우.

  • 내부 클래스는 둘러싸는 범위에 선언 된 비 정적 변수에 액세스하는 기능을 추가합니다.

    • 비 정적 멤버 클래스는 인스턴스 변수를 참조 할 수 있습니다.
    • 메서드 내에서 선언 된 로컬 클래스는 메서드의 로컬 변수를 참조 할 수도 있습니다 ( final . (Java 8 이상에서는 효과적 일 수 있습니다.)
    • 익명 내부 클래스는 클래스 또는 메서드 내에서 선언 될 수 있으며 동일한 규칙에 따라 변수에 액세스 할 수 있습니다.

    내부 클래스 인스턴스가 둘러싼 클래스 인스턴스의 변수를 참조 할 수 있다는 사실은 인스턴스화에 영향을 미칩니다. 특히, 내부 클래스의 인스턴스가 생성 될 때 암시 적으로 또는 명시 적으로 엔 클로징 인스턴스가 제공되어야합니다.

중첩 클래스 및 내부 클래스 관련 예