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
'JAVA' 카테고리의 다른 글
[JAVA] List와 동기화 (0) | 2024.11.18 |
---|---|
[JAVA] List 반복문을 활용한 처리 (0) | 2024.11.17 |
[JAVA] List의 데이터 변환과 처리 (0) | 2024.11.17 |
[JAVA] List의 데이터 정렬과 검색 (1) | 2024.11.17 |
[JAVA] List 인터페이스의 주요 메서드 (0) | 2024.11.16 |
[JAVA] List (0) | 2024.11.16 |
[JAVA] Jackson 자주 발생하는 오류와 해결 방법 (1) | 2024.11.15 |
[JAVA] Jackson과 Spring Boot 통합 (0) | 2024.11.15 |