본문 바로가기
Programming/Java

컬렉션 프레임워크

by Tarake 2024. 8. 10.

컬렉션 프레임워크(Collection Framework)


프레임워크란?

프로그래머들이 쓸 수 있도록 정의된 클래스들의 모임입니다. 즉 자바 프레임워크는 개발자가 자바로 응용 프로그램을 쉽게 구축할 수 있도록 돕는 소프트웨어 플랫폼입니다.

하지만 이것이 전부라면 라이브러리라고 불리게 됩니다.

 

컬렉션이란?

데이터를 효율적으로 저장하고 조작하기 위한 자료구조알고리즘의 집합을 제공합니다. 자바 컬렉션은 다양한 자료구조를 지원하며, 각 자료구조는 특정 상황에서 효율적인 데이터 처리 방법을 제공합니다.

 

컬렉션 프레임워크란?

즉 컬렉션 프레임워크란 자료구조와 알고리즘을 제네릭 기반의 클래스와 메소드로 미리 구현한 결과물입니다. 

 

인터페이스


  • 주요 메소드: add(), remove(), contains(), size(), isEmpty() 등

주요 하위 인터페이스

  • List
    • 특징: 순서가 있는 요소의 집합으로, 중복을 허용하며 인덱스를 통해 요소에 접근할 수 있습니다.
    • 구현체: ArrayList, LinkedList, Vector, Stack
  • Set
    • 특징: 중복을 허용하지 않는 요소의 집합으로, 요소의 순서를 보장하지 않습니다.
    • 구현체: HashSet, LinkedHashSet, TreeSet
  • Queue
    • 특징: FIFO(First-In-First-Out) 방식의 요소 처리 구조를 제공합니다.
    • 구현체: LinkedList, PriorityQueue, ArrayDeque
  • Deque
    • 특징: 양쪽에서 삽입과 삭제가 가능한 큐
    • 구현체: ArrayDeque, LinkedList
  • Map
    • 특징: 키-값 쌍으로 구성된 요소의 집합입니다. 키는 중복을 허용하지 않으며, 값은 중복될 수 있습니다.
    • 구현체: HashMap, LinkedHashMap, TreeMap, Hashtable

알고리즘

  • 정렬: Collections.sort(List<T> list), Collections.sort(List<T> list, Comparator<? super T> c)
  • 검색: Collections.binarySearch(List<? extends Comparable<? super T>> list, T key)
  • 최대/최소값 검색: Collections.max(Collection<? extends T> coll), Collections.min(Collection<? extends T> coll)
  • 셔플링: Collections.shuffle(List<?> list)
  • 동기화: Collections.synchronizedList(List<T> list), Collections.synchronizedMap(Map<K,V> map)

 

List<E>


공통 메소드

요소 추가

  • add(E e) : 리스트의 끝에 요소를 추가합니다.
  • add(int index, E element) : 지정한 인덱스에 요소를 삽입합니다.

요소 제거

  •  remove(int index) : 지정한 인덱스의 요소를 제거합니다.
  • remove(Object o) : 리스트에서 처음으로 등장하는 지정된 요소를 제거합니다.

요소 접근 및 수정

  • get(int index) : 지정한 인덱스의 요소를 반환합니다.
  • set(int index, E element) : 지정한 인덱스의 요소를 새로운 요소로 대체합니다.

기타 메소드

  • size() : 리스트의 요소 개수를 반환합니다.
  • isEmpty() : 리스트가 비어 있는지 여부를 확인합니다.
  • contains(Object o) : 리스트에 특정 요소가 포함되어 있는지 확인합니다.
  • indexOf(Object o) : 리스트에서 처음으로 등장하는 지정된 요소의 인덱스를 반환합니다.
  • clear() : 리스트의 모든 요소를 제거합니다.

 

ArrayList

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add(1, "Orange"); // 인덱스 1에 요소 삽입
        System.out.println(list); // 출력: [Apple, Orange, Banana]
        
        list.remove("Orange");
        list.remove(0); // 인덱스 0의 요소 제거
        System.out.println(list); // 출력: [Banana]
        
        String fruit = list.get(0); // 요소 접근
        System.out.println(fruit); // 출력: Banana
        
        list.set(0, "Mango"); // 요소 수정
        System.out.println(list); // 출력: [Mango]
    }
}

