1. List 란?
- 객체를 일렬로 늘어놓은 구조로 이루어져 있다.
- 배열처럼 "순서"가 있어 객체를 인덱스로 관리한다.
- List의 종류는 ArrayList, Vector, Stack, LinkedList 이다.
2. ArrayList
- 쉽게 확장 가능한 배열이다. 즉, 동적 크기의 배열이다.
- 제네릭 클래스로 ArrayList<E> 와 같이 선언한다.
- 동일한 값을 여러 번 저장할 수 있다.
- 데이터를 자주 조회하는 작업에 효율적이다. 중간에 데이터 추가, 삭제 작업은 배열 재할당 작업이 필요하다.
- Not Thread safe 하다. 즉, 멀티스레드 환경에서는 스레드 동기화 처리가 가능한 "Vector" 를 사용해야 한다.
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> fruits = new ArrayList<>();
// 추가
fruits.add("사과");
fruits.add("바나나");
fruits.add("딸기");
// 크기
System.out.println("과일 개수: " + fruits.size()); // 출력: 과일 개수: 3
// 조회
System.out.println("첫 번째 과일: " + fruits.get(0)); // 출력: 첫 번째 과일: 사과
// 변경
fruits.set(1, "오렌지");
System.out.println("두 번째 과일: " + fruits.get(1)); // 출력: 두 번째 과일: 오렌지
// 삭제
fruits.remove("사과");
System.out.println("과일 개수: " + fruits.size()); // 출력: 과일 개수: 2
// 특정 인덱스 조회
System.out.println("딸기의 인덱스: " + fruits.indexOf("딸기")); // 출력: 딸기의 인덱스: 1
// ArrayList 비우기
fruits.clear();
System.out.println("비어있는지 확인: " + fruits.isEmpty()); // 출력: 비어있는지 확인: true
}
}
3. Vector
- ArrayList와 기능 측면에서는 거의 동일하다. 다만, 동기화 지원 여부가 다르다.
- Thread safe 하다. 여러 스레드가 동시에 Vector를 수정하거나 접근해도 안전하다.
- 하지만 동기화 처리로 인해 arrayList보다 성능이 떨어진다는 단점이 있다.
4. Stack
- Stack은 Vector를 확장하여 만들었다. 즉, Vector가 부모 클래스이다.
- Stack의 가장 큰 존재 이유는 LIFO를 지원하기 위함이다.
- LIFO : Last In First Out의 약자로, 가장 마지막에 추가한 값을 가장 처음 빼 내는 것이다.
- Stack에 대한 자세한 내용은 따로 정리할 예정이다.
5. LinkedList
- 이중 연결 리스트 ( Doubly Linked List )로 구현된다.
- 각 노드 ( Node )가 링크( 포인터 )로 한 줄로 서로 연결되어 있는 자료 구조이다.
- 객체 추가 / 삭제할 때, 해당 노드와 이전 또는 다음 노드를 연결만 해주면 되어서 효율성이 뛰어나다.
- 따라서 데이터를 자주 추가/삭제하는 작업에 효율적이다.
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
// LinkedList 생성
LinkedList<Integer> linkedList = new LinkedList<>();
// 추가
linkedList.add(10);
linkedList.add(20);
linkedList.add(30);
linkedList.add(40);
// 출력
System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 30, 40]
// 특정 인덱스에 추가
linkedList.add(2, 25); // 인덱스 2에 25 추가
// 출력
System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 25, 30, 40]
// 특정 객체 삭제
linkedList.remove(Integer.valueOf(30)); // 값이 30인 객체 삭제
// 출력
System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 25, 40]
// 크기
int size = linkedList.size();
System.out.println("Size : " + size); // 출력 Size : 4
// 조회
int element = linkedList.get(2);
System.out.println("index : " + element); // 출력 index : 25
// 변경
linkedList.set(1, 22); // 인덱스 1의 원소를 22로 변경
// 출력
System.out.println("LinkedList : " + linkedList); // 출력: LinkedList : [10, 22, 25, 40]
}
}
6. ArrayList VS LinkedList
- 장단점
ArrayList 장점: 인덱스 기반 접근이 빠르며, 데이터를 자주 조회하는 작업에 효율적이다.
단점: 중간에 객체를 추가/삭제하는 경우에 느릴 수 있고, 배열 재할당에 따른 성능 저하가 발생할 수 있다.
LinkedList 장점: 중간에 객체를 추가/삭제하는 작업에 효율적이다.
단점: 메모리 사용이 많고, 인덱스 기반 접근이 불가능하여 ArrayList보다 느릴 수 있다.
* linkedList.get(int index); 메서드는 실제로 인덱스 기반으로 직접 접근하는게 아니라 링크를 하나하나 따라가면서
해당 인덱스에 해당하는 노드를 찾아서 객체를 가져오는 것이다.
'자바' 카테고리의 다른 글
자바 Queue (0) | 2023.07.24 |
---|---|
자바 Stack (0) | 2023.07.24 |
자바 JVM 내부 구조 및 메모리 구조 (0) | 2023.07.18 |
자바 String builder, String buffer 차이 (0) | 2023.07.18 |
자바 JVM 이란 (0) | 2023.07.18 |