Java

Java Collection

기기디 2024. 3. 2. 09:33

자바에서 제공하는 Collection interface에 대해서 정리한 내용

 

Java에서 Collection이란?

  • 여러 데이터를 담을 수 있는 자료구조를 뜻한다. 기존 배열과의 차이점으로 데이터의 갯수에 따라서 동적메모리 할당이 가능하다.
  • Iterable인터페이스를 상속받는다. 기본적으로 Iterable인터페이스를 사용하여 순차적으로 데이터를 가져올 수 있다는것을 의미한다. 향상된 for문을 쓸 수 있다는걸 의미하기도 한다.
  • 컬렉션의 인터페이스는 List, Set, Queue, Map으로 구분할 수 있다. 이 중에서 Map은 Collection Interface를 상속받고 있지 않지만 Collection으로 구분한다.

Java에서 자료구조의 분류

  • 선형자료구조(Linear Data Structure) : List, Queue, Deque이 있다. 데이터가 일렬로 연결된 형태를 말한다.
  • 비선형자료구조(NonLinear Data Structure) : Graph, Tree가 있다. 각 요소가 여러개의 요소와 연결된 형태를 생각를 말한다. 거미줄처럼 엮여있는 형태로 그려진다.
  • Set은 기타자료구조, 집합자료구조로 분류된다. 집합의 경우 데이터가 연결된 형식이 아니다.

List인터페이스

  • 저장순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.

ArrayList

  • 동적으로 크기가 조정되는 배열을 제공한다. 기본크기는 10으로 설정되어있지만 개체를 추가, 삭제함에 따라서 ArrayList내부에서 자동으로 크기를 조절한다. 이러한 작업은 어플리케이션 성능에 영향을 주고 데이터 크기가 예측된다면 크기를 지정하는것도 방법이라고 한다.
  • 하나의 List객체를 여러 스레드에서 사용한다면 Thread Safe하지 않다. 단방향 포인터구조를 가진다.

Vector

  • ArrayList와 유사하지만 Thread Safe하다. Thread Safe를 보장하기 위해서 동기화 처리가 자주 일어나 비교적 성능이 떨어지고 무겁다.
  • 한개의 스레드만 접근 가능하다. 여러개의 스레드가 접근한다면 다른 스레드는 기다려야한다.

Stack

  • Vector를 확장한다. 나중에 들어온 데이터가 먼저 나간다는 특징(Last In First Out)이 있다.
  • 보통 프로그래밍 언어에서 스택이라고 하면 메소드가 호출된 순서를 기억하는 장소를 말한다. 보통 메소드 안에 메소드를 호출하는것처럼 갈고리처럼 엮여있는 데이터(정해진 순서를 지켜야하는 데이터)를 다룰때 활용한다.

Set인터페이스

  • 저장순서를 보장하지 않고 데이터의 중복을 허용하지 않는다는 특징을 가진다.
  • 중복되는것을 방지하고 원하는 값이 포함되어있는지 확인하려고 할 때 주로 쓰인다.
  • Set은 순서가 없어서 index를 파라미터로 넘기는 메소드나 데이터의 인덱스를 반환하는 메소드가 존재하지 않는다. ex) get(), indexOf()
  • Thread Safe를 보장하지 않는다.

HashSet

  • Set중에 가장 빠르다. 순서를 보장하지도 않고 정렬작업도 지원하지 않는다.
  • 생성자를 이용하여 객체생성시 로드팩터라는 개념을 활용하여 배열의 크기를 지정한다. 데이터의 개수가 증가하여 로드팩터보다 커지면 저장공간의 크기는 증가되고 해시재정리 작업이 필요하다. 이 작업은 자료구조를 재구성하는 단계를 거치므로 성능에 영향을 끼친다.
  • 로드팩터가 크면 클수록 데이터를 찾는 시간이 늘어난다.
  • 객체를 저장하기전 저장할 객체의 hashCode()메소드를 호출하여 해시코드를 알아내고 set내부에 hashCode와 비교하여 없을때 저장한다.

TreeSet

  • HashSet보다 느리다. 데이터의 순서를 오름차순으로 정렬하여 저장한다. 다른 Set인터페이스를 확장하는 클래스들과 다르게 순서를 정렬하는 메소드를 제공한다.
  • red-black이라는 이진탐색트리타입으로 값이 저장된다.

LinkedHashSet

  • 연결된 목록 타입으로 구현된 해시테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다.
  • HashSet과 유사하지만 차이점은 데이터를 저장하는 순서를 보장한다. set중에서 성능이 가장 떨어진다.

Queue인터페이스

  • FIFO기능을 지원하기 위해서 필요한 인터페이스다.
  • 여러 쓰레드에서 들어오는 작업을 순차적으로 처리할 때 많이 사용한다. ex)서버에 클라이언트로 부터 동시에 다수의 요청이 들어왔을때 순차적으로 처리하기 위해 사용