ArrayList는 자바에서 가장 많이 사용되는 컬렉션 클래스 중 하나로, 동적 배열(dynamic array)을 구현한 클래스입니다.

ArrayList는 다양한 메소드를 제공하여 요소를 추가, 삭제, 수정, 검색할 수 있습니다. 주요 메소드는 다음과 같습니다.

 

ArrayList의 특징

  • 동적 크기 조절: 요소가 추가되면 자동으로 크기가 증가하며, 필요에 따라 배열의 크기를 늘립니다.
  • 인덱스를 통한 요소 접근: 배열처럼 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
  • 중복 허용: 같은 요소를 여러 번 추가할 수 있습니다.
  • null 값 허용: null 값을 요소로 허용합니다.
  • 비동기적: 기본적으로 ArrayList는 스레드에 안전하지 않습니다. 멀티스레드 환경에서 사용하려면 별도의 동기화가 필요합니다.

 

LinkedList

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("Apple");
        list.add("Banana");
        list.add(1, "Orange"); // 인덱스 1에 요소 삽입
        list.addFirst("Mango");
        list.addLast("Grapes");
        System.out.println(list); // 출력: [Mango, Apple, Orange, Banana, Grapes]

        list.remove("Orange");
        list.remove(0); // 인덱스 0의 요소 제거
        list.removeFirst(); // 첫 번째 요소 제거
        list.removeLast(); // 마지막 요소 제거
        System.out.println(list); // 출력: [Banana]

        String fruit = list.get(0); // 요소 접근
        System.out.println(fruit); // 출력: Banana

        list.set(0, "Mango"); // 요소 수정
        System.out.println(list); // 출력: [Mango]
    }
}

LinkedList는 자바 컬렉션 프레임워크의 일부로, 연결 리스트(data structure)를 구현한 클래스입니다. java.util 패키지에 속해 있으며, List, Deque, Queue 인터페이스를 구현하고 있어 리스트와 큐의 성질을 모두 사용할 수 있습니다. LinkedList는 요소가 이중 연결 리스트(doubly linked list)로 저장되기 때문에 삽입과 삭제가 빈번한 경우에 ArrayList보다 좋습니다.

 

LinkedList의 특징

  • 이중 연결 리스트: 각 노드는 데이터와 다음, 이전 노드에 대한 참조를 포함합니다. 이를 통해 리스트의 양방향 탐색이 가능합니다.
  • 동적 크기 조절: 필요에 따라 자동으로 크기가 조절됩니다. 삽입 및 삭제 시 다른 요소의 이동이 필요하지 않습니다.
  • 중복 허용: 동일한 요소를 여러 번 추가할 수 있습니다.
  • null 값 허용: null 값을 요소로 허용합니다.
  • 비동기적: 기본적으로 LinkedList는 스레드에 안전하지 않습니다. 멀티스레드 환경에서 사용하려면 별도의 동기화가 필요합니다.

 

LinkedList 추가 메소드

요소 추가

  • addFirst(E e) : 리스트의 시작에 요소를 추가합니다.
  • addLast(E e) : 리스트의 끝에 요소를 추가합니다.

요소 제거

  • remove() : 리스트의 첫 번째 요소를 제거하고 반환합니다.
  • removeFirst() : 리스트의 첫 번째 요소를 제거하고 반환합니다.
  • removeLast() : 리스트의 마지막 요소를 제거하고 반환합니다.

요소 접근 및 수정

  • getFirst() : 리스트의 첫 번째 요소를 반환합니다.
  • getLast() : 리스트의 마지막 요소를 반환합니다.

 

Set<E>


HashSet

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        // HashSet 생성
        HashSet<String> set = new HashSet<>();
        
        // 요소 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복된 요소
        
        // 출력
        System.out.println(set); // 출력 순서는 보장되지 않음
        
        // 요소 제거
        set.remove("Banana");
        
        // 특정 요소 존재 여부 확인
        boolean hasApple = set.contains("Apple"); // true
        boolean hasBanana = set.contains("Banana"); // false
        
        // 전체 요소 출력
        for (String fruit : set) {
            System.out.println(fruit);
        }
        
        // 사이즈 확인
        System.out.println("Size: " + set.size());
    }
}

