멤버 클래스는 4가지로 정의된다.
정적 멤버 클래스
public 도우미 클래스로 주로 사용된다.
바깥 클래스에는 접근할 수 없다.
예시) Calculator.Operation.PLUS
비정적 멤버 클래스
어댑터를 정의할 때 주로 사용된다.
내부적으로 바깥 클래스와 관계를 갖게 되며, 멤버 클래스 내에서 바깥 클래스.this 를 통해 접근도 가능하다.
Set, List의 Iterator 와 같이 자신의 뷰를 제공할 때 주로 사용된다.
익명 클래스
선언한 지점에서만 사용할 수 있다
이름이 없으므로 외부에서 instanceof와 같은 연산자를 처리할 수 없다.
즉석에서 로직을 수행하기 위해 많이 사용되었었으나, 자바가 람다를 지원하여 그 자리를 물려주었다.
정적 팩터리 메서드를 구현할 때, 주로 사용된다.
지역 클래스
익명 클래스와 비슷한 역할을 수행하며 이름을 갖는다.
유효 범위가 지역 변수와 같다.
바깥 클래스를 사용할 일이 없다면 멤버 클래스는 static으로 만들자.
그렇지 않으면 바깥 클래스의 참조를 불필요하게 갖고 있게 되어 시간, 공간의 낭비가 발생하고, 가비지 컬렉션에서 바깥 클래스의 인스턴스를 수거하지 못하는 일이 발생한다.