[Java/자바] 4. 컬렉션 프레임워크 Collection framework

컬렉션 Collection

문제 상황

배열은 자료구조 중에서 가장 기본이고 단순한 구조로, 동일한 타입 데이터들의 집합이다. 하지만 배열을 사용할 때 몇 가지 제약이 따른다.

  1. 배열은 초기 생성 시에 그 크기를 미리 지정해야 한다.

    • 초기에 지정한 크기는 변경이 불가하여 생성한 크기보다 많은 자료를 저장할 수 없다.
  2. 데이터의 삽입, 검색, 삭제 등의 기능을 매번 직접 작성하면 중복 로직들이 발생한다.

    • 이때 위 기능들을 클래스로 구현하면 재사용성을 높일 수 있다.

✨프로그램에서 사용할 데이터들을 효과적으로 관리하고 사용할 수 있도록 다양한 기능의 클래스를 제공한다. 👉 컬렉션 프레임워크

컬렉션 프레임워크 등장 이전
Vector, Stack, Properties
컬렉션 프레임워크
- 각각의 사용법이 다름
- 상호 호환성이 떨어짐
- 확장성이 떨어짐
- 높은 성능으로 동작
- 상호운용성이 뛰어남
- 응용 및 확장성이 뛰어남
🗝 표준인터페이스들의 집합에 기초를 두고 구현되었기 때문에 가능

컬렉션 프레임워크의 인터페이스

Collection

객체들의 집합을 사용할 수 있도록 하는 컬렉션 계층의 최상위 인터페이스

  • 모든 컬렉션 클래스가 가지고 있는 핵심 메소드로 구성
  • 주요 추상 메소드

    • boolean add(Object obj): 컬렉션에 obj 추가, 추가 성공 시 true return, 이미 컬렉션의 멤버이거나 중복을 허용하지 않는 컬렉션일 경우 false retrun
    • boolean contains(Object obj): obj가 컬렉션의 요소이면 true return
    • boolean isEmpty(): 컬렉션이 비어있을 경우 true return
    • Iterator iterator(): 컬렉션의 모든 요소를 순차적으로 접근할 수 있는 Iterator return -boolean remove(Object obj): 컬렉션에서 obj 하나 제거, 성공 시 true return
    • int size(): 컬렉션의 요소의 수를 return

List

Collection 인터페이스를 상속했으며, 순차적인 리스트를 다루기 위해 사용

  • 요소들의 순서를 저장하는 기능이 추가
  • 0부터 시작하는 index를 사용하여 특정 위치의 요소 삽입/삭제 가능
  • 동일한 요소라고 하더라도 순서를 가지고 구분이 가능하기 때문에 요소 중복 저장 허용
  • 주요 추상 메소드

    • void add(int index, Object obj): 리스트의 index위치에 obj 삽입
    • Object get(int index): 리스트의 index 위치의 요소 return
    • Object remove(int index): 리스트의 index 위치의 요소를 삭제하고 삭제한 요소 return

Set

Collection 인터페이스를 상속했으며, 유일한 요소만 포함하는 집합을 다루기 위해 사용

  • 중복되지 않는 요소들의 집합
  • 중복을 허용하지 않기 때문에 이미 저장된 객체를 add()로 다시 저장하려 할 때 false를 return

SortedSet

Set 인터페이스를 상속했으며, 정렬된 집합을 다루기 위해 사용

  • 오름차순으로 정렬된 집합의 동작을 선언
  • 주요 추상 메소드

    • Object first(): 첫 번째 요소 반환
    • Object last(): 마지막 요소 반환

컬렉션 클래스

  • 구현한 인터페이스들의 특징을 그래도 가지고 있다.
  • 몇몇 클래스들은 추상 클래스로 작성되어 실제 동작이 가능한 자식 클래스의 골격을 제공

AbstractCollection

  • Collection 인터페이스 대부분의 기능을 실제 구현

    AbstractList

  • AbstractCollection을 확장하고 List 인터페이스 대부분의 기능 실제 구현

    AbstractSequentialList

  • AbstractList 확장, 요소들의 순차적인 접근 처리

    ⭐️ LinkedList

  • AbstractSequentialList 확장, 이중 연결 리스트(Doubly Linked List) 구현
  • AbstractSequentialList 클래스, List 인터페이스의 모든 메소드 사용 가능
  • 첫 요소 또는 마지막 요소에 삽입/삭제가 효율적으로 이뤄지므로 이에 대한 추가 메소드 제공
  • 추가 메소드

    • void addFirst(Object obj): 리스트 맨 앞에 obj 추가
    • void addLast(Object obj): 리스트 맨 뒤에 obj 추가
    • Object getFirst(): 첫 번쨰 요소 return
    • Object getLast(): 마지막 요소 return
    • Object removeFrist(): 첫 번째 요소 삭제 후 삭제한 요소 return
    • Object removeLast(): 마지막 요소 삭제 후 삭제한 요소 return

⭐️ ArrayList

  • AbstractList 확장, 동적 배열 구현
  • 내부적으로 배열을 이용하여 리스트 자료구조를 구현
  • AbstractList 클래스, List 인터페이스의 모든 메소드 사용 가능
  • 추가된 메소드

    • void ensureCapacity(int minCapacity): ArrayList 사이즈 return
    • void trimToSize(): ArrayList의 빈공간을 제거하여 사이즈 조절

      AbstractSet

  • AbstractCollection 확장, Set 인터페이스 대부분의 기능 실제 구현

