Web develop/JAVA

[JAVA] 자바 내부클래스(Inner Class/비 정적 중첩클래스)

ForA 2019. 4. 29. 18:21
728x90

: 클래스 내에 또 다른 클래스를 구성하는 것

[public/final/abstract] class A { //외부클래스, Outer클래스, Top-level 클래스
  static int su = 100;

  //1차자원 정의

  [접근제한자4개, static가능] class B {// 내부클래스, Inner클래스
      //2차 자원정의

      System.out.println(su); //외부클래스 su에 static 선언 후 사용 
  }
}
  • 클래스 접근제한자로 public, default, final, abstract만 가능하지만 중첩클래스는 멤버이기에 접근제한자 네개와 static까지 모두 사용할 수 있음.
  • 내부클래스는 외부클래스에서 static이 붙은 자원을 모두 자기것으로 사용함.
  • 외부클래스가 내부클래스 안에있는 기능을 사용하기위해선 객체생성을 해줘야함.
  • 파일 저장방식
    A.java → 컴파일(javac) → A.class와 A$B.class 생성 // $ 뒤에있는건 내부클래스

종류

정적 중첩 클래스

: static이 선언된 내부클래스. 외부자원을 사용할 때 static 붙는 인스턴스만 접근가능

비정적 중첩 클래스

: static이 선언되지 않은 내부클래스. 보통 Inner클래스라고 함.

class NestingClass {// 외부클래스

  int i = 11;

  void hello() {
      System.out.println("안녕");
      //외부클래스 -->내부클래스 자원 사용 
      //nested.print(); --> 오류. 객체생성 후 내부클래스의 기능을 가져올수있다
      Nested nested = new Nested();//객체생성
      nested.print();
  }

  class Nested {// 내부클래스
      int j = 22;

      void print() {
          System.out.println("프린트");
      }
      //외부클래스 자원사용
      void callTest() {
          hello();
          System.out.println("i=" + i);
      }
  }// Nested
}// NestingClass


public class NestedClassTest {// 내부클래스에 대한 테스트

  public static void main(String[] args) {
    //외부클래스 - int i , hello() , 내부클래스
    //내부클래스 - int j , print()

    NestingClass nesting = new NestingClass();
    nesting.hello();//외부클래스의 메소드 호출

    //내부클래스의 메소드를 main()에서 직접 호출 (잘 안씀)
    //객체생성: 외부클래스명.내부클래스명 참조변수명 = new 외부생성자().new 내부생성자();

    NestingClass.Nested nested = new NestingClass().new Nested();
    nested.print();
  }
}