컬렉션 프레임워크 (1)

HyeonWoo·2021년 5월 3일
0

Java

목록 보기
10/12
post-thumbnail

실제 개발 시에는 다루고자 하는 컬렉션(자료구조)의 특징을 파악하고 어떤 인터페이스를 구현한 컬렉션 클래스를 사용해야하는지 결정할 줄 알아야 한다. 학교 수업 시간에 배운 자바 컬렉션을 '자바의 정석'이라는 책을 통해서 다시 한번 정리 하고자 한다.

컬렉션 프레임워크

데이터 군을 저장하는 클래스들을 표준화한 설계. 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스를 제공.

컬렉션 프레임워크에서는 컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는데 필요한 기능을 가진 3가지의 인터페이스를 정의하였다. 그리고 인터페이스 List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였다. 아래 사진에서 볼 수 있듯이 List와 Set을 구현한 컬렉션 클래스들은 서로 많은 공통부분이 있다는 것을 알 수 있다.

인터페이스특징
List순서가 있는 데이터의 집합. 데이터의 중복을 허용한다. ex)대기자 명단, ArrayList, LinkedList, Stack, Vector 등
Set순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. ex)양의 정수집합, 소수의 집합, HashSet, TreeSet 등
Map키(Key)와 값(Value)의 쌍(Pair)으로 이루어진 데이터의 집합. 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다 ex) 우편번호, 지역번호(전화번호), HashMap, TreeMap, Hashtable, Properties 등

Collection인터페이스

List인터페이스

  • 중복 허용, 저장 순서 유지

Set인터페이스

  • 중복을 허용하지 않고, 저장 순서가 유지되지 않음.

Map인터페이스

  • 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스.

  • 키는 중복될 수 없지만 값은 중복을 허용한다.

  • 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.

  • values()에서는 반환타입이 Collection, keySet()에서는 반환타입이 Set

ArrayList vs LinkedList

1. ArrayList

  • 컬렉션 프레임워크에서 가장 많이 사용되는 컬렉션 클래스.

  • ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용.

  • ArrayList를 생성할 때, 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유 있는 크기로 하는 것이 좋다. 생성할 때 지정한 크기보다 더 많은 객체를 저장하면 자동적으로 크기가 늘어나기는 하지만 이 과정에서 처리시간이 많이 소요되기 때문.

  • ArrayList나 Vector 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야하기 때문에 상당히 효율이 떨어진다는 단점을 가지고 있다. 그래서 처음에 인스턴스를 생성할 때, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋다.

  • 배열에 객체를 순차적으로 저장할 때와 객체를 마지막에 저장된 것부터 삭제하면 System.arraycopy()를 호출하지 않기 때문에 작업시간이 짧지만, 배열의 중간에 위치한 객체를 추가하거나 삭제하는 경우 System.arraycopy()를 호출해서 다른 데이터의 위치를 이동시켜 줘야 하기 때문에 다루는 데이터의 개수가 많을수록 작업시간이 오래 걸린다.

2. LinkedList

배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(접근시간)이 가장 빠르다는 장점을 가지고 있지만 다음과 같은 단점도 가지고 있다.

배열의 단점

  • 크기를 변경할 수 없다.

    • 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야한다.
    • 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다
  • 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

    • 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.

이러한 배열의 단점을 보완하기 위해 링크드 리스트라는 자료구조가 고안되었다. 배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.

  • 실제 LinkedList클래스는 이름과 달리 '링크드 리스트'가 아닌 '더블 링크드 리스트'로 구현되어 있다. 즉 각 노드가 다음과 같다.
class Node {

    Node next; //다음 요소의 주소를 저장
    Node previous; //이전 요소의 주소를 저장
    Obeject obj;
    
}

이는 링크드 리스트의 단점인 낮은 접근성을 높이기 위한 것이다.

3. ArrayList와 LinkedList 비교

  • 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.

  • 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.

컬렉션읽기(접근시간)추가/삭제비고
ArrayList빠르다느리다순차적인 추가삭제는 더 빠름. 비효율적인 메모리 사용
LinkedList느리다빠르다데이터가 많을수록 접근성이 떨어짐
  • 다루고자 하는 데이터의 개수가 변하지 않는 경우라면, ArrayList가 최상의 선택이 되겠지만, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는 것이 더 나은 선택.

다음 포스터에 이어서 Stack, Queue, Set, Map에 대해 정리하도록 하겠다.

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글