# π°μν창ꡬ λ§€λμ π°
## λͺ©μ°¨
1. [μκ°](#1μκ°)
2. [νμ](#2νμ)
3. [νμλΌμΈ](#3νμλΌμΈ)
4. [UML](#4λ€μ΄μ΄κ·Έλ¨)
5. [μ€ν νλ©΄](#5μ€ννλ©΄)
6. [νΈλ¬λΈ μν
](#6νΈλ¬λΈ-μν
)
7. [ν΅μ¬ κ²½ν](#7νλ‘μ νΈ-μν-μ€-ν΅μ¬-κ²½ν)
8. [μ°Έκ³ λ§ν¬](#8μ°Έκ³ -λ§ν¬)
## 1.μκ°
- μνμ μνμλ€μ΄ κ³ κ°μ μ
무μ λ°λ₯Έ μΌμ λμμ μ²λ¦¬νλ μ±μ
λλ€.
<br>
## 2.νμ
| Baem | bella |
| --- | --- |
| <img src=https://i.imgur.com/jrW5RQj.png width="155" height="150" >|<img src=https://i.imgur.com/Ux3OvW7.jpg width="155" height="150" > |
| [@Dylan-Yoon](https://github.com/dylan-yoon) | [@hyhy0429](https://github.com/hyhy0429) |
<br>
## 3.νμλΌμΈ
**[STEP-1]**
- 221101
- CocoaPodμ μ΄μ©ν SwiftLint λΌμ΄λΈλ¬λ¦¬ μ€μΉ
- Node νμΌ μμ± λ° κ΅¬ν
- LinkedList νμΌ μμ±κ³Ό νλ‘νΌν° λ° λ©μλ ꡬν
- LinkedList UnitTest ꡬν
**[STEP-2]**
- 221102
- Bank νμΌ μμ± λ° νμ
λ΄λΆ λ©μλ ꡬν
- Customer νμΌ μμ±
- Bank νμ
λ΄λΆ λ©μλ κΈ°λ₯ λΆλ¦¬
- μ κ·Όμ μ΄μ μ€μ
**[STEP-3]**
- 221107
- Task νμΌ μμ± λ° Customer νμ
νλ‘νΌν° μΆκ°
- Bankmanger νμ
ꡬν
- Bank νμ
λ΄λΆ κ³ κ° λκΈ°μ΄ κ΅¬λΆ λ° λλ€νκ² μ
무 λΆλ°°νλ λ©μλ μΆκ°
- Bankmanager νμ
λ΄λΆ task() ꡬν
- Bankmanager νμ
classλ‘ λ³κ²½ λ° μκ°/κ³ κ°μ νλ‘νΌν°μ λ©μλ ꡬν
- Bank νμ
λ΄λΆ μ
무 λ§μΉλ λ©μλ ꡬν
- Bank νμ
λ΄λΆ μΌμ μμ λ©μλμ DispatchQueueμ λμ§λ λ©μλ κΈ°λ₯ λΆλ¦¬
- 221110
- BankTypeμ κ³ κ°μ°½κ΅¬λ₯Ό Task νμ
μ νλ‘νΌν°λ‘ κ΄λ¦¬νλλ‘ κ΅¬ν
- Bank νμ
λ΄λΆ μ
무 κ΄λ ¨ λ©μλλ₯Ό BankManager νμ
λ΄λΆλ‘ μ΄λ
- Bank νμ
λ΄λΆ dispatchTask() μκ°κ³μ° μ€λ₯ μμ
- 221111
- Readme μμ±
<br>
## 4.λ€μ΄μ΄κ·Έλ¨
#### UML
<img src=https://i.imgur.com/ih6BBYT.jpg width="600" height="450">
## 5.μ€ννλ©΄
| STEP 1, 2 | STEP 3 |
| -- | -- |
| <img src=https://i.imgur.com/Tw1RwJ4.gif width="400" height="350" > | <img src=https://i.imgur.com/5ZcK7tA.gif width="400" height="350" > |
## 6.νΈλ¬λΈ μν
#### SwiftLint SPMμ€μΉμ λν μ€ν΄μ Cocoa Pod μ ν μ΄μ
- Swift Package Manager(SPM)
- μ²μ `SwiftLint λΌμ΄λΈλ¬λ¦¬`λ₯Ό μ¬μ©νκΈ° μν μμ‘΄μ±κ΄λ¦¬λꡬ μ€ `CocoaPod`κ³Ό `SPM`μ κ³ λ―Όνκ² λμκ³ , μ νμμ μ§μ μ 곡νλ€λ μ λ° νΈλ¦¬νλ€λ μ μμ `SPM`μ μ ννμ¬ μ¬μ©νλ €κ³ νμ΅λλ€.
- SPMμ μ΄μ©ν μ€μΉ κ³Όμ μμ, μ²μμλ Xcodeμ [File -> Add Package]μμ μ€μΉλ§ νλ©΄ λλ κ²μΌλ‘ μκ³ μμμΌλ, `SwiftLint`λ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ²λΌ SPMμ μ§μνλ κ²μ΄ μλμμΌλ©° μ¬μ©μ μν΄μλ `brew`λ₯Ό ν΅ν΄ `swiftLint`λ₯Ό μΈμ€ν¨ ν λ€ νλ‘μ νΈμ μ μ© ν swiftlint.yml νμΌμ μμ± ν΄μΌ νμ΅λλ€.
- CocoaPod
- <img src=https://i.imgur.com/ImUaDQf.png width="600" height="250" >
- [SwiftLint github](https://github.com/realm/SwiftLint)μ `μ€μΉ`μ κ΄λ ¨λ λΆλΆμ μ΄ν΄λ³΄λ, `SPM`μ΄ μλ `CocoaPod` μ¬μ©μ κΆμ₯νκ³ μλ κ²μ μκ² λμ΄ λ³κ²½νκ² λμμ΅λλ€.
#### νμ μ¬μ©
- μ²μμλ LinkedListλ‘ λ§λ νλ₯Ό νμ©νμ¬, `μκΈ ν` `λμΆ ν` λ₯Ό λ°λ‘ λ§λ€κ³ μ νμμ΅λλ€.
κ·Έλ¬λ, Bank νμ
λ΄λΆμ μκΈ λ§€λμ 2λͺ
κ³Ό λμΆ λ§€λμ 1λͺ
μ μμ±νμμ΅λλ€. μκΈ λ§€λμ 1κ³Ό λμΆλ§€λμ 1μκ² κ° κ³ κ° λκΈ°μ΄μμ κ³ κ°μ κΊΌλ΄ μΌμ ν λΉνλ κ²μ΄ κ°λ₯νμΌλ, μκΈ κ³ κ°λκΈ°μ΄μ μκΈλ§€λμ 1 λΏλ§ μλλΌ μκΈλ§€λμ 2μκ²λ ν λΉνλ κ²μλ μ€ν¨νκ²λμμ΅λλ€.
κ³ λ―Όμ νλ€κ°, μ
무μ²λ¦¬λ₯Ό λ§€λμ κ°μ²΄λ₯Ό μμ±ν΄μ λΆλ΄νλ κ²μ΄ μλ μ€λ λμ κ°λ
μμ μ²λ¦¬νλ κ²μΌλ‘ λ³κ²½νμ΅λλ€.
#### DispatchSemaphore μ¬μ©
- μμ κ³Όμ μ κΈ°μ¬λ κ²κ³Ό κ°μ΄, μ
무μ²λ¦¬λ₯Ό μ€λ λμ κ°λ
μμ μ²λ¦¬νκ³ μ νλ ꡬνκ³Όμ μμ, κ° μ
무λ₯Ό `global.async` λ₯Ό μ΄μ©νμ¬ λ³΄λΌ κ²½μ°μ, λλ€νκ² μμ±ν κ³ κ° μ λ§νΌ(νμν λ§νΌ) μ°λ λλ₯Ό μμ±νκ² λμμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄, `DispatchSemaphore`μ `SerialQueue` λ κ°μ§ λ°©λ² μ€μ κ³ λ―Όνκ² λμμΌλ©° μκΈ μ
무μ λμΆ μ
무λ₯Ό μ²λ¦¬νλ μ€λ λμ κ°μλ₯Ό μ ννκ³ μ `DispatchSemaphore`μ `value` λ₯Ό μ΄μ©νμ¬ μ§μ νμμ΅λλ€.
#### ν΄λ‘μ μΊ‘μ³ μ€λ₯μ λ°λ₯Έ Struct -> Class νμ
λ³κ²½

- `struct Bankmanager` μ νμ
μ΄ StructμΌ λ, `Bank`μ DispatchQueue μμ μ¬μ©νλ©΄ μ¬μ©νκ³ μ νλ κ°μ΄ μ΄λ―Έ μΊ‘μ³κ° λμ΄μμ΄ λ³κ²½μ΄ λΆκ°νκΈ°μ μμ κ°μ μ€λ₯κ° λ°μνκ² λμμ΅λλ€.
- μΊ‘μ³λ 리μ€νΈλ₯Ό νμ©νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νκ³ μ νμμΌλ, μΊ‘μ³λ 리μ€νΈ μμ κ° λ³κ²½μ λΆκ°νμκΈ°μ μ°Έμ‘°νμ
μ΄ μλ κ°νμ
μΌλ‘ λ°κΎΈμ΄ λ¬Έμ λ₯Ό ν΄κ²°νμμ΅λλ€.
#### μ΄κΈ° μ€κ³μ νμ¬ κ΅¬νμ μ°¨μ΄
- μ²μ μ€κ³ μμλ, μκΈ λκΈ°μ΄κ³Ό λμΆ λκΈ°μ΄μ λ§λ€κ³ μκΈ λ΄λΉ μνμ(2), λμΆ λ΄λΉ μνμ(1) λ° μν창ꡬμ κ°λ
μ΄ λ΄κΈ΄ κ°μ²΄λ₯Ό μμ±νμ¬ μ
무λ₯Ό ν λΉνκ³ μ νμμ΅λλ€.
κ·Έλ¬λ, νλμ μκΈ λκΈ°μ΄μ κ³ κ°λ€μ λ λͺ
μ μνμμκ² λΆλ°°νλ μμ
(whileλ¬Έ μ΄μ© μ, μ΄λ―Έ μκΈλ΄λΉ μνμ1μ΄ λͺ¨λ κ³ κ°μ dequeueν μν©)μ΄ λΆκ°νκ² λμ΄, μΌνλ μνμμ κ°λ
μ μ€λ λμ κ°λ
μ μ μ©νκ³ μ νμμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ² λ°©λ²μΌλ‘λ νμλ²μ§Έ μ§μλ²μ§Έλ‘ κ°κ° ν λΉνλ λ°©λ²μ΄ μμ μ μμ§λ§ μνμμ΄ μ¬λ¬λͺ
μΌ κ²½μ° λ³΅μ‘ν΄ μ§ κ²μΌλ‘ μμν΄μ λ€λ₯Έ λ°©λ²μ μ°Ύμ λ³΄κ³ μ νμμ΅λλ€.

- μλ₯Ό λ€μ΄, μμ μ¬μ§μ²λΌ λ§μ½ μ΄ 6λͺ
μ κ³ κ°μ΄ μμ λ μκΈ μ°½κ΅¬μλ 2λͺ
μ μνμμ΄ μλ€κ³ μκ°ν΄λ΄
λλ€.
λ§ν¬λ 리μ€νΈμ λ€μ΄μλ κ³ κ°λ€μ νλμ© λΉΌμ `async`λ‘ λ³΄λ΄μ£Όλ©΄ λμμ μΌμ μ²λ¦¬νκ² λ κ²μ΄λ©°, 곡μ μμμΈ μκΈκ³ κ°λκΈ°μ΄μ μ κ·Όν μ μλ μ€λ λλ₯Ό `Semaphore`μ `value`λ₯Ό ν΅ν΄ μ ννμ¬ 2λͺ
μ© μ
무μ²λ¦¬κ° κ°λ₯νκ² λ©λλ€.
κ·Έλ¬λ, μμ μ¬μ§μ²λΌ κ° κ³ κ°λΉ νλμ μ€λ λμμ μ
무μ²λ¦¬κ° λμ΄ μ΄ κ³ κ°μ μμ λ§λ μ€λ λκ° μμ±λκΈ° λλ¬Έμ μ΄λ€ λ°©μμ μ¬μ© ν΄μΌν μ§ λ€μ κ³ λ―Όν΄λ³΄μμΌ ν λΆλΆμ΄λΌκ³ μκ°ν©λλ€.
<br>
## 7.νλ‘μ νΈ μν μ€ ν΅μ¬ κ²½ν
- μμ‘΄μ±κ΄λ¦¬λꡬμ κ°λ
μ΄ν΄μ μ μ©
- LinkedList μλ£κ΅¬μ‘°μ μ΄ν΄μ μ μ©
- Generics κ°λ
μ΄ν΄μ μ μ©
- νμ
μΆμν λ° μΌλ°ν
- λκΈ° λΉλκΈ°μ μ΄ν΄μ μ μ©
- λμμ± νλ‘κ·Έλλ° κ°λ
μ μ΄ν΄
- GCDμ μ΄ν΄μ νμ©
- ν΄λ‘μ μΊ‘μ³μ μΊ‘μ³λ 리μ€νΈμ μ΄ν΄
<br>
## 8.μ°Έκ³ λ§ν¬
- Apple Developer
- [Generic](https://docs.swift.org/swift-book/LanguageGuide/Generics.html)
- [Choosing Between Structures and Classes](https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes)
- Swift Programming Language
- [ν΄λ‘μ μΊ‘μ³(μΊ‘μ³ κ°)](https://docs.swift.org/swift-book/LanguageGuide/Closures.html)
- [ν΄λ‘μ μ κ°ν μ°Έμ‘°](https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html#ID56)
- μν€λ°±κ³Ό
- [LinkedList](https://ko.wikipedia.org/wiki/%EC%97%B0%EA%B2%B0_%EB%A6%AC%EC%8A%A4%ED%8A%B8)
- github
- [SwiftLint.github](https://github.com/realm/SwiftLint)
- μΌκ³°λ·λ·
- [λμμ± νλ‘κ·Έλλ°](https://yagom.net/courses/%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-concurrency-programming/)
---
[π 맨 μλ‘ μ΄λνκΈ°](#μν창ꡬ-λ§€λμ )