본문 바로가기
Language/Java

[JAVA] 왜 굳이 Iterator (이터레이터)를 사용할까?

by jungwon3004 2022. 1. 20.
728x90
반응형

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를 만든 이후의 코드는 수정하지 않아도 된다.

 

728x90
반응형