---
# System prepended metadata

title: Day04-학습정리
tags: [2020 Boostcamp]

---

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

