HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 24] Map 인터페이스에서 컬렉션 뷰 구현 #31

Closed Limgayoung closed 6 days ago

Limgayoung commented 2 months ago

책의 147페이지를 보면

예컨대 Map 인터페이스의 구현체들은 보통 자신의 컬렉션 뷰를 구현할 때 비정적 멤버 클래스를 사용한다.

고 나와 있습니다.

해당 부분이 감이 잘 안잡히는데 이 부분을 더 자세하게 설명해 주실 수 있나요?

zpqmdh commented 1 month 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: 값의 집합) 를 마치 다른 클래스의 인스턴스처럼 보이게 할 수 있습니다 !