[개인공부] Iterator, ListIterator, Enumeration

Walter Mitty·2022년 12월 27일
0

개인공부

목록 보기
34/40
post-thumbnail

Iterator

  • 컬렉션에 저장된 데이터를 접근하는(읽어오는데) 사용되는 인터페이스 위에 두개만 신경쓰자!
    hasNext() : 읽어 올 요소가 남아있는지 확인
    next() :다음 요소를 읽기

  • Enumeration은 Iterator의 구버젼이라고 생각하면 된다.
    (참고만 하자)
  • ListIterator는 Iterator의 접근성을 향상시킨 것이다. (단방향에서 양방향으로)

Iterator는 왜 쓸까?

  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 한 것이다.
    • 컬렉션: List, Set, Map
      • 컬렉션들 마다 구조도 읽어오는 방법도 다르기 때문에 표준화가 필요했다.

  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다.
    list.iterator() 만으로도 Iterator 객체를 얻을 수 있다.
    그 다음 hasNext()로 읽어올 요소 확인, next()로 요소 읽어오기.

    예제)
    ⤷ Iterator는 일회용이다. 한번 다 읽고나면 while을 똑같이 여러개 복사해도 while 조건이 false가 되어 안읽어 진다.

⤷새로운 객체 얻어와서 다시 돌려본 것

⤷for문을 돌려봐도 똑같이 나온다

⤷그러나 ArrayList에서 HashSet으로 바꾸면 for문이 돌아가지 않는다. 이유는 HashSet은 get()함수가 없기 때문이다.

따라서 Collection에 List, Set 이 있지만 불러오는 함수가 다 다르기 때문에 Iterator를 쓰면 나중에 ArrayList가 HashSet이 되어도 같은 방법으로 불러올 수 있다.

⤷ 그렇다면 처음부터 Collection으로 하면 더 편하다! list 우클릭 후 Refactor → Rename → c로 하면 밑에 list 쓰인 부분 다 c로 바뀜! 참고!

만약 내가 hashSet()을 TreeSet으로 바꿀 때

Collection c = new HashSet(); //에서
Collection c = new TreeSet(); //으로만 해주면 된다.

아래 코드는 Collection을 활용해서 만든 코드니까 안바꿔도 되게 된다!


Map과 Iterator

  • Map에는 Iterator가 없다.
    • Collection의 자손으로는 List와 Set만 있기 때문에..
  • keySet(), entrySet(), values()를 호출해서 Iterator를 사용가능하다.
    • keySet, entrySet()의 반환타입은 Set, values()는 Collection이다.

Iterator it = map.entrySet().iterator();
// 이 한줄의 코드는 아래 두줄의 코드와 같다
set eSet = map.entrySet(); //entretSet()으로 Set을 얻은 다음에
Iterator it = eSet.iterator(); //iterator()로 Iterator 객체 얻음

0개의 댓글