4/29, 4/30, 5/1 컬렉션 프레임워크

박세현·2024년 4월 29일

JAVA

목록 보기
17/22
post-thumbnail

컬렉션 프레임워크(Collections Framework)

  • 컬렉션(Collections) : 데이터 군, 데이터 군집, 자료
    ex) 배열...

  • 프레임워크(Framework) : 표준화된 설계

  • 데이터 군을 다루는데 필요한 클래스를 표준화서 설계

참고)

  • 프레임워크 : 개발 방식의 틀을 정해 놓은 것
    ex) 스프링 웹 MVC 프레임워크

  • 라이브러리 : 편의 기능을 모은 것


1. 컬렉션 프레임워크 핵심 인터페이스

  • 자료에 대한 처리 구조 3가지

Collection 인터페이스


Interface Collection<E>
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collection.html


참고) 컬렉션 프레임워크의 주요 작업
C (Create) : 데이터 추가
R (Read) : 데이터 조회
U (Update) : 데이터 변경
D (Delete) : 데이터 삭제




1. List : 순차 자료 구조에대한 설계

  • 순서가 있는 자료, 순서대로 입력되는 형태
    ex) 배열
  • 특정 순서에 추가, 제거, 변경 등의 매개변수가 정의된 메서드가 많다
    ex) 매개변수 : int index...
  • 순서⭕


참고) Interface List<E>
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html



1) 추가

- boolean add(E e)

- boolean add(int index, E e)

  • index : 순서

- boolean addAll(Collection<? extends E>...)

  • 매개변수 Collection : List, Set 모두 받을 수 있다

- boolean addAll(int index, Collection...)

  • 매개변수 Collection : List, Set 모두 받을 수 있다



2) 조회

- E get(int index)

- int indexOf(Object e)

  • 특정요소의 위치번호(왼쪽 -> 오른쪽), 없을 때는 -1

- int lastindexOf(Object e)

  • 특정요소의 위치번호(오른쪽 -> 왼쪽), 없을 때는 -1

- boolean contains(Object e)

- boolean containsAll(Collection<?>..)

  • 매개변수 Collection : List, Set 모두 받을 수 있다



3) 수정

- E set(int index, E e)

  • 특정 위치에 있는 요소를 변경



4) 삭제

- E remove(int index)

  • 특정 순서위치에 있는 요소 제거(꺼낸다...)

- boolean remove(Object e)

- boolean removeAll(Collection...)

  • 매개변수 Collection : List, Set 모두 제거 능



5) 기타

- int size()

  • 요소의 갯수

- void clear()

  • 요소 비우기

- retainAll(Collection..)

  • 매개변수에 있는 값만 유지하고 모두 제거(교집합)

- static <E> of(E...)

  • 정적으로 객체를 만드는 기능
  • 수정불가(?)

- replace

  • 교체

- toArray()

  • 배열형태로 다시 변환
    • Object[] toArray()
      항상 Object 타입의 배열을 반환하며, 이를 사용하려면 배열 요소를 적절한 타입으로 캐스팅해야함
    • <T> T[] toArray(T[] a)
      타입 안전성을 제공하며, 지정된 타입의 배열을 반환합니다. 이를 통해 명시적인 캐스팅이 필요❌


예시) Object[] toArray()



예시) <T> T[] toArray(T[] a)




6) 구현된 클래스

- ArrayList : 배열을 구현한 클래스

  • 스택 구현 시 활용 가능
  • 쓰레드 안정성 확보x
  • 기본 생성 배열 갯수 10, 공간의 갯수가 부족하면 -> 배열이 2배 크기로 새로 생성 -> 데이터의 양을 충분히 예상 할 수 있는 경우는 충분한 크기를 만들어야 성능이 좋다
    = 내부에 생성된 배열(기본 공간의 갯수10개)의 공간이 다 차면 2배로 늘어난다(새로운 배열이 생성)
  • 배열은 물리적으로 붙어있는 나열 구조 -> 순차 조회는 매우 빠르다 = 순방향, 역방향 조회 시 빠르다
  • 순서 위치가 바뀌는 수정, 삭제 -> 새로운 배열이 매번 생성 -> 성능 저하
  • List 구현 클래스 중 가장 많이 사용

