정리/Java

Collection

개발아기 2023. 3. 8. 15:48

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을 구현하고 있는 경우 내장 알고리즘을 통해 정렬