ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컬렉션 - iterator, Listiterator, Enumeration
    백엔드/자바 2020. 8. 17. 02:44

    iterator, ListIterator, Enumeration이란?

    컬렉션에 저장된 데이터에 접근하는데 사용되는 인터페이스.

     

    Enumeration은 iterator의 구 버전으로서 현재는 주로 iterator가 사용된다.

     

    다만 오래된 코드들의 지원을 위해 Enumeration은 여전히 지원하고 있다.

     

    그래서 실제 학습은 itertor만으로 충분하다.

    해당 인터페이스들의 필요성

    컬렉션에서 전체 데이터를 한 번에 읽어올 때 다소 번거로운 감이 있다.

     

    List, Set, Map의 자료 구조가 모두 다르고, 읽어오는 방법도 제각각이기 때문이다.

     

    그래서 등장한 것이 바로 iterator 계열의 인터페이스다.

     

    iterator 계열의 인터페이스들은 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한다.

     

    이를 이용하면 자료구조가 달라도 편리하게 컬렉션 데이터에 접근할 수 있게 도와준다.

    iterator의 사용 범위

    iterator는 컬렉션 데이터에 접근하는데 사용되는 인터페이스다.

     

    하지만 그 사용 범위에 제한이 있다. 바로 Set과 List에만 사용이 가능하다.

     

    즉 Collection 인터페이스를 구현하는 인터페이스 List와 Set에서만 사용이 가능하다.

     

     

     

    이전에 컬렉션 프레임워크에 대한 포스팅을 할 때 썼던 주요인터페이스 상속 계층도다.

     

    보면 알겠지만 List와 Set은 Collection을 구현하게 되있는데, 이 둘만 iterator인터페이스를 쓸 수 있다.

     

     

     

     

    실제로 상속도를 보면 Set, List가 참조하는 Collection이 Iterable을 상속받은 걸 볼 수 있다.

     

    그리고 이 Iterable의 내용을 보면 Iterator의 객체를 호출하는 iterator() 메서드를 볼 수 있다.

     

    이때 Iterator() 메서드가 반환하는 객체 Iterator가 바로 그 Iterator 인터페이스다.

     

    정리하자면 Iterable인터페이스를 사용하려면 Iterable 객체를 호출 가능한 iterator()메서드를 써야한다.

     

    그리고 iterator() 메서드는 Iterable 인터페이스를 구현해야 하고 Collection은 이 Iterable을 구현한다.

     

    그리고 Set, List는 이 Collection을 구현하기 때문에 자연스럽게 iterator() 메서드 사용이 가능하다.

     

    Iterator 인터페이스를 사용할 수 있다는 뜻이다.

     

    Map의 경우 바로 Iterator를 사용할 수 없고 별도의 처리를 거쳐야 한다.

    Iterator 사용법

    Itreator 인터페이스를 사용하는데 있어서 가장 핵심인 메서드 두 가지만 기억하면 된다.

     


    메서드명


    설명


    hasNext()


    해당 컬렉션에서 읽어올 요소가 남았는지 확인한다.

    만약 요소가 남는다면 true를, 없다면 false를 반환한다.


    next()


    다음 요소를 읽어온다.

    즉 hasNext()를 통해 읽어올 요소가 남았는지 확인한다.

    그 뒤에 요소가 남아있다면 next()를 이용해 요소를 읽어올 수 있다.

     

    바로 hasNext()와 next()다.

     

    Iterator 인터페이스를 사용하고 싶다면 iterator() 메서드를 통해 iterator 객체를 호출하고,

     

    위에서 언급한 두 개의 메서드 hasNext()와 next()를 조합하면 끝이다.

    List와 Set의 Iterator 사용법

     

     

    위 코드는 List의 데이터를 Iterator를 이용해 읽어온 코드다.

     

    iterator() 메서드를 이용해 iterator 객체를 호출하고 while을 이용해 hasNext(), next()를 사용하면 끝이다.

     

    참고로 이 때 호출되는 iterator 객체는 일회용이라 다시 쓰고자 한다면 새로 iterator()를 써야 한다.

     

     

    Set도 사용하기 어렵지 않다.

     

     

     

    위 코드는 Set의 데이터를 Iterator를 사용해 읽어온 코드다.

     

    List와 차이라고는 선언할 때 자료형과 생성자 메서드 부분 뿐이다.

     

    예제 코드는 차별화를 두기 위해 자료형을 바꿨는데

     

    이것조차 Collection으로 해두면 자료형도 바꿀 필요 없이 생성자 메서드만 바꿔주면 된다.

    Map의 Iterator 사용법

    위에서 계속 이야기 했듯 Iterator인터페이스는 Set과 List만 사용 가능하다.

     

    하지만 Map 인터페이스를 구현한 자료형인 TreeMap, HashMap은 사용이 불가능하다.

     

    그럼 어떻게 쓸 수 있을까?

     

    바로 Map의 데이터를 Set로 바꾸는 entrySet(), keySet()을 이용하면 된다.

     

    우선 entrySet()을 이용해보자.

     

     

     

    iterator() 메서드를 사용하기 위해 entrySet()을 이용해 Map의 데이터를 Set으로 바꾼다.

     

    그리고나서 iterator() 메서드를 이용해 객체를 호출한다.

     

    그 다음 iterator의 객체가 next() 메서드를 이용해 호출됐을 때 이걸 다시 Entry 객체로 형변환을 한다.

     

    그 다음 Entry 객체의 메서드 getKey(), getValue()를 이용하면 map의 데이터를 읽어올 수 있다.

     

     

    다음으로 keySet을 이용해보자.

     

     

     

    EntrySet과 큰 차이는 없다. 결과적으로 iterator 객체만 불러오면 크게 어렵지 않다.

     

    EntrySet으로 불러오는 것과 차이라면 EntrySet을 이용하면 Entry객체를 이용해서 데이터를 불러온다.

     

    하지만 keySet을 이용하면 Entry객체 없이 데이터를 불러올 수 있다는 것이다.

     

    사실 Map의 경우 for문을 써주는 게 더 편하다.

     

     for 문에 관한건 아래를 참고하자.

     

    컬렉션 - MAP 출력 방법

    컬렉션에서 List와 Set은 데이터를 읽어오기가 간편하다. 반면 Map의 경우 데이터가 키(key), 값(value)로 나뉘다보니 상대적으로 읽기가 까다롭다. 그래서 이번 포스트에선 Map 데이터를 읽어오는 방

    sgcomputer.tistory.com

    Iterator와 ListIterator의 차이

    일반 Iterator가 hasNext() 메서드를 이용했을 때 첫 요소부터 순차적으로 단방향으로 객체를 반환한다.

     

    반면 ListIterator는 양방향으로 객체를 반환할 수 있다.

     

    코드로 직접 보면 더 이해가 쉽다.

     

     

     

     

    내용을 보면 알겠지만 Iterator가 hasNext()를 이용해 첫 요소부터 순차적으로 객체를 반환한다.

     

    하지만 hasPrevious()는 뒤의 요소부터 역순으로 객체를 반환한다.

     

    추가로 ListIterator는 말그대로 List를 구현한 ArrayList, LinkedList에서만 사용이 가능하다.

     

    '백엔드 > 자바' 카테고리의 다른 글

    컬렉션 - Arrays 클래스와 메서드  (0) 2021.05.20
    컬렉션 - Comparable와 Comparator  (0) 2020.08.17
    컬렉션 - MAP 출력 방법  (0) 2020.08.17
    컬렉션 Map - TreeMap  (0) 2020.08.17
    컬렉션 Map - HashMap  (0) 2020.08.17
Designed by Tistory.