티스토리 뷰
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
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Type Safety : unchecked cast (0) | 2019.01.29 |
---|---|
[Java] :: ( 더블콜론 ) (0) | 2018.12.12 |
[Java] parseInt() 와 intValue() 의 차이 (0) | 2017.11.01 |
[Java] 문자열 자르기, replace() 메소드 (0) | 2017.10.25 |
[JAVA] String, StringBuilder, StringBuffer (0) | 2017.09.28 |