###### tags: `2020 Boostcamp`
# Day04-학습정리
### 스스로 확인할 사항
- **자신이 사용하는 언어에 있는 Object 나 Map (혹은 Dictionary) 기능에 대해 학습하고 정리한다.**
**예제 코드가 있다면 더 좋다. 리뷰할 때는 다른 언어와 차이점도 비교한다.**
- swift collection type 중 dictionary 존재
> Swift’s `Dictionary` type is bridged to Foundation’s `NSDictionary` class.
>
> For more information about using `Dictionary` with Foundation and Cocoa, see [Bridging Between Dictionary and NSDictionary](https://developer.apple.com/documentation/swift/dictionary#2846239).
- 고유 키(Key)와 대응하는 값(Value)을 연결하여 데이터를 저장하는 자료형
- c++ 의 Map과 유사함
- codes
```swift
// Empty dictionary
var namesOfIntegers = [Int: String]()
// with dictoinary literal
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
// Iterating over a dictionary
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
```
- **일반 Map 과 HashMap을 차이에 대해 학습하고 정리한다.**
- Map: BST를 이용해 구현(대부분 red-black tree) - 평균 탐색시간 O(logN)
- HashMap: 해쉬 키를 이용해 구현 - 평균 탐색시간 O(1) but! 최악에 O(N)
- **효율적인 hash 키를 생성하는 방식에 대해 학습하고 정리한다.**
- 제산법: H(key) = Key % Prime No, 키를 소수(Prime Number)로 나눈 값으로 주소 결정
- 제곱법: (Key^2)한 값의 중간 부분으로 주소 결정
- 폴딩법: 키 값을 여러 부분으로 분류하여 분류한 부분을 더하거나 XOR하여 주소를 계산
- 기수 변환법: 특정 진법으로 표현한 레코드 키 값을 다른 진법으로 간주하고 키 값을 변환하여 홈 주소를 취함
- 계수 분석법: 주어진 모든 키 값들에서 그 키를 구성하는 자릿수들의 분포를 조사하여 비교적 고른 분포를 보이는 자릿수를 택함
### 다같이 확인할 사항
- **HashMap 성능 기준은 어떤 측면을 고려해야 하는지 학습하고 정리한다.**
* 해시 충돌(Hash Collision) : 해싱된 키(Hash Key)가 중복되어 해당 버킷(Bucket)에 이미 레코드가 존재하는 현상
* 오버플로우(Overflow) : 해시 충돌(Hash Collision)이 버킷(Bucket)에 할당된 슬롯(Slot) 수보다 많이 발생하면 더 이상 버킷에 값을 넣을 수 없음
* 클러스터링(Clustering) : 연속된 레코드에 데이터가 몰리는 현상
- **모든 함수를 단위 테스트로 테스트할까? 어떤 구조로 설계하고 구현해야 테스트가 더 쉬운지 나름의 기준을 정리한다.**
- 모든 함수에 대해 단위 테스트를 진행하는데엔 많은 시간과 노력이 필요하다
- 기존 레거시 코드는 E2E 테스트로 커버한다
- 새로 개발하거나 변경하는 부분을 대상으로 우선적으로 단위 테스트한다