[JAVA]컬렉션 프레임워크

ggamang·2022년 9월 18일
0

JAVA&Spring

목록 보기
6/27

Collections Framework

컬렉션 프레임웍

다수의 객체를 다루기 위한 표준화된 프로그래밍 방식
컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
java.util패키지에 포함

컬렉션

여러 객체(데이터)를 모아 놓은 것

프레임워크

표준화, 정형화된 체계적인 프로그래밍 방식
자유도는 떨어지나, 생산성 증대, 유지보수 용이

라이브러리

기능만 제공

Collections 클래스

다수의 데이터를 저장할 수 있는 클래스

컬렉션을 위한 static 메서드 제공
1. 컬렉션 채우기, 복사, 검색 : fill(), copy(), sort(), binarySearch() 등
2. 컬렉션 동기화 : synchronizedXXX()
3. 변경불가 컬렉션 만들기 : unmodifiableXXX()
4. 싱글톤 컬렉션 : singletonXXX()
5. 한 종류의 객체만 저장 : checkedXXX()

핵심 인터페이스

Collection 인터페이스

List, Set 공통 요소

메서드

  1. 추가
    boolean add(Object o)
    boolean addAll(Collection c)
  2. 삭제
    boolean remove(Object o)
    boolean removeAll(Collection c)
  3. 검색
    boolean contains(Object o)
    boolean containsAll(Collection c)
    boolean isEmpty()
    int size()

Iterator, ListIterator, Enumeration

컬렉션에 저장된 데이터를 접근하는데 사용하는 인터페이스
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것

컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다

List list = new ArrayList();
Iterator it = list.iterator(); 	// Iterator 객체 반환

Enumerations는 Iterator의 구버전으로 Iterator를 사용하면 됨
ListIterator는 Iterator의 접근성을 향상시킨 것(양방향)

단, Map에는 iterator()가 없다 (Map은 Collection의 자손이 아니다)
☞ keySet(), entrySet(), values()를 호출해야 한다

Map map = new HashMap();
...
Iterator it = map.entrySet().iterator();

Iterator 메서드

boolean hasNext()
Object next()

Enumerator 메서드

boolean hasMoreElements()
Object nextElement()

Arrays

배열을 다루기 편리한 static 메서드 제공
1. 배열 출력 - toString()
2. 배열 복사 - copyOf(), copyOfRange()
3. 배열 채우기 - fill(), setAll()
4. 정렬, 검색 - sort(), binarySearch()

순차탐색 vs 이진탐색
순차탐색 - 정렬X
이진탐색 - 정렬O, 둘로 나누어가며 검색

  1. 다차원 배열 출력 - deepToString()
  2. 다차원 배열 비교 - deepEquals()
  3. 배열을 List로 변환 - asList(Object... a)
    ❗️ list는 읽기 전용이라 변경 불가 ☞ 배열로 변경해서 수정 후 list로 변환해야 한다
  4. 람다와 스트림 관련 - parallelXXX(), spliterator(), stream()

Comperator, Comparable

Comperator : 기본 정렬기준 외 다른 기준으로 정렬하고자 할 때 사용
Comparable : 기본 정렬기준 구현

static void sort(Object[] a)				// Comparable에 의한 기본 정렬
static void sort(Object[] a, Comperator c)	// 지정한 Comperator에 의한 정렬
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);

List

순서가 있는 데이터의 집합
데이터의 중복을 허용한다

구현 클래스

ArrayList, LinkedList, Stack, Vector 등

메서드

  1. 추가
    void add(int index, Object element)
    boolean addAll(int index, Collection c)
  2. 삭제
    Object remove(int index)
  3. 검색
    int indexOf(Object o)
    int lastIndexOf(Object o)
  4. 기타
    Object get(int index)
    Object set(int index, Object element)
    void sort(Comperator c)
    List subList(int fontindex, int toindex)

ArrayList

기존의 Vector(동기화처리 O)를 개선한 것, ArrayList는 동기화처리 X
데이터 저장공간으로 배열을 사용한다
저장순서가 유지되고 중복을 허용한다

생성자

ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)

메서드

  1. 추가
    boolean add(Object o)
    void add(int index, Object element)
    boolean addAll(Collection c)
    boolean addAll(int index, Collection c)
  2. 삭제
    boolean remove(Object o)
    Object remove(int index)
    boolean removeAll(Collection c)
    void clear()

객체의 삭제 과정

list.remove(2); 호출
1) 삭제할 데이터 아래의 데이터를 한 칸씩 뒤로 복사해서 삭제할 데이터를 덮어쓴다
2) 마지막 데이터는 null로 변경
3) size 값을 감소시킨다

  1. 검색
    int indexOf(Object o)
    int lastIndexOf(Object o)
    boolean contains(Obejct o)
    Object get(int index)
    Object set(int index, Object element)
  2. 기타
    List subList(int fromIndex, int toIndex)
    Object[] toArray()
    Object[] toArray(Object[] a)
    boolean isEmpty()
    void trimToSize()
    int size()

Stack

LIFO, 배열로의 구현이 효율적이다
Stack 클래스 존재

Stack st = new Stack();
st.push("a");

Stack 메서드

boolean empty()
Object peek()
Object push()
Object push(Object item)
int search(Obejct o)

활용

수식계산, 수식괄호검사, 워드프로세서의 undo,redo, 웹브라우저의 뒤로/앞으로

LinkedList

