Java - Inner Class


1. 내부 클래스 ?? (Inner Class)

  • 내부 클래스라는건 쉽게 말해서, class 안에 class를 만들어 사용하는 것이다.
  • 우리가 내부 클래스를 사용하는 이유는
    • 클래스를 논리적으로 그룹화 할 수 있기 때문
    • 더욱 타이트한 캡슐화가 가능하기 때문
    • 가독성이 좋고, 유지 보수가 쉽기 때문
  • 내부 클래스로 인해 새로운 클래스를 생성하지 않아도 되므로 패키지가 간소화된다. 그리고 내부 클래스에 private 제어자를 적용해준다면, 캡슐화를 통해 클래스를 내부로 숨길 수 있어서 구조적인 프로그래밍이 가능해진다. 그리고 클래스 구조를 숨김으로 코드의 복잡성도 줄일 수 있다.
  • 간단히 말하자면, A 클래스 안에 내부 클래스가 존재한다는건 A클래스 안에서만 사용하기 위한 내부 클래스이므로 괜히 연관관계 생각없이 내부에 선언하여 직관적으로 사용하자는 취지이다.



2. 내부 클래스의 종류

  • 내부 클래스에는 정적 중첩 클래스 ( Static Nested Class )와 일반 내부 클래스(Inner Class)가 있고, 일반 내부 클래스 안에는 지역 클래스(Local Inner Class)와 익명 내부 클래스(Anonymous Inner Class) 그리고 그냥 일반 내부 클래스(Inner Class)로 나뉜다.


2.1. Static Nested Class

  • 정적 중첩 클래스( Static Nested Class )는 클래스 안에 static이 붙은 내부 클래스를 사용하는 것으로, static 키워드가 붙은 외부 자원만 사용할 수 있는 내부 클래스이다.
  • 내부 클래스 본인 안에는 일반 인스턴스 맴버도 선언할 수 있다.
  • 아래 코드를 예시로 들자면 Outer 클래스에 대한 인스턴스를 만들지 않아도 Inner라는 내부 클래스는 static 이므로 사용할 수 있다.
      class Outer {
          public static class Inner {
             // Code
          }
      }
    
      Outer.Inner testClass = new Outer.Inner();
    
  • 주의할 점은, Static Nested Class는 우리가 알고 있는 Static 키워드가 붙은 다른 맴버들과는 다르게 취급된다. 우리가 일반 내부 클래스처럼 외부 인스턴스를 먼저 선언하고 초기화해야되는 선수 작업이 필요없다는 것일 뿐, 일반적인 Static 맴버들처럼 최초에 한 번만 JVM Static 메모리에 올라가는 개념이 아니다.
  • 즉, Static이 붙었지만, 생성된 내부 클래스 인스터스는 서로 다르다는 것이다.
      // 생성된 내부 클래스 인스턴스는 서로 다르다
      Main.InnerClass inner1 = new Main().new InnerClass();
      Main.InnerClass inner2 = new Main().new InnerClass();
      System.out.println(inner1 == inner2); // false
    


2.2. Method Local Inner Class

  • 지역 클래스이다. 클래스 내부에 있는 메서드 안에 정의하는 경우인데, 마치 메서드 안에 있는 지역변수처럼 쓰인다.
  • 내부에서 new 한 뒤에 사용해야하며, 메서드 밖에서는 사용할 수 없다.
      class Outer {
          testMethod() {
              int a = 10;
              class Inner {
                  void display() {
                      System.out.println("이것은 지역 내부 클래스입니다.");
                  }
              }
              Inner inner = new Inner();
          inner.display();
          }
      }
    


2.3. Anonymous Inner Class

  • 익명 내부 클래스이다. 클래스 선언과동시에 부모 클래스를 상속받아 내부에서 오버라이딩 하여 사용하며 생성자가 존재하지 않는다.
  • 특정 클래스의 내부에서만 사용하며, 추상 메서드때문에 혹은 다른 이유로 상속은 받아야하지만, 한 번만 사용할 경우 사용한다. 그래서 extends 라는 예약어를 사용하지 않아도 된다.
      abstract class Greeting {
          abstract void greet();
      }
    
      public class AnonymousInnerClassExample {
    
          public static void main(String[] args) {
              // 익명 내부 클래스를 사용하여 Greeting 인터페이스의 인스턴스를 생성
              Greeting anonymousGreeting = new Greeting() {
                  @Override
                  public void greet() {
                      System.out.println("안녕하세요! 익명 내부 클래스의 greet 메서드입니다.");
                  }
              };
    
              // 익명 내부 클래스의 메서드 호출
              anonymousGreeting.greet();
          }
      }
    


2.4. Inner Class

  • 그냥 일반적인 내부 클래스이다.
  • 안에는 static 맴버를 선언할 수 없으며, 외부 클래스의 인스턴스 맴버들과 관련된 작업에 사용될 목적으로 선언한다. ( 단 final 상수의 경우 static을 선언할 수 있다. )
      class Outer {
          int a = 100;
          int b = 5000;
    
          class Inner {
              int c = 10;
    			
              // static int cost = 100; - 에러! 인스턴스 내부 클래스에는 static 변수를 선언할 수 없다.
              static final int cost = 100; // final static은 상수이므로 허용
    
          }
      }
    






results matching ""

    No results matching ""