[JAVA]자바 리스트(list)의 remove() 아이템(객체, 요소) 삭제하는 방법 2가지 : remove(),Iterator를 사용하자!!
Java의 ArrayList에서 객체를 제거하는 방법은 두 가지가 있습니다 . 첫 번째는 remove( ) 메서드를 사용하는 것이고 두 번째는 Iterator를 사용하는 것 입니다. ArrayList는 오버로드 된 remove() 메서드를 제공합니다.
구분 |
제거 할 객체의 허용 인덱스 ( 예 : remove (int index)) |
제거 할 허용 객체 ( 예 : remove (Object obj)) |
객체가 리스트의 어느 인덱스에 있는지 알고 있다면 첫 번째 방법을 사용하고 그렇지 않으면 두 번째 방법을 사용합니다. 다음 예제코드를 살펴보면 이해가 빠를 것으로 생각됩니다. 그럼 첫번째 예제를 살펴봅니다.
[샘플 예제 코드]
package edu.sample;
import java.util.ArrayList;
import java.util.List;
public class Tutorial {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(45);
System.out.println("ArrayList 출력 : " + numbers);
//삭제(인덱스)
numbers.remove(1);
//삭제 (객체(object))
numbers.remove(3);
System.out.println("삭제 후 ArrayList 출력 : " + numbers);
}
}
[예제 코드 실행결과]
실행결과 첫번째 remove()와 두번째 remove() 역시 index값을 사용한 방법으로 처리되어, IndexOutOfBoundsException 오류가 발생하게 됩니다. 3이라는 객체(요소)(아이템)를 삭제하려면 어떻게 해야할까요?
ArrayList contains : [1, 2, 3, 45]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at edu.sample.Tutorial.main(Tutorial.java:20)
이러한 모호함을 제거하기 위해 객체(object)를 제거할 경우에는 객체 타입으로 선언해서 삭제해야합니다.
numbers.remove(new Integer(3));
package edu.sample;
import java.util.ArrayList;
import java.util.List;
public class Tutorial {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(45);
System.out.println("ArrayList 출력 : " + numbers);
//삭제(인덱스)
numbers.remove(1);
//삭제 (객체(object))
numbers.remove(new Integer(3));
System.out.println("삭제 후 ArrayList 출력 : " + numbers);
}
}
[에제 코드 실행결과]
ArrayList 출력 : [1, 2, 3, 45]
삭제 후 ArrayList 출력 : [1, 45]
정확하게 숫자 3이 삭제되었음을 알 수 있습니다.
두번째 방법 :Iterator() 사용
다음은 두번째 방법으로 Iterator()를 사용하여 객체를 삭제하는 방법에 대해 알아봅니다. Iterator()를 사용하는 경우는 반복적으로 객체나 요소(엘리먼트)를 삭제할 경우에 사용합니다. 그럼 예제를 살펴봅니다.
package edu.sample;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Tutorial {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(45);
System.out.println("ArrayList 출력 : " + numbers);
Iterator<Integer> itr = numbers.iterator();
while (itr.hasNext()) {
Integer number = itr.next();
//짝수인경우 삭제를 해보자
if (number % 2 == 0) {
numbers.remove(number);
}
}
System.out.println("삭제 후 ArrayList 출력 : " + numbers);
}
}
[샘플코드 실행결과]
ConcurrentModificationException 오류가 발생합니다. 왜 오류가 발생했는지 찾으셨나요?
ArrayList 출력 : [1, 2, 3, 45]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at edu.sample.Tutorial.main(Tutorial.java:20)
iterator()를 사용하여 객체나 요소를 삭제하는 경우, 리스트의 remove()메서드를 사용할 수 없습니다.
numbers.remove(number); <---오류 코드의 원인
반드시 iterator 변수로 접근하여 삭제해야합니다.
예제 itr.remove()
package edu.sample;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Tutorial {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(45);
System.out.println("ArrayList 출력 : " + numbers);
Iterator<Integer> itr = numbers.iterator();
while (itr.hasNext()) {
Integer number = itr.next();
//짝수인경우 삭제를 해보자
if (number % 2 == 0) {
//numbers.remove(number);
itr.remove();
}
}
System.out.println("삭제 후 ArrayList 출력 : " + numbers);
}
}
[실행결과]
ArrayList 출력 : [1, 2, 3, 45]
삭제 후 ArrayList 출력 : [1, 3, 45]
오늘은 자바의 ArrayList에서 객체를 제거하는 방법에 대해 알아보았습니다. 열공하세요!! 안뇽~~