List

조용근·2024년 1월 25일

자바 정리

목록 보기
6/21

ArrayList

  • ArrayListVector를 개선한 것으로 구현원리와 기능이 동일하다.
    //단, Vector는 자체적으로 동기화가 되어 있지만, ArrayList동기화가 되어 있지 않다.
  • List 인터페이스를 구현하기 때문에, 순서가 유지되고, 중복을 허용한다.
  • 데이터 저장공간으로 배열을 사용한다.

동기화에 대해서는 쓰레드를 학습할 때 공부할 것이다.

Object[]의 경우, 모든 종류의 객체를 저장 가능하다.

ArrayList의 메서드

생성자

  • ArrayList() //기본 생성자
  • ArrayList(Collection c)
  • ArrayList(int initialCapacity) //괄호 안의 내용은 배열의 길이에 해당된다.

추가

int index의 경우, 저장 위치를 말한다.

삭제

검색

contains = 객체(Object)가 있는지 찾기
get = 객체 읽기
set = 객체 변경

subList = from~to까지의 데이터를 뽑아 내는 거
toArray = ArrayList의 객체배열을 반환
isEmpty = 비어 있는지 확인
void trimToSize = 빈공간 제거
size = ArrayList에 저장된 객체의 개수

ArrayList 객체 삭제

첫번째부터 삭제를 하면, 배열의 모든 요소가 전부 삭제가 안되는 경우가 존재하므로, 거꾸로 삭제하는 것이 더 좋다.

LinkedList

장점- 배열은 구조가 간단, 데이터를 읽는 데 걸리는 시간(접근 시간)
단점- 크기를 변경할 수 없다.
//크기를 변경해야 하는 경우, 새로운 배열을 생성한 후, 데이터를 복사한다.
//크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비된다.
(더 큰 배열을 만든다 -> 데이터를 복사한다 -> 참조를 복사한다)
비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.
순차적(끝에 추가,삭제)는 빠르다.
//중간에 있는 요소들을 추가,삭제하면 뒤에 있는 요소들이 전부 앞으로 당겨지게 되는데, 데이터의 크기가 큰 경우에는 많은 시간이 소요된다.

이렇게 배열의 단점을 보완해서 나온 것이 LinkedList이다.


마치 기차처럼 불연속적으로 존재하는 데이터들이 연결되어 있다.
데이터값을 바꾸기 위해서는 연결선(참조값)만 바꾸면 된다.

class Node{
    Node next;
    Object obj;
}

배열처럼 요소에 바로 접근할 수 없다. 징검다리처럼 건너 건너 접근해야 한다. 따라서, 데이터 접근성이 나쁘다.

그래서 이러한 접근성을 향상시키기 위해 만든 것이 doubly linked list 이다.

class Node{
    Node next;//다음 요소
    Node previous; //이전 요소
    Object obj;
}

앞,뒤로 이동이 가능하다. 하지만, 한번에 2,3칸 이상 이동하는 것은 불가능하다.

doubly circular linked listdoubly linked list에서 양 끝에 있는 null값을 활용하는 것이다.

맨 앞의 요소를 맨 끝에 연결하고, 맨 끝의 요소를 맨 앞에 연결하는 것이다.
이렇게 하면, 맨 앞에서 맨 끝으로 바로 이동할 수 있다.

참고로 자바는 doubly linked list로 이루어져 있다.

비유를 통해 알아보는 ArrayList vs LinkedList

ArrayList: 책장에 꽉 찬 책들
ArrayList를 도서관의 일렬로 정렬된 책장에 비유할 수 있다. 각 책은 특정 위치(인덱스)에 있으며, 특정 책을 찾기 위해서는 그 위치만 알면 된다. 즉, 당신이 도서관에서 특정 책을 찾고자 할 때, 그 책의 정확한 위치를 알고 있다면, 바로 그 책을 꺼낼 수 있다. 이는 ArrayList의 임의 접근이 매우 빠르다는 것을 의미한다.
하지만 새로운 책을 책장에 추가하고자 할 때, 책장에 빈 자리가 없다면, 새로운 책장을 가져와야 하고 기존의 책들을 새 책장으로 옮겨야 한다. 이는 ArrayList에서 배열의 크기를 조정해야 하는 상황과 비슷하다. 또한, 책장의 중간에 책을 추가하려면, 그 위치에 있는 책들을 옆으로 옮겨 공간을 만들어야 하는데, 이 과정은 시간이 많이 걸릴 수 있다.
LinkedList: 연결된 책들
LinkedList는 도서관에서 서로 연결된 책들로 생각할 수 있다. 각 책은 다음 책과 이전 책을 가리키는 정보를 가지고 있다. 책을 추가하거나 제거하고 싶을 때, 해당 책의 앞뒤 링크만 조정하면 되므로, 전체를 재배열할 필요가 없다. 이는 리스트 중간에 요소를 추가하거나 제거하는 작업이 ArrayList보다 효율적일 수 있음을 의미한다.
하지만 특정 책을 찾고자 할 때는, 처음부터 시작하여 해당 책을 찾을 때까지 모든 연결을 따라가야 한다. 이는 LinkedList에서 특정 인덱스에 접근하기 위해 리스트를 순차적으로 탐색해야 한다는 것을 의미하며, 이 과정은 시간이 많이 걸릴 수 있다.
이 비유를 통해, ArrayList는 빠른 접근이 필요할 때 유리하며, LinkedList는 자주 변경되는 데이터에 더 적합함을 이해할 수 있다. 따라서 사용하는 상황에 따라 적절한 타입을 선택하는 것이 중요하다.

정리

ArrayList는 배열기반(연속적)
LinkedList는 연결기반(불연속)

출처 : https://www.youtube.com/watch?v=_2e-cgwMOyc&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=121

profile
Today I Learn

0개의 댓글