📝느낀 점
한번 컬렉션 프레임워크에 정리를 하고 싶어서 이렇게 작성하게 되었다. 확실하게 정리를 하면서 알게된 점은 내가
어디가 약한지 어디를 자세히 알고 있는지가 눈으로 보인다는 점이 아닐까 싶다. (제 생각입니다 ㅎ...)
그렇기에 이번 컬렉션 프레임워크도 정리를 해볼까 한다. 분명 부족점도 있을 것이다. 하지만 이런거 하나하나
부끄러워 하지말고, 점점 공부해 가며 블로그 글을 수정해 가면 된다. 정말 부끄러운 것은 노력도 안해 놓고 잘하길
바라는게 정말 부끄러운 생각이 아닐까 싶다. 이번에 이렇게 컬렉션에 대해 정리 하였으니, 다음에는 한층 더 올라간 글을 작성해보도록 하자.
자바에서 크기가 고정되어있지 않고, 여러 객체를 담을 수 있는 라이브러리이다.
대표적으로 List, Set, Queue가 있다.
그리고 컬렉션 안에는 들어가 있지 않은, Map 컬렉션도 있습니다.
- Map의 특성이 <k, v>로 이루어져 있기에, 컬렉션과는 구조가 다르기에 따로 존재하고 있다
컬렉션 프레임워크 구조
Iterable은 무엇인가?
public interface Iterable<T> {
Iterator<T> iterator();
}
iterator는 세가지 메소드만 있으면 된다.
- hasNext() : 다음 객체가 있는지
- next() : 다음 원소가 있다면 가져오는 것.
- remove() : 삭제
이렇게 3가지 메서드로 이루어져 있다.
List란?
객체를 일렬로 관리하는 자료구조로 인덱스로 관리하는 것이 가장 큰 특징이다.
List는 순서가 있는 데이터의 집합이며, 데이터의 중복을 허용합니다.
List에는 어떤 것들이 있나요?
- ArrayList
- LinkedList
- Vector
ArrayList와 Vector 특징
원소들을 배열로 관리를 한다.
- 미리 메모리에다가 공간을 할당해 놓고, 각각의 객체들을 넣는 것이다.
- 더 정확히는 객체들이 아니라, 객체의 주소 번지를 관리하게 되는 것이다.
- 배열은 기본 크기가 10으로 정해져 있다.
- 하지만, 원소를 계속 넣다 10이 사이즈만큼 되었다면, 사이즈가 늘어가게 된다.
- 이걸, “동적리사이징" 이라고 부른다.
사이즈가 늘어난다는 말은.
새로 만들어진 배열. 즉, 길이가 더 길어진 배열이 새로 생성된다는 말이다.
기존에 있던 배열의 크기가 늘어나는게 아니다.
그리하여 새로 생긴 배열에, 기존에 있던 원소들을 하나씩 옮기는 작업을 수행한다.
이대, O(N)이 되게 되는 것이다.
- 그리하여 배열의 크기가 클수록 “리사이징” 해주는 것이 불리하다는 특징이 있다.
LinkedList 특징
위, ArrayList나 Vector처럼 배열로 데이터를 저장하는 것이 아니라,
어떠한 값이 있고, 그리고 다음거에 대한 주소도 저장하고 있는 것이 LinkedList이다.
사진 참고 : https://crazykim2.tistory.com/566
Vector 특징
멀티 스레드와 연관이 되어 있다.
예시)
- ArrayList에 1, 2, 3을 저장해 놓는다.
- a이라는 스레드에서 for문을 돌면서 1, 2, 3을 출력하려고 한다.
- 그런데, 1, 2까지 출력한 상황에 b라는 스레드가 3을 삭제하는 순간이다.
이것이, ArrayList 같은 경우는, 삭제를 할 때 Exception이 발생한다.
즉, 프로그램이 종료되게 된다.
이런 결과를 막기 위해서는 Vector 사용!
Vector 같은 경우는 a라는 스레드가 돌고 있을때,
b라는 스레드가 들어오려고 해도 들어오지 못하고,
a라는 스레드가 작업을 끝내야지 들어올 수 있도록 하는 동기화 기능이 있다.
ArrayList와 Vector 차이는?
멀티스레드 환경에서 thread-safe 한지 안한지의 차이가 있는 것이다.
Vector 경우 동기화가 구현 되어 있기 때문에 속도가 상대적으로 느리다.
thread-safe를 만족시켜줘야하는 환경이라면 Vector 사용하는 것이 유리하다.
Set이란?
List와 같이 여러 객체를 저장하는 자료구조이다.
Set은 순서가 없는 데이터의 집합이며 데이터의 중복을 허용하지 않는 특징을 가지고 있다.
Set에는 어떤 것들이 있나요?
- HashSet
- TreeSet
- LinkedHashSet
Hash란 무엇인가?
여러가지 데이터가 있는 상황이라고 생각해보자.
각각의 데이터를 숫자로 변환하는 것을 hash라고 한다.
HashSet 특징
hashCode()라는 메서드를 통해서 hash값을 가져오고,
이 hash값을 비교하면서 중복값을 거른다.
만약, hash값이 같다면?
그러면, equals()라는 함수를 호출해서 두 객체를 비교하는 것이고,
equals() 까지 데이터가 같게 나온다면, 그 값은 저장하지 않게 되는 것이다. (set이기에)
TreeSet 특징
compareTo() 라는 메서드를 사용해서 데이터를 비교하며 중복을 거른다.
여기서, 이진탐색트리 구조로 저장하게 되는 것이다.
트리구조의 특징
추가와 삭제를 할때 트리를 재배열해야하기 때문에 속도가 느리다.
하지만, 검색은 유리하다.
정리하면 -> 삽입, 삭제는 속도가 느린데, 검색에는 속도가 빠르다
LinkedHashSet 특징
HashSet과 똑같이 hashCode()를 통해서 중복을 확인하는데,
이 클래스 내부에 LinkedList가 포함되어 있으며, 내가 입력한 순서를 확인할 수 있다.
그렇기에, LinkedHashSet은 입력 순서까지 저장하고 있는 것이다.
Map
별도의 구조를 가지고 있는 것이 map이다.
Map은 키와 값이 한 쌍으로 이뤄져 있고, 키는 중복으로 저장이 될 수 없고, 순서가 없습니다.
그렇기에, set과 비슷한 특징을 가지고 있다. key를 통해서 value를 저장하는 구조가 map이라는 자료구조이다.
Map에는 어떤 것들이 있나요?
- HashMap
- HashTable
- LinkedHashMap
- TreeMap
HashMap 특징
hashCode() 사용하여 key를 저장을 하고, 거기에 따라서 value를 저장하는게 HashMap이다.
그래서 Hash를 사용하기 때문에 → 조회에서 유리하다
HashTable 특징
HashMap()과 비슷한데, 여기에 thread-safe 한 것이라고 생각하면 된다.
HashMap와 HashTable 차이는 ArrayList와 Vector의 차이처럼
thread-safe 한지, 안한지 차이로 볼수 있다.
LinkedHashMap 특징
LinkedHashSet과 똑같이 내부에 LinkedList를 가지고 있어서, 입력순서를 저장하게 된다.
TreeMap 특징
TreeSet과 같이 이진트리를 구조로 key를 정렬해서
추가와 삭제가 성능이 좀 떨어지지만 조회가 유리하는 특징이 있습니다.
Reference :
'Java' 카테고리의 다른 글
JVM 동작원리와 내부구조 (0) | 2023.11.07 |
---|---|
JIT 컴파일러는 무엇인가요? (0) | 2023.11.07 |
배열의 선언과 메모리 할당 (0) | 2023.11.07 |
static primitive, static reference 저장 / static 메서드와 일반 메서드의 차이점 (0) | 2023.11.07 |
exception VS error 차이가 무엇인가요? (0) | 2023.11.07 |