본문 바로가기
개발 관련 강의 정리/10분 테코톡

[10분 테코톡] 마코의 JCF 정리

by 코딩개발 2023. 6. 1.
728x90
반응형

● 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 

728x90
반응형

댓글