인생을 코딩하다.

[Java] Collection - Set과 Queue 본문

Java

[Java] Collection - Set과 Queue

Hyung1 2021. 1. 14. 02:55
728x90
반응형

Set은 순서에 상관 없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용된다. 중복되는 것을 방지하고, 원하는 값이 포함되어 있는지를 확인하는 것이 주 용도다. Map 인터페이스의 Key만 사용하고 value는 항상 같은 Dummy 값을 넣어두고 사용하지 않는다.

 

HashSet : 순서가 전혀 필요 없는 데이터를 해시 테이블에  저장한다. Set 중에 가장 성능이 좋다. 내부적으로 HashMap를 사용한다.

TreeSet : 저장된 데이터의 값에 따라서 정렬되는 셋이다. red-black이라는 트리타입으로 값이 저장되며, HashSet 보다 약간 성능이 느리다. 내부적으로 TreeMap을 사용한다

LinkedHashSet : 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 대신 성능이 이 셋중에서 가장 나쁘다. 내부적으로 LinkedHashMap을 사용한다.

 

HashSet의 상속관계

java-lang-Object - java.util.AbstractCollection - java.util.AbstractSet<E> - java.util.HashSet<E>

 

구현되어 있는 메소드는 Object 클래스에서 선언되어 있는 equals(), hashCode() 메소드와 이 클래스에서 추가한 removeAll() 뿐이다. 

 

생성자 설명
HashSet() 데이터를 저장할 수 있는 16개의 공간과 0.75의 로드 팩터(load fac-tor)를 갖는 객체를 생성한다.
HashSet(Collection<? extends E> c) 매개 변수로 받은 컬렉션의 객체의 데이터를 HastSet에 담는다.
Hash(int initialCapcity, float loadFactor) 첫 매개 변수로 받은 개수만큼의 데이터 저장 공간과 두 번째 매개 변수로 받은 만큼의 로드 팩터를 갖는 객체를 생성한다.

여러 가지 생성자가 있지만, 여기서 자주나오는 "로드 팩터" 라는 것은 뭘까?

로드 팩터 (데이터의 개수) / (저장 공간)을 의미한다. 만약 데이터의 개수가 증가하여 로드 팩터보다 커지면, 저장 공간의 크기는 증가되고 해시 재정리 작업을 해야만 한다. 해시 재정리 작업에 들어가면, 내부에 갖고 있는 자료 구조를 다시 생성하는 단계를 거쳐야하므로 성능에 영향이 발생한다.

 

로드 팩터라는 값이 클수록 공간을 넉넉해지지만, 데이터를 찾는 시간은 증가한다. 따라서, 초기 공간 개수와 로드 팩터는 데이터의 크기를 고려하여 산정하는 것이 좋다. 왜냐하며느 초기 크기가 (데이터의 개수) / (로드 팩터) 보다 클 경우에는 데이터를 쉽게 찾기 위한 해시 재정리 작업이 발생하지 않기 때문이다. 따라서, 대량의 데이터를 여기에 담아 처리할 때에는 초기 크기와 로드 팩터의 값을 조절해 가면서 가장 적당한 크기를 찾아야만 한다. 하지만, 대부분의 초급 개발자 분들은 로드 팩터를 건드릴 필요가 거의 없으므로, 매개 변수가 없는 첫 번째 생성자를 사용하거나, 세 번째에 잇는 초기 크기만 지정하는 생성자를 사용하면 된다.

HashSet의 주요 메소드

리턴 타입 메소드 이름 및 매개 변수 설명
boolean add(E e) 데이터를 추가한다.
void clear() 모든 데이터를 삭제한다.
Object clone() HashSet 객체를 복사한다. 하지만, 담겨 있는 데이터들은 복제하지 않는다.
boolean contains(Object o) 지정한 객체가 존재하는지를 확인한다.
boolean isEmpty() 데이터가 있는지를 확인한다.
Iterator<E> iterator() 데이터를 꺼내기 위한 Iterator 객체를 리턴한다.
boolean remove(Object o) 매개 변수로 넘어온 객체를 삭제한다.
int size() 데이터의 개수를 리턴한다.

 

Queue란? 

 

먼저 들어온 데어터를 먼저 처리해주는 FIFO 기능을 처리하기 위해 사용. Queue 인터페이스를 구현한 클래스는 두가지로 나뉜다. util 패키지에 속하는 LinkedList와 PriorityQueue는 일반적인 목적의 큐 클래스이고 concurrent 패키지에 속하는 클래스들은 스레드에 안전한 컨커런트 큐 클래스이다.

- LinkedBlockingQueue: 저장할 데이터의 크기를 선택적으로 정할수도 있는 FIFO 기반의 링크 노드를 사용하는 블로킹 큐

- ArrayBlockingQueue: 저장되는 데이터의 크기가 정해져 있는 FIFO 기반의 블로킹 큐
- PriorityBlockingQueue: 저장되는 데이터의 크기가 정해져 있지 않고 객체의 생성순서에 따라서 순서가 저장되는 블로킹 큐

- DelayQueue: 큐가 대기하는 시간을 지정하여 처리하도록 되어 있는 큐

- SynchronousQueue: put() 메서드를 호출하면, 다른 스레드에서 take() 메서드를 호출될 때까지 대기하도록 되어 있는 큐, 이 큐에는 저장되는 데이터가 없다. API에서 제공하는 대부분의 메서드는 0이나 null을 리턴한다.

 

blocking queue란 크기가 지정되어 있는 큐에 더 이상 공간이 없을 때, 공간이 생길 때 까지 대기하도록 만들어진 큐를 의미한다.

Collection의 List 알아보기, Map 알아보기

 

참고 자료

- 자바의 신, 자바 성능 튜닝 이야기 / 이상민

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] JVM(Java Virtual Machine)란?  (2) 2021.01.15
[Java] Collection - Map  (0) 2021.01.14
[Java] Collection - List  (0) 2021.01.13
[Java] Collection  (0) 2021.01.13
[Java] Call by value의 메모리 관리 과정  (2) 2021.01.09
Comments