ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java][정리] Collection Framework - Iterator(반복자) 사용하는 이유
    Java 2018. 2. 13. 19:57

    [Java] Ch11. 컬렉션 프레임워크(Collection Framework)



    <iterator??>

    * iterator는 반복자라는 의미를 가지고 있다.

    * 인터페이스로 실제 코드는 아래와 같다. java.util 패키지에 있다.

    (JDK를 설치한 뒤 C:\Program Files\Java\jdk1.8.0_131\src\java\util 의 경로를 들어가면 java파일을 확인할 수 있다.)


    package java.util;

    import java.util.function.Consumer;


    public interface Iterator<E> {

        boolean hasNext();


        E next();


        default void remove() {

            throw new UnsupportedOperationException("remove");

        }


        default void forEachRemaining(Consumer<? super E> action) {

            Objects.requireNonNull(action);

            while (hasNext())

                action.accept(next());

        }

    }


    * JAVA 공부를 하던 중 컬렉션 프레임워크(Collection Framework) 부분에서 List에 저장된 데이터를 for문 대신 iterator로 조회하는 것이 궁금하여 리서치하게 되었고, 알게 된 내용을 바탕으로 실제 소스와 함께 정리해보기로 했다.



    * 우선 <iterator를 사용하는 이유>는 표준이기 때문이라고 한다.

    * List인터페이스를 구현한 컬렉션은 get메서드로 저장된 데이터를 읽어올 수 있지만, Set인터페이스를 구현한 컬렉션에는 get메서드가 없다.

    * 하지만 iterator(반복자)는 어느 컬렉션이든 사용법이 동일하다(표준이므로).

    * 그래서 해당 컬렉션(예를 들면 ArrayList를 HashSet 컬렉션으로 교체 시)으로 교체해야할 때 반복자를 이용하면 코드를 수정하지 않아도 되어 유지보수 시간을 줄일 수 있다고 한다.

    * 참고 : http://cafe.naver.com/javachobostudy/115447



    * <iterator의 사용 방법>은 다음과 같다.

    class Main {

    public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<Integer>(); // 저장순서 유지 => 4,5,9,2,

    // HashSet<Integer> list = new HashSet<Integer>();        // 저장순서 유지안됨. 정렬되어 출력 =>  2,4,5,9,

    list.add(4);

    list.add(5);

    list.add(9);

    list.add(2);

    // 1) 표준 iterator(반복자) 사용

    // Iterator<Integer> it = list.iterator();

    // while (it.hasNext()) {

    // System.out.print(it.next() + ",");

    // }

    // 2) get() 메서드 사용: HashSet으로 교체 시, 컴파일 에러

    // for (int i=0; i < list.size(); i++) {

    // System.out.print(list.get(i) + ",");// HashSet은 get() 메서드가 없음 --> 컴파일 에러 발생

    // }

    // 3) 표준은 아니어도 둘 다(ArrayList, HashSet) 가능(참고)

    for (int x : list) {

    System.out.print(x + ",");

    }

    }

    }




    * java.util 패키지의 <Set 인터페이스의 실제 소스>를 살펴보면 다음과 같다.

    package java.util;


    public interface Set<E> extends Collection<E> {

        // Query Operations

        int size();

        boolean isEmpty();

        boolean contains(Object o);

        Iterator<E> iterator();

        Object[] toArray();


        <T> T[] toArray(T[] a);


        // Modification Operations

        boolean add(E e);

        boolean remove(Object o);


        // Bulk Operations

        boolean containsAll(Collection<?> c);

        boolean addAll(Collection<? extends E> c);

        boolean retainAll(Collection<?> c);

        boolean removeAll(Collection<?> c);

        void clear();


        // Comparison and hashing

        boolean equals(Object o);

        int hashCode();

        @Override

        default Spliterator<E> spliterator() {

            return Spliterators.spliterator(this, Spliterator.DISTINCT);

        }

    }


    * 그리고 <Set인터페이스를 구현한 HashSet 컬렉션의 실제 소스 일부>이다.

    package java.util;


    import java.io.InvalidObjectException;


    public class HashSet<E>

        extends AbstractSet<E>

        implements Set<E>, Cloneable, java.io.Serializable

    {

        static final long serialVersionUID = -5024744406713321676L;


        // 생략

    }



    * 그리고 아래는 java.util 패키지의 <List 인터페이스의 실제 소스>이다.

    package java.util;


    import java.util.function.UnaryOperator;


    public interface List<E> extends Collection<E> {

        // Query Operations

        int size();

        boolean isEmpty();

        boolean contains(Object o);

        Iterator<E> iterator();

        Object[] toArray();

        <T> T[] toArray(T[] a);


        // Modification Operations

        boolean add(E e);

        boolean remove(Object o);


        // Bulk Modification Operations

        boolean containsAll(Collection<?> c);

        boolean addAll(Collection<? extends E> c);

        boolean addAll(int index, Collection<? extends E> c);

        boolean removeAll(Collection<?> c);

        boolean retainAll(Collection<?> c);

        default void replaceAll(UnaryOperator<E> operator) {

            Objects.requireNonNull(operator);

            final ListIterator<E> li = this.listIterator();

            while (li.hasNext()) {

                li.set(operator.apply(li.next()));

            }

        }

        @SuppressWarnings({"unchecked", "rawtypes"})

        default void sort(Comparator<? super E> c) {

            Object[] a = this.toArray();

            Arrays.sort(a, (Comparator) c);

            ListIterator<E> i = this.listIterator();

            for (Object e : a) {

                i.next();

                i.set((E) e);

            }

        }

        void clear();


        // Comparison and hashing

        boolean equals(Object o);

        int hashCode();


        // Positional Access Operations

        E get(int index);

        E set(int index, E element);

        void add(int index, E element);

        E remove(int index);


        // Search Operations

        int indexOf(Object o);

        int lastIndexOf(Object o);



        // List Iterators

        ListIterator<E> listIterator();

        ListIterator<E> listIterator(int index);


        // View

        List<E> subList(int fromIndex, int toIndex);

        @Override

        default Spliterator<E> spliterator() {

            return Spliterators.spliterator(this, Spliterator.ORDERED);

        }

    }



    * <ArrayList 컬렉션의 실제 소스 일부>로 List인터페이스를 구현한 컬렉션이다.

    package java.util;


    import java.util.function.Consumer;

    import java.util.function.Predicate;

    import java.util.function.UnaryOperator;


    public class ArrayList<E> extends AbstractList<E>

            implements List<E>, RandomAccess, Cloneable, java.io.Serializable

    {

        private static final long serialVersionUID = 8683452581122892189L;


        // 생략

    }



    * 실제 소스에서도 확인할 수 있듯이 List 인터페이스에는 getter, setter 메서드가 있는 반면 Set인터페이스에는 없는 것을 알 수 있다.


    'Java' 카테고리의 다른 글

    Java/객체 정의  (0) 2020.07.18
    Java/Arrays  (0) 2020.07.12
    Java/Iterator  (0) 2020.07.09
    Java/JUnit 예제  (0) 2020.06.15
    [Java][정리] 위임(delegation)과 구현/포함(Composite) 개념  (3) 2018.03.26
    [Java][정리] Collection Framework - Iterator(반복자) 사용하는 이유  (0) 2018.02.13

    댓글 0

Designed by Tistory.