Java & Spring

java Collection 프레임워크 정리

닥치고개돌 2021. 8. 11. 23:40
728x90

배열을 사용하다 보면 크기가 고정적이라 여러가지 비효율적인 문제가 생긴다.  배열의 크기는 생성할 때 결정되고 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없다. 또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리가 낭비되는 등 문제가 발생.  배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 자료구조 라이브러리를 컬렉션 프레임워크라고 한다. 

 

 

Collection 인터페이스는 List, Set, Queue로 크게 3가지 상위 인터페이스로 분류할 수 있다.

그리고 여기에 Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.

 

 

 Collection 인터페이스의 특징

 

인터페이스  구현클래스  특징 
 Set  HashSet
TreeSet
 순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
 List  LinkedList
Vector
ArrayList
 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
 Queue  LinkedList
PriorityQueue
 List와 유사
 Map  Hashtable
HashMap
TreeMap
 키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로,
순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

 

1. List 인터페이스

 

List 컬렉션은 객체를 일렬로 늘어놓은 구조. List 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공. (인덱스에는 데이터가 저장되어 있는 참조 값을 가지고 있습니다.)

List컬렉션은 객체 자체를 저장하는 것이 아니라 위와 같이 객체의 번지를 참조합니다. 동일한 객체를 중복 저장할 수 있는데 이 경우 동일한 번지가 참조됩니다. null도 저장이 가능한데 이 경우 해당 인덱스는 객체를 참조하지 않습니다. 

 

  • ArrayList
    -  크기가 가변적으로 변하는 선형리스트입니다. 일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점등이 유사하지만 한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다는 특징

  • LinkedList
    - 중간에 데이터를 추가나 삭제하더라도 전체의 인덱스가 한 칸씩 뒤로 밀리거나 당겨지는 일이 없기에 ArrayList에 비해서 데이터의    추가나 삭제가 용이하나, 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요로 하여 탐색 속도가 떨어진다는 단점이      있다. 그러므로 탐색 또는 정렬을 자주 하는 경우엔 배열을 사용하고 데이터의 추가/삭제가 많은 경우 연결 리스트를 사용하는 것이 좋 다
    - 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임

  • Vector
    -Arraylist와 기본적인 기능은 동일하나 자동 동기화 기능이 있음. 하지만 Arraylist가 속도도 더 빠르기 때문에 벡터에 비해 많이 쓰이고 있습니다.
    - 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음

 

2. Set 인터페이스

 

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공

 

  • HashSet
    - Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있다. 또한 저장 순서가 유지되지 않는데, 만약 요소의 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용
    - 가장빠른 임의 접근 속도
    - 비선형 구조이기에 순서가 없으며 그렇기에 인덱스도 존재하지 않는다. 그렇기에 값을 추가하거나 삭제할 때에는 내가 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색 한 뒤 추가나 삭제를 해야 하므로 속도가 List구조에 비해 느림.

  • TreeSet
    -  TreeSet은 이진 탐색 트리(BinarySearchTree) 구조로 이루어져 있어 추가와 삭제에는 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보이는 자료구조
    - 데이터를 저장할 시 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장하기에 기본적으로 nature ordering를 지원하며 생성자의 매개변수로 Comparator객체를 입력하여 정렬 방법을 임의로 지정해 줄 수도 있음

 

3. Map 인터페이스

 

-Map 컬렉션은 키(key)와 값(value)으로 구성된 객체를 저장하는 구조를 가지고 있는 자료구조입니다. 키는 중복으로 저장할 수 없고 값은 중복으로 저장할 수 있으며 중복된 key값이 들어온다면 기존의 값은 없어지고 새로운 값으로 대치됩니다.

 

  • Hashtable
    - HashMap보다는 느리지만 동기화 지원
    - null불가

  • HashMap
    - 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
    - HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.
    -  HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 두배로 늘리면서 과부하가 많이 발생. 그렇기에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정필요

  • TreeMap
    - 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름
    - TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면 TreeMap은 키와 값이 저장된 Map, Etnry를 저장
    - 정렬 순서는 기본적으로 부모 키값과 비교해서 키 값이 낮은 것은 왼쪽 자식 노드에 키값이 높은 것은 오른쪽 자식 노드에 Map.Etnry 객체를 저장
    - 정렬된 상태로 Map을 유지해야 하거나 정렬된 데이터를 조회해야 하는 범위 검색이 필요한 경우 TreeMap을 사용하는 것이 효율
728x90

'Java & Spring' 카테고리의 다른 글

java 웹 서버 및 WAS 개념정리, 차이점  (0) 2021.08.16
java int to char 형변환  (0) 2021.08.15
java array관련 함수  (0) 2021.08.09
java string관련 함수정리  (0) 2021.08.08
자바 parseInt vs valueOf 차이  (0) 2021.08.07