이 글에서는 자바(Java)에서 다양한 유형의 컬렉션(Collection)을 사용하는 방법을 알아봅니다. 대표적인 리스트 구현체인 ArrayList와 LinkedList를 예제 코드와 함께 비교하며 살펴보겠습니다.
예제 개요
입력값 -
입력 리스트: [101, 102, 103, 104, 105]
기대 출력 결과 -
요소를 제거한 후의 리스트: 101 102 103 105
알고리즘
Step 1 - 프로그램을 시작합니다. Step 2 - input_collection이라는 이름의 리스트를 선언합니다. Step 3 - 리스트에 저장할 값들을 정의합니다. Step 4 - remove() 함수에 제거할 요소의 인덱스를 매개변수로 전달하여 해당 요소를 삭제합니다. Step 5 - 결과를 화면에 출력합니다. Step 6 - 프로그램을 종료합니다.
예제 1: ArrayList 사용하기
여기서는 ArrayList의 사용법을 보여줍니다. ArrayList는 초기 크기를 가진 상태로 생성되며, 저장 용량을 초과하면 컬렉션이 자동으로 확장됩니다. 반대로 객체를 제거하면 배열의 크기가 줄어들 수도 있습니다. 아래 예제에서는 remove() 메서드에 인덱스 3을 전달하여 네 번째 요소(104)를 삭제합니다.
import java.util.*;
public class Demo {
public static void main(String[] args){
ArrayList<Integer> input_collection = new ArrayList<Integer>();
for (int i = 1; i <= 5; i++)
input_collection.add(i + 100);
System.out.println("정의된 리스트: " + input_collection);
input_collection.remove(3);
System.out.println("\n요소를 제거한 후의 리스트: ");
for (int i = 0; i < input_collection.size(); i++)
System.out.print(input_collection.get(i) + " ");
}
}
출력 결과
정의된 리스트: [101, 102, 103, 104, 105] 요소를 제거한 후의 리스트: 101 102 103 105
예제 2: LinkedList 사용하기
여기서는 LinkedList의 사용법을 보여줍니다. java.util.LinkedList 클래스는 이중 연결 리스트(doubly-linked list)에서 기대할 수 있는 연산들을 수행합니다. 인덱스로 리스트에 접근하는 연산은 지정된 인덱스에 더 가까운 쪽, 즉 리스트의 시작점 또는 끝점 중 가까운 위치부터 탐색을 진행합니다.
import java.util.*;
public class Demo {
public static void main(String[] args){
LinkedList<Integer> input_collection = new LinkedList<Integer>();
for (int i = 1; i <= 5; i++)
input_collection.add(i + 100);
System.out.println("정의된 리스트: " + input_collection);
input_collection.remove(3);
System.out.println("\n요소를 제거한 후의 리스트: ");
for (int i = 0; i < input_collection.size(); i++)
System.out.print(input_collection.get(i) + " ");
}
}
출력 결과
정의된 리스트: [101, 102, 103, 104, 105] 요소를 제거한 후의 리스트: 101 102 103 105
두 예제 모두 동일한 결과를 출력하지만, 내부 동작 방식은 서로 다릅니다. ArrayList는 인덱스 기반의 빠른 임의 접근(random access)에 유리하고, LinkedList는 요소의 삽입과 삭제가 빈번하게 일어나는 경우에 더 효율적입니다. 따라서 데이터의 사용 패턴에 맞는 컬렉션을 선택하는 것이 성능 최적화의 핵심입니다.