0. 서론
자바 공부를 하다보면 Iterator interface에 대해 배우게 된다.
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<>();
al.add("하나"); al.add("둘"); al.add("셋"); al.add("넷");
Iterator<String> iter = al.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
이건 가장 기본적인 형태이다.
Iterator를 통해서 전체를 다 꺼내는 것을 편하게 할 수 있다.
next();
hasNext();
보통 이 2개를 많이 쓴다.
사실 사용법은 전혀 어렵지 않다.
애초에 쉽게 값을 꺼내려고 만든 것이니까 어려워서 안 되긴 한다.
1. 왜 굳이 Iterator 객체를 만들어서 사용하는 걸까?
List 관련 문제들을 풀다가 문득 그런 생각이 들었다.
왜 굳이 Iterator를 사용해서 값을 꺼내는걸까?
생각해보면 List에는 get(idx) 같은 method가 있기 때문에 그냥 반복문으로 값을 꺼내도 된다.
그래서 문득 이게 오히려 메모리 낭비일 것 같다는 생각이 들었다.
하지만 찾아본 결과, 그 생각은 아니라는 걸 알게 되었다.
(1) 내 의문은 바보 같은 생각이었을까?
사실 그건 아니다.
실제로 일부분 그런 경우가 있다.
예를 들어서, ArrayList<> 같은 경우에는 값을 get(index)로 찾을 수 있기 때문에 반복문을 돌리는 것이 Iterator를 만드는 것보다 빠르다.
(2) 그럼 왜 Iterator를 만드나? ①
get(index) 를 지원하지 않는 Collection framework들도 있다.
딱 생각해도 Set 은 주소 값으로 elements를 꺼내올 수 없다.
애초에 순서가 없고 index라는 개념이 존재하지 않으니 말이다.
따라서 이런 경우엔 Iterator로 바꿔주면 편하게 전체 값을 꺼낼 수 있다.
HashSet<Integer> hs = new HashSet<>();
hs.add("하나"); hs.add("둘"); hs.add("셋"); hs.add("넷");
Iterator iter = hs.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
(3) 그럼 왜 Iterator를 만드나? ②
성능 향상이 되는 경우도 있다.
대표적으로 LinkedList<>가 있다.
LinkedList에는 get(index) method가 있기는 하지만, 속도가 매우 느리다.
원리상 LinkedList는 0번째부터 index번째까지 매번 확인해야하기 때문에
get(index)는 O(n)의 속도를 가진다.
이런 경우에는 Iterator를 만들어서 값을 꺼내는 것이 훨씬 이득이다.
(4) 그럼 왜 Iterator를 만드나? ③
"유지 보수"
이게 굉장히 중요한 포인트인 것 같다.
forEach( ) method 같은 것들을 이용해도 되지만, Iterator를 사용하는 이유는 이게 크다.만약 중간에 유지보수하면서 type 자체가 변경되면 어떨까?
method들도 싹 바꿔야 한다.하지만 Iterator를 사용한다면 그러지 않아도 된다.데이터를 Iterator에 담은 후 Iterator의 instance를 다루는 과정이기 때문에 Iterator instance를 만든 이후의 코드는 수정하지 않아도 된다.
'Language > Java' 카테고리의 다른 글
| 자바 버전 변경시 주의 사항 (JAVA_HOME) (0) | 2022.02.23 |
|---|---|
| [JAVA] Collection class (컬렉션)의 forEach() method 알아보기 (0) | 2022.01.21 |
| [JAVA] list (리스트)를 array (배열)로, array를 list로 바꾸기 (0) | 2022.01.20 |
| [JAVA] List.of() vs Arrays.asList() 차이점 (0) | 2022.01.20 |
| [JAVA] enum 이란? (아무리 봐도 이해가 안 된다면 꼭 보자) (0) | 2022.01.20 |