Set 인터페이스: HashSet은 Set 인터페이스를 구현한 클래스입니다. Set 인터페이스는 중복된 요소를 허용하지 않는 컬렉션을 정의합니다.

해시 기반 저장: HashSet은 내부적으로 HashMap을 사용하여 요소를 저장합니다. 따라서 해시 기반으로 요소를 관리합니다.

 

주요 특징

  • 중복 불허: HashSet은 중복된 요소를 허용하지 않습니다. 동일한 요소를 추가하려고 하면, 이미 존재하는 것으로 간주되어 추가되지 않습니다.
  • 순서 없음: HashSet은 요소의 순서를 보장하지 않습니다. 즉, 요소를 삽입한 순서가 유지되지 않습니다. 순서가 필요하다면 LinkedHashSet을 사용하거나 정렬된 순서를 원할 경우 TreeSet을 사용해야 합니다.
  • 빠른 검색: HashSet은 평균적으로 O(1)의 시간 복잡도로 요소를 검색할 수 있습니다. 이는 해시 기반으로 요소를 저장하고 검색하기 때문입니다.
  • Null 허용: HashSet은 하나의 null 요소를 허용합니다. 하지만 여러 개의 null을 허용하지는 않습니다.

주요 메소드

요소 추가

  • add(E e) : 요소를 추가합니다. 이미 존재하면 추가되지 않으며, false를 반환합니다.

요소 제거

  • remove(Object o) : 지정된 요소를 제거합니다. 성공하면 true, 그렇지 않으면 false를 반환합니다.

요소 확인

  • contains(Object o) : 지정된 요소가 존재하면 true, 그렇지 않으면 false를 반환합니다.

기타

  • clear() : 모든 요소를 제거합니다.
  • size() : HashSet에 포함된 요소의 개수를 반환합니다.
  • isEmpty() : HashSet이 비어 있으면 true, 그렇지 않으면 false를 반환합니다.
  • iterator() : 요소를 반복할 수 있는 Iterator를 반환합니다.

TreeSet

import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        // TreeSet 생성
        TreeSet<String> set = new TreeSet<>();
        
        // 요소 추가
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 중복된 요소, 추가되지 않음
        
        // 출력
        System.out.println(set); // [Apple, Banana, Cherry]
        
        // 요소 제거
        set.remove("Banana");
        
        // 특정 요소 존재 여부 확인
        boolean hasApple = set.contains("Apple"); // true
        boolean hasBanana = set.contains("Banana"); // false
        
        // 전체 요소 출력
        for (String fruit : set) {
            System.out.println(fruit);
        }
        
        // 사이즈 확인
        System.out.println("Size: " + set.size());
        
        // 정렬된 집합에서 특정 범위의 요소 조회
        System.out.println("First element: " + set.first());
        System.out.println("Last element: " + set.last());
        System.out.println("HeadSet (before 'Cherry'): " + set.headSet("Cherry"));
        System.out.println("TailSet (from 'Apple'): " + set.tailSet("Apple"));
    }
}

컬렉션 프레임워크에서 Set 인터페이스를 구현한 클래스 중 하나로, 요소들이 정렬된 상태로 유지되도록 해줍니다.

 

주요 특징

  • 정렬: TreeSet의 요소는 자동으로 정렬되며, 기본적으로 요소의 자연 순서에 따라 정렬됩니다. 정렬 방식을 변경하려면 생성자에서 Comparator를 제공할 수 있습니다.
  • 반복: TreeSet은 정렬된 순서로 요소를 반복할 수 있습니다.
  • null 요소: TreeSet은 null 요소를 허용하지 않습니다. null 요소를 추가하려고 하면 NullPointerException이 발생합니다.

주요 메소드

요소 추가

  • add(E e) : 지정된 요소를 TreeSet에 추가합니다. 중복된 요소는 추가되지 않으며, 추가되면 true, 그렇지 않으면 false를 반환합니다.

