반응형

List와 같은 컬랙션에서 요소들을 순차적으로 처리하기 위해서 iterator 반복자가 존재합니다.

예제를 보고 간단히 살펴보겠습니다.

public class IteratorExample {
	public static void main(String[] args) {
		List<String> list = Arrays.asList("자바", "파이썬", "스프링", "장고");
		Iterator<String> iterator = list.iterator();
		while(iterator.hasNext()) {
			String name = iterator.next();
			System.out.println(name);
		}
		
		for (String s : list) {
			System.out.println(s);
		}
	}
}

자바 / 파이썬 / 스프링 / 장고 4개의 리스트 요소를 포함하고 있는 리스트를 생성했습니다.

그리고 iterator() 함수를 통해서 Iterator 반복자를 갖고 옵니다.

hasnext() 함수를 통해서 항목이 있는지 확인을 하고 next() 함수를 통해서 요소를 하나씩 하나씩 갖고 오면 되겠습니다.

아래의 for문은 iterator를 사용하지 않고도 for문을 통해서 요소들을 전체 출력을 할 수 있습니다.

 

 

다음으로는 iterator를 활용한 예제를 보도록 하겠습니다.

public class Iterators {

    public static class ListIterator<T> implements Iterator<T> {

        private final Iterator<Iterator<T>> listIterator;
        private Iterator<T> currentIterator;

        public ListIterator(List<Iterator<T>> iterators) {
            this.listIterator = iterators.iterator();
            this.currentIterator = listIterator.next();
        }

        @Override
        public boolean hasNext() {
            if(!currentIterator.hasNext()) {
                if (!listIterator.hasNext()) {
                    return false;
                }

                currentIterator = listIterator.next();
                hasNext();
            }

            return true;
        }

        @Override
        public T next() {
            hasNext();
            return currentIterator.next();
        }

        @Override
        public void remove() {
            hasNext();
            currentIterator.remove();
        }
    }

    public static <T> Iterator<T> singleIterator(final List<Iterator<T>> iteratorList) {
        return new ListIterator<>(iteratorList);
    }
}

1. singleIterator부터 살펴보겠습니다.

singleIterator는 정적 메서드이며 Iterator<T> 타입을 리턴합니다.

위의 ListIterator 클래스는 Iterator를 구현하였으니 Iterator 타입이겠죠?

singleIterator를 호출하면 ListIterator 객체가 리턴됩니다.

파라미터로는 Iterator<T>으로 구성된 리스트를 인자로 받습니다. 즉, 여러 (리스트로 만들어지고 난 후에) Iterator형의 요소들이 존재합니다.

 

2. ListIterator 클래스를 살펴보겠습니다.

ListIterator 생성자를 보면 singleIterator 메서드로부터 받은 Iterator요소가 담겨 있는 리스트를 넘겨받아서, 리스트의 Iterator를 저장합니다.

아하, 그러니까 리스트 안에는 Iterator타입의 요소들이 담겨줘 있고, 요소가 아닌 이 리스트의 Iterator를 다시 저장하는 것입니다.

currentIterator에는 첫 번째 요소를 저장합니다.

 

3. hasNext()를 살펴보겠습니다.

currentIterator(현재 이터레이터)의 다음 데이터가 없다면 listIterator.next()를 통해서 다음 요소를 갖고 옵니다.

listIterator.hasNext()를 호출할 때 리스트의 다음 요소가 없다면, 더 이상 요소가 존재하지 않습니다.

currentIterator 다음 데이터가 존재한다면 True가 리턴됩니다.

 

테스트 코드를 살펴보겠습니다.

public class IteratorsTest {

    @Test
    public void multipleIterators() {
        final Iterator<Integer> a = Arrays.asList(1, 2, 3, 4, 5).iterator();
        final Iterator<Integer> b = Arrays.asList(6).iterator();
        final Iterator<Integer> c = new ArrayList<Integer>().iterator();
        final Iterator<Integer> d = new ArrayList<Integer>().iterator();
        final Iterator<Integer> e = Arrays.asList(7, 8, 9).iterator();

        final Iterator<Integer> singleIterator = Iterators.singleIterator(Arrays.asList(a, b, c, d, e));

        assertTrue(singleIterator.hasNext());
        for (Integer i = 1; i < 10; i++) {
            assertEquals(i, singleIterator.next());
        }
        assertFalse(singleIterator.hasNext());
    }
}

a, b, c, d, e 각각의 Iterator 타입의 변수를 만들었습니다. 그리고 이 각각의 변수들을 List 요소에 넣고 singleIterator 메서드를 호출했습니다.

singleIterator 변수에 Iterator가 리턴이 되고, 이를 활용하여 각각의 요소들 별로 데이터를 추출하는 예제입니다.

즉, 하나의 Iterator 인터페이스로 여러 개의 Iterator를 다루는 예제입니다.

 

 

도움이 되셨으면 좋겠습니다.

감사합니다 :)

 

 

참고)

[예제] - JAVA 프로그래밍 면접 이렇게 준비한다

반응형

+ Recent posts