3. static 멤버 클래스
• 다른 클래스의 static 멤버로 선언
• 외곽 클래스의 모든 멤버들을 사용할 수 있는 클래스
• ex) Map을 구현하는 클래스의 Entry
• instance field에 접근 불가
• private static 멤버 클래스는 외곽 클래스가 나타내는 객체의 컴포넌
트들을 표현하는데 주로 사용
public abstract class AbstractMap<K,V> implements Map<K,V> {
…
public static class SimpleEntry<K,V>
implements Entry<K,V>, java.io.Serializable{ … }
}
4. static이 아닌 멤버 클래스
• static이 아닌 멤버 클래스의 인스턴스는 자신의 외곽 클래스의 인스
턴스가 있어야만 생성할 수 있다.
• instance field에 접근 가능
• 해당 클래스가 public이나 private이라면 향후 배포판의 바이너리 수
준 호환성을 위해 static과 static이 아닌 클래스를 선택하는 것이 중요
하다.
• 외곽 클래스의 인스턴스를 사용할 필요가 없는 멤버클래스를 선언한
다면 static 멤버 클래스로 만들자.
5. 익명 클래스
• 선언된 곳에서만 인스턴스를 생성
• instanceof 연산자 사용 불가
• 익명 클래스의 클라이언트는 그 클래스의 어떤 멤버 메소드도 호출
불가
• 함수 객체를 생성하는데 많이 사용됨
6. 지역 클래스
• 제일 적게 사용되는 inner class
• {}로 둘러쌓인 메소드나 블록 어디든 선언될 수 있다.
• 지역변수와 동일한 유효범위를 가짐
• 이름을 가질 수 있어 반복적으로 사용가능
• 익명 클래스처럼 외곽 인스턴스를 가지며 static 멤버 포함 불가
• 가독성을 위해 가급적 코드 길이가 짧아야 함
7. 요약.
• nested class (inner class)
– inner class, static inner class, anonymous class, local class
• 메소드 내부에 두기 적합하지 않다면 → 멤버 클래스
• 멤버 클래스의 각 인스턴스가 외곽 클래스의 인스턴스를 참조할 필요가 있다
면 static이 아닌 멤버 클래스, 그렇지 않다면 static 멤버 클래스
• 클래스가 어떤 메소드 내부에 속하고, 한 곳에서만 인스턴스를 생성하고 그
클래스의 특성을 나타내는 타입이 존재하면 익명 클래스, 그렇지 않으면 지역
클래스