2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 20] 골격 구현 AbstractList #78

Open gmelon opened 1 year ago

gmelon commented 1 year ago

p.133 에서 예시로 제공하는 AbstractList 를 구현하는 정적 팩토리 메서드를 보고 get(), set(), size() 만 구현하고도 저게 제대로 동작할 수 있는지 궁금해서 찾아본건데,

AbstractList의 API 문서가 이렇게 작성되어 있네요.

변경할 수 없는 목록을 구현하려면 프로그래머는 이 클래스를 확장하고 get(int)와 size() 메서드에 대한 구현만 제공하면 됩니다.

변경 가능한 목록을 구현하려면 프로그래머는 추가로 set(int, E) 메서드를 오버라이드해야 합니다 (그렇지 않으면 UnsupportedOperationException가 발생합니다). 만약 목록의 크기가 가변적이라면 프로그래머는 추가로 add(int, E)와 remove(int) 메서드를 오버라이드해야 합니다.

위 메서드만 재정의해주게 되면 AbstractList가 디폴트로 구현하고 있는 아래와 같은 메서드들을 사용할 수 있게 됩니다.

public int lastIndexOf(Object o) {
    ListIterator<E> it = listIterator(size());
    if (o==null) {
        while (it.hasPrevious())
            if (it.previous()==null)
                return it.nextIndex();
    } else {
        while (it.hasPrevious())
            if (o.equals(it.previous()))
                return it.nextIndex();
    }
    return -1;
}

추가로, 예시에 나온 정적 팩토리 메서드의 인자를 통해 받은 int 배열 a 의 참조를 새롭게 생성한 List에서 사용하는 게 조금 흥미로웠습니다. 처음엔 get() 에서 단순히 return a[i] 뭐 이런식으로 해주길래 AbstractList에 어떻게 a를 넘겨주는거지? 했는데 생각해보니 List에서 그냥 배열 a의 참조를 사용하고, List의 참조가 해제되기 전까지 a가 List랑 붙어서 동작할 것 같아요.