###### 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 테스트로 커버한다 - 새로 개발하거나 변경하는 부분을 대상으로 우선적으로 단위 테스트한다