[TransferObject] Collection, Map Interface

GilLog·2021년 5월 14일
0

🙆‍♂️ import 🙇‍♂️

자바 성능 튜닝 이야기[ProgrammingInsight-이상민]


대부분 프로젝트에서 Transfer Object를 많이 사용하고, 그 내부에서 CollectionMap Interface를 상속받는 객체가 많이 사용된다.

목록 데이터를 담기에 가장 좋은것이 Array이고, 그 다음으로 Collection 관련 객체들이기 때문이다.

Array는 생성부터 크기를 지정해야 하지만, Collection객체 들은 그럴 필요 없이 자동으로 크기가 증가된다.

이번엔 어떤 객체를 써야 성능면에서 우수한지 알아보려한다.


Collection 및 Map Interface

Array를 제외하면 Data를 담기 가장 좋은 객체CollectionMap Interface를 상속한 객체이다.

CollectionMap에 대해 간략히 정리해보면 아래와 같다.

Interface설명
Collection가장 상위 Interface
Set중복을 허용하지 않는 집합 처리용도 Interface
SortedSet오름차순을 갖는 Set Interface
List순서가 있는 집합 처리 용도 Interface, Index가 있어 위치를 지정해 값을 찾을 수 있다.
중복을 허용, List Interface를 상속받는 Class 중 가장 많이 사용하는 것이 ArrayList
Queue여러개 객체를 처리하기 전 담아 처리할 때 사용하는 Interface, FIFO
MapKey와 Value 쌍으로 구성된 객체 집합을 처리하기 위한 Interface, 중복 키를 허용하지 않는다.
SortedMapKey를 오름차순으로 정렬하는 Map Interface

Set Interface

먼저 Set Interface에 대해 알아보면, Set Interface는 중복이 없는 집합 객체를 만들때 유용하게 사용된다.

예를들어 전체 학생 이름이 몇개 인지 확인하기 위해서 중복되는 이름을 제외해야 하지만, Set 객체에 Data를 저장하면 중복되는 Data는 원천적으로 삽입되지 않는다.

Set Interface를 구현한 Class로는 HashSet, TreeSet, LinkedHashSet 세 가지가 있다.

Class설명
HashSetData를 Hash Table에 저장하는 Class로 순서 없이 저장한다.
TreeSetRed-Black이라는 Tree 구조에 Data를 저장, 값에 따라 순서가 정해진다.
Data를 담으면서 동시에 정렬을 수행하여 HashSet보다 성능 상 느리다.
LinkedHashSetHash Table에 Data를 저장하는데, 저장된 순서에 따라 순서가 결정된다.

Red Black Tree??

Red-Black Tree이진 트리 구조로 Data를 담는 구조를 말하며 아래와 같은 특징이 있다.

  1. 각각의 노드는 검은색이나 붉은색 이어야 한다.

  2. 가장 상위(root) 노드는 검은색이다.

  3. 가장 말단(leaves) 노드는 검은색이다.

  4. 붉은 노드는 검은 하위 노드만을 가진다.

  5. 검은 노드는 붉은 상위 노드만을 가진다.

  6. 모든 말단 노드로 이동하는 경로의 검은 노드 수는 동일하다.


List Interface

List Interface 는 Array의 확장판이라고 보면 된다.

C나, JavaArray는 모두 최초 선언 시 담을 수 있는 Data의 개수를 한정하여 생성한다.

하지만 List Interface를 구현한 Class들은 담을 수 있는 크기가 자동으로 증가 되므로, Data의 개수를 확실히 모를 때 유용하게 사용할 수 있다.

List Interface를 구현한 Class에는 ArrayList, Linked-List, 원조 Class 격인 Vector Class가 있다.

Class설명
Vector객체 생성 시 크기를 지정할 필요가 없는 Array Class이다.
ArrayListVector와 비슷하지만, 동기화 처리가 되어 있지 않다.
LinkedListArrayList와 동일하지만, Queue Interface를 구현했기 때문에, FIFO Queue 작업을 수행한다.

Map Interface

Map Interface는 Key, Value 쌍으로 저장되는 구조체이다.

단일 객체만 저장되는 다른 Collection과는 다르게 따로 분리되어 있다.

Map Interface는 ID와 PassWord, Code와 이름 등 고유한 값과 그 값을 설명하는 Data를 보관할 때 유용하다.

Map Interface를 구현한 Class로는 , HashMap, TreeMap, LinkedHashMap 세 가지가 있고, 원조 Class 격인 Hashtable Class가 있다.

Class설명
HashtableData를 Hashtable에 담는 Class로, 내부에서 관리하는 Hashtable 객체가 동기화되어 있으므로, 동기화가 필요한 부분에서는 이 Class를 사용하는 것이 권장된다.
HashMapData를 Hashtable에 담는 Class로, Hashtable Class와 다른 점은 null값을 허용한다는 것과, 동기화 되어 있지 않다는 것이다.
TreeMapRed-Black Tree에 Data를 담는다. TreeSet과 다른 점은 Key에 의해 순서가 정해진다는 것이다.
LinkedHashMapHashMap과 거의 동일하며, 이중 연결 리스트(Doubly-LinkedList)라는 방식을 사용하여 Data를 담는다는 점만 다르다.

이중 연결 리스트(Doubly-LinkedList) ???

이중 연결 리스트(Doubly-LinkedList) 는 자료구조론에서 앞, 뒤 Node에 대한 Link 정보를 가지고 있는 것을 말한다.

만약 앞 Node의 Link 값이 null이거나 비어 있으면 가장 첫 Node임을 의미하고,
뒤 Node의 Link 값이 null이거나 비어 있으면 가장 마지막 Node임을 의미한다.


Queue Interface

Queue는 Data를 담아 두었다가 먼저 들어온 Data부터 처리하기 위해 사용된다.

예를 들면 SMS와 같은 문자를 처리할 때 서버에 들어오는 순서대로 Queue에 저장하고 처음 요청한 Data부터 처리하면 된다.


이때 List도 순서가 있고, Queue도 순서가 있는데, Queue를 사용하는 이유는, List가장 큰 단점은 첫 번째 Data(0번 Data)를 지우면 그 다음 두 번째 Data(1번 Data)부터 마지막 Data까지 한 칸씩 옮기는 작업을 수행해야 하므로, Data가 많으면 많을 수록 Data를 지우는데 소요되는 시간이 증가되기 때문이다.

Queue Interface를 구현한 Class는 두 가지로 나뉘며, java.util package에 속하는 LinkedListPriorityQueue는 일반적 목적의 Queue Class이고, java.util.concurrent package에 속하는 Class들은 Concurrent Queue Class이다.

Class설명
PriorityQueueQueue에 추가된 순서와 상관없이 먼저 생성된 객체가 먼저 나오도록 되어 있는 Queue
LinkedBlockingQueue저장할 Data의 크기를 선택적으로 정할 수 도 있는 FIFO기반 LinkNode를 사용하는 BlockingQueue
ArrayBlockingQueue저장되는 Data의 크기가 정해져 있는 FIFO기반의 BlockingQueue
PriorityBlockingQueue저장되는 Data의 크기가 정해져 있지 않고, 객체의 생성 순서에 따라서 순서가 저장되는 BlockingQueue
DelayQueueQueue가 대기하는 시간을 지정하여 처리하도록 되어 있는 Queue
SynchronousQueueput() method를 호출하면, 다른 Thread에서 take() method가 호출될 때 까지 대기하도록 되어있는 Queue, 해당 Queue에 저장되는 Data는 없다.
API에서 제공하는 대부분의 메소드는 0, null을 return
profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글