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){
//...
}
}
'JAVA' 카테고리의 다른 글
[Java] 시간낭비 방지 메모: HashXX를 보고 O(1)을 곧바로 떠올렸어야지...! (1) | 2023.12.06 |
---|---|
[JDBC] DB Connection을 얻어서 query 실행 | DriverManager과 DataSource를 통하여 (+ Connection Pool 개념) (0) | 2023.01.11 |
[Java] String 연결하기(더하기) 효율적인 방법 (0) | 2022.09.07 |
웹개발 집중학습용으로 블로그 개설 (0) | 2022.07.19 |
오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다 (0) | 2022.07.19 |