본문 바로가기

IT/Java

[Java] Iterator 함수 제대로 알고 사용하기


Iterator 란?


Iterator는 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator이다.


Iterator는 인터페이스인데 그 구성을 살펴보자.


public interface Iterator {

boolean hasNext();

Object next();

void remove();

}


boolean hasNext() 메소드는 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다.


Object next() 메소드는 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다.


void remove() 메소드는 next()로 읽어 온 요소를 삭제한다. next() 를 호출한 다음에 remove() 를 호출해야 한다. (선택적 기능이라 사용해도 그만 사용하지 않아도 그만이다)


Iterator는 다시 말해 인터페이스이다. 그렇다면 저 메소드들은 어떻게 정의가 되어있단 말인가?


List 혹은 Set 인터페이스를 구현하는 컬렉션은 iterator() 가 컬렉션의 특징에 맞게 설계가 되어있다.



Iterator 사용법



ArrayList<Integer> list = new ArrayList<Integer>();


for( Iterator<Integer> itr = list.iterator(); itr.hasNext(); )

{

list.get( itr.next() );

}

ArrayList<Integer> list = new ArrayList<Integer>();


Iterator<Integer> itr = list.iterator();

while( itr.hasNext() )

{

list.get( itr.next() );

}


Iterator를 활용해서 list의 모든 값을 가져온다.




Iterator VS List의 Size 이용하기


< 예제 소스>


package vaert;


import java.util.*;


public class Main {

public static void main(String[] args) {

long start = 0;

long end = 0;


int inRoopSize = 100;

int maxRoopSize = 10000000;


ArrayList<Integer> list = new ArrayList<Integer>();

ArrayList<Double> result = new ArrayList<Double>();

Double[] arr = new Double[10000000];

for (int i = 0; i < maxRoopSize; i++)

list.add(i);


// Iterator 사용 시 실행 시간

System.out.println("----Iterator 사용 시----");

for (int idx = 0; idx < inRoopSize; idx++) {

start = System.nanoTime(); // 시작시간


Iterator<Integer> itr = list.iterator();

while (itr.hasNext()) {

list.get(itr.next());

}


end = System.nanoTime(); // 끝나는 시간


result.add(((double) (end - start) / 1000000000));

}


for (int i = 0; i < inRoopSize; i++)

arr[i] = result.get(i);


for (int i = 0; i < inRoopSize; i++)

for (int j = 0; j < inRoopSize; j++)

if (arr[i] < arr[j]) {

double temp = arr[j];

arr[j] = arr[i];

arr[i] = temp;

}


for (int i = 0; i < 10; i++)

System.out.println((i + 1) + " : " + arr[i] + "(sec)");

System.out.println();

// Size 받아온 코드 실행 시간

System.out.println("-----Size 받아오는 방법 사용 시-----");

for (int idx = 0; idx < inRoopSize; idx++) {

start = System.nanoTime();

int size = list.size();

for (int i = 0; i < size; i++) {

list.get(i);

}

end = System.nanoTime();


result.add(((double) (end - start) / 1000000000));

}

arr = new Double[10000000];

for (int i = 0; i < inRoopSize; i++)

arr[i] = result.get(i);


for (int i = 0; i < inRoopSize; i++)

for (int j = 0; j < inRoopSize; j++)

if (arr[i] < arr[j]) {

double temp = arr[j];

arr[j] = arr[i];

arr[i] = temp;

}


for (int i = 0; i < 10; i++)

System.out.println((i + 1) + " : " + arr[i] + "(sec)");

}

}



< 결과 >


for( Iterator<Integer> itr = list.iterator(); itr.hasNext(); )

{

list.get( itr.next() );

}

 1 : 0.309012652(sec)

 2 : 0.309870762(sec)

 3 : 0.310434898(sec)

 4 : 0.311340917(sec)

 5 : 0.312230778(sec)

 6 : 0.312908024(sec)

 7 : 0.313480948(sec)

 8 : 0.314196465(sec)

 9 : 0.314853301(sec)

10 : 0.31523232(sec)

int size = list.size();

for( int i = 0; i < size; i++ )

{

list.get( i );

}

 1 : 0.041885812(sec) 乃 Best

 2 : 0.041918697(sec)

 3 : 0.042251792(sec)

 4 : 0.04225406(sec)

 5 : 0.042269085(sec)

 6 : 0.042285244(sec)

 7 : 0.042312175(sec)

 8 : 0.042338539(sec)

 9 : 0.042373124(sec)

10 : 0.042443145(sec)




















결론

Iterator 는 자동으로 Index 를 관리해주기 때문에,

사용에 편리함이 있을수 있으나

Iterator 를 열어보면 객체를 만들어 사용하기 때문에 느릴수 밖에 없다.

그러므로, list 의 size를 받아와서 사용것이 더 좋다.