Java - 컬렉션 프레임워크

진경천·2024년 9월 22일

Java

목록 보기
3/9

Collection framework

컬렉션 프레임 워크란 객체들을 효율적으로 관리하기 위해 표준화된 방법
크기 고정, 타입 제한, 유선성 부족 등의 배열의 한계를 극복하기 위해 고안돼었다.

Collection은 하나의 인터페이스로

주요 인터페이스로는 List Set Map이 있다.

List

말 그대로 객체들의 목록을 저장할 수 있는 인터페이스이다.

주요 메서드

메서드 리턴타입 설명
add(E element) boolean 매개 변수로 넘어온 요소를 추가
contains(E element) boolean 매개변수로 넘어온 요소가 있는지 확인
get(int index) E 주어진 인덱스에 저장된 객체 반환
remove(int index) E 주어진 인덱스에 저장된 객체 반환 및 제거
isEmpty() boolean 컬렉션이 비어있는지 확인
set(int index, E e) E 특정 인덱스의 요소를 전달 받은 객체로 대체
size() int 리스트의 요소의 총 개수를 반환
toArray() Object[] 리스트의 모든 요소를 Object타입의 배열로 반환

List의 특징

  • 순서 보장
  • 중복 허용
  • 인덱스를 사용해 요소에 접근

List 인터페이스를 상속 받는 주요 클래스는 ArrayList LinkedList Stack 등이 있다.

ArrayList

배열을 이용해 요소를 저장하기 때문에 인덱스를 이용해 요소에 빠르게 접근할 수 있다.
하지만 배열은 크기를 변경할 수 없기 때문에 요소의 추가 및 삭제에 걸리는 시간이 매우 길어진다.

  • 제한없는 객체 추가
  • 객체의 주소 저장
  • Random Access

LinkedList

linked list 구조를 이용하여 요소를 저장한다.
그렇기 때문에 데이터의 삽입 / 삭제에 유리하다.

ArrayList VS LinkedList

ArrayList LinkedList
데이터 저장 방식 동적 배열 이중 연결 리스트
메모리 사용 효율적
- 데이터만 저장
비효율적
- 노드 별로 데이터와 함께 포인터 저장
삽입/삭제 시간 비효율적
- 배열 크기 조정, 요소 이동
빠름
사용 접근이 빈번한 경우 삽입/삭제가 빈번한 경우
무작위 접근 시간 빠름 느림
순차 접근 시간 빠름

TreeList

Set

  • 순서 보장 ❌
  • 중복 ❌

주요 메서드

메서드 리턴타입 설명
add(E element) boolean 매개 변수로 넘어온 요소를 추가
contains(E element) boolean 매개변수로 넘어온 요소가 있는지 확인
remove(int index) E 주어진 인덱스에 저장된 객체 반환 및 제거
isEmpty() boolean 컬렉션이 비어있는지 확인
size() int 요소의 총 개수를 반환
toArray() Object[] 모든 요소를 Object타입의 배열로 반환

Set 인터페이스를 상속 받는 주요 클래스는 HashSet LinkedHashSet TreeSet 등이 있다.

HashSet

해시 알고리즘을 사용하여 검색 속도가 매우 빠르다.

해시 알고리즘이란?

해시 함수를 이용해 데이터를 저장하는 방법이다.

자세한 설명은 아래 링크에 설명했다.

https://velog.io/@rudcjs335/Java-Hash-Algorithm

LinkedHashSet

위 HashSet과 같이 해시 알고리즘을 사용하여 검색 속도가 매우 빠르다.
다만, 연결 리스트를 사용하여 데이터의 저장 순서가 보장된다.

TreeSet

데이터를 정렬된 상태로 저장되는 BST 형태로 요소를 저장한다.
데이터 삽입/제거의 동작 시간이 매우 빠르다.

JDK 1.2부터는 NavigableSet 인터페이스를 더욱 향상 시킨 Red-Black tree로 구현한다.

Map

데이터를 Key-Value로 이루어진 하나의 쌍으로 저장한다.
Key란 실질적인 데이터 Value를 찾기 위한 이름의 역할을 한다.
구조상의 차이로 인해 Collection 인터페이스를 상속 받지 않는다.

  • Key - Value로 구성
  • Key 중복 ❌
  • Value 중복 허용

주요 메서드

메서드 리턴타입 설명
put(K key, V value) V key와 value를 매핑하여 저장
get(K key) V 전달 받은 key에 대응하는 value 반환, 없다면 null 반환
remove(K Key) V key에 대응하는 매핑 제거
isEmpty() boolean 맵이 비어있는지 확인
size() int 매핑의 총 개수를 반환
containsKey(K key) boolean key를 포함하고 있는지 확인
containsValue(V value) boolean value를 포함하고 있는지 확인

Map 인터페이스를 상속 받는 주요 클래스는 HashMap TreeMap 등이 있다.
HashMapTreeMap의 특징은 Set과 동일하기에 설명을 생략한다.

Iterator

  • 객체들을 순회하는 표준화된 방법 제공
  • 직접적인 요소 접근 제한

주요 메서드

메서드 리턴타입 설명
hasNext() boolean iteration이 다음 요소를 가지고 있다면 true, 그렇지 않다면 false 반환
next() E iteration의 위치를 다음 값으로 이동하고 그 값을 반환
remove() void iterator가 마지막으로 반환한 값을 컬랙션에서 제거

하지만 현재 자바에서는 객체를 순회할 때 향상된 for문 사용하도록 권장하고 있다.

Stack

후입선출(LIFO) 특성을 가진다.

데이터를 상자안에 쌓는다고 생각하면 좋다.
데이터를 쌓고 반출할 때는 가장 마지막에 쌓은 데이터를 반환하게 된다.

주요 메서드

메서드 리턴타입 설명
empty() boolean 스택이 비어있는지 확인
push(E element) E 스택의 제일 상단에 요소 저장
pop() E 스택의 제일 상단에 있는 요소를 반환하고 제거
peek() E 스택의 제일 상단에 있는 요소를 반환
search(Object o) int 요소가 저장된 위치의 인덱스를 반환
인덱스는 1부터 시작하며 제일 상단의 위치부터 시작

Queue

선입선출(FIFO) 특성을 가진다.

데이터를 대기열에 세운다고 생각하면 좋다.
데이터를 줄에 세우고 반출할 때는 가장 먼저 줄ㅇ츨 섰던 데이터를 반출한다.

주요 메서드

메서드 리턴타입 설명
add(E element) boolean 큐의 매뒤에 요소 삽입
성공하면 true, 실패하면 IllegalStateException발생
offer(E element) boolean 큐의 맨뒤에 요소 삽입
peek() E 큐의 맨 앞에 있는 요소 반환
poll() E 큐의 맨 앞에 있는 요소 반환 및 제거
비어 있다면 null 반환
remove() E 큐의 맨 앞에 있는 요소 반환

Deque

Queue와 동일한 자료 구조를 갖지만 요소를 앞 뒤로 추가 및 제거할 수 있다.

즉, StackQueue의 특성을 모두 가진 자료구조이다.

주요 메서드

개인적으로 Deque의 메서드는 StackQueue와 혼동하기 쉽다고 생각한다.
그렇기에 아래 링크에서 숙달하는것이 좋다고 생각한다.
https://docs.oracle.com/javase/8/docs/api/

profile
어중이떠중이

0개의 댓글