iterator & hasnext (), next() 메소드 - 미완성

2020. 3. 16. 14:16카테고리 없음

반응형

 

 

iterator는 자바의 컬렉션 프레임 워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한 것이다.

컬렉션 프레임 워크란 데이터를 저장하는 클래스들을 표준화 한 설계이다.

컬렉션 프레임 워크는 아래 그림과 같이 데이터를 저장하는 구조에 따라 3가지 인터페이스로 구성된다.

 

 

 

Set, List, Map은 어떤 데이터들의 집합체라고 볼 수 있다.

Set과 List는 데이터의 그룹(Collection)이다.

Set은 순서를 유지하지 않는 데이터의 집합이다. 데이터의 중복이 허용되지 않고 HashSet, TreeSet 등이 있다.

 

List는 순서를 유지하는 데이터의 집합이다. 데이터의 중복이 허용되며 Vector, LinkedList, ArrayList 등이 있다.

List 클래스에 대해서는 한번 다룬적이 있다.

 

Map은 키(Key)와 값(Value)으로 이루어진 데이터의 집합이다. 순서는 유지되지 않으며 키는 중복을 허용하지 않는다.

Map의 클래스로는 TreeMap, Hashtable, HashMap 등이 있다.

 

 

Iterator는 이런 집합체로부터 정보를 얻어낸다고 볼 수 있다. 집합체를 다룰 때는 개별적인 클래스에 대해 데이터를 읽는 방법을 알아야하기 때문에 각 컬렉션에 접근이 힘들어진다. Iterator를 쓰게 되면 어떤 컬렉션이라도 동일한 방식으로 접근이 가능하여 그 안에 있는 항목들에 접근할 수 있는 방법을 제공한다.(다형성


 

Iterator

- Vector<E>, ArrayList<E>,LinkedList<E> 가 상속받는 인터페이스 

-리스트 구조의 컬렉션에서 요소의 순차검색을 위한 메소드 포함

- iterator()를 호출하면 iterator 객체 반환

-자바의 컬렉션에 저장되어 있는 요소들을 읽어오는 방법의 인터페이스

즉 쉽게 컬렉션으로부터 정보를 얻어내는 인터페이스 이다.

 

iterator를 쉽게 비유한 것이 있다.

-우리가 책을 보관하는 책장(컬렉션)이 있고, 그곳에는 책(컬렉션 안에 들어갈 객체)이 있다.

-이 책장은 도서관 사서(iterator)가 관리한다. 

-사서는 단순 무식한 녀석이라 책장 처음부터 끝까지 한번에 하나씩 밖에 못가져 온다. 

 

iterator method

1) hasNext(): 다음 요소에 읽어 올 요소가 있는지 확인 하는 메소드 있으면 true, 없으면 false 를 반환한다. 

2) next(): 다음 요소를 가져온다. 

3) remove(): next()로 읽어온 요소를 삭제한다.

 

메소드의 호출 순서는 hasNext() -> next() -> remove() 이다.


 

 

 

 

Iterator는 Collection클래스의 iterator()라는 메소드로 리턴 되는 인터페이스는, 간단히 설명하면 Vector, List, Map 등..과 같은 동적으로 데이터를 저장하는 클래스에서Iterator 인터페이스 얻어올수 있습니다. Iterator의 역할은 저장된 데이터들 사이에서 순방향으로 이동하면서 데이터를 가져오거나 삭제할수 있는 기능을 제공합니다.

님께서, 링크드리스트에 대해 이해 하고 있다면 이와 비슷한 기능을 한다고 쉽게 이해하실수 있을것 입니다.

 

hasNext()의 의미는 Iterator가 보통 순방향으로 이동하는데, Iterator가 가리키는 데이터저장소의 현재 위치에서 이동할 항목이 있는지 체크합니다. 즉, Iterator는 내부적으로 데이터저장소의 자신이 가리키고 있는 지점을 알고 있습니다.  결국, 이동할 항목이 있다면 true을 리턴하고 그렇지 않으면 false을 리턴합니다.

 