LinkedList

  • 데이터가 지속적으로 삭제되고 추가되는 상황에 유리하다. 배열의 중간에 있는 데이터를 지웠을때 지운 데이터의 앞과 뒤에 있는 데이터를 양방향 포인터로 연결해주기만 하면 되기 때문이다.
  • 객체를 생성할때 크기를 지정하지 않는다. 데이터들이 앞뒤로 연결되는 구조이기 때문에 미리 공간을 설정할 필요가 없다. 정해진 길이보다 데이터가 늘어났을때 HashSet이나 다른 배열처럼 크기를 자동으로 늘리는 작업을 하지 않는다.
  • List, Queue, Deque인터페이스를 구현한다.
  • 데이터가 메모리상에서 연속된 위치에 저장되지 않고 데이터부분과 주소부분이 있는 별도의 객체에 저장된다. 이러한 부분때문에 ArrayList와 비교할때 조회부분에서 속도가 느릴 수 있다. 대신 삽입과 삭제가 데이터의 위치정보만 수정하면 되기에 빠르다.
  • 포인터와 주소를 사용해서 데이터를 가져오고 각 데이터를 노드라고 부르기도한다. 양방향 포인터구조를 가진다.

PriorityQueue

  • 우선순위에 따라서 객체를 처리해야 할 때 사용한다. poll() - 오름차순으로 데이터를 반환하고 제거하고 peek()첫번쨰 데이터결과를 반환하는 등의 기능들이 있다.

Deque

  • 양방향 큐라고 불리기도한다. 큐와 같이 선입선출의 구조를 가지지만 양쪽 끝에서 데이터를 추가하고 제거 할 수 있다.

ArrayDeque

  • Deque와 같지만 동적으로 크기조절이 가능하다.

Map인터페이스

  • HashTable, HashMap, TreeMap, Properties, LinkedHashMap을 구현한다.
  • key-value형식으로 데이터를 저장하고 순서는 유지되지 않으며 키의 중복을 허용하지 않는다.
  • Map객체에 저장된 모든 value를 반환하는 values()메소드는 value는 중복을 허용하기 때문에 Collection으로 목록을 반환한다.
  • Map객체에 저장된 모든 key를 반환하는 keySet()메소드는 key는 중복을 허용하지 않기 때문에 Set으로 목록을 반환한다.

HashMap

  • 담을 데이터의 갯수가 많을 경우 객체 생성시 크기지정을 권장한다.
  • HashMap에서 키값이 될 객체가 직접 만든 클래스일 경우, 기존의 hashCode()와 equlas()메소드를 재정의하여 동일한 값을 비교할 수 있도록 해줘야한다.
  • Thread Safe하지 않다. 이런 특징때문에 싱글쓰레드환경에서 사용하는게 좋다.
  • 동기화처리를 하지 않기 때문에 데이터 조회시 속도가 빠르다.
  • key와 value에 null삽입을 허용한다.
  • HashTable이나 ConcurrentHashMap보다 조회속도가 빠르지만 신뢰성과 안정성이 떨어진다.

HashTable

  • JDK1.0부터 만들어져 사용됐고 JDK1.2에 추가된 Map인터페이스에 맞춰 보완됐다. 그렇기에 Map인터페이스를 구현했지만 다른 Map인터페이스를 구현한 클래스들과 차이가 있다.
  1. Enumeration 객체를 통해서 데이터 처리. Map은 컬렉션 뷰를 사용.
  2. 키-값 쌍으로 데이터 순환 처리 불가능(키, 값은 가능). Map은 키, 값, 키-값 쌍으로 데이터 순환처리 가능.
  3. 이터레이션을 처리하는 도중에 데이터를 삭제하는 안전한 방법 제공 x. Map은 제공.
  • HashMap과 동일하지만 Thread Safe하다. 멀티쓰레드를 사용할 수 있고 ThreadSafe를 Sychronized로 보장하기 때문에 HashMap보다는 느리다.
  • key와 value에 null을 허용하지 않는다

ConcurrentHashMap

  • key와 value에 null을 허용하지 않는다
  • ThreadSafe를 보장한다. 보장방법으로 특정 Entry를 처리할때 해당 Entry에만 락을 거는 방식으로 HashTable보다 빠르다.
  • HashMap의 동기화문제를 보완하기 위해서 나타났다.
  • 키와값으로 구성되는 데이터를 엔트리라고 한다.

TreemMap

  • SortedMap인터페이스를 구현하여 저장되는 키를 정렬한다.
  • 저장하는 시점에 키를 오름차순으로 정렬한다. 숫자 → 알파벳대문자 → 알파벳소문자 → 한글순으로 정렬한다.
  • 키가 정렬되기 때문에 매우 많은 데이터를 저장할 경우 HashMap보다 느리다.

Properties

  • HashTable을 확장하는 클래스다. key값을 String으로만 제한한다. .properties파일을 읽을때 사용된다고 한다.

Collections클래스

  • java1.2부터 존재하는 static클래스로 Collection인터페이스에 속하는 클래스 객체들을 정렬하거나 비교, 임의의값으로 섞는 기능들을 지원한다.

Iterator, ListIterator, Enumeration

'Java' 카테고리의 다른 글

Java Input/Output(I/O)  (0) 2024.03.07
Java.lang  (0) 2024.03.05
Effective Java 정리 #1  (1) 2023.12.10
동기와 비동기, Java Synchronized  (0) 2022.05.28
Servlet서블릿  (0) 2022.05.25