Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java ArrayList에서 부분 리스트(SubList) 제거하기: subList().clear()부터 removeRange()까지

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를 상속한 커스텀 클래스를 만들 때만 유용하며, 실무에서는 사용 빈도가 낮습니다. 대부분의 경우 첫 번째 방법으로 충분히 깔끔하게 부분 리스트를 제거할 수 있습니다.