Collection_2_List
by 핫도구
List
List는 중복을 허용하지 않으며 순서가 있는 데이터 집합으로 인덱스를 통해 데이터에 접근할 수 있는 구조이다.
사실 List를 많이 사용하면서 지속적으로 잘못 사용했던 경우가 있는데 바로 데이터를 제거할 때 인덱스가 0부터 접근하는 방식이었다. 아래에는 간단한 예가 존재한다.
list는 get()메서드를 사용해서 제거를 하면 제거할 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리 이동을 하기 때문에 제대로 된 결과를 얻을 수 없다.
List<Integer> list1 = new ArrayList<Integer>(5);
List<Integer> list2 = new ArrayList<Integer>(5);
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);
list2.add(6);
for(int i = 0; i < list2.size() -1; i++) {
if(list1.contains(list2.get(i))) {
list2.remove(i);
}
}
System.out.println(list2); // [3,5,6]
이러한 결과를 도출하게 된 이유는 i가 0일 경우 조건절에서 list2에서 2를 가져오기에 list2의 0번째 index인 2가 삭제가 되어 list2는 [3,4,5,6]이 되고 i가 1일 경우 조건절에서 list2에서 4를 가져오기에 list2의 1번째 index인 4가 삭제가 되어 list2는 [3,5,6]이 되고 i가 2인 경우 조건절에서 list2에서 6을 가져오기 때문에 조건절이 만족하지 않는다. 결과적으로 반복문을 돌릴 때 큰 index부터 차례대로 내려와야 한다.
for(int i = list2.size()-1; i >= 0 ; i--) {
if(list1.contains(list2.get(i))) {
list2.remove(i);
}
}
System.out.println(list2); // [6]
이처럼 list에서 다수의 데이터를 제거하려할 때 index가 큰 것부터 작은 것으로 내려와야 하는 것을 알 수 있다.
ArrayList의 특징
1. 동적크기조절이 가능하다.
2. 인덱스를 통한 빠른 접근이 가능하다.
3. 순서가 보장된다.
인덱스를 통해 데이터에 접근하므로 굉장히 빠르게 데이터에 접근할 수 있으며 순서가 보장되기 때문에 일반적으로 굉장히 많이 사용된다. 또한 기본적으로 기본 크기는 10으로 할당되며 동적크기조절이 가능하기 떄문에 필요에 따라 크기가 자동으로 증가한다.
이러한 특징 때문에 일반적으로 많이 사용되지만 데이터가 자주 삽입되거나 삭제가 되는 경우 혹은 대량의 데이터를 처리해야하는 경우에는 적합하지 않다. 첫번째 단점을 잘 보완해주기 위해 LinkedList를 사용한다.
LinkedList
LinkedList는 다음노드포인터와 데이터로 구성이 되어 있다. 그래서 현재의 데이터가 다음 노드를 참조하는 링크를 함께 제시한다고 볼 수도 있다.
LinkedList의 특징
1. 크기를 변경할 수 없다.
2. 비순차적인 데이터의 추가 및 삭제에 시간이 많이 소요된다.
LinkedList는 단일로 연결되어 있는 구조이며 중간에 삽입하거나 삭제하는 작업이 빠르고 동적으로 크기가 조정되기 때문에 위와 같은 경우에 자주 사용된다.
하지만 LinkedList는 단방향으로만 데이터를 탐색할 수 있기 때문에 이러한 보완점으로 DoubleLinkedList가 나온다.
DoubleLinkedList
DoubleLinkedList의 특징
1. 양방향으로 탐색이 가능하다.
2. LinkedList보다 데이터 처리가 효율적으로 지원한다.
3. 하지만 양방향으로 탐색을 해야하니 메모리 사용량이 늘어난다.
4. LinkedList보다 더 복잡하다.
DoubleLinkedList는 LinkedList의 불편한 양방향 탐색을 지원한다. 그렇기 때문에 데이터 처리의 효율성이 향상된다.
DoubleLinkedList는 이중연결리스트의 구조로 다음의 노드를 가르키는 LinkedList의 노드가 2개가 존재하여 2가지 방향(양방향)으로 연결이 가능하다. 하지만 이러한 영향으로 메모리 사용량이 늘어나는 것을 부정할 수 없다. 그렇기 때문에 어떤 것을 선택할 때 상황에 맞게 사용해야한다.
하지만 DoubleLinkedList의 마지막 데이터에서 첫번째 데이터로 접근하기에 용이하지 않고 무환순환이 필요한 경우가 있기 때문에 CircularLinkedList가 나오게 되었다.
CircularLinkedList
CircularLinkedList의 특징
1. 시작과 끝이 연결되어 있어 DoubleLinkedList에서의 단점을 보완한다.
2. 순환하여 데이터를 처리하기 때문에 반복적인 작업에 유리하다.
3. 자칫잘못하면 무한루프에 빠질 수 있어 명확하게 종료조건을 설정해야 한다.
시작과 끝이 연결된 순환구조로 효율적으로 반복적인 작업을 할 수 있다. 그래서 주기적으로 혹은 반복적으로 데이터를 처리해야하는 경우에 유용하게 사용되지만 중간노드의 접근이 비효율적이므로 이와 같은 경우에는 다른 구조를 고려해야한다.
Stack
Stack의 특징
1. LIFO(Last In, First Out)
2. 단방향접근
3. 가변적인 크기
사실 Stack은 매우 단순한 구조이며 후입선출방식으로 동작하며 빠르게 데이터를 처리할 수 있는 강력한 장점을 가졌지만 데이터에 접근할 때 상단에서만 접근이 가능하며 크기가 제한되어 있다면 오버플로우가 발생할 수 있는 치명적인 단점이 존재한다.
이처럼 List에도 다양한 종류가 존재하고 특징에 맞게 필요한 것을 골라 사용해야 한다.
'JAVA > OLD' 카테고리의 다른 글
| Collection_4_Map (0) | 2025.03.01 |
|---|---|
| Collection_3_Set (0) | 2025.02.25 |
| Collection_1 (0) | 2025.02.02 |
| JSTL LOOP(forEach) (0) | 2024.08.19 |
| JSTL_if, choose(조건분기) (0) | 2024.08.19 |
블로그의 정보
AquaMan
핫도구