JAVA

[JAVA] List의 주요 구현체와 특징

인생아 2024. 11. 16. 22:30
반응형

Java의 List 인터페이스는 다양한 구현체를 제공하며, 각각의 구현체는 데이터 구조와 성능 특성에서 차이를 보입니다. 이 글에서는 ArrayList, LinkedList, Vector, CopyOnWriteArrayList구조와 특징, 사용 예제를 상세히 설명합니다. 주요 키워드로는 Java List, ArrayList와 LinkedList 비교, 동기화된 리스트 등을 활용합니다.

1. ArrayList

내부 구조와 특징

ArrayList동적 배열 기반으로 데이터를 저장하는 List 구현체입니다. 배열과 비슷하지만, 크기를 자동으로 조정하며 데이터 삽입 및 삭제에 효율적입니다. 순차적으로 데이터를 저장하기 때문에 데이터 접근 속도가 매우 빠릅니다.

동적 배열과 메모리 관리

  • 초기 크기: 기본적으로 10개의 용량으로 초기화됩니다.
  • 확장 방식: 배열의 용량이 초과되면 기존 용량의 50%를 더한 크기로 확장됩니다.
  • 단점: 중간에 데이터를 삽입하거나 삭제할 경우, 데이터를 이동해야 하므로 성능이 떨어질 수 있습니다.

사용 예제

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        // 데이터 추가
        list.add("사과");
        list.add("바나나");
        list.add("포도");

        // 특정 위치에 데이터 삽입
        list.add(1, "수박");

        // 데이터 삭제
        list.remove("바나나");

        System.out.println("리스트 내용: " + list);
    }
}

출력 결과

리스트 내용: [사과, 수박, 포도]

2. LinkedList

내부 구조와 특징

LinkedList이중 연결 리스트를 기반으로 데이터를 저장합니다. 각 노드는 데이터다음 및 이전 노드의 참조를 포함합니다. 배열 기반인 ArrayList와는 다르게, 비순차적인 삽입과 삭제가 효율적입니다.

삽입 및 삭제 성능 비교

  • 삽입 및 삭제: ArrayList는 데이터 이동이 필요하지만, LinkedList는 참조만 변경하면 되므로 더 빠릅니다.
  • 접근 속도: LinkedList는 특정 인덱스에 접근할 때 순차적으로 탐색하므로 ArrayList보다 느립니다.

사용 예제

import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();

        // 데이터 추가
        list.add("사과");
        list.add("바나나");
        list.add("포도");

        // 데이터 삽입
        list.addFirst("수박"); // 맨 앞에 추가
        list.addLast("딸기"); // 맨 뒤에 추가

        // 데이터 삭제
        list.removeFirst(); // 맨 앞의 데이터 삭제
        list.removeLast(); // 맨 뒤의 데이터 삭제

        System.out.println("리스트 내용: " + list);
    }
}

출력 결과

리스트 내용: [사과, 바나나, 포도]
반응형

3. Vector

Thread-safe 특징

Vector동기화(Synchronized) 처리가 되어 있어 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 하지만 동기화 처리로 인해 성능이 낮을 수 있습니다.

Vector와 ArrayList의 차이점

  • 동기화: Vector는 동기화되어 있지만, ArrayList는 동기화되지 않습니다.
  • 확장 크기: Vector는 용량 초과 시 기존 크기의 2배로 확장됩니다.

사용 예제

import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();

        // 데이터 추가
        vector.add("사과");
        vector.add("바나나");
        vector.add("포도");

        // 특정 위치에 데이터 삽입
        vector.insertElementAt("수박", 1);

        // 데이터 삭제
        vector.remove("바나나");

        System.out.println("벡터 내용: " + vector);
    }
}

출력 결과

벡터 내용: [사과, 수박, 포도]

4. CopyOnWriteArrayList

동시성 환경에서의 활용

CopyOnWriteArrayList동기화된 ArrayList로, 읽기 작업이 많은 환경에서 적합합니다. 쓰기 작업 시 기존 배열의 복사본을 생성하여 데이터를 추가하거나 수정합니다.

특징과 사용 사례

  • 데이터 일관성: 읽기 작업 중에 발생할 수 있는 ConcurrentModificationException을 방지합니다.
  • 쓰기에 비해 읽기 성능 최적화: 주로 읽기 작업이 많고 쓰기가 적은 환경에서 사용됩니다.

사용 예제

import java.util.concurrent.CopyOnWriteArrayList;

public class Main {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

        // 데이터 추가
        list.add("사과");
        list.add("바나나");
        list.add("포도");

        // 데이터 삽입 및 삭제
        list.addIfAbsent("수박"); // 존재하지 않을 때만 추가
        list.remove("바나나");

        System.out.println("리스트 내용: " + list);
    }
}

출력 결과

리스트 내용: [사과, 포도, 수박]

참고 사이트

Java 공식 문서: https://docs.oracle.com/javase/8/docs/api/java/util/List.html

반응형