Closed Limgayoung closed 6 days ago
먼저, 비정적 멤버 클래스에 대해 간단히 알아보자면 비정적 멤버 클래스는 static
이 붙지 않은 중첩 클래스를 의미합니다.
이러한 non-static 멤버 클래스는 어댑터를 정의할 때 자주 쓰입니다. 즉, 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰로 사용한다는 것입니다.
책에서는 예제로 Map
인터페이스의 구현체들은 보통(keySet
, entrySet
, values
메서드가 반환하는) 자신의 컬렉션 뷰를 구현할 때 사용한다고 이야기하고 있습니다.
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
...
final class KeySet extends AbstractSet<K> {
// size(), clear(), iterator(), contains(), spliterator(), toArray(), forEach() 구현
}
final class Values extends AbstractCollection<V> {
// size(), clear(), iterator(), contains(), spliterator(), toArray(), forEach() 구현
}
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
// size(), clear(), iterator(), contains(), spliterator(), toArray(), forEach() 구현
}
}
위의 코드는 Map
인터페이스를 구현한 HashMap
클래스입니다. HashMap
은 멤버로 KeySet
, EntrySet
, Values
를 비정적 멤버 클래스로 가지고 있습니다.
비정적 멤버 클래스로 구현한 이유로는 위의 세 비정적 멤버 클래스는 HashMap
내부 데이터에 의존한다는 점과 그렇기 때문에 HashMap
클래스의 인스턴스가 생성된 후에 생성되어야 하기 때문입니다.
비정적 멤버 클래스로 구현함으로써 Map
인터페이스의 구현체인 HashMap
이 자신의 컬렉션 뷰 (keySet
: 키의 집합, entrySet
: 전체 집합, values
: 값의 집합) 를 마치 다른 클래스의 인스턴스처럼 보이게 할 수 있습니다 !
책의 147페이지를 보면
고 나와 있습니다.
해당 부분이 감이 잘 안잡히는데 이 부분을 더 자세하게 설명해 주실 수 있나요?