배열의 장단점

장점) 구조가 간단하고 데이터 읽어오는데 걸리는 시간이 짧다
단점) 크기를 변경할 수 없다. 비순차적인 데이터의 추가 및 삭제에 시간이 많이 걸린다.

☞ 배열의 단점을 보완
LinkedList는 불연속적으로 존재하는 데이터를 연결
⎻ 데이터 삭제: 단 한 번의 참조 변경만으로 가능
⎻ 데이터 추가: 한 번의 Node 객체 생성, 두 번의 참조 변경만으로 가능
단, 데이터 접근성이 나쁘다

Queue

FIFO, LinkedList가 효율적이다(앞에서부터 삭제)
Queue 인터페이스 존재
☞ Queue 직접 구현
☞ Queue를 구현한 클래스들 중 하나를 사용 :"LinkedList"

Queue q = new LinkedList();
q.offer("a");

Queue 메서드

boolean add(Object o) - 추가(예외발생)
Object remove() - 삭제(예외발생)
Object element()
boolean offer(Object o) - 추가(예외발생X)
Object poll() - 삭제(예외발생X)
Object peek()

활용

최근사용문서, 인쇄작업 대기목록, 버퍼

ArrayList vs LinkedList

성능비교

  1. 순차 추가/삭제 : ArrayList가 더 빠르다
  2. 비순차 추가/삭제 : LinkedList가 더 빠르다
  3. 접근시간 : ArrayList가 더 빠르다

Set

순서를 유지하지 않는 데이터의 집합
데이터의 중복을 허용하지 않는다

구현 클래스

HashSet, TreeSet 등

메서드

Collection 인터페이스와 동일

집합과 관련된 메서드(Collection에 변화가 있으면 true, 아닌면 false)

  • boolean addAll(Collection c) - 합집합
  • boolean containsAll(Collection c) - 부분집합
  • boolean removeAll(Collection c) - 차집합
  • boolean retainAll(Collection c) - 교집합

HashSet

Set 인터페이스를 구현한 대표적인 컬렉션 클래스

중복을 허용하지 않기 때문에 저장하기 전에 같은 객체 존재 여부 체크
☞ boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
❗️ equals(), hashCode() 오버라이딩 되어 있어야 HashSet이 바르게 동작함

순서를 유지하려면 LinkedHashSet클래스를 사용

생성자

HashSet()
HashSet(Collection c)
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor)

메서드

boolean add(Object o)
boolean addAll(Collection c) - 합집합
boolean remove(Object o) - 삭제
boolean removeAll(Collection c) - 교집합
boolean retainAll(Collection c) - 차집합
void clear()

boolean contains(Object o)
boolean containsAll(Collection c)
iterator iterator()

boolean isEmpty()
int size()
Object[] toArray()
Object[] toArray(Object[] a)

TreeSet

이진 탐색 트리로 구현
⎻ 모든 노드가 최대 2개의 하위 노드를 갖는다
⎻ 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장한다

범위검색과 정렬에 유리한 컬렉션 클래스
HashSet보다 데이터 추가, 삭제에 시간이 더 걸린다(비교횟수 증가)

생성자

TreeSet()
TreeSet(Collection c)
TreeSet(Comperator comp) - 주어진 정렬기준으로 정렬하는 TreeSet 생성

메서드

boolean add(Object o)

데이터 저장과정
루트부터 트리를 따라 내려가며 값을 비교
값이 작으면 왼쪽, 크면 오른쪽에 저장한다

Object first()
Object last()
Object celing(Object o) - 같은 객체 반환, 없으면 큰 값 가진 객체 중 가장 가까운 값 객체 반환
Object floor(Object o)
Object higher(Object o)
Object lower(Object o)
SortedSet subset(Object fromElement, Object toElement)
SortedSet headset(Obejct toElement) - 지정 객체보다 작은 값
SortedSet tailSet(Object from Element) - 지정 객체보다 큰 값

Map

key와 value의 쌍으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않으나 값은 중복을 허용한다

구현 클래스

HashMap, TreeMap, Hashtable, Properties 등

메서드

  1. 추가
    Object put(Object key, Object value)
    void putAll(Map t)
  2. 삭제
    Object remove(Object key)
  3. 검색
    Object get(Object key)
    boolean containsKey(Object key)
    boolean containsValue(Object value)
  4. 기타
    Set entrySet() - key, value 쌍
    Set keySet() - key 만
    Collection values() - value 만

HashMap

Map인터페이스를 구현한 대표적인 컬렉션 클래스
순서를 유지하려면 LinkedHashMap클래스 사용
해싱기법으로 데이터를 저장하여 데이터가 많아도 검색이 빠르다

생성자

HashMap()
HashMap(int initialCapacity)
HashMap(int initialCapacity, fload loadFactor)
HashMap(Map m)

메서드

Object put(Object key, Object value)
void putAll(Map m)
Object remove(Object key)
Object replace(Object key, Object value)
boolean replace(Object key, Object oldValue, Object newValue)

Set entrySet()
Set keySet()
Collection Values()

Object get(Object key)
Object getOrDefault(Object key, Object defaultValue)
boolean containsKey(Object key)
boolean containsValue(Object value)

int size()
boolean isEmpty()
void clear()
Object clone()

TreeMap

범위 검색과 정렬에 유리
HashMap보다 데이터 추가, 삭제에 시간이 더 걸림

0개의 댓글