반응형
Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

지식조각모음

11. 컬렉션 프레임웍 본문

책/자바의 정석

11. 컬렉션 프레임웍

y00 2022. 3. 6. 00:02
반응형

컬렉션 프레임웍이란, '데이터 군(群)을 저장하는 클래스들을 표준화한 설계'를 뜻한다. 즉 데이터 그룹(collection)을 표준화한 프로그래밍 방식이다.
JDK1.2부터 컬렉션 프레임웍이 등장하면서 모든 컬렉션 클랙스를 표준화된 방식으로 다룰 수 있도록 체계화 되었다.

public interface Collection<E>
extends Iterable<E>
  • 컬렉션 프레임웍의 장점
    1. collection(다수의 데이터)을 다루는데 다양한 클래스를 제공
    2. 인터페이스와 다형성을 이용하여 표준화
    3. 사용하기 편리
    4. 재사용성 높은 코드 작성

라이브러리와 프레임웍

  • 라이브러리: 공통으로 사용될만한 유용한 기능을 모듈화하여 제공
    • 개발을 위한 도구
  • 프레임웍: 기능뿐만 아니라 프로그래밍 방식을 정형화

컬렉션 프레임웍의 핵심 인터페이스

상속계층도

컬렉션 데이터 그룹을 3가지로 나누고, 각 컬렉션을 다루기 위한 3개의 인터페이스 정의

  • List: 순서가 있는 데이터의 집합, 중복 허용
  • Set: 순서가 없는 데이터의 집합, 중복 허용하지 않음
  • Map: key-value로 이루어진 데이터의 집합. 키는 중복 허용되지 않음.

Collection interface

참고: https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html
데이터를 읽고, 추가하고, 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드를 정의

List interface

  • 순서가 있는 컬렉션. integr 인덱스를 통해 각 element에 접근이 가능하다.
  • set과 다르게 중복을 허용한다.

Set interface

  • 저장순서가 유지되지 않음
  • 중복을 허용하지 않는다

Map interface

  • key-value 쌍을 저장하는 컬렉션 클래스
  • key는 중복될 수 없지만 value는 중복을 허용한다
Map map = new HashMap();

// value의 중복은 허용한다
map.put("key", "value");
map.put("key2", "value");
System.out.println(map.get("key"));        // value
System.out.println(map.get("key2"));    // value

// key의 중복은 허용하지 않는다.
// 새로운 value로 대채
map.put("key", "value");
System.out.println(map.get("key"));        // value

map.put("key", "value2");
System.out.println(map.get("key"));        // value2

ArrayList

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final int DEFAULT_CAPACITY = 10;

    transient Object[] elementData; // non-private to simplify nested class access

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;

    ...
}

Object 배열을 이용해서 데이터를 순차적으로 저장한다.
실제로 크기를 변경할 수 없다. 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존 배열을 새로운 배열로 복사하여 저장한다. 이 과정에서 메모리가 낭비된다.

특징

  • add 등 메소드를 수행하면 O(n)이 소요된다.
    • 중간에 데이터를 추가하면 다른 데이터들을 복사해서 이동해야 한다.
  • 모든 ArrayList 인스턴스는 리스트에 저장될 수 있는 사이즈인 _capacity_를 가지며 최대 사이즈는 리스트 사이즈이다.
  • synchronized하지 않다.

LinkedList

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable
{
    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;

    ...
}

배열의 단점을 보완. 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다. 링크드 리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.

// LinkedList 내부에 구현되어 있는 Node class
private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

Stack and Queue

Stack

  • 마지막에 저장한 데이터를 가장 먼저 꺼낸다
  • 순차적으로 데이터를 추가/삭제하기 때문에 ArrayList와 같은 배열 기반의 컬렉션 클래스가 적합

Queue

  • 처음에 저장한 데이터를 가장 먼저 꺼낸다
  • 데이터를 꺼낼 때 첫 번째 데이터를 삭제하므로, LinkedList가 적합

Iterator

Iterator, ListIterator, Enumeration 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스

public interface Iterator<E>
public interface Collection<E>
extends Iterable<E>
반응형

' > 자바의 정석' 카테고리의 다른 글

12. 제네릭스, 열거형, 애너테이션  (0) 2022.03.13
Comparator와 Comparable  (1) 2022.03.10
10. 날짜와 시간 & 형식화  (1) 2022.03.05
9. java.lang 패키지와 유용한 클래스  (0) 2022.03.03
8. 예외처리  (4) 2022.03.03