article thumbnail image
Published 2021. 8. 25. 23:35

 

#Iterator란?

  • 반복자 라고 생각하면 쉽다. Collection 인터페이스를 구현하고 있는 클래스는 Iterator() 를 사용할 수 있습니다. 즉 Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것이다.





#기본 사용법

Iterator 메소드에는 hasNext(), next(), remove()가 있다.
각각의 기능은 다음과 같다.

hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드이다. 요소가 있으면 true, 없으면 false  
next() : 다음 데이터를 반환한다.  
remove() : next()로 읽어온 요소를 삭제한다.  
class Scratch {
    public static void main(String[] args) {
        //ArrayList 생성
        List<Integer> test = new ArrayList<>();

        // 0~ 9 까지 데이터 넣어주기
        for (int i = 0; i < 10; i++) {
            test.add(i);
        }

        //Iterator로 변환
        Iterator<Integer> is = test.iterator();


        // is.hasNext() 로 데이터가 있는지 확인하고 is.next()로 데이터를 꺼낼 수 있따.
        while (is.hasNext()) {
            int s = is.next();
            System.out.print(s + ", ");  // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
        }

    }
}



#remove() 에 대해서

위에서 remove()는 next()로 읽어온 요소를 삭제한다. 라고 설명했다.
여기서는 주의할 점이 있다. #remove() 사용하여 요소를 제거하면 iterator의 타켓 Collection 요소에 영향을 준다는 것이다.
즉, iterator는 요소를 복제한 것이 아니라 참조를 하고 있다.

확인 예제

class Scratch {
    public static void main(String[] args) {
        //ArrayList 생성
        List<Integer> test = new ArrayList<>();

        // 0~ 9 까지 데이터 넣어주기
        for (int i = 0; i < 10; i++) {
            test.add(i);
        }

        //Iterator로 변환
        Iterator<Integer> is = test.iterator();

        // is.hasNext() 로 데이터가 있는지 확인하고 is.next()로 데이터를 꺼낼 수 있따.
        while (is.hasNext()) {
            is.next();
            is.remove();    //요소를 지우고
            
            
            System.out.print(test.size()+ ", "); 
            //target이였던 test의 사이즈를 출력해보면 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 로 줄어든 것을 확인할 수있다.
        }

    }
}

메모지 주소 확인

메모지 주소값을 확인하기 위해 Object 타입으로 진행했다.
출력 결과는 메모리 주소가 같기 때문에 iterator.remove()를 하면 결국 test 객체까지 영향을 준다라는게 증명되었습니다.

class Scratch {
    public static void main(String[] args) {
        List<Object> test = new ArrayList<>();

        Object o = new Object();
        test.add(o);

        Iterator<Object> is = test.iterator();

        System.out.println(test.get(0));  // java.lang.Object@50040f0c
        System.out.println(is.next());    // java.lang.Object@50040f0c
    }
}

#Iterator vs for-each

검색을 해보니 이러한 글들이 나왔다.

차이점 1. For-each 반복문은 처음부터 끝까지 모두 탐색한다.
차이점 2. For-each문은 ConcurrentModificationException 예외가 발생할 수 있다.

그 외에도 성능, 가독성 등의 이야기들이 있었지만...

 

가독성은 개발자가 얼마나 그 코드가 익숙하냐에 다름이라 생각이들고
성능도 현재는 하드웨어가 너무 좋아 소프트웨어에서의 속도는 중요도는 낮아졌다고 한다. 100% 무시할 순 없다. 하지만
성능차이가 차이도 많이 안나는 것 같다. 나는 차이점 2 때문에 Iterator를 사용하게 된 계기였다.

#참고

 

Iterator 와 For-each 비교

Iterator 이터레이터(Iterator)는 자바 컬렉션 프레임워크(Collection Framework)에 속해있는 인터페이스 중 하나. Iterato를 구현한 클래스는 컬렉션 객체를 탐색, 데이터에 접근, 삭제할 수 있다. Itera.

erinyees.tistory.com

 

Iterator vs for

I was asked in an interview what is the advantage of using iterator over for loop or what is the advantage of using for loop over iterator? Can any body please answer this?

stackoverflow.com

 

복사했습니다!