[Java] Collection 프레임워크

이상현·2023년 10월 8일
0

Java

목록 보기
2/21
post-thumbnail

본 게시글은 Java Api Document - Java Collections Framework (JDK 11)
에서 주로 참고할만한 내용들을 옮겨 작성하였습니다.

컬렉션이란?

  • Collection
    데이터 그룹
  • Collection Framwork
    컬렉션 클래스들을 표준화한 설계

컬렉션의 인터페이스 세가지

컬렉션에는 다음 세가지를 주요 인터페이스로 정의한다.

  • List<E>
  • Set<E>
  • Map<K,V>

List, Set, Map의 특징

이름ListSetMap
순서순서가 있다.순서가 없다.순서가 없다.
중복중복 허용중복 허용 안함Key 는 중복 허용 안함, Value 는 중복 허용
구현 클래스ArrayList, LinkedList, Stack ...HashSet, TreeSet ...HashMap, TreeMap, Properties...

상속계층도


ListSet은 공통된 부분이 많아서 Collection 인터페이스로 다시 정의되어있다.

주로 사용하는 컬렉션 프레임워크의 구현 클래스들은 위 세가지 중의 한가지 인터페이스를 상속받아 구현한 클래스이다.

Collection 인터페이스의 메서드

List와 Set의 조상이므로 List와 Set에서 사용가능하다.

  • int size()
    컬렉션에 저장된 객체의 개수를 반환한다.

  • boolean add(E e)

  • boolean addAll(Collection<? extends E> c)
    객체 e 또는 컬렉션 c의 모든 객체를 추가한다.

  • void clear()
    컬렉션의 모든 객체를 삭제한다.

  • boolean remove(Object o)

  • boolean removeAll(Collection<?> c)
    컬렉션에서 객체 o 또는 컬렉션 c에 포함된 객체들을 삭제한다. (차집합)

  • boolean retainAll(Collection<?> c)
    컬렉션 c에 포함된 객체만을 남기고 다른 객체들은 삭제한다. (교집합)
    기존 컬렉션에 변화가 있으면 true 반환

  • boolean contains(Object o)

  • boolean containsAll(Collection<?> c)
    객체 o 또는 컬렉션 c가 포함되어있는지 확인한다.

  • boolean equals(Object o)
    컬렉션과 객체를 비교하여 같은지 비교한다.

  • boolean isEmpty()
    컬렉션이 비어있으면 true 반환

  • Iterator<E> iterator()
    컬렉션의 요소들을 iterator로 반환한다.

  • Object[] toArray()
    컬렉션의 요소들을 객체 배열로 반환한다.

List 인터페이스의 메서드

List는 순서를 유지하고 중복을 허용한다.
배열처럼 데이터 묶음을 사용하고 싶을때 유용하다.

위에 작성한 Collection 인터페이스에서 상속받는 메서드는 작성하지 않겠다.

  • List.of(E e1, E e2, ... E e10)
    정적 메서드로, 위와 같이 사용하면 요소 e1 ~ e10 까지를 요소로 갖는 불변 리스트를 반환한다.

  • void add(int index, E element)

  • void addAll(int index, Collection<? Extends E> c)
    E 또는 컬렉션 c의 모든 요소를 지정된 위치 index에 추가한다.
    Collection의 add 메서드를 확장하여 특정 위치에 추가하는 기능이 추가되었다.

  • E get(int index)
    index 위치의 요소를 반환한다.

  • E set(int index, E element)
    index 위치에 요소를 저장하고 원래 있던 요소를 반환한다.

  • E remove(int index)
    index 위치의 요소를 삭제하고 반환한다.

  • int indexOf(Object o)
    객체 o와 일치하는 첫 번째 요소의 인덱스를 반환한다.
    일치하는 객체가 없을 시 -1 반환

  • int lastIndexOf(Object o)
    객체 o와 일치하는 뒤에서 첫 번째 요소의 인덱스를 반환한다.
    일치하는 객체가 없을 시 -1 반환

  • void sort(Comparator<? super E> c)
    비교자 c로 리스트를 정렬한다.

  • List<E> subList(int fromIndex, int toIndex)
    위치가 fromIndex 부터 toIndex -1 인 객체들을 리스트로 추출한다.

대표적인 List의 구현 클래스 사용예시: ArrayList

