정리

중첩 클래스의 종류는 정적 멤버 클래스, (비정적)멤버 클래스, 익명 클래스, 지역 클래스 로 네가지이다. 이중 첫번째를 제외한 나머지는 내부 클래스에 해당한다.

정적멤버 클래스 : 다른 클래스안에 선언되고, 바깥클래스의 private 멤버에도 접근할 수있다는 점만 제외하고 일반클래스와 똑같다.

비정적 멤버클래스 : 구문상의 차이는 단지 static 이지만 의미상의 차이는 꽤크다. 비정적 멤버 클래스의 인스턴스는 바깥클래스의 인스턴스와 암묵적으로 연결 된다. 비정적 멤버 클래스의 인스턴스 메서드에서 정규화된 this 를 사용해 바깥 인스턴스의 메서드를 호출하거나 바깥인스턴스의 참조를 가져올 수 있다.(정규화된 this 란 : 클래스명.this 형태로 바깥 클래스의 이름을 명시하는 용법을 말한다. ) 비정적 멤버 클래스의 인스턴스와 바깥 인스턴스 사이의 관계는 멤버클래스가 인스턴스화될 때 확립되며, 더이상 변경할 수 없다. 비정적 멤버 클래스는 어댑터를 정의할 때 자주 쓰인다.

멤버클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static 을 붙여서 정적 멤버클래스로 만들자. static 를 생략하면 바깥 인스턴스로의 숨은 외부참조를 갖게 된다. 이 참조를 저장하려면 시간과 공간이 소비된다. 더 심각한 문제는 가비지 컬렉션이 바깥클래스의 인스턴스를 수거하지 못 하는 메모리 누수가 생길 수 있다는 점이다.

익명클래스는 당연히 이름이 없다. 또한 바깥 클래스의 멤버도 아니다. 멤버와 달리, 쓰이는 시점에 선언과 동시에 인스턴스가 만들어진다.

지역클래스는 네가지 중첩 클래스 중 가장 드물게 사용된다.

핵심정리

중첩 클래스에는 네가지가 있으며, 쓰임은 다르다. 메서드 밖에서도 사용해야 하거나 메서드 안에 정의하기에 너무 길다면 멤버클래스로 만든다. 멤버클래스의 인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 그러지 않으면 정적으로 만들자.