ㄴ 추가
ㄴ 순서가 있는 반복
-> for문
-> size() : 요소의 갯수

ㄴ 조회

ㄴ 순서유지

ㄴ 삭제
ㄴ 음? 왜 다 삭제가 안됬지??

ㄴ 배열의 특징 : 순서(위치)가 바뀔 때 마다 새로운 배열이 만들어짐
ㄴ 매번 위치가 바뀔 때 마다 새로운 배열이 생성되기 때문에 완전히 삭제되지 않음
ㄴ 어떻게 완벽히 삭제하지?

ㄴ 역순으로 하면 순서 안바뀌어서 새로운 배열 생성도 안됨
ㄴ 마지막에 추가한걸 가장 먼저 제거 -> 스택
ㄴ 문제 해결

예시) 기본 생성 배열 갯수 10, 공간의 갯수가 부족하면 -> 배열이 2배 크기로 새로 생성

ㄴ 배열 공간의 갯수(기본 10개)

ㄴ 최초의 배열공간 갯수 설정

ㄴ 공간이 부족하네? 기존 배열 버리고 2배 크기로 새로 배열 생성하자

- LinkedList

  • 다음 요소, 이전 요소를 주소를 가지고 서로 연결 관계(물리적 순서x, 논리적 순서o)
  • 수정 삭제 등, 순서 위치가 자주 변경되는 자료에서 유리
    ex) 주식차트
  • 조회 속도는 ArrayList 보다는 불리
  • 다음 요소 위치 주소만 변경하면 되므로, 성능 저하x
  • 논리적 순서이므로 위치를 계산하는 일을 더 하므로 ArrayList보다는 조회에서 분리
  • 자바는 DoublylinkedList 형태로 구현되어 있음 : 다음요소, 이전 요소의 주소를 모두 가지고 있는 형태
  • 큐인터페이스의 구현체
    • boolean offer(E e) : 끝에 요소 추가
    • E poll() : 앞에서 요소 꺼내기
  • Deque인터페이스(큐와 스택의 짬뽕)
    • boolean offerFirst(E e) : 요소 앞에 추가
    • boolean offerLast(E e) : 요소 끝에 추가

    • E pollFirst() : 가장 앞에 요소를 꺼내기
    • E pollLast() : 가장 뒤의 요소 꺼내기

ㄴ 다형성

예시) 큐인터페이스의 구현체

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/LinkedList.html

- Stack

E pop() : 끝 요소 꺼내기
E push(E e) : 끝에 추가

  • 배열은 스택에 최적화 되어 있다

- Vector: ArrayList 동일

  • 배열을 구현한 클래스
  • 쓰레드 안정성 확보
  • ArrayList 동일하지만 과거 기능과의 호환성 유지를 위해 남겨둠

참고) 자료, 자료구조

  • 자료 : 데이터 군, Collection
  • 자료구조 : 자료를 어떻게 처리할 것인지 방법적인 부분을 정의한 것
    • 순차 자료구조(List)
      • 스택 자료구조
      • 큐 자료구조
    • 집합(Set)
    • 사전(Map)



2. Set : 집합 자료 구조에 대한 설계

  • 중복이 없는 자료
    -> 중복제거 기준 : 동등성 비교 - equals() and hashCode()
  • 순서 유지는 중요x = 순서❌
    -> 순서관련된 메서드❌(조회, 수정메서드❌)
  • 중복❌, 순서❌

  • SuperInterface : 상속받은 클래스
  • SubInterface : 내가 상속을 준 클래스

참고)
A 집합 : 2, 3, 1, 4, 5
B 집합 : 8, 9, 4, 5, 6, 7


