JAVA 14. 컬렉션(List)

김창민·2024년 7월 29일

BE

목록 보기
16/50

오라클 컬렉션 스팩

컬렉션을 사용하긴 하지만, 더 자세히 알아보도록 하자.
오라클 문서

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.

구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자

List

AbstrackList, AbstractSequentialList, ArrayList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Vector

기본적으로 순서가 있는 요소의 집합이다. List의 구현체들은 요소들이 인덱스를 통해 접근하며, 요소 중복이 허용된다. add, get, set, remove가 CRUD 메소드다.

AbstrackList

이름에서 알 수 있듯, List 인터페이스를 구현한 추상 클래스다. 새로운 List 구현을 만들때 AbstrackList를 상속받아서 구현하면 된다.

AbstractSequentialList

이 역시 이름에서 알 수 있듯 List 인터페이스를 구현한 추상 클래스다. 다만, AbstrackList와 다른점은 데이터 구조에 순차적으로 접근하도록 설계 되었다. 우리가 아는 LinkedList와 같은 구조.

List가 get(idx)로 접근하기 때문에 원래가 순차적이라고 할 수 있지만, 사실 List는 랜덤 접근 기반 구현이다.

ArrayList

AbstrackList를 상속받고 List, RandomAccess, Cloneable, Serializable를 구현한 List의 구현체다.

생성자

크기 조절이 가능한 배열로 잘 알려져있으며, 생성자는 총 3종류가 있다.
ArrayList<>() : 초기 용량이 10인 빈 List
ArrayList(Collection<? extends E> c) : 컬렉션 c의 모든 요소를 복사해서 List로 만든다.
ArrayList<>(size) : 초기 용량이 size인 빈 List

메소드

메소드는 좀 많은데, 대표적인거만 보면 다음과 같다.

추가

add(int idx,E e):지정된 요소를 idx에 삽입한다. 생략하면 가장 뒤에 추가한다.
addAll(int index, Collection<? extends E> c) : 컬렉션을 전부 idx 부터 추가한다. 생략하면 가장 뒤에

읽기/찾기

get(int idx) : 해당 위치에 있는 요소 반환
contains(Object o) : 이 인스턴스에 o 가 있으면 true
indexOf(Object o) : 이 요소가 있는 idx 반환, 없으면 -1

삭제

remove(int idx) : 해당 인덱스의 요소 삭제
remove(Object o) : 가장 앞에있는 o 삭제
removeRange(int start,int end) : 범위삭제
clear() : 모든 요소 삭제

수정

'set(int idx, E element)' : 해당 idx의 요소를 element로 수정

기타

size() : 저장된 요수의 수 반환
subList(int from, int to) : from~to-1까지의 원소를 갖는 List 생성
toArray() : List를 Array로 변환후 반환
equlas,toString,..

더 보러가기

CopyOnWriteArrayList

ArrayList에서 쓰레드 안전성을 추가한 버전이라고 보면 된다.
읽기 작업이 많은 멀티쓰레드 환경에서 효울적이며, 쓰기 작업 수행마다 내부 배열을 복사하는 특징이 있다.

읽기는 시간복잡도가 O(1)로 매우 빠르지만, 쓰기는 O(n)로 좀 느리다. 그 이유는 복사를 하기 때문.

LinkedList

LinkedList는 위에서 언급한 AbstractSequentialList를 상속하고, List, Dequq, Clonable, Serializable을 구현했다.

ArrayList와 메소드는 거의 공유한다고 보면 된다. 다만, Dequq(양방향 Queue)를 구현해서 Queue 기능이 추가되었는데, 그건 Dequq에서 설명할 예정.

ArrayList vs LinkedList

get: O(1) vs O(n)
add: O(n) vs O(1)
remove : O(n) vs O(1)

사실 ArrayList에 add, remove도 index지정 안하면 O(1)인데, 일반성을 위해서 무작위 index로 가정했다.

위에서 시간복잡도를 통해 예측이 가능한데, ArrayList는 접근이 빠른 장점이 있다. 즉 읽기 중심 작업에 특화되어 있고,

LinkedList는 추가, 삭제가 빠른 장점이 있지만, 접근이 느린 단점이 있는걸로 보아 쓰기 중심 작업에 특화되어 있음을 알 수 있다.

RoleList

ArrayList를 상속받는 객체이다. 관계를 생성할 때 매개변수로 사용된다.

RoleUnresolvedList

ArrayList를 상속받는 객체이다. Role에 엑세스시 문제가 발생하여 검색되지 않는 Role을 나타내는 RoleUnresolved의 목록을 나타낸다.

Vector

AbstractList를 상속받고 List, RandomAccess, Cloneable, Serializable를 구현한 동기화 List이다.

ArrayList와 유사하지만 사용 목적이 다르다.

특징

  1. 동기화 : 동기화된 메서드를 제공하며 멀티스레드 환경에서도 안전하다. 즉, Vector는 데이터의 일관성을 보장한다. 다만, 성능 오버헤드가 발생할 수 있어서 성능이 중요하면 비동기화 컬렉션인 ArrayList를 사용하는걸 고려해야한다.
  2. 사이즈 조정 : 배열의 size를 자동으로 조절한다.

List를 구현했기 때문에 메소드는 대부분 동일하다.

profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글