공부/Java

[Java-11] 컬렉션 프레임웍 - ArrayList, LinkedList

줭♪(´▽`) 2021. 4. 13. 11:29

1. 컬렉션 프레임웍(Collections Framework)

1) 컬렉션 프레임웍이란?

- 데이터 군(群)을 저장하는 클래스들을 표준화한 설계

- 컬렉션(Collection) : 다수(多數)의 데이터

- 프레임웍(Framework) : 표준화된 프로그래밍 방식

- 컬렉션 클래스 : 다수의 데이터를 저장할 수 있는 클래스

 

2) 컬렉션 프레임웍의 장점

(1) 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공

-> 프로그래머의 짐을 덜어줌

(2) 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화

-> 사용법이 편리하고 재사용성이 높음

 

3) 핵심 인터페이스

 

- 컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하여 각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의함

- List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스 Collection을 추가로 정의함

 

인터페이스 특 징
List 순서가 있는 데이터의 집합, 데이터의 중복을 허용함
ex) 대기자 명단
구현클래스 : ArrayList, LinkedList, Stack, Vector 등
Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않음
ex) 양의 정수집합, 소수의 집합
구현클래스 : HashSet, TreeSet 등
Map 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합,
순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용함
ex) 우편번호, 지역번호(전화번호)
구현클래스 : HashMap, TreeMap, Hashtable, Properties 등

 

 

4) Collection 인터페이스

- List와 Set의 조상

- 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고, 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의함

 

boolean add(Object o)
boolean addAll(Collection c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가함
void clear() Collection의 모든 객체를 삭제
boolean contains(Object o)
boolean containsAll(Collection c)
지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인
boolean equals(Object o) 동일한 Collection인지 비교
int hashCode() Collection의 hash code를 반환
boolean isEmpty() Collection이 비어있는지 확인
Iterator iterator() Collection의 Iterator를 얻어서 반환
boolean remove(Object o) 지정된 객체를 삭제
boolean removeAll(Collection c) 지정된 Collection에 포함된 객체들을 삭제
boolean retainAll(Collection c) 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제.
이 작업으로 인해 Collection에 변화가 있으면 true를, 그렇지 않으면 false를 반환
int size() Collection에 저장된 객체의 개수를 반환
Object[] toArray() Collection에 저장된 객체를 객체배열(Object[])로 반환
Object[] toArray(Object[] a) 지정된 배열에 Collection의 객체를 저장해서 반환

 

 

5) List 인터페이스

- 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용

- Collection인터페이스로부터 상속받은 것들은 제외한 메서드

 

void add(int index, Object element)
boolean addAll(int index, Collection c)
지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가
Object get(int index) 지정된 위치(index)에 있는 객체를 반환
int indexOf(Object o) 지정된 객체의 위치(index)를 반환
(List의 첫 번째 요소부터 순방향으로 찾음)
int lastIndexOf(Object o) 지정된 객체의 위치(index)를 반환
(List의 마지막 요소부터 역방향으로 찾음)
ListIterator listIterator()
ListIterator listIterator(int index)
List의 객체에 접근할 수 있는 ListIterator를 반환
Object remove(int index) 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환
Object set(int index, Object element) 지정된 위치(index)에 객체(element)를 저장
void sort(Comparator c) 지정된 비교자(comparator)로 List를 정렬
List subList(int fromIndex, int toIndex) 지정된 범위(fromIndex부터 toIndex)에 있는 객체 반환

 

 

6) Set 인터페이스

- 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용

 

7) Map 인터페이스

- 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용

- 키는 중복될 수 없지만 값은 중복을 허용함

- 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막 저장된 값이 남음

 

void clear() Map의 모든 객체를 삭제
boolean containsKey(Object key) 지정된 key객체와 일치하는 Map의 key객체가 있는지 확인
boolean containsValue(Object value) 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인
Set entrySet() Map에 저장되어 있는 key-value 쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환
boolean equals(Object o) 동일한 Map인지 비교
Object get(Object key) 지정된 key객체에 대응하는 value객체를 찾아서 반환
int hashCode() 해시코드를 반환
boolean isEmpty() Map이 비어있는지 확인
Set keySet() Map에 저장된 모든 key객체를 반환
Object put(Object key, Object value) Map에 value객체를 key객체에 연결(mapping)하여 저장
void putAll(Map t) 지정된 Map의 모든 key-value쌍을 추가
Object remove(Object key) 지정된 key객체와 일치하는 key-value객체를 삭제
int size() Map에 저장된 key-value쌍의 개수를 반환
Collection values() Map에 저장된 모든 value객체 반환

 

 

8) Map.Entry 인터페이스

- Map인터페이스의 내부 인터페이스

- Map에 저장되는 key-value쌍을 다루기 위해 정의됨

 

boolean equals(Object o) 동일한 Entry인지 비교
Object getKey() Entry의 key객체 반환
Object getValue() Entry의 value객체 반환
int hashCode() Entry의 해시코드 반환
Object setValue(Object value) Entry의 value객체를 지정된 객체로 바꿈

 

 


 

2. ArrayList

- List인터페이스를 구현하여 데이터의 저장순서가 유지되고 중복을 허용함

- 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스

- Vector와 구현원리와 기능적인 측면에서 동일함

 

- Object배열을 이용해서 데이터를 순차적으로 저장 (0번째, 1번째, ...)

- 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 뒤 저장

 

1) 생성자

 

ArrayList() 크기가 10인 ArrayList 생성
ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList 생성
ArrayList(int initialCapacity) 지정된 초기용량을 갖는 ArrayList 생성

 

2) 데이터 추가

 

boolean add(Object o) ArrayList의 마지막에 객체 추가, 성공하면 true
void add(int index, Object element) 지정된 위치(index)에 객체 저장
boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장
boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
Object set(int index, Object element) 지정된 위치(index)에 주어진 객체 저장

 

3) 데이터 삭제

 

void clear() ArrayList를 완전히 비움
Object remove(int index) 지정된 위치(index)에 있는 객체 제거
boolean remove(Object o) 지정된 객체를 제거, 성공하면 true
boolean removeAll(Collection c) 지정된 컬렉션에 저장된 것과 동일한 객체들을 제거
boolean retainAll(Collection c) 지정된 컬렉션과 공통된 것만을 남기고 나머지는 제거

 

4) 데이터 가져오기

 

Object get(int index) 지정된 위치(index)에 저장된 객체 반환
Iterator iterator() ArrayList의 Iterator객체 반환
ListIterator listIterator() ArrayList의 ListIterator객체 반환
ListIterator listIterator(int index) ArrayList의 지저된 위치부터 시작하는 ListIterator객체 반환
List subList(int fromIndex, int toIndex) fromIndex부터 toIndex사이에 저장된 객체 반환

 

5) 기타

 

Object clone() ArrayList 복제
boolean contains(Object o) 지정된 객체(o)가 ArrayList에 포함되어 있는지 확인
int indexOf(Object o) 지정된 객체(o)가 저장된 위치 반환(순방향)
int lastIndexOf(Object o) 지정된 객체(o)가 저장된 위치 반환(역방향)
boolean isEmpty() 비어있는지 확인
int size() 저장된 객체 개수 반환
void sort(Comparator c) 지정된 정렬기준(c)로 ArrayList 정렬
Object[] toArray() 모든 객체들을 객체배열로 반환
Object[] toArray(Object[] a) 모든 객체들을 객체배열 a에 담아 반환
void trimToSize() 용량을 크기에 맞게 줄임 (빈 공간을 없앰)
void ensureCapacity(int minCapacity) 용량이 최소한 minCapacity가 되도록 함

 


 

3. LinkedList

 

배열의 단점

1. 크기를 변경할 수 없음
2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸림

 

 

- 배열의 단점을 보완하기 위해 고안된 자료구조

- 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성

 

1) 생성자

 

LinkedList() LinkedList 객체 생성
LinkedList(Collection c) 주어진 컬렉션을 포함하는 LinkedList 객체 생성


2) 데이터 추가

 

boolean add(Object o) 지정된 객체(o)를 LinkedList의 끝에 추가, 성공하면 true
void add(int index, Object element) 지정된 위치에 객체 추가
boolean addAll(Collection c) 주어진 컬렉션에 포함된 모든 요소를 LinkedList의 끝에 추가, 성공하면 true
boolean addAll(int index, Collection c) 지정된 위치에 주어진 컬렉션에 포함된 모든 요소를 LinkedList의 끝에 추가, 성공하면 true
Object set(int index, Object element) 지정된 위치의 객체를 주어진 객체로 바꿈

 

3) 데이터 삭제

 

void clear() LinkedList를 완전히 비움
Object remove(int index) 지정된 위치(index)에 있는 객체 제거
boolean remove(Object o) 지정된 객체를 제거, 성공하면 true
boolean removeAll(Collection c) 지정된 컬렉션에 저장된 것과 동일한 객체들을 제거
boolean retainAll(Collection c) 지정된 컬렉션과 공통된 것만을 남기고 나머지는 제거

 

4) 데이터 가져오기

 

Object get(int index) 지정된 위치(index)에 저장된 객체 반환
Iterator iterator() LinkedList의 Iterator객체 반환
ListIterator listIterator() LinkedList의 ListIterator객체 반환
ListIterator listIterator(int index) LinkedList의 지저된 위치부터 시작하는 ListIterator객체 반환
List subList(int fromIndex, int toIndex) fromIndex부터 toIndex사이에 저장된 객체 반환

 

5) 기타

 

boolean contains(Object o) 지정된 객체(o)가 LinkedList에 포함되어 있는지 확인
boolean containsAll(Collection c) 지정된 컬렉션의 모든 요소가 포함되어 있는지 확인
int indexOf(Object o) 지정된 객체(o)가 저장된 위치 반환(순방향)
int lastIndexOf(Object o) 지정된 객체(o)가 저장된 위치 반환(역방향)
boolean isEmpty() 비어있는지 확인
int size() 저장된 객체 개수 반환
void sort(Comparator c) 지정된 정렬기준(c)로 LinkedList 정렬
Object[] toArray() 모든 객체들을 객체배열로 반환
Object[] toArray(Object[] a) 모든 객체들을 객체배열 a에 담아 반환

 

6) Queue인터페이스와 Deque인터페이스를 구현하면서 추가된 것들

 

Object element() LinkedList의 첫 번째 요소 반환
boolean offer(Object o) 지정된 객체(o)를 LinkedList의 끝에 추가, 성공하면 true
Object peek() LinkedList의 첫 번째 요소 반환
Object poll() LinkedList의 첫 번째 요소 반환 (LinkedList에서는 제거됨)
Object remove() LinkedList의 첫 번째 요소 제거

 

void addFrist(Object o) LinkedList의 맨 앞에 객체 추가
void addLast(Object o) LinkedList의 맨 끝에 객체 추가
Iterator descendingIterator() 역순으로 조회하기 위한 DescendingIterator 반환
Object getFirst() LinkedList의 첫 번째 요소 반환
Object getLast() LinkedList의 마지막 요소 반환
boolean offerFirst(Object o) LinkedList의 맨 앞에 객체 추가, 성공하면 true
boolean offerLast(Object o) LinkedList의 맨 끝에 객체 추가, 성공하면 true
Object peekFirst() LinkedList의 첫 번째 요소 반환
Object peekLast() LinkedList의 마지막 요소 반환
Object poolFirst() LinkedList의 첫 번째 요소 반환하면서 제거
Object poolLast() LinkedList의 마지막 요소 반환하면서 제거
Object pop() removeFirst()와 동일
void push(Object o) addFirst()와 동일
Object removeFirst() LinkedList의 첫 번째 요소 제거
Obejct removeLast() LinkedList의 마지막 요소 제거
boolean removeFirstOccurrence(Object o) LinkedList에서 첫 번째로 일치하는 객체 제거
boolean removeLastOccurrence(Object o) LinkedList에서 마지막으로 일치하는 객체 제거

 

 

 

 

 

※ ArrayList와 LinkedList의 비교

 

컬렉션 읽기(접근시간) 추가/삭제 비 고
ArrayList 빠르다 느리다 순차적인 추가삭제는 더 빠름
비효율적인 메모리 사용
LinkedList 느리다 빠르다 데이터가 많을수록 접근성이 떨어짐

 

 

 

 

 

 

 

참고 - Do it! 자료구조와 함께 배우는 알고리즘 입문 : 자바 편 (저자 : 보요 시바타, 출판 : 이지스 퍼블리싱)