A 와 B의 합집합? 1, 2, 3, 4, 5, 6, 7, 8
-> A 집합, B 집합 모두 4, 5가 있지만 중복되지 않게 나온다

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html


① 추가

- boolean add(E e)

- boolean addAll(Collection..)


② 조회❌

  • 순서가 결정이 안되서 못 찾음 (index 없음 = 순서가 없다)
    -> 조회메서드 없음

③ 수정❌

  • 순서가 결정이 안되서 특정 위치를 못 찾음 (index 없음 = 순서가 없다)
    -> 수정메서드 없음

④ 삭제

- boolean remove(Object e)

- boolean removeAll(Collection...)


⑤ 기타

- int size()

  • 요소의 갯수

- void clear()

  • 전체 비우기

- boolean contains(Object e)

- boolean containsAll(Collection<?>..)

- boolean retainAll(Collection<?>..)


⑥ 구현된 클래스

- HashSet

- TreeSet

  • HashSet + 정렬



3. Map : 사전 자료구조에 대한 설계

  • 키, 값(value)의 쌍
  • 키 : 값을 찾기위한 자료, 값 -> 중복허용❌(집합자료)
  • 값 : 중복허용⭕(like 동음이의어)

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Map.html



① 추가

- V put(K key, V value)

  • key가 없을 땐 추가, 있을 땐 value값 수정

- void putAll(Map...)

  • Map 객체로 전체 추가 시

ㄴ 순서는 보장이 안됨

- V putIfAbsent(K key, V value)

  • key가 없을때만 value값 추가

② 조회

- V get(Object key)

  • key를 가지고 값 조회, 없을 땐 null

- V getOrDefault(Object key, V defaultValue)

  • key를 가지고 값 조회, 없을 땐 defaultValue로 대체

- Set<Map.Entry<K,V>> entrySet()

  • 전체 키 값의 쌍을 조회

참고) entries = 키 벨루 쌍


③ 수정

- V put(K key, V value)


ㄴ put : 없으면 추가 있으면 수정

- V replace(K key, V value)

- boolean replace(K key, V oldValue, V newValue

  • 기존 값이 oldValue로 일치하는 경우만 newValue로 변경

④ 삭제

- V remove(Object key)

  • key를 가지고 제거

- boolean remove(Object key, Object value)

  • key와 value가 일치하는 요소만 삭제

⑤ 기타

- int size()

  • 요소의 갯수

- Set<K> keySet()

  • Map에 포함되어 있는 키값만 추출

- Collection<V> values()

  • Map에 포함되어 있는 값만 추출

- boolean containsKey(Object key)

  • Map key가 포함되어 있는지 여부

- boolean contains(Object value)

  • Map value가 포함되어 있는지 여부

⑥ 구현된 클래스

- HashMap

- TreeMap

  • 키값의 정렬
    -> 기본 정렬 기준 : java.lang.Comparable / int compareTo(...)
    -> 대안기준 : java.util.Comparator / int compare(..)




2. Stack과 Queue

① Stack

- E pop() : 끝 요소 꺼내기

- E push(E e) : 끝에 추가

  • 배열은 스택에 최적화 되어 있다


② Queue

- boolean offer(E e) : 끝에 요소 추가

- E poll() : 앞에서 요소 꺼내기




3. Iterator, ListIterator, Enumeration

1) Iterator : 반복자 패턴 인터페이스

  • 참고) Enumeration 동일한 반복자 패턴 인터페이스, Iterator 보다 먼저 등장
  • Collection
    Iterator <E> iterator()
    Iterator
    boolean hasNext() : 다음 요소가 있는지 체크
    E next() : 다음 커서로 이동 요소를 조회



2) ListIterator : List에 특화되어 있는 Iterator

  • 순서에 대한 메서드가 정의
  • 순방향 조회 : hasNext(), next(), nextIndex()
  • 역방향 조회 : hasPrevious(), previous(), previousIndex()
  • 요즘은 Iterator 많이 안쓴다고...

