Collection Framework (자료 구조)
정의
- CS에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미
- 데이터 값의 모임, 데이터 간의 관계, 데이터에 적용할 수 있는 함수나 명령을 의미
배열
- 가장 기본적인 자료 구조
- homogeneous collection
- Polymorphism
- Object를 이용하면 모든 객체를 참조할 수 있음
- 담을 때는 편리하지만 빼낼 때는 Object로만 가져올 수 있음
- 런타임에 실제 객체의 타입 확인 후 사용해야하는 번거로움이 있음
- Generic을 이용하여 타입을 한정
- 컴파일 타임에 저장하려는 타입을 제한함으로써 형변환의 번거로움 제거
Collection framework 핵심 Interface
List
- 순서가 있는 데이터의 집합
- 중복을 허락
ex) ArrayList, LinkedList, ...
Set
- 순서를 유지하지 않는 데이터의 집합
- 같은 데이터를 구별할 수 없음 ⇒ 중복을 허락하지 않음
ex) HashSet, TreeSet, ...
Map
- key와 value를 쌍으로 관리하는 집합
- 순서는 없고 key는 중복 불가, value는 중복 가능
ex) HashMap, TreeMap, ...
List
특징
- 순서가 있는 데이터의 집합
- 순서가 있으므로 데이터의 중복을 허락
주요 메서드
- 추가
- add(int index, E element) : index 위치에 element 추가
- addAll(int index, Collection<? extends E> c) : index 위치에 Collection c 추가
- 조회
- get(int index) : index 위치의 값 조회
- indexOf(Object o) : o가 있는 첫 index 조회
- lastIndexOf(Object o) : o가 있는 마지막 index 조회
- listIterator() : list를 순회할 수 있는 iterator
- 삭제
- remove(int index) : index 위치의 값 삭제
- 수정
- set(int index, E element) : index 위치의 값을 element로 수정
- 기타
- subList(int fromindex, int toindex) : fromindex ~ toindex-1 의 값들을 이용해 새로운 리스트 생성
배열의 장점
- 가장 기본적인 형태의 자료 구조로 간단하며 사용이 쉬움
- 접근 속도가 빠름
배열의 단점
- 크기를 변경할 수 없어 추가 데이터를 위해 새로운 배열을 만들고 복사해야 함
- 비 순차적 데이터의 추가, 삭제에 많은 시간이 걸림
LinkedList
- 각 요소를 Node로 정의하고 Node는 다음 요소의 참조 값과 데이터로 구성됨
- 각 요소가 다음 요소의 링크 정보를 가지며 연속적으로 구성될 필요가 없음
ArrayList vs LinkedList
- 용도에 맞게 적합하게 사용하는 것이 좋음
- 정적인 데이터 활용, 단순한 데이터 조회용 : ArrayList
- 동적인 데이터 추가, 삭제가 많은 작업 : LinkedList
자료 삭제시 주의 사항
- index를 이용한 for문
- 요소가 삭제되면 size가 줄어들기 때문에 index 차감 필요
- 거꾸로 접근함으로써 해결
for(int i = nums.size()-1; i >= 0; i--) {
// 구현부
}
- for-each 문장은 Collection 크게가 불변할 경우에만 사용 가능
Set
특징
- 순서 없이 데이터를 넣는 형태
- 순서가 없으므로 데이터를 구별할 index가 없어 중복이 허용되지 않음
생성한 클래스를 이용한 Set을 생성할 경우
- 중복을 제거할 수 있는 수단을 제공해야함
- 동일한 데이터의 기준 = 객체의 equals()가 True를 리턴하고, hashCode() 값이 같을 것
- equals Method, hashCode() Method를 재정의(Overriding) 함으로써, 중복을 제거
public boolean equals(Object obj) {
boolean result = false;
if (obj != null && obj instanceof Class) {
Class param = (Class) obj;
result = (this.---.equals(param.---));
}
return result;
}
public int hashCode() {
return ---.hashCode();
}
Map
특징
- Key와 Value를 하나의 Entry로 묶어서 데이터 관리
- Key : Object 형태로 데이터 중복을 허락하지 않음
- Value : Object 형태로 데이터 중복이 허락
주요 메서드
- 추가
- put(K key, V value) : Key, Value 쌍을 추가
- putAllMap(? extends K, ? extends V> m) : 맵에 m 맵을 추가
- 조회
- containsKey(Object key) : key값을 가지는 Object 조회
- containsValue(Object value) : value값을 가지는 Object 조회
- entrySet() : Map의 전체 key와 value값을 조회
- keySet() : Map의 전체 key값만 조회
- get(Object key) : key값을 이용하여 value값 조회
- values() : Map의 value값들을 조회
- size() : Map의 크기 조회
- isEmpty() : Map이 비어있는지 여부를 조회
- 삭제
- clear() : Map의 전체 내용을 삭제
- remove(Object key) : Map에서 Key에 해당하는 값을 삭제
- 수정
- put(K key, V value) : key에 해당하는 값을 value로 수정
- putAll(Map<? extends K, ? extends V> m : 맵에 map에 해당하는 내용들을 수정
정렬
- 요소를 특정 기준에 대한 내림차순 또는 오름차순으로 배치하는 것
- 순서를 가지는 Collection들만 정렬 가능
- List, SortedSet, SortedMap
- Collections의 sort()를 이용한 정렬
- sort(List<T> list)
- 객체가 Comparable을 구현하고 있는 경우 내장 알고리즘을 통해 정렬