● JCF?
- Java Collections Framework
- Collections : 데이터의 그룹
- Framework : 표준화된 프로그래밍 방식
- 자바에서 데이터 구조를 구현하고 관리하기 위한 클래스와 인터페이스의 모음
JCF를 쓰는 이유는?
크기가 4인 배열이 있을 때 새로운 데이터를 여기다가 추가하려고 한다면 어떤 상황이 발생할까? ArrayIndexOutOfBoundsException 이 발생하게 된다. 그래서 4보다 큰 배열을 하나 생성을 해서 여기에 하나씩 데이터를 복사해주어야 한다. 그리고 마지막에 원하는 데이터를 추가할 수 있다. 이처럼 배열을 사용하면 이러한 복잡한 과정을 다 고려하고 직접 구현해야 한다. 하지만 이런 것을 다 생각하면서 개발하기 어렵다. 그래서 이런 것들을 JCF에서 내부적으로 다 구현이 되어 있다.
정리
- 데이터 구조를 쉽게 사용 가능
- 성능 향상
● JCF의 종류
List : ArrayList, LinkedList
Set : HashSet, TreeSet
Queue : PriorityGueue
Map : HashMap, TreeMap
List
- 중복 허용
- 저장순서 유지
Set
- 중복 허용X
- 저장순서 유지X
Queue
- FIFO의 구조를 따른다.
Map
- Key, Value로 구성된 데이터의 집합
- Key는 중복X
- Value는 중복 가능
● JCF 계층 구조
List, Set, Queue는 Collection 인터페이스를 상속하고 있지만 Map은 혼자 따로 떨어져 있다. Map은 컬렉션 인터페이스를 상속하지는 않지만 JCF의 컬렉션 중 하나이다.
Collection 인터페이스는 Iterable 인터페이스를 상속하고 있다. Iterable 인터페이스는 요소들을 순차적으로 순회할 수 있는 기능을 제공하는 인터페이스이다. 따라서 Iterable 인터페이스를 구현하면 요소들을 순차적으로 탐색하거나 삭제하거나 하는 작업들을 할 수 있다. 그래서 List, Set, Queue는 순차적으로 탐색을 할 수 있다. 하지만 Map의 경우에는 Key와 Val로 이루어진 자료 구조라서 Key를 먼저 순회할지 Value를 먼저 순회할지 정할 수 없기 때문에 Map은 컬렉션 인터페이스를 상속하지 않는다.
● ArrayList와 Linkedlist의 차이
1) ArrayList
- 처음에 크기를 지정해주지 않으면 초기 용량이 10인 배열을 생성 하게 되고 공간이 부족할 때마다 1.5배씩 공간을 늘리게 된다.
- 내부적으로 Object 배열을 사용
- 물리적으로 연결되어 있음
- 인덱스로 바로 접근
검색의 경우 배열로 이루어져 있기 때문에 그 배열의 인덱스로 바로 접근해서 데이터를 찾을 수 있다. 만약 중간에 데이터를 추가 한다면 맨 뒤부터 데이터를 한 칸씩 뒤로 밀어놓고 그 다음에 원하는 자리에 데이터를 넣을 수 있다. 삭제는 반대로 원하는 위치의 데이터를 꺼내서 사용한 후에 삭제한 인덱스의 바로 뒤의 인덱스부터 앞으로 한 칸씩 당겨오게 된다. 그래서 ArrayList는 중간에서 데이터의 추가나 삭제가 많이 일어날 경우에 앞으로 당기고 뒤로 미는 과정이 많이 일어나기 때문에 중간에서 데이터를 추가, 삭제하기에 비용이 많이 든다고 할 수 있다.
2) Linkedlist
- Deque 인터페이스를 구현해서 DoubleLinkedList의 형태로 되어 있다.
- 리스트의 요소는 데이터와 다음 요소에 대한 참조를 가지고 있다. 이 요소를 '노드'라고 한다. 그래서 다음 노드에 대한 참조를 계속 따라가면서 데이터에 접근할 수 있다. 이것을 논리적으로 연결되어 있다고 한다.
ArrayList | LinkedList | |
검색 | 인덱스를 바로 접근하기 때문에 빠르다. | 순차적으로 다음 노드에 대한 참조를 반복하며 탐색하기 때문에 느리다. |
추가/삭제 | 배열의 마지막에 데이터를 추가하는 것은 빠르지만, 중간에 추가하는 것은 느리다. | 중간에 데이터를 추가하더라도 빠르다. |
크기 | 크기가 정적일 때 유리 | 크기가 동적일 때 유리 |
결론
ArrayList : 검색이 잦을 때, 마지막 인덱스에서 데이터 추가/삭제를 많이 할 때,리스트의 크기가 정적일 때 사용
LinkedList : 중간에 데이터를 추가/삭제할 때, 리스트의 크기가 동적일 때 사용
참고
https://www.youtube.com/watch?v=OI5fF2wGVxA&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC
'개발 관련 강의 정리 > 10분 테코톡' 카테고리의 다른 글
[10분 테코톡] 아벨의 상태 패턴 정리 (0) | 2023.06.03 |
---|---|
[10분 테코톡] 케로의 예외처리 정리 (0) | 2023.06.02 |
[10분 테코톡] 마루의 데이터베이스 Lock 정리 (0) | 2023.05.31 |
[10분 테코톡] 애쉬의 AWS 살짝 알은체 하기 정리 (0) | 2023.05.29 |
[10분 테코톡] 릭의 MySQL 아키텍처 정리 (0) | 2023.05.28 |
댓글