티스토리 뷰

프로그래밍/Java

[Java] Iterator

DwEnn 2018. 12. 12. 11:22
728x90
반응형

Iterator ( 반복자 ) ?


자바의 컬렉션 프레임워크는 컬렉션에 저장된 요소를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있다


Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있다


Set, List 등은 Collection 을 상속 받고 Collection 이 Iterable 을 상속 받고 있다


따라서 Collection 인터페이스를 상속받는 List 와 Set 인터페이스에서도 iterator() 메소드를 사용할 수 있다.


Map 은 Set 이나 List 와 달리 Key-Value 의 구조이다

Key 에 대한 Iterator 인지 Value 에 대한 Iterator 인지 구별할 방법이 없기 때문에 

Iterator 를 제공하지 않는다


그래서 Map 의 경우,

values() 메소드가 Collection 을 반환하는데 

이 Collection 의 iterator() 메소드가 iterator 를 반환해 주기 때문에 이러한 방법으로

value 값을 가져올 수 있다


values() 메소드로 Map 의 values 를 가져오고 key 의 경우는,

Map 의 keySet() 메소드가 Set 을 반환해주고 

마찬가지로 Set 의 iterator() 메소드가 iterator 를 반환해 준다


( 두 메소드의 반환 값이 Collection 과 Set 으로 서로 다른데, 아마 내부적으로 구조가 달라 그런것 같다

이 부분은 더 찾아봐야 할 듯 )


Iterator 의 메소드


자바의 iterator 소스를 까보면 이렇게 되어있다

( 다른 인터페이스들도 까보면 abstract interface 라고 되어있는데 

왜 abstract 만 쓰지 않고 이렇게 해놓았는지 모르겠다 .. )


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public abstract interface java.util.Iterator {
 
    /**
    *    @return 해당 iterator 이 다음 요소를 가지고 있으면 true,
    *    더 이상 다음 요소를 가지고 있지 않으면 false 를 반환
    */
    public abstract boolean hasNext();
 
    /**
    *    @return iterator 의 다음 요소를 반환
    */
    public abstract java.lang.Object next();
 
    /**
    *    @return 해당 iterator 로 반환된(next()로 가져온) 요소를 제거
    */
    public void remove();
 
    /**
    *    Oracle 문서를 살펴보면,
    *    모든 요소가 처리되거나 예외가 throw 될 떄까지 
    *     각 나머지 요소에 대한 지정된 작업을 수행
    */
    public void forEachRemaining(java.util.function.Consumer arg0);
 
}
cs



이러한 메소드로 컬렉션의 각 요소에 접근할 수 있다


하지만 자바에서는 될 수 있으면 JDK 1.5 부터 추가된 Enhanced for 문을

사용하도록 권장하고 있다고 한다


Enhanced for 문을 사용하면 같은 성능을 유지하면서도 코드의 명확성을 확보하고

발생할 수 있는 버그를 예방해 준다고 한다


하지만 요소의 선택적 제거나 대체 등을 수행하기 위한 경우에는

iterator 를 사용해야만 한다


forEachRemaining() 을 이용한 Iterator to ArrayList


Java8 에서 추가된 forEachRemaining() 메소드를 사용해 

Iterator 를 ArrayList 로 변환 할 수 있다


1
2
ArrayList<T> list = new ArrayList<>();
it.forEachRemaining(list::add);
cs


( :: ( 더블콜론 ) ? )


하지만 for loop 가 성능상 더 빠르다고 한다


< Iterator를 ArrayList로 변환 https://code.i-harness.com/ko-kr/q/9a5fa2 >


Enumeration, ListIterator


http://tcpschool.com/java/java_collectionFramework_iterator >


이 곳에 잘 정리되어있다



+

Collection 이 Iterable 을 상속받아 iterator() 메소드로 iterator 를 반환하기 때문에

모든 컬렉션에서 iterator 로 값을 읽어올 수 있다는 것은 이해가 가지만


iterator 가 내부적으로 어떤 구조를 가지고 있어서 

어떻게 값을 가져오는지가 이해 되지 않는다


이 부분을 좀 더 찾아봐야겠다



+ References


http://tcpschool.com/java/java_collectionFramework_iterator

http://mainia.tistory.com/367

반응형
공지사항
최근에 올라온 글