요소 제거

  • remove(Object o) : 지정된 요소를 TreeSet에서 제거합니다. 성공적으로 제거되면 true, 요소가 없으면 false를 반환합니다.

요소 확인

  • contains(Object o) : TreeSet에 지정된 요소가 포함되어 있는지 확인합니다. 포함되어 있으면 true, 그렇지 않으면 false를 반환합니다.

기타

  • first() : TreeSet에서 가장 첫 번째(최소) 요소를 반환합니다.
  • last() : TreeSet에서 가장 마지막(최대) 요소를 반환합니다.
  • SortedSet<E> headSet(E toElement) : 지정된 요소보다 작은 요소들로 구성된 SortedSet을 반환합니다.
  • SortedSet<E> tailSet(E fromElement) : 지정된 요소보다 크거나 같은 요소들로 구성된 SortedSet을 반환합니다.
  • SortedSet<E> subSet(E fromElement, E toElement) : 지정된 범위의 요소들로 구성된 SortedSet을 반환합니다. 범위는 fromElement(포함)와 toElement(포함되지 않음)입니다.

 

Map<K, V>


import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // HashMap 생성
        Map<String, String> map = new HashMap<>();
        
        // 요소 추가
        map.put("key1", "value1");
        map.put("key2", "value2");
        
        // 값 조회
        System.out.println("Value for key1: " + map.get("key1")); // value1
        
        // 요소 제거
        map.remove("key2");
        
        // 전체 키-값 쌍 출력
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
        
        // 사이즈 확인
        System.out.println("Size: " + map.size()); // 1
    }
}

Map은 키와 값을 연관시켜 저장하며, 각 키는 고유하고 각 값은 키에 의해 매핑됩니다. Map 인터페이스는 Collection 프레임워크의 일부로, 키-값 쌍을 효율적으로 저장하고 검색하는 기능을 제공합니다.

 

주요 특징

  • 키-값 쌍: Map은 키와 값의 쌍으로 데이터를 저장합니다. 각 키는 유일해야 하며, 같은 키를 사용하여 값을 덮어쓸 수 있습니다.
  • 키의 유일성: Map에서는 같은 키를 두 번 사용할 수 없지만, 같은 값은 여러 번 사용할 수 있습니다.
  • 빠른 검색: Map은 키를 사용하여 값을 빠르게 검색할 수 있는 효율적인 데이터 구조를 제공합니다.

주요 메소드

요소 추가

  • put(K key, V value) : 지정된 키와 값을 Map에 추가합니다. 기존에 같은 키가 있으면 기존 값을 덮어쓰며, 이전 값을 반환합니다.

요소 제거

  • remove(Object key) : 지정된 키에 대한 값을 제거하고 반환합니다. 키가 없으면 null을 반환합니다.

요소 확인

  • get(Object key) : 지정된 키에 대한 값을 반환합니다. 키가 없으면 null을 반환합니다.
  • containsKey(Object key) : 지정된 키가 Map에 존재하는지 확인합니다. 존재하면 true, 그렇지 않으면 false를 반환합니다.
  • containsValue(Object value) : 지정된 값이 Map에 존재하는지 확인합니다. 존재하면 true, 그렇지 않으면 false를 반환합니다.

기타

  • size() : Map에 저장된 키-값 쌍의 수를 반환합니다.
  • isEmpty() : Map이 비어 있는지 확인합니다. 비어 있으면 true, 그렇지 않으면 false를 반환합니다.
  • clear() : Map의 모든 키-값 쌍을 제거합니다.
  • keySet() : Map에 있는 모든 키를 반환하는 Set을 반환합니다.
  • Collection<V> values() : Map에 있는 모든 값을 반환하는 Collection을 반환합니다.
  • Set<Map.Entry<K, V>> entrySet() : Map에 있는 모든 키-값 쌍을 반환하는 Set을 반환합니다. 각 요소는 Map.Entry 객체입니다.

 

출처

W3school

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Programming > Java' 카테고리의 다른 글

중첩 클래스  (0) 2024.08.11
열거형, 가변인자, 어노테이션  (0) 2024.08.11
제네릭  (0) 2024.08.10
Arrays 클래스  (0) 2024.08.09
StringTokenizer 클래스  (0) 2024.08.09