JAVA

[JAVA] Iterator의 remove() 이해하기

히어로맛쿠키 2022. 9. 8. 23:53

List에 문자열을 담고 for문 내에서 동적으로 처리(삭제)해야 할때 흔히 Iterator를 사용한다.

Iterator의 remove() 메서드를 사용하여 삭제할 수 있다.

 

내가 오늘 새롭게 알게 된 것은 Iterator객체의 현재 요소를 remove()하면 원본 List에서 삭제된다는 것이다.

처음에는 Iterator 객체와 List 객체를 완전히 분리하여 생각했기 때문에 몰랐던 내용인데,

Iterator가 컬렉션을 읽는 방법 중 하나이고 컬렉션을 내재하고 있다는 사실을 알게 되고 나서 이해가 잘 되었다.

 

 


 

일단 Iterator라는 것은 뭘까?

자바 컬렉션의 요소들을 읽어오는 방법을 표준화한 방법 중 하나이다.

즉,  컬렉션 요소를 Iterator로 읽어올 수 있다.

그러면 컬렉션이 뭔지 알아야겠다.

 

 

컬렉션 프레임워크 (참고: http://www.tcpschool.com/java/java_collectionFramework_concept)

- 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다.

- 데이터를 저장하는 자료구조 & 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.

- 컬렉션 프레임워크는 인터페이스로 구현되며, 핵심 인터페이스는 List, Set, Map 등이 있다.

- 컬렉션 프레임워크라고 해서 모두 Collection 인터페이스를 상속받는 것은 아니다. List나 Set은 Collection 인터페이스를 상속받지만 Map은 그렇지 않다.

- 컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스라고 한다. ArrayList, LinkedLIst, HashSet 이런게 다 컬렉션 클래스다.

 

 

그리고 Iterator의 remove()에 대한 설명이다.

Removes from the underlying collection the last element returned by this iterator

 


위 내용들을 알고 나서야 iterator.remove()시 기존 ArrayList에서 요소가 삭제되는지 이해할 수 있었다.

 

 

● 처음에는 Iterator라는 객체가 (원본)List와 별개로 존재한다고 생각했다.

그런데 그냥 Iterator는 읽어들이는 방법일 뿐이지 컬렉션을 내재하고 있는 것은 새로 알았다.

 

 

● 그러면 나는 ArrayList 컬렉션을 Iterator로 읽고자 했고,

Iterator 객체는 컬렉션을 내재하고 있기 때문에

iterator.remove() 할 때 컬렉션에서 지워지는 것이 이제는 자연스러워보인다.

참고: 내 상황은 대략 아래와 같은 구조였다.

 

public class Main {
    static List<String> array;
    static Iterator<String> it;
	
    static void method1(List list){
    	array = new ArrayList<>(list);
        
        for (it = array.iterator(); it.hasNext(); ) {
            String s = it.next();  // remove()하려면 next()가 선행되어야 한다.
            it.remove(); // array에서도 지워진다!
        }
	}
    
    public static void main(String[] args){
    	//...
    }
}

 

 

 

반응형