###### tags: `2020 Boostcamp`
# Day11 - 학습정리
### 스스로 확인할 사항
* **OperationQueue 비동기 방식이 동기 방식과 달리 어떻게 다르게 동작하는지 자기만의 방식으로 정리한다.**
| 동기 | 비동기 |
| :--------------------------------------: | :-----------------------------------------------: |
| task를 직렬로 처리 | task를 병렬로 처리 |
| 선행된 task의 작업이 완료될 때 까지 대기 | task를 비동기로 실행하고 대기 중인 다음 task 수행 |
| task가 실행 중일 때 다른 task는 Block | 비동기로 실행된 task에서 응답이 오면 처리 |
* **모듈/객체를 어떻게 나누고, 어떻게 모듈간의 협력관계를 맺는게 좋은지 자기만의 기준을 정리한다.**
* 모듈이나 클래스에 존재하는 프로퍼티와 메서드들의 상호 관계를 파악
* 그 요소들이 얼마나 상호간 의미있게 결합하는지 판단
* 정체성, 고유성이 보장되는지 판단
* 모듈, 객체간 응집도는 높히고 그들간 결합도는 줄이는 방향
* 최대한 독립적인 단위로 생성
### 다같이 확인할 사항
* **비동기 방식으로 구현할 때 어려운 점은 무엇이고, 디버깅을 쉽게 도와주는 다양한 방법을 찾아서 비교한다.**
* 비동기는 디버깅 하기가 까다롭다 (언제 작업이 끝날지도 모르고 언제 발생할지도 모른다)
* 내부의 상태를 알기가 힘들다
* 현재 실행되고 있는 Queue의 label을 참조하여 디버깅 할 수 있다
```swift
String(validatingUTF8: __dispatch_queue_get_label(nil))
```
* **스레드를 생성하는 것과 여러 비동기 방식을 비교해보고, 어떤 제약사항이 있는지 비교한다.**
* 스레드
* 서로 데이터를 사용하다가 충돌이 일어날 가능성 있음
* 디버깅이 다소 까다로워 짐. (버그 생성될 가능성 증가)
* 비동기
* delegate, @selector, block, Notification 등의 방법이 있음
* 동기처리 보다 설계가 까다로움
* Deadlock 걸릴 확률 높음