- java.util 패키지
- 다수의 데이터를 쉽게 처리하는 방법 제공 -> DB처럼 CRUD 기능 중요
- collection framework 핵심 interface
- Iterable->Collection->List, Set
- Map은 Collection을 상속하진 않음
- List
- 순서가 있는 데이터의 집합
- 순서가 있으므로 데이터의 중복을 허락
- ex: ArrayList, LinkedList
- Set
- 순서를 유지하지 않는 데이터의 집합
- 순서가 없으므로 같은 데이터를 구별할 수 없음 - > 중복 허락하지 않음
- ex: HashSet, TreeSet...
- Map
- key와 value의 쌍으로 데이터를 관리하는 집합, 순서는 없고 key의 중복 불가, value는 중복 가능(ex: 속성-값, 지역번호-지역)
- ex: HashMap, TreeMap
- Collection method
- 추가
- add(E e)
- addAll(Collection<? extends E> c)
- 조회
- contains(Object o)
- containsAll(Collection<?> c)
- equals()
- isEmpty()
- iterator()
- size()
- 삭제
- clear()
- removeAll(Collection<?> c)
- retainAll(Collection<?> c)
- 수정
- 기타
List
특징
- 순서가 있는 데이터의 집합
- 순서가 있으므로 데이터의 중복을 허락
ArrayList
- 내부적으로 Object 배열을 만들고 꽉 찰 경우 grow() 메서드를 통해 더 크게 재할당함
- default는 크기가 0인 배열부터 시작함
- List method
- 추가
- add(int index, E element)
- addAll(int index,Collection\<? extends E> c)
- 조회
- get(int index)
- indexOf(Object o)
- lastaIndexOf(Object o)
- listIterator()
- 삭제
- 수정
- set(int index, E element)
- 기타
- subList(int fromIndex, int toIndex)
LinkedList
- 각 요소를 Node로 정의하고 Node는 다음 요소의 참조 값과 데이터로 구성됨
- 각 요소가 다음 요소의 링크 정보를 가지며 연속적으로 구성될 필요가 없다.
- 순차적으로 추가/수정/삭제할 때와 조회할 때는 ArrayList가 빠르다
- 비순차적으로 추가/수정/삭제할 때는 LinkedList가 빠르다.
결론
- 특정 클래스가 좋고 나쁨이 아니라 용도에 적합하게 사용해야 한다.
- 소량의 데이터를 가지고 사용할 경우는 큰 차이가 없다.
- 정적인 데이터 활용, 단순한 데이터 조회용: ArrayList
- 동적인 데이터 추가, 삭제가 많은 작업: LinkedList
ArrayList 나 LinkedList 생성시 List 인터페이스를 참조변수로 사용하는 이유
- ArrayList에서 LinkedList로, 또는 그 반대로 변경이 용이하기 때문이다.
자료 삭제 시 주의 사항
- List 인터페이스는 기본적으로 삭제 후 인덱스를 당겨오므로 이를 주의(뒤에서 삭제하는 방식으로 하면 이 문제는 해결된다.)
Set
특징
- 순서 없이 주머니에 구슬(데이터)를 넣는 형태
- 순서가 없으므로 데이터를 구별할 index가 없어 중복이 허용되지 않는다.
- Set이 같다고 판단하는 기준
- equals()가 true 반환
- hashCode() 값이 같음
- equals() 재정의 시 hashCode()도 재정의하는것이 좋다
Map
특징
- Key와 Value를 하나의 Entry로 묶어서 데이터 관리
- Key: Object 형태로 데이터 중복을 허락하지 않음
- Value: Object 형태로 데이터 중복이 허락 됨
- Collection을 상속하지 않으므로 메소드 목록이 다름
- Map에서 Entry를 얻고나서 key 나 value에 바로 접근할 수 있다.
정렬
- 요소를 특정 기준에 대한 내림차순 또는 오름차순으로 배치하는 것
- 순서를 가지는 Collection들만 정렬 가능
- List 계열
- Set에서는 SortedSet의 자식 개체
- Map에서는 SortedMap의 자식 객체(key 기준)
- Collections의 sort()를 이용한 정렬
- sort(List list)
- 객체가 Comparable을 구현하고 있는 경우 내장 알고리즘을 통해 정렬
Comparator의 활용
- 객체가 Comparable을 구현하고 있지 않거나 사용자 정의 알고리즘으로 정렬하려는 경우
- 1회성 객체 사용 시 anonymous inner class 사용