⭐️ HashSet

  • AbstractSet 확장, Hash Table 사용하도록 구현
  • 데이터 저장소로 Hash Table을 사용하기 때문에 Hash 형태의 자료구조를 구현
  • 객체의 저장/삭제 시 내부적으로 대상 객체를 hashing하여 HsahCode를 만든 뒤 Hash Table의 index로 사용
  • 객체를 hashing하는 작업은 자동으로 진행되어 Hash Table에 직접 접근 불가
  • 삽입, 삭제 등의 작업이 데이터의 수와 관계없이 일정한 성능을 보장
  • AbstractSet 클래스와 Set 인터페이스의 모든 메소드 사용 가능

⭐️ LinkedHashSet

  • HashSet 확장, 삽입 순서가 유지되는 집합 구현
  • HashSet은 삽입된 순서를 기억하지 않지만 LinkedHashSet은 연결리스트를 이용하여 삽입된 순서를 기억한다.
  • 중간에 데이터를 삭제해도 데이터의 순서가 유지됨

⭐️ TreeSet

  • AbstractSet 확장 SortedSet 인터페이스를 구현, 트리에 저장된 집합 구현
  • 오름차순으로 정렬된 Set 집합 사용 가능
  • 기억장소로 트리를 사용하며 빠른 접근 속도를 가지므로, 많은 양의 데이터를 정렬하여 사용할 때 유용

Iterator 인터페이스

컬렉션 클래스의 모든 요소를 처음~끝까지 순차적으로 접근 가능하도록 해주는 인터페이스 👉 Iterator는 간단하고 통일된 방법으로 처리할 수 있는 방법을 제공

  • 직접 객체 생성 불가, 컬렉션 클래스의 iterator()메소드를 통해 생성 가능
  • 주요 메소드

    • boolean hasNext(): Iterator에 요소가 더 있으면 true 반환
    • Object next(): 다음 요소 반환
    • void remove(): 컬렉션에서 현재 요소를 삭제
  • 예시

    import java.util.Iterator;
    import java.util.LinkedList;
    
    public class IteratorTest{
        public static void main(String[] args){
            LinkedList<Double> scoreList = new LinkedList<Double>;
            
            //...
            
            Iterator<Double> it = scoreList.iterator();
            while(it.hasNext()){
                // ...
            }
        }
    }

Map 컬렉션

  • Map

    • key, value의 쌍으로 데이터를 저장하는 객체
    • key는 유일해야 하며 value는 중복 가능
    • 기능적으로 Collection 인터페이스와 다르기 때문에 Collection 인터페이스를 상속 받지 않음
  • 주요 관련 클래스

    • AbstractMap: Map 인터페이스의 대부분 구현
    • ⭐️ HashMap: AbstractMap 확장, Hash Table을 이용하여 데이터 관리하는 클래스

      • 키-데이터 쌍으로 묶어서 데이터를 관리하며 키의 중복을 허용하지 않는다. HashMap, HashTable, TreeMap 클래스가 유사
      • Enumeration이나 Iterator 객체를 사용하여 데이터를 추출하지 않고 특정 키로 등록된 데이터를 추출 👉 키로 접근
      • 주요 메소드

        • put(): 키와 값으로 구성된 새로운 데이터 추가
        • get(): 지정한 키에 해당하는 데이터 return
        • remove(): 지정한 키에 해당하는 데이터 삭제
        • containsKey(): 지정한 키가 이미 존재하는지 여부 return
        • containsValue(): 지정한 값이 존재하는지 여부 return
        • size(): 요소 개수 return
        • isEmpty(): 비어있는 지 여부 return
    • TreeMap: AbstractMap 확장, 트리를 이용하여 데이터 관리하는 클래스
    • WeakHashMap: AbstractMap 확장, 취약 키(weak key)를 갖는 Hast Table을 이용하여 데이터 관리하는 클래스
    • ⭐️ LinkedHashMap: HashMap 확장, 삽입 순서가 유지되는 집합을 구현
    • IdentityHashMap: AbstractMap 확장, 요소를 비교할 때 참조를 근거로 비교
  • 주요 메소드

    • void clear(): 맵의 모든 요소 삭제
    • Object get(Object k): 키값 k와 연결된 value return
    • boolean isEmpty(): 맵이 비어있으면 true return
    • Set keySet(): 맵에 있는 모든 key를 포함하는 Set을 return
    • Object put(Object k, Object v): 지정한 k-v 쌍의 요소를 맵에 추가, 이미 있는 k라면 덮어씀
    • Object remove(Object k): 키값 k와 연결된 value를 삭제
    • int size(): 맵에 저장된 요소의 수 return
    • Collection values(): 맵에 있는 모든 value를 포함하는 Set를 return

예시

HashMap 클래스 test

출력 순서 - 최규태, 정길용, 강성윤

LinkedHashMap 클래스 test

출력 순서 - 정길용, 강성윤, 최규태

TreeMap 클래스 test

출력 순서 - 강성윤, 정길용, 최규태


Hi! I'm @Yeseul Lee
Passionate for what I love

GitHubLinkedIn