Java와 자료구조 - Collection Framework 2
Collection인터페이스를 구현하는 컬렉션들과 Map에 대해 이어서 살펴보자.
HashSet
Set인터페이스를 구현한 컬렉션이며, 역시 중복을 허용하지 않고 순서가 유지되지 않는다.
지정된 순서를 보장하지 않고 자체적인 저장방식에 의해 순서가 결정되기에, 순서가 중요한 경우는 LinkedHashSet 컬렉션을 사용하는 편이 합리적이다.
여기서 Hash는 해시 함수(Hash Function)를 이용해 데이터를 해시테이블에 저장하고 검색하는 기법을 의미한다.
해시를 통해 데이터가 저장된 위치를 빠르게 알 수 있어 많은 데이터 중 원하는 데이터를 빠르게 찾아올 수 있다.
해싱 기법에서 사용하는 자료구조는 배열과 링크드 리스트로 구성된다.
저장할 데이터의 키 값을 해시함수를 통해 배열의 한 요소를 얻고, 연결된 링크드 리스트에 얻은 요소를 저장한다.
해싱 기법에서는 해시함수의 알고리즘이 매우 중요하다.
해시 값이 중복될 수록 성능이 떨어지기 때문에 좋은 해시함수를 사용하는게 좋은데, 모든 객체에 대해 정의된 hashCode()함수는 객체의 주소를 이용해 해시코드를 만들어내기에 일반적으로 hashCode함수를 사용하면 문제가 발생하지 않는다.
TreeSet
자료구조 중 이진 검색 트리 형태로 데이터를 저장하며, 레드-블랙 트리로 구현되어있다.
역시 중복을 허용하지 않고 저장 순서를 유지하지도 않는다.
원래 이진 검색 트리는 왼쪽 자식에 부모노드보다 작은 수를, 오른쪽 자식에 부모노드보다 큰 수를 저장하는 방식으로 정렬되는데, Comparable이 구현되지 않는 객체들에 대해서는 정렬되지 않는다.
따라서 TreeSet에 저장되는 객체에 Comparable을 구현하던가 TreeSet자료구조에게 Comparator를 제공하지 않으면 데이터를 저장할 때 마다 예외가 발생한다.
데이터를 저장할 때 순차적으로 저장하지 않고 매번 저장위치를 비교해야 해서 링크드 리스트보다 추가와 삭제는 비효율적이지만, 검색과 정렬에서는 효과적이다.
HashMap
HashMap과 HashTable은 서로 비슷하다.
HashMap이 HashTable의 최신 버전으로 생각할 수 있으니 HashMap을 사용하자.
Map의 특징인 key와 value를 묶어서 하나의 값으로 저장하는 특징과 Hashing기법을 사용해 많은 양의 데이터를 검색할 때 효과적이다.
key에는 중복을 허용하지 않지만 value에는 중복을 허용한다.
당장 떠오르는 활용 부분은 사용자 정보가 있다.
ID를 key값으로, password를 value값으로 설정하고, 중복되는 key값에 대해서는 생성할 수 없게 만드는... 그런 예시가 있을 수 있다. (자료구조를 공부하면서 이런식으로 어떤 부분에서 활용할 수 있을지를 생각해 보자!)
TreeMap
이진검색트리의 형태로, 키와 값의 쌍으로 이루어진 데이터를 트리 형태로 저장한다.
검색과 정렬에 적합하다. (검색에서는 HashMap이 더 효과적이니, 범위검색이나 정렬이 필요한 경우 사용하자.)
Properties
해시테이블을 상속받아 구현한 컬렉션으로, (String,String) 타입으로 값을 저장한다.
애플리케이션의 환경설정에 관련된 속성을 저장할 때와 간단한 입출력을 구현할 때 사용된다.
Collections 클래스
Collection은 인터페이스고, Collections는 컬렉션과 관련된 메서드를 제공하는 클래스이다.
1. 동기화
멀티쓰레드 환경에서 데이터의 일관성을 유지하기 위해서 사용한다.
symchronized를 컬렉션 앞에 붙여서 사용.
2. 변경불가
멀티쓰레드 환경에서 컬렉션을 보호하기 위해서 사용한다.
unmodifiable을 컬렉션 앞에 붙여서 사용.
3. 싱글톤
하나의 객체만 저장하는 컬렉션을 만들 때 사용한다.
singleton을 컬렉션 앞에 붙여서 사용.
4. 객체 제한
컬렉션에 저장할 수 있는 객체를 제한하고 싶을 때 사용한다.
checked를 컬렉션 앞에 붙이고, 두 번째 매개변수로 저장할 객체의 클래스를 지정.
(사실 지네릭스로 쉽게 처리할 수 있다.)
'Algorithm > Data Structure' 카테고리의 다른 글
Java와 자료구조 - 배열 (0) | 2022.03.29 |
---|---|
Java와 자료구조 - 배열 / 정렬 (0) | 2022.03.19 |
Java와 자료구조 - Collection Framework 1 (0) | 2022.03.19 |
링크드 리스트 (Linked List) (0) | 2022.03.07 |
댓글
이 글 공유하기
다른 글
-
Java와 자료구조 - 배열
Java와 자료구조 - 배열
2022.03.29 -
Java와 자료구조 - 배열 / 정렬
Java와 자료구조 - 배열 / 정렬
2022.03.19 -
Java와 자료구조 - Collection Framework 1
Java와 자료구조 - Collection Framework 1
2022.03.19 -
링크드 리스트 (Linked List)
링크드 리스트 (Linked List)
2022.03.07