[F-Lab 모각코 챌린지] 7일차 - TreeMap, Red-black Tree, Properties
F-Lab 모각코 챌린지 를 진행하며 정리 한 글 입니다. 자바의 신 24장 에서 설명하는 TreeMap, Properties 를 기록하고 정리합니다.
![[F-Lab 모각코 챌린지] 7일차 - TreeMap, Red-black Tree, Properties](/content/images/size/w1200/2023/06/-------_--------_------.png)
TreeMap
Implementation of Map Interface in Java
- 이진 트리를 기반으로 한 Map 컬렉션
- 저장과 동시에 정렬.
숫자: 값을 기준으로 정렬
문자: 유니코드를 기반으로 정렬 - 일반적으로 HashMap 에 비해 성능이 떨어짐
- 내부적으로 이진 탐색 트리의 문제점을 보완한 Red-Black Tree 를 사용함 (때문에 성능은 O(log n))
Red-back tree
이진 탐색 트리의 문제점인 데이터 불균형을 해결하기 위해 만들어진 Tree
(데이터가 트리의 한 쪽 노드로 편향되게 되면 최악의 경우 O(n) 이 걸림)
특성
![](https://blog.pollra.com/content/images/2023/06/image-4.png)
- 모든 Node 는 Red/Black 중 하나여야 함
- Root Node 는 반드시 Black
- 모든 리프 노드는 Black
- Red Node 의 자식은 언제나 모두 블랙이다.
(Red 노드가 연속적으로 나타날 수 없음) - 모든 리프 노드에서 부모 노드로 탐색 시 Black node 의 갯수는 같다
어떤 노드로 부터 시작되어 그에 속한 하위 리프 노드에 도달하는 모든 경로에는 모두 같은 개수의 블랙 노드가 있다(리프 노드 제외)
Double Red
Red-Black Tree 에서 삽입 과정에서 일어나는 문제
새로운 노드를 삽입 할 때는 항상 Red 로 삽입을 수행한다.
이럴 경우 특성-4 를 위배 하며 Double Red 문제가 발생한다.
해결 방법
- 삼촌 노드(부모 노드와 같은 depth 의 다른 노드. 위 예제 에서는 노드 7) 가 검은색이라면 Restructuring
- 삼촌 노드가 빨간색 이라면 Recoloring
Restructuring
- 삼촌 노드(부모 노드와 같은 depth 의 다른 노드. 위 예제 에서는 노드 7) 가 검은색이라면 Restructuring
- 새로운 노드, 부모 노드, 조상 노드를 오름차순으로 정렬
- 셋 중 중간 값을 부모로 만들고 나머지 둘을 자식으로 만듬
- 새로 부모가 된 노드를 Black 으로 만들고 나머지를 Red 로 변경
Recoloring
- 삼촌 노드가 빨간색 이라면 Recoloring
- 새로운 노드의 부모와 삼촌을 Black 으로 바꾸고 조상을 Red 로 변경
- 조상이 Root 라면 검은색으로 변경
- 조상을 Red 로 변경 했을 때 Double Red 문제 발생 시, 문제가 발생하지 않을 때 까지 Restructuring, Recoloring 수행
Red-Black Tree simulator
![](https://blog.pollra.com/content/images/2023/06/-----------2023-06-03------9.45.19.png)
Properties
Implementation with an extension of HashTable
- HashTable 을 확장하여 만들어짐
- Map 인터페이스에서 제공하는 모든 메서드를 사용 할 수 있음
- 자바에서 시스템 속성은 해당 클래스를 사용하여 만들어짐
- Properties 클래스의 사용 목적은 Properties 에서 제공하는 특수한 함수들 때문.
속성
속성 | 설명 |
---|---|
user.language | 사용자의 사용 언어 |
user.dir | 현재 사용중인 기본 디렉터리 |
user.home | 사용자 계정의 홈 디렉터리 |
java.io.tmpdir | 자바에서 사용하는 임시 디렉터리 |
file.encoding | 파일의 기본 인코딩 |
sun.io.unicode.encoding | 유니코드 인코딩 |
path.separator | 경로 구분자 |
file.separator | 파일 구분자 |
line.separator | 줄(line) 구분자 |
제공 함수
리턴 타입 | 메소드 시그니쳐 | 설명 |
---|---|---|
String |
getProperty(String key) |
주어진 키(key)에 해당하는 속성 값(property value)을 리턴. 만약 해당 키가 존재하지 않을 경우 null 을 리턴. |
String |
getProperty(String key, String defaultValue) |
주어진 키(key)에 해당하는 속성 값(property value)을 리턴. 만약 해당 키가 존재하지 않을 경우 기본값(defaultValue)을 리턴. |
void |
setProperty(String key, String value) |
주어진 키(key)와 값(value)을 속성으로 설정. 만약 이미 동일한 키가 존재할 경우 기존의 값을 새로운 값으로 대체. |
void |
load(InputStream inStream) |
주어진 InputStream 으로부터 속성 파일을 읽어와 현재 Properties 객체에 로드. |
void |
load(Reader reader) |
주어진 Reader 로부터 속성 파일을 읽어와 현재 Properties 객체에 로드. |
void |
store(OutputStream outStream, String comments) |
현재 Properties 객체의 속성을 주어진 OutputStream 에 저장. 저장되는 파일에 대한 주석(comments)을 추가할 수 있음. |
void |
store(Writer writer, String comments) |
현재 Properties 객체의 속성을 주어진 Writer 에 저장. 저장되는 파일에 대한 주석(comments)을 추가할 수 있음. |
Enumeration<Object> |
keys() |
모든 키(key)를 나타내는 Enumeration 객체를 리턴. |
Set<String> |
stringPropertyNames() |
모든 속성의 키(key)를 포함하는 Set 컬렉션을 리턴. |
void |
clear() |
모든 속성을 제거하여 Properties 객체를 비움. |
void |
remove(Object key) |
주어진 키(key)에 해당하는 속성을 제거. |