[TIL] 코드스테이츠 SEB BE Day 16

💡 Today I Will Learn

  • Inner Class

✏️ Summary


Inner Class


클래스 내 선언된 클래스를 의미하며, 외부 클래스와 연관이 있을 때 사용한다.

// file: "Outer.java"
class Outer{

  class Inner{
    // 인스턴스 내부 클래스
  }

  static class Static Inner{
    // 정적 내부 클래스
  }

  void method(){
    class LocalInner{
       // 로컬 내부 클래스
    }
  }
}
종류선언사용변수
인스턴스 내부 클래스외부 클래스의 멤버변수외부 인스턴스 변수, 외부 전역 변수
정적 내부 클래스외부 클래스의 멤버변수외부 전역 변수
지역 내부 클래스외부 클래스의 메서드 또는 초기화 블럭외부 인스턴스 변수, 외부 전역 변수
익명 내부 클래스클래스의 선언과 객체의 생성을 동시에 하는 일회용외부 인스턴스 변수, 외부 전역 변수

인스턴스 내부 클래스 (Instance Inner Class)


class Outer{
  private int num=1;
  private static int sNum=2;

  private Inner inner;

  public Outer(){
    inner = new Inner();
  }

  class Inner{
    void method(){
      System.out.println(num+sNum); // 3
    }
  }
}

private로 생성된 인스턴스 변수도 Inner 클래스에서는 사용할 수 있다.

하지만 Outer클래스가 생성된 후 Inner클래스를 사용할 수 있으므로, static 멤버는 내부클래스에 생성할 수 없다.

정적 내부 클래스 (static Inner Class)


class Outer{
  private int num=1;
  private static int sNum=2;

  public Outer(){
    inner = new Inner();
  }

  static void staticMethod(){

  }

  static class staticInner{
    void method(){
      System.out.println(sNum);
      staticMethod();// 3
    }
  }
}

인스턴스 내부 클래스와 유사하며, 내부 클래스에만 static 예약어를 사용할 수 있다. (외부 클래스에는 불가능!)

지역 내부 클래스 (Local Inner Class)


class Outer{
  private int num=1;
  private static int sNum=2;

  public Outer(){
    inner = new Inner();
  }

  void method(){
    class LocalInner{
      void innerMethod(){

      }
    }

    LocalInner localInner = new LocalInner();
    localInner.innerMethod();
  }


}

메서드 내 정의되는 클래스로, Local variable처럼 정의된 메서드 내에서만 사용가능하다. 메서드가 호출될 떄만 메모리에 로딩되므로 static 키워드 사용이 불가능하다.

익명 내부 클래스 (Anonymous Inner Class)


이름을 알 수 없는 클래스이며, 선언과 객체 생성을 동시에 하기 때문에 오직 하나의 객체생성으로 일회성 용도로 사용한다.

‘익명’의 의미를 제외하면 지역 내부클래스와 유사하다.

단 하나의 클래스를 상속받거나, 단 하나의 인터페이스를 구현할 수 있다.

interface Inter{
  void method();
}

class Main{
  public static void main(String[] args){
    Inter inter = new Inter(){
      public void method(){
        // 구현
      }
    };

    inter.method();
  }
}

📌 정리


익명 내부클래스 사용을 의미는 모르게 간간히 사용했던 것으로 기억이 난다. 대강의 유추해서 사용했었는데, 일회성으로 상속받아 구현한다고 이해하면 되겠다😁

👿 Problem

List에서 복사를 위해 Collections.copy(dest, src) 메서드를 사용하면 Shallow(얕은) 복사가 일어난다?

👼 Solution

우선 copy() 메서드는 빈 List에 복사하면 오류가 난다. 이유는 “dest의 길이>=src의 길이” 를 만족해야 하기 때문이다.

돌아와서, copy() 메서드는 참조를 복사하는 shallow copy 메서드이다. 따라서 Wrapper 클래스(immutable)가 아닌 클래스를 사용하여 내부적으로 변경하는 경우 src와 dest 모두 변경되는 불상사가 일어난다.

Java API는 collection 객체의 shallow copy만 구현한다…. (deep copy는 알아서…)

🎯 Tomorrow


  • Enum
  • Annotation
  • Lambda
  • Stream

Back to [TIL] 코드스테이츠 SEB BE Day 15