-> 어짜피 반복은 처음부터 끝까지 조회가 많다!
-> 향상된for문




4. Comparable와 Comparator

1) Comparable : 기본 정렬 기준 인터페이스

  • java.lang.Comparable
  • 기본 정렬 기준 : Natural Ordering
  • int compareTo(T o)
    • 반환값이 양수 : 현재 객체 뒤로 배치, T o를 앞에 배치
    • 반환값이 0 : 배치x
    • 반환값이 음수 : 현재 객체를 앞으로 배치, T o는 뒤에 배치

    • 현재 객체의 정수 - 비교 객체의 정수 : 오름 차순
    • 비교 객체의 정수 - 현재객체의 정수 : 내림차순



2) Comparator : 대안적인 정렬 기준 인터페이스

  • 기본 기준을 바꾸지 못하는 경우(final 적용...)에 대안적인 기준을 사용
  • java.util.Comparator
  • int compare(T o1, To2)
    • o1 정수 - o2 정수 : 오름차순
    • o2 정수 - o1 정수 : 내림차순

  • Natural Order() : 기본 정렬 기준 사용한 정렬(java.lang.Comparable, int ComparTo(..))
  • reversedOder() : 기본 정렬 기준의 반대
    -> 기본 정렬 기준은 보통 오름차순이기 때문에 reversedOder()은 내림차순인 경우가 많을 다


기준

  • 기준이 필요한 이유? 애매하니까
    ex) 책이름, 책번호, 책저자 -> 어떤걸 기준으로 정렬하지? -> 애매함 -> 기준을 정해주자

  • 집합 : HashSet, TreeSet - 중복 제거 기준
    -> equals() and hashCode()

  • 정렬 : TreeSet - 기본 정렬 기준 (Natural Order)
    -> java.lang.Comparable
    -> int compareTo(T o)



5. Arrays

  • java.util.Arrays
  • 배열의 편의 기능 모음

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Arrays.html

참고)
Unsigned : 양수
byte : -128 ~ 127
Unsignedbyte : 0 ~ 255



1) Arrays.asList(T... a)

ㄴ asList는 수정불가

ㄴ 수정하고 싶을 시 새롭게 만들고 매개변수로 대입하여 새로운 List형태로 수정

2) Arrays.copyOf, Arrays.copyOfRange

3) Arrays.deepToString

  • 다차원 배열 값 구하기

ㄴ 난 값을 원해

4) Arrays.equals, Arrays.deepEquals

  • 1차원 배열 값 비교 : Arrays.equals
  • 다차원 배열 값 비교 : Arrays.deepEquals

5) Arrays.fill

  • 원래 배열에 채워넣을 때 사용

ㄴ 좋은 방식은 아님, 보여줄려고 이렇게 한 것

6) Arrays.mismatch

  • 배열에서 차이점이 발생하는 위치 알아내기
  • 동일하면 -1

7) Arrays.sort

  • 정렬하기
  • 기본기준(내츄럴 오더)을 기준으로 정렬됨

ㄴ 오름차순

ㄴ 내림차순으로 해보자 = 역으로 해보자
ㄴ Comparator : 래퍼클래스 형태로 해줘야함




6. Collections

  • java.util.Collections
  • 컬렉션의 편의 기능 모음

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html



1) Collections.addAll

  • 값 추가하기

2) Collections.frequency

3) Collections.max, Collections.min

  • max : 정렬 후 가장 마지막 요소
  • min : 정렬 후 가장 처음 요소

ㄴ 요소를 섞어놨어도 정렬하고 나서 가장 처음, 마지막 요소를 가져오기 때문에 값이 변하지x

4) Collections.shuffle

  • 요소 섞기

5) Collections.swap

  • 요소 위치 교체

6) Collections.reverse

  • 요소 역으로 정렬

7) Collections.replace

  • 요소 대체

8) Collections.sort

profile
귤귤

0개의 댓글