ArrayList, LinkedList의 적절한 사용 상황

유수민·2022년 7월 10일
0

지식창고

목록 보기
7/60
post-thumbnail

공통점 : 사이즈를 정하지 않고 동적으로 활용할 수 있습니다. 즉, 저장해야하는 객체의 수를 정확히 모를 때 사용한다.

📌ArrayList

데이터들이 순서대로(연속적으로) 쭉 늘어선 배열의 형식으로 ArrayList는 내부 배열 객체를 저장해서 인덱스로 관리한다.
ArrayList는 데이터의 추가, 삭제를 위해서 임시 배열을 생성해 데이터를 복사하는 방법을 사용한다

📖데이터의 추가

저장 공간 부족으로 ArrayList의 용량을 늘리게 되고, 이는 기존의 ArraList에 추가하는 것이 아닌, 확장된 크기의 ArrayList를 새로 생성하고, 그 새로 생성된 ArrayList에 기존의 ArrayList 값들을 복사해주는 과정을 거치게 됩니다. 그리고 기존의 ArrayList는 가비지 컬렉션에 의해 메모리에서 제거된다. 지속적으로 삭제 과정이 있을 경우에는 그 공간만큼 낭비되는 메모리도 많아지게 된다.

📖데이터 제거

순차적인 인덱스 구조로 인해 삭제된 빈 인덱스를 채워야 하기 때문에,제거한 요소 뒤에 있던 값들을 모두 앞으로 끌어당기는 연산이 필요하다.

이처럼 데이터 추가/삭제를 위해, 새로운 배열 인스턴스의 생성과 기존 데이터의 복사하거나 부가적인 연산과 같은 번거로운 작업을 거치게 되기 때문에 메모리나 시간적인 측면에서 성능 저하를 일으켜 추가/삭제가 빈번하게 이루어지는 프로세스에는 적합하지 않다 .
-> 이에 대한 보완으로 LinkedList가 등장하게 되었다.

📖ArrayList의 장점과 단점

ArrayList는 양쪽 끝에 추가하는 속도가 느리고 특히 중간에서 삭제하는 속도가 느리지만, 내부적으로 배열로 구현되어 있어서 특정 요소에 액세스하는데 더 용이하고, 요소들을 인접한 메모리에 저장한다는 특징에 의해 for each로 LinkedList보다 빠르다는 장점을 가지고 있다.

For-each문 : for (Integer integer : list) { }

📌LinkedList

: 자료의 주소 값으로 서로 연결되어 있는 구조입니다. 즉, 데이터와 다음 노드의 주소로 구성된 노드들이 서로 연결되어 있다. 양방향 포인터 구조로, 각각마다 인접하는 참조를 링크해서 체인처럼 관리한다.
따라서, LinkedList는 특정 인덱스의 객체를 제거하거나 삽입하면, 앞 뒤 링크만 변경되고 나머지 링크는 변경되지 않기 때문에 중간 삽입/삭제가 빈번할 수록 LinkedList를 쓰는 것이 효율적이다.

이처럼 LinkedList는 요소 추가 및 삭제는 빠르지만, LinkedList에서 특정 원소에 접근하기 위해서는 ,

1) 처음부터 원소에 도달할 때까지 순차적으로 검색하면서 찾아야 하고
2) LinkedList는 데이터들을 저장 공간에 불연속적인 단위로 저장한다는 특징

때문에 메모리 이곳저곳에 산재해 저장되어 있는 노드들을 접근하는데 ArrayList보다는 긴 지연시간이 소모된다는 단점으로 특정 요소에 대한 액세스하는 프로세스에는 적합하지 않다.

profile
배우는 것이 즐겁다!

0개의 댓글