import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
    	// 형식을 Integer로 지정하고, 5, 2 요소 두개를 넣어준 ArrayList
        ArrayList<Integer> list = new ArrayList<>(List.of(5, 2));
        list.add(4); // [5, 2, 4]
        list.set(1, 8); // [5, 8, 4]
        list.add(0); // [5, 8, 4, 0]

        // 오름차순 정렬
        Collections.sort(list); // [0, 4, 5, 8]

        // 리스트로 향상된 for문 사용
        for(int n: list) {
            System.out.print(n + ", "); // "0, 5, 4, 8" 출력
        }
        
        System.out.println(list.get(3)); // 8 출력
    }
}

List의 구현 클래스 ArrayList의 주요 메소드는 다음 글을 참고해주세요.
[Java] ArrayList

Set 인터페이스의 메서드

Set은 순서를 유지하지 않고 중복을 허용하지 않는다.
집합처럼 데이터 묶음을 사용하고 싶을때 유용하다.

위에 작성한 Collection 인터페이스에서 상속받는 메서드는 작성하지 않겠다.

  • Set.of(E e1, E e2, ... E e10)
    정적 메서드로, 위와 같이 사용하면 요소 e1 ~ e10 까지를 요소로 갖는 불변 Set을 반환한다.

이 외에는 Collection 인터페이스의 메소드와 동일하다. 하위 클래스로는 HashSet, TreeSet 등이 있다.

대표적인 Hash의 구현 클래스 사용예시 : HashSet

import java.util.HashSet;
import java.util.List;

public class Main {
    public static void main(String[] args) {
    	List<String> list = new ArrayList<>(List.of("1", "5", "2", "5", "4"));
        Set<String> set = new HashSet<>(list);
        set.add("2");
        set.add("2");
        System.out.println(set);
        // [1, 2, 4, 5] -> 중복이 제거됐다.
    }
}

중복이 제거되지만 순서는 유지하고 싶으면 HashSet 대신 LinkedHastSet 사용하면 된다.

Map 인터페이스의 메서드

Map은 Key와 Value를 하나의 쌍으로 묶어서 저장한다.
순서를 유지하지 않고 Key는 중복을 허용하지 않고, Value는 중복을 허용한다.

기존에 저장된 데이터와 키가 중복되는 데이터를 저장하면 기존 값이 새로운 값으로 대체된다.

Collection 인터페이스를 상속받지 않는다.

  • void clear()
    모든 객체를 삭제한다.

  • V get(Object key)
    key객체에 대응하는 value 객체를 찾아서 반환한다. (시간복잡도가 O(1)이다.)

  • V put(K key, V value)
    key-value 쌍을 둘이 연결하여 추가한다.

  • void putAll(Map<K,V> m)
    Map m의 모든 key-value 쌍을 추가한다.

  • boolean containsKey(Object key)
    모든 요소의 Key중에 key와 일치하는 객체가 있으면 true를 반환한다.

  • boolean containsValue(Object value)
    모든 요소의 Value중에 value와 일치하는 객체가 있으면 true 반환한다.

  • boolean equals(Onject o)
    동일한 Map인지 비교한다.

  • boolean isEmpty()
    비어있는지 확인한다.

  • Set keySet()
    모든 Key 객체를 Set로 반환한다. -> key는 중복 안되므로 Set으로 반환

  • Collection values()
    모든 value 객체를 컬렉션으로 반환한다. -> value 는 중복 가능하므로 Collecton으로 반환

  • V remove(Object Key)
    key 객체와 일치하는 key-value 쌍을 삭제한다.

  • int size()
    Map에 저장된 key-value 쌍의 개수를 반환한다.

  • Set enrtySet()
    모든 Key-Value 쌍을 Map.Entry 타입의 객체로 저장한 Set를 반환한다.

대표적인 Map의 구현 클래스 사용예시 : HashMap

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
    	Map<Integer, String> map = new HashMap<>();
        map.put(2, "LEE");
        map.put(4, "HONG");
        map.put(1, "HWANG");
        System.out.println(map.get(1)); // HWANG
        System.out.println(map.containsKey(2)); // true
        System.out.println(map.containsValue("HONG")); // true
    }
}

Map.Entry 인터페이스

Map 내부의 인터페이스이다. Map에 저장되는 key-value 쌍을 다루기 위해 정의되었다.

  • boolean equals(Object o)
    동일한 Entry 인지 비교한다.
  • K getKey()
    Entry의 key객체를 반환한다.
  • V getValue()
    Entry의 value객체를 반환한다.
  • V setValue(V value)
    Entry의 value 객체를 지정된 객체로 바꾼다.

0개의 댓글