컬렉션 프레임워크 (Collection Fremework)
- 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들의 모음집
-> 자료구조 종류의 형태들을 자바 클래스로 구현한 모음집
- 자바에서는 저 모음집을 java.util 패키지에 포함시켜 놓았다.
- 주요 인터페이스로는 List, Set, Map이 있다.
- List와 Set은 객체를 추가,삭제하는 방법에 있어 공통점이 있어 공통된 메소드만 따로 모아서 Collection 인터페이스로 정의
- Map은 키와 값을 하나의 쌍으로 묶어서 관리하는 구조
Collection Interface
인터페이스 분류 | 특징 | 구현 클래스 |
List | - 순서를 유지하고 저장 - 중복 저장 가능 |
ArrayList, Vector, LinkedList |
Set | - 순서를 유지하지 않고 저장 - 중복 저장 안됨 |
HashSet, TreeSet |
Map Interface
인터페이스 분류 | 특징 | |
Map | - 키와 값으로 구성된 엔트리 저장 - 키는 중복 저장 안됨 |
HashMap, Hashtable, TreeMap, Properties |
List 컬렉션
- 객체를 인덱스로 관리
- 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공
- ArrayList, Vector, LinkedList 등이 있다.
List 인터페이스 메소드
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 | |
set(int index, E element) | 주어진 인덱스의 객테를 새로운 객체로 바꿈 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
E get(int index) | 주어진 인덱스에 저장된 객체를 리턴 | |
isEmpty() | 컬렉션이 비어 있는지 조사 | |
int size() | 저장되어 있는 전체 객체를 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
ArrayList
- 배열을 이용하여 만든 리스트
- 데이터 저장 순서 유지 및 중복 허용
- 일반 배열과 달리 공간이 가변적 (자동으로 늘고 줄음)
- 단방향 포인터로 자료에 대해 순차적인 접근 가능 (조회 빠름)
- 순차적인 추가/삭제에 대해 가장 빠름. 그게 아니라면 삽입/삭제가 느리다
- 중간에 삽입/삭제가 일어나면 인덱스가 1씩 밀리거나 당겨지게 됨
List<String> arrayList = new ArrayList<>();
LinkedList
- ArrayList와 사용 방법은 동일
- 내부 배열이 아니라 인접 객체를 체인처럼 연결해서 관리
- 양방향 포인터 구조이며 중간 삽입/삭제 시 체인을 바로 앞뒤 link만 변경하면 되기 때문에 빠르다.
- 임의의 요소에 대한 접근 성능은 좋지 않다.
- 리스트 용도 이외에도 스택, 큐, 트리 등의 자료구조 사용 시에도 사용된다.
List<String> linkedList = new LinkedList<>();
Vector
- ArrayList와 동일한 내부 구조
- ArrayList와 달리 동기화된 메소드로 구성되어 있어 Thread-Safe하다. 즉, 멀티 스레드가 동시에 Vector() 메소드를 실행할 수는 없어(= 한 번의 하나의 스레드만 실행) 멀티 스레드 환경에서 안전하게 객체를 추가 또는 삭제할 수 있다.
- 구버전 자바와 호환성을 위해 남겨두었지만 현재는 잘 쓰이지 않는다.
List<Integer> vector = new Vector<>();
Set 컬렉션
- 저장 순서가 유지되지 않고 중복 저장할 수 없다. (null도 하나만 저장 가능)
- 집합에 비유되기도 한다. (순서 상관없고 중복이 허용되지 않는다는 점에서)
- HashSet, LinkedHashSet, TreeSet 등이 있다
Set 인터페이스 메소드
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴 |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
isEmpty() | 컬렉션이 비어 있는지 조사 | |
Iterator<E> iterator() | 저장된 객체를 한 번씩 가져오는 반복자 리턴 | |
int size() | 저장되어 있는 전체 객체 수 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
HashSet
- set 컬렉션 중 가장 많이 사용
- 배열과 연결노드를 결합한 자료구조 형태
- 추가, 삭제, 검색, 접근이 모두 빠르나 순서는 예측할 수 없다
- 동일한 객체는 중복 저장하지 않는다
- 동일한 객체의 기준은 동등 객체 (다른 객체라도 hashCode()의 리턴값이 같고, equals() 메소드가 true를 리턴한다면 동일한 객체라 판단)
- 인덱스로 객체를 검색할 수 없기 때문에 for문을 이용하거나 iterator() 메소드를 이용해야 한다
Set<E> set = new HashSet<E>(); // E에 지정된 타입의 객체만 저장
Set<E> set = new HashSet<>(); // E에 지정된 타입의 객체만 저장
Set set = new HashSet<>(); // 모든 타입의 객체 저장
Map 컬렉션
- 키와 값으로 구성된 엔트리 객체 저장 (키와 값은 모두 객체)
- 키는 중복 저장할 수 없지만 값은 중복 저장 가능
- 기존에 있는 키로 값 저장 시, 기존의 값은 사라지고 새로운 값으로 대체
- 저장 순서는 유지되지 않는다
- HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다
Map 인터페이스 메소드
기능 | 메소드 | 설명 |
객체 추가 | V put(K key, V value) | 주어진 키와 값을 추가, 저장이 되면 값을 리턴 |
객체 검색 | boolean containsKey(Object key) | 주어진 키가 있는 지 여부 |
boolean containsValue(Object value) | 주어진 값이 있는지 여부 | |
Set<Map.Entry<K,V>> entrySet() | 키와 값으로 구성된 모든 Map.Entry 객체를 Set에 담아 리턴 | |
V get(Object key) | 주어진 키의 값을 리턴 | |
boolean isEmpty() | 컬렉션이 비어 있는지 여부 | |
Set<K> keySet() | 모든 키를 Set 객체에 담아 리턴 | |
int size() | 저장된 총 수를 리턴 | |
Collection<V> values() | 저장된 모든 값 Collection에 담아서 리턴 | |
객체 삭제 | void clear() | 모든 Map.Entry(키와값)를 삭제 |
V remove(Object key) | 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴 |
- Map 인터페이스에서 값(Value)은 중복을 허용하기에 Collection 타입으로, 키(key)는 중복을 허용하지 않기에 Set 타입으로 반환한다.
- Map.Entry 인터페이스는 Map 인터페이스 안에 있는 내부 인터페이스로 Map에 저장되는 key-value 쌍의 Node 내부 클래스가 이를 구현 (이 부분은 따로 정리할 예정!)
HashMap
- Hashtable을 보완한 컬렉션
- 키로 사용할 객체가 hashcode()의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우 동일 키로 판단, 중복 저장 허용x
- 순서를 보장하지 않는다
- 키와 값으로 null이 허용된다
- 추가, 삭제, 검색, 접근성이 모두 뛰어나다
- 비동기로 작동하기에 멀티 쓰레드 환경에는 어울리지 않는다
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<>();
Map map = new HashMap(); // 모든 타입의 키와 객체 허용의 의미로 선언은 가능하나, 잘 쓰이지는 않음
Hashtable
- HashMap과 동일한 내부 구조
- HashMap과 달리 Hashtable은 동기화된 메소드로 구성 -> 멀티스레드가 동시에 Hashtable의 메소드들 수행할 수 없다. 즉, 멀티 스레드 환경에서 안전하게 객체를 추가,삭제할 수 있다
Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();
Map map = new Hashtable(); // 잘 사용되지 않음
Properties
- Hashtable의 자식 클래스
- 키와 값을 String 클래스로 제한하여 저장하는 단순화된 컬렉션
- 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용
TreeSet과 TreeMap, LIFO와 FIFO 컬렉션을 따로 정리할 예정이다!
참고
- https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC#%EC%BB%AC%EB%A0%89%EC%85%98_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC_%EC%84%A0%ED%83%9D_%EC%8B%9C%EC%A0%90
- https://gray-tree.tistory.com/entry/JCF-%EC%9E%90%EB%B0%94-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84-%EC%9B%8C%ED%81%AC
- 『 이것이 자바다 저자 』 저자: 신용권, 임경균
'JAVA' 카테고리의 다른 글
[JAVA] 제네릭(Generic) (0) | 2024.11.22 |
---|---|
[JAVA(자바)] 오류 Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0+ 해결 방법 (0) | 2023.02.28 |
[JAVA(자바)] 인터페이스 (feat. 인터페이스와 추상클래스 비교) (0) | 2023.01.22 |
[JAVA(자바)] 배열 복사, 배열 특정 구간 복사(copyOf, copyOfRange) (0) | 2023.01.21 |
[JAVA(자바)] 추상 클래스(abstract)와 봉인된 클래스(sealed) (0) | 2023.01.20 |
댓글