subList()와 clear() 메서드 조합하기
List 인터페이스의 subList() 메서드는 두 개의 정수값(인덱스)을 매개변수로 받아, 현재 리스트 객체에서 시작 인덱스(포함)부터 끝 인덱스(제외) 사이에 있는 요소들의 뷰(view)를 반환합니다.
clear() 메서드는 리스트 객체의 모든 요소를 제거하는 역할을 합니다.
따라서 ArrayList에서 특정 구간의 요소들을 한 번에 삭제하고 싶다면, 제거하려는 서브리스트의 시작 인덱스와 끝 인덱스를 지정한 뒤 이 두 메서드를 연달아 호출하기만 하면 됩니다.
obj.subList(fromIndex, toIndex).clear();
예제
import java.util.ArrayList;
public class RemovingSubList {
public static void main(String[] args){
// ArrayList 객체 생성
ArrayList<String> list = new ArrayList<String>();
list.add("JavaFX");
list.add("Java");
list.add("WebGL");
list.add("OpenCV");
list.add("OpenNLP");
list.add("JOGL");
list.add("Hadoop");
list.add("HBase");
list.add("Flume");
list.add("Mahout");
list.add("Impala");
System.out.println("ArrayList의 내용: \n"+list);
// 서브리스트 제거
list.subList(4, 9).clear();
System.out.println("서브리스트 제거 후 ArrayList의 내용: \n"+list);
}
}실행 결과
ArrayList의 내용: [JavaFX, Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala] 서브리스트 제거 후 ArrayList의 내용: [JavaFX, Java, WebGL, OpenCV, Mahout, Impala]
위 예제에서는 인덱스 4(OpenNLP)부터 인덱스 8(Flume)까지 총 5개의 요소가 한 번에 제거된 것을 확인할 수 있습니다.
참고: subList()에 전달하는 인덱스가 유효 범위(fromIndex ≤ toIndex ≤ 리스트 크기)를 벗어나면 IndexOutOfBoundsException이 발생하므로 주의해야 합니다.
removeRange() 메서드 활용하기
AbstractList 클래스의 removeRange() 메서드 역시 두 개의 정수값(인덱스)을 매개변수로 받아, 현재 ArrayList에서 해당 범위의 요소들을 제거합니다.
다만 이 메서드는 protected로 선언되어 있어 클래스 외부에서 직접 호출할 수 없습니다. 따라서 사용하려면 다음과 같은 절차를 거쳐야 합니다.
extends 키워드를 사용해 자신의 클래스가 ArrayList 클래스를 상속하도록 합니다.
상속받은 클래스의 인스턴스를 생성합니다.
생성된 객체에 요소를 추가합니다.
removeRange() 메서드를 호출하여 원하는 서브리스트를 제거합니다.
예제
import java.util.ArrayList;
public class RemovingSubList extends ArrayList<String>{
public static void main(String[] args){
RemovingSubList list = new RemovingSubList();
// 요소 추가
list.add("JavaFX");
list.add("Java");
list.add("WebGL");
list.add("OpenCV");
list.add("OpenNLP");
list.add("JOGL");
list.add("Hadoop");
list.add("HBase");
list.add("Flume");
list.add("Mahout");
list.add("Impala");
System.out.println("ArrayList의 내용: \n"+list);
// 서브리스트 제거
list.removeRange(4, 9);
System.out.println("서브리스트 제거 후 ArrayList의 내용: \n"+list);
}
}실행 결과
ArrayList의 내용: [JavaFX, Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala] 서브리스트 제거 후 ArrayList의 내용: [JavaFX, Java, WebGL, OpenCV, Mahout, Impala]
두 방법의 비교 및 정리
일반적인 상황에서는 별도의 상속 없이 간단히 사용할 수 있는 subList().clear() 방식이 권장됩니다. 반면 removeRange()는 protected 메서드라서 ArrayList를 상속한 커스텀 클래스를 만들 때만 유용하며, 실무에서는 사용 빈도가 낮습니다. 대부분의 경우 첫 번째 방법으로 충분히 깔끔하게 부분 리스트를 제거할 수 있습니다.