Inner class란 클래스 내부에 존재하는 또다른 클래스입니다.
Inner class는 세 가지로 분류됩니다.
정적 inner class는 static
키워드로 인해 감싼 클래스의 객체 참조값이 없이도 생성이 됩니다.
이너 클래스는 감싼 클래스의 객체 참조값으로 이너 클래스의 생성자를 호출해야 합니다.
정적 이너클래스를 사용하는 이유는 네임스페이스의 공유입니다. 자바 클래스중에 예를 들면 HashMap 에 선언된 정적 이너 클래스인 Node 와 LinkedList 에 선언된 정적 이너 클래스 Node 는 정의된 내용이 다릅니다. 범용적인 이름인 Node 클래스를 감싼 클래스 내부에 선언함으로써 어떤 Node 인지 의미를 알 수 있게 됩니다.
이너 클래스는 감싼 클래스 내부에서만 사용되는 경우 사용합니다.
이너클래스는 내부적으로 감싼 클래스의 객체 참조값을 들고 있어 이 참조값으로 스턴스나 메서드를 사용할 수 있습니다. 하지만 이 때문에 GC가 잘 되지 않는 단점이 있습니다.
이너클래스도 외부클래스의 코드 재사용, 캡슐화 등 상속의 특징을 어느정도 갖고 있지만 결정적 차이는 다형성을 실현할 수 없다.
익명클래스란 이름이 없는 클래스로 한 번만 사용되고 버려지는 객체를 위해 사용합니다.
익명클래스를 일회성 클래스를 사용하기 위해 클래스를 정의하고 생성하는 과정이 비효율적인 경우에 사용합니다.
람다는 익명 클래스와 다르게 메서드 레퍼런스를 사용하기 위한 문법입니다.
메서드를 매개변수로 전달해서 전략 패턴 등 디자인 패턴을 다채롭게 사용할 수 있습니다.