next()메소드는 실제로 Iterator가 자신이 가리키는 데이터저장소에서 현재위치를 순차적으로 하나 증가해서 이동하는 것을 말합니다.

 

예를하나 들면, 아래의 Vector 클래스에서 iterator 메소드를 사용하여, Iterator 인터페이스를 리턴받습니다. 그리고, hasNext()가 true을 리턴하는 동안 즉, Iterator는 Vector 클래스에서 어떤 항목의 위치를 가리키고 있는데, 이때 앞으로 하나 이동해서, 가리킬 항목이 존재하는동안 while 루프문을 반복합니다.

그리고, next()메소드를 사용하여 실제 이동하는것입니다.

또한, Iterator는 처음에는 자신이 가리키는 데이터저장소의 첫번째 항목전을 가리키고 있습니다. 반드시 시작시 next()메소드를 호출하여 첫번째 항목을 가리키게 한후 읽을 수 있습니다.

 

1. 정의

   - Java에서 제공하는 컬렉션(Collection)객체는 보관하고 있는 자료들을 순차적으로 접근하면서 처리할 때 사용하는 Iterator 형식을 제공하고 있다.

   - Iterator는 반복자라고 부르며 컬렉션 종류에 관계없이 같은 방법으로 프로그래밍 할 수 있게 해 준다.

 

2. 사용방법

   - Iterator 개체는 컬렉션 개체의 iterator() 메서드를 호출하여 얻어올 수 있다.

   - hasNext() 메서드로 이동이 가능한지 확인한 후에 next() 메서드로 해당 위치의 보관한 개체를 참조하여 원하는 작업을 수행한다.

 

3. 장.단점

   - 이와 같은 Iterator 개체를 사용하면 size 메서드를 얻어와서 반복 처리하는 것보다 속도에서 불리하다.

   - 이는 Iterator 개체를 사용하는 부분이 있기 때문에 불가피한 사항이다.

     하지만 컬렉션 종류에 관계없이 일관성있게 프로그래밍할 수 있다는 장점을 갖고 있다.

   - 소스 코드에 어떠한 컬렉션을 사용할 지 정해지지 않았지만 컬렉션 내에 보관한 모든 내용을 출력하는 등의 작업을 먼저 하길 원한다면 Iterator를 사용하는 것은 좋은 선택이다.

 

3. 사용가능 객체

 

ArrayList arr = new ArrayList();

  Vector<> vec = new Vector<>();

 LinkedList<Member>  link = new LinkedList<Member>();

 Set<String> st     = new Set<>(String);

 ....

 과 같은 Collection 객체들

4. Iterator객체 얻기

Iterator it0 = arr.iterator();  //vector의 요소를 순차 검색할 객체

  Iterator<> it1 = vec.iterator<>();

  Iterator<Member> it2 = link.iterator<Member>();

  Iterator<String> it3 = st.iterator<String>();

 ...

5. while 문으로 하나씩 객체 얻기

   - hasNext() : 해당 iterator객체에 값 존재 여부(boolean)

   - next() : iterator객체의 값 얻기.



 while (it0.hasNext()){

    String st = (String)it0.next();

 }

6. 참고, for문을 통한 객체 얻기

    - 이때는 Iterator객체가 아닌 Collection객체를 사용한다.

    - for 문장이 만나면 자동으로 Collection객체의 요소를 순차적으로 얻어 온다.



for(Member mem : link){

    mem.get();

    mem.set();

    ...

 }

 

for(String stOne : st){

    System.out.println(stOne);

    ...

 }

 

 

 

 

참고

 

https://imasoftwareengineer.tistory.com/84

 

자바 Collection Iterator

이번 포스트에서는 자바의 Collection을 반복하는 몇가지 방법에 대해 소개하도록 한다. 특히 반복문이 아닌 Collection이 구현하는 Iterator 인터페이스를 이용해 반복하는 방법을 다룬다. 또한 이 포스트에서는..

imasoftwareengineer.tistory.com

 

 

 

반응형