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

Java ArrayList·LinkedList에서 요소 삭제하기: remove() 메서드 완벽 정리

ArrayList와 LinkedList 클래스는 java.util 패키지의 List 인터페이스를 구현하는 대표적인 컬렉션입니다. 이 인터페이스는 특정 요소를 삭제할 수 있도록 아래와 같이 두 가지 형태의 remove() 메서드를 제공합니다.

  • E remove(int index)
  • boolean remove(Object o)

이 메서드들 중 하나를 활용하면 Java에서 List나 LinkedList에 담긴 원하는 요소를 간편하게 삭제할 수 있습니다.

1. remove(int index) – 인덱스로 요소 삭제하기

E remove(int index)는 List 객체에서 특정 위치를 나타내는 정수(인덱스)를 매개변수로 받아, 해당 위치에 있는 요소를 제거합니다. 삭제가 성공적으로 수행되면 제거된 요소 자체가 반환됩니다.

만약 전달된 인덱스 값이 0보다 작거나 리스트의 크기(size())보다 크거나 같으면 IndexOutOfBoundsException 예외가 발생하므로 주의해야 합니다.

예제

import java.util.ArrayList;
import java.util.LinkedList;

public class RemoveExample {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("JavaFX");
        arrayList.add("Java");
        arrayList.add("WebGL");
        arrayList.add("OpenCV");
        System.out.println("ArrayList contents: " + arrayList);

        // 인덱스로 요소 제거
        System.out.println("Removed elements:");
        System.out.println(arrayList.remove(0));
        System.out.println(arrayList.remove(2));

        System.out.println();

        // LinkedList 객체 생성
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("Krishna");
        linkedList.add("Satish");
        linkedList.add("Mohan");
        linkedList.add("Radha");
        System.out.println("LinkedList contents: " + linkedList);

        // 인덱스로 요소 제거
        System.out.println("Removed elements:");
        System.out.println(linkedList.remove(0));
        System.out.println(linkedList.remove(2));
    }
}

실행 결과

ArrayList contents: [JavaFX, Java, WebGL, OpenCV]
Removed elements:
JavaFX
OpenCV

LinkedList contents: [Krishna, Satish, Mohan, Radha]
Removed elements:
Krishna
Radha

위 예제에서 인덱스 0의 요소가 먼저 삭제된 후, 남은 요소들이 한 칸씩 앞당겨진다는 점에 유의하세요. 즉, 연속으로 remove()를 호출하면 두 번째 호출은 이미 변경된 리스트를 기준으로 동작합니다.

2. remove(Object o) – 객체로 요소 삭제하기

boolean remove(Object o)는 List에 포함된 요소를 나타내는 객체를 매개변수로 받아, 해당 요소가 처음 등장하는 위치의 항목을 제거합니다. 반환값은 boolean 타입이며 다음과 같습니다.

  • 삭제가 성공하면 true
  • 일치하는 요소가 없어 삭제에 실패하면 false

참고로 이 메서드는 equals() 메서드를 기준으로 요소를 비교하므로, 저장하는 객체의 동등성(equality) 비교 로직에 따라 결과가 달라질 수 있습니다.

예제

import java.util.ArrayList;
import java.util.LinkedList;

public class RemoveObjectExample {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("JavaFX");
        arrayList.add("Java");
        arrayList.add("WebGL");
        arrayList.add("OpenCV");
        System.out.println("ArrayList contents: " + arrayList);

        // 객체로 요소 제거
        System.out.println(arrayList.remove("JavaFX"));
        System.out.println(arrayList.remove("WebGL"));
        System.out.println("After removal: " + arrayList);

        System.out.println();

        // LinkedList 객체 생성
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("Krishna");
        linkedList.add("Satish");
        linkedList.add("Mohan");
        linkedList.add("Radha");
        System.out.println("LinkedList contents: " + linkedList);

        // 객체로 요소 제거
        System.out.println(linkedList.remove("Satish"));
        System.out.println(linkedList.remove("Mohan"));
        System.out.println("After removal: " + linkedList);
    }
}

실행 결과

ArrayList contents: [JavaFX, Java, WebGL, OpenCV]
true
true
After removal: [Java, OpenCV]

LinkedList contents: [Krishna, Satish, Mohan, Radha]
true
true
After removal: [Krishna, Radha]

3. Iterator의 remove() 메서드 활용하기

위의 두 메서드 외에도 Iterator 클래스가 제공하는 remove() 메서드를 사용해 LinkedList나 ArrayList의 요소를 제거할 수 있습니다. 특히 for-each 문이나 반복 처리 도중에 컬렉션을 직접 수정하면 ConcurrentModificationException이 발생할 수 있으므로, 순회하면서 요소를 삭제해야 하는 상황에서는 Iterator의 remove()를 사용하는 것이 안전합니다.

Iterator의 remove()는 반드시 next()를 먼저 호출한 뒤에 사용해야 하며, 그렇지 않으면 IllegalStateException이 발생합니다.

예제

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

public class IteratorRemoveExample {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("JavaFX");
        arrayList.add("Java");
        arrayList.add("WebGL");
        arrayList.add("OpenCV");
        System.out.println("ArrayList contents: " + arrayList);

        // Iterator 객체 얻기
        Iterator<String> it1 = arrayList.iterator();
        it1.next();
        it1.remove();
        System.out.println("After removal:");
        while(it1.hasNext()) {
            System.out.println(it1.next());
        }

        System.out.println();

        // LinkedList 객체 생성
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("Krishna");
        linkedList.add("Satish");
        linkedList.add("Mohan");
        linkedList.add("Radha");
        System.out.println("LinkedList contents: " + linkedList);

        // Iterator 객체 얻기
        Iterator<String> it2 = linkedList.iterator();
        it2.next();
        it2.remove();
        System.out.println("After removal:");
        while(it2.hasNext()) {
            System.out.println(it2.next());
        }
    }
}

실행 결과

ArrayList contents: [JavaFX, Java, WebGL, OpenCV]
After removal:
Java
WebGL
OpenCV

LinkedList contents: [Krishna, Satish, Mohan, Radha]
After removal:
Satish
Mohan
Radha

마무리

지금까지 ArrayList와 LinkedList에서 요소를 삭제하는 세 가지 방법을 살펴보았습니다. 인덱스를 알고 있다면 remove(int index), 특정 값을 찾아 삭제하려면 remove(Object o), 그리고 반복 중 안전하게 삭제하려면 Iterator.remove()를 사용하는 것이 좋습니다. 각 방식의 특징과 예외 상황을 잘 이해하고 활용하면 더욱 견고한 컬렉션 코드를 작성할 수 있습니다.