# ๐ ๋ฌต์ฐ๋น ๊ฒ์ ํ๋ก์ ํธ
## ๐ ๋ชฉ์ฐจ
- [์๊ฐ](#-์๊ฐ)
- [ํ๋ก์ ํธ ์ํ ์ค ํต์ฌ ๊ฒฝํ](#-ํ๋ก์ ํธ-์ํ-์ค-ํต์ฌ-๊ฒฝํ)
- [ํ์๋ผ์ธ](#-ํ์๋ผ์ธ)
- [ํ์ผ๊ตฌ์กฐ](#-ํ์ผ๊ตฌ์กฐ)
- [์์๋](#-์์๋)
- [์คํํ๋ฉด](#-์คํํ๋ฉด)
- [ํ ๊ท์น](#-ํ-๊ท์น)
- [ํธ๋ฌ๋ธ ์ํ
](#-ํธ๋ฌ๋ธ-์ํ
)
- [์ฐธ๊ณ ๋งํฌ](#์ฐธ๊ณ -๋งํฌ)
- [7ํ ํ๊ณ ](#7ํ-ํ๊ณ )
## ๐ฃ ์๊ฐ
### ํ๋ก์ ํธ ์๊ฐ
#### ํ๋ก์ ํธ ๊ธฐ๊ฐ : 22.12.26 ~ 22.12.30
- ๊ฐ์๋ฐ์๋ณด๋ฅผ ์น์๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.(0 ๋๋ฅด๋ฉด ์ข
๋ฃ)
- ๊ฐ์๋ฐ์๋ณด ์น์๊ฐ ํด์ ์ก๊ณ ๋ฌต์ฐ๋น ๊ฒ์์ ํ๋ค.(0 ๋๋ฅด๋ฉด ์ข
๋ฃ)
- ํด์ ์ก๊ณ ์์๋ ๊ฐ์ ๋ชจ์์ ๋ด๋ฉด ๋ฌต์ฐ๋น ๊ฒ์์ ์น๋ฆฌํ๋ค.
- ๊ฐ์ ๋ชจ์์ด ๋์ค์ง ์์ผ๋ฉด ๊ฒ์์ ๋ฐ๋ณตํ๋ค. (0 ๋๋ฅด๋ฉด ์ข
๋ฃ)
### ํ ์๊ฐ
- ํ ๊ตฌ์ฑ์(2์ธ)
| vetto | ์ก์ค |
| :--------: | :--------: |
| <img src="https://cdn.discordapp.com/attachments/535779947118329866/1055718870951940146/1671110054020-0.jpg" width="300" height="350"/> | <img src="https://user-images.githubusercontent.com/88870642/210026753-591175fe-27c1-4335-a2cb-f883bfeb2784.png" width="300" height="300"/>|
|Navigator, Driver|Navigator, Driver|
## ๐ ํ๋ก์ ํธ ์ํ ์ค ํต์ฌ ๊ฒฝํ
<details>
<summary><big>ํต์ฌ ๊ฒฝํ</big></summary>
- Swift์ Optional ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ<br>
- if์ switch ์กฐ๊ฑด๋ฌธ์ ์ฐจ์ด์ ์ฅ๋จ์ ๋น๊ตํด๋ณด๊ธฐ<br>
- ์ํํจ์(์ฌ๊ทํจ์)์ ๋ฐ๋ณต๋ฌธ์ ์ฅ๋จ์ ๋น๊ตํด๋ณด๊ธฐ<br>
- ํจ์๊ฐ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ๊ธฐ๋ฅ ๋ถ๋ฆฌํ๊ธฐ<br>
- guard ๊ตฌ๋ฌธ์ ์ดํด์ ํ์ฉ<br>
- Git์ ์ปค๋ฐ๋จ์ ๊ณ ๋ฏผํ๊ณ ์ปค๋ฐ์ ์ ์ฉํ๊ธฐ<br>
- Git ์ปค๋ฐ ๋ก๊ทธ ํ์์ ๋ง์ถฐ ์ปค๋ฐํ๊ธฐ<br>
- ์ฝ๋ฉ ์ปจ๋ฒค์
๊ณ ๋ฏผํ๊ธฐ<br>
- ๋๋ฃ์ ํ์
์์ธ ๊ณ ๋ฏผํ๊ธฐ<br>
</details>
## โฑ ํ์๋ผ์ธ
#### STEP 1 [2022.12.26~2022.12.27]
- **2022.12.26**
- ์ซ์ ์
๋ ฅ ํจ์ ๊ตฌํ, ์ปดํจํฐ ์ซ์ ๋ฐํ ํจ์ ๊ตฌํ
- ์ซ์๋ฅผ ๊ฐ์๋ฐ์๋ณด๋ก ๋ฐ๊พธ๋ ํจ์ ๊ตฌํ
- ๋น๊ตํ์ฌ ๊ฒฐ๊ณผ ๋ฐํ ํจ์ ๊ตฌํ
- **2022.12.27**
- ๊ฐ์๋ฐ์๋ณด ๋ฉ๋ด ์ถ๋ ฅ ํจ์ ๊ตฌํ
- ๋น๊ตํ๋ ํจ์ Naming ๋ณ๊ฒฝ ๋ฐ refactoring
- ๊ฐ์๋ฐ์๋ณด ๊ฒฐ๊ณผ ์ถ๋ ฅํจ์ ๊ตฌํ
#### STEP 2 [2022.12.28~2022.12.30]
- **2022.12.28**
- ์น์ ํ์
๋ถ๋ฆฌ
- ์
๋ ฅ ์๋ฌ์ฒ๋ฆฌ๋ก ๊ตฌํ
- ํด๊ณผ ๋ฌต์ฐ๋น ๋ฉ๋ด ์ถ๋ ฅ ํจ์ ๊ตฌํ
- ์ซ์๋ฅผ ๋ฌต์ฐ๋น ๋ก ๋ฐ๊พธ๋ ํจ์ ๊ตฌํ
- ๋ฌต์ฐ๋น ๊ฒฐ๊ณผ ๋ฐํ ํจ์ ๊ตฌํ
- **2022.12.29**
- ๋ฌต์ฐ๋น ๊ฒฐ๊ณผ ๋ฐํ ํจ์ refactoring
- ๊ฐ์๋ฐ์๋ณด ํจ์ refactoring
- runGameํจ์ ๊ตฌํ
- ๋ฌต์ฐ๋น ๊ฒฐ๊ณผ ์ถ๋ ฅํจ์ ๊ตฌํ
## ๐ ํ์ผ๊ตฌ์กฐ
```bash!
RockPaperScissors
โโโ Error.swift
โโโ MookZziBbaGame.swift
โโโ ReturnNumberLibrary.swift
โโโ RockPaperScissorsGame.swift
โโโ StartGame.swift
โโโ Type
โ โโโ MookZziBbaType.swift
โ โโโ RockPaperScissorsType.swift
โ โโโ WinnerType.swift
โโโ main.swift
```
## ๐ ์์๋
<details>
<summary><big>STEP 1 ์์๋</big></summary>
<img src="https://cdn.discordapp.com/attachments/1056776760622071858/1058265379266363402/RockPaperScissorsGame.drawio.png"/>
</details>
<details>
<summary><big>STEP 2 ์์๋</big></summary>
<img src="https://cdn.discordapp.com/attachments/1056776760622071858/1058266474327855145/MookZziBbaGame.drawio.png"/>
</details>
## ๐ป ์คํํ๋ฉด
|**๊ฒ์ ์คํ**|
|---|
||
|**๊ฒ์ ์ข
๋ฃ**|
||
|**์
๋ ฅ ์ค๋ฅ**|
||
|**๋ฌต์ฐ๋น ์
๋ ฅ์ค๋ฅ ์ ํด ๋๊น**|
||
## ๐ฅ ํ ๊ท์น
### ์ฝ๋ ์ปจ๋ฒค์
- ํจ์ ์ ์ธ ์ 100์ ์ด์์ผ๋ก ๋์ด๊ฐ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์ ์ค๋ฐ๊พธ๊ธฐ
- ํจ์, ๋ณ์, ์์ ์ด๋ฆ์ CamelCase ์ฌ์ฉํ๊ธฐ
- ๋ณ์๋ช
๋ชจํธํ๊ฒ ์์ฑํ์ง ์๊ธฐ
- ๋ถํธ, ๋ฑํธ ์์ชฝ์ผ๋ก ๋์ด์จ์ฃผ๊ธฐ
- ๋งฅ๋ฝ์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ฉด ์ค๋ฐ๊พธ๊ธฐ
### ์ปค๋ฐ ์ปจ๋ฒค์
- feat : ๊ธฐ๋ฅ ์ถ๊ฐ (์๋ก์ด ๊ธฐ๋ฅ)
- refactor : ๋ฆฌํฉํ ๋ง (๋ค์ด๋ฐ ์์ ๋ฑ)
- docs : ๋ฌธ์ ๋ณ๊ฒฝ (๋ฌธ์ ์ถ๊ฐ, ์์ , ์ญ์ )
- chore : ๊ธฐํ ๋ณ๊ฒฝ์ฌํญ (์ฝ๋์ ๋ณํ๊ฐ ์์ฐ์ ์ธ ๊ฒ์ด ์๋ ๊ฒ ์์ )
## ๐ฅ ํธ๋ฌ๋ธ ์ํ
### 1๏ธโฃ Naming
ํ๋ก์ ํธ๋ฅผ ์งํํจ์ ์์ด Naming์ด ์ ๋ง ๊น๋ค๋ก์ ์ต๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ํฐ ์ด์ ๋ ์ฌ์ฉ์ ํ์
์ ์ฌ์ฉํ์ง ์์์ ๊ทธ๋ฌ๋๊ฑฐ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด class ํ์
์ผ๋ก "RockPaperScissors"๋ก ์ค์ ์ ํด์ฃผ์๋ค๋ฉด, ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ ํจ์๋ช
์์ "RockPaperScissors"๋ฅผ ์์ฑํ์ง ์์๋ ๋ ๊ฒ์
๋๋ค.
**- class ์ฌ์ฉ**
```swift=
class RockPaperScissors {
func decideWinner() {
// ์น๋ฆฌ์๋ฅผ ๊ฒฐ์ ์ง์
}
func printWinner() {
// ์น๋ฆฌ์๋ฅผ ํ๋ฆฐํธํจ
}
}
```
**- class ๋ฏธ์ฌ์ฉ**
```swift=
func decideRockPaperScissorsGameWinner() {
}
func printRockPaperScissorsGameWinner() {
}
```
ํด๋์ค ํ์
์ ์ฉ๋์ ๊ธฐ๋ฅ์ ๋ค์ํ์ง๋ง, ํด๋์ค์ ๊ด๋ จ๋ ํจ์๋ฅผ ๋ฌถ์ด์ค์ผ๋ก์จ ํจ์์ Naming์ ๋จ์ถ์ํฌ ์ ์๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
------
### 2๏ธโฃ ๊ฐ์๋ฐ์๋ณด ๋ก์ง ๊ตฌํ
๊ฐ์๋ฐ์๋ณด ๋ก์ง ๊ตฌํ์ ์์ด์ ์ฌ์ฉ์์ ์ซ์์ ์ปดํจํฐ์ ์ซ์๋ฅผ ๋นผ์ ์นํจ๋ฅผ ๊ฒฐ์ ์ง๋ ๋ก์ง์ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ๋์ค์ ๊ฐ์๋ฐ์๋ณด๋ฅผ ๊ฒฐ์ ์ง๋ ์ซ์๋ค์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ํ๋ก๊ทธ๋จ์์ ์ ์ฒด์ ์ธ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๊ฒ์
๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ซ์๊ฐ ์๋ ๊ฐ์,๋ฐ์,๋ณด๋ก ์นํจ๋ฅผ ํ์ธํ ์ ์๋ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. ์ด ๊ณผ์ ์ค enum์ ํตํด ์ ํ์ ์ธ ์กฐ๊ฑด์ผ๋ก ๊ฐ์, ๋ฐ์, ๋ณด๋ฅผ ์ ์ธํด์ฃผ์์ต๋๋ค.
**- ์์ ์ (์ซ์๋ก ๋ก์ง์ฒ๋ฆฌ)**
์ซ์๊ฐ์ ๋บ์
์ ํตํด ๋ก์ง์ ๊ตฌํํ์ง๋ง, ์ซ์๊ฐ ๋ณ๊ฒฝ๋ ์ ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค.
```swift=
func compareHand(computerHand: Int, userHand: Int) -> String {
let status: String
if result == 0 {
status = "Draw"
} else if result == -2 || result == 1 {
status = "Win"
} else {
status = "Lose"
}
return status
}
```
**- ์์ ํ(๊ฐ์, ๋ฐ์, ๋ณด๋ก ๋ก์ง์ฒ๋ฆฌ)**
์ด๊ฑฐ์ฒดํํ๋ก ์ซ์๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฐ์, ๋ฐ์, ๋ณด๊ฐ ์ ์ธ๋ ์ด๊ฑฐ์ฒด์์๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
```swift=
func decideRockPaperScissorWinner(_ userHand: RockPaperScissors,
_ computerHand: RockPaperScissors) -> Winner {
switch (userHand, computerHand) {
case (.scissors, .paper), (.rock, .scissors), (.paper, .rock):
return .user
case (.scissors, .rock), (.rock, .paper), (.paper, .scissors):
return .computer
default:
return .draw
}
}
```
**- Enum ํ์
**
```swift=
enum RockPaperScissors: Int {
case scissors = 1
case rock = 2
case paper = 3
case wrongHand
}
```
---
### 3๏ธโฃ ์๋ฌ์ฒ๋ฆฌ
์ฒ์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ๋์ง ์๊ณ ์์ฑํ์ต๋๋ค. ๊ทธ ์ด์ ๋ step1์์๋ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ์ํด๋ ๊ตฌํ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ step2๋ฅผ ์์ํ๊ณ ๋ณด๋ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๊ตฌํํด์ผ project์์ ์๊ตฌํ๋ ์ฌํญ๋ค์ด ์ ์์ ์ผ๋ก ์๋๋๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฝ๋์์ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํฌํจํ๊ฒ ๋ฆฌํฉํ ๋งํ์๊ณ ์ ํฌ๊ฐ ์ํ๋ ๊ธฐ๋ฅ๋ถ๋ฆฌ์๋ ์ฑ๊ณตํ๊ฒ ๋์์ต๋๋ค.
---
### 4๏ธโฃ ๊ธฐ๋ฅ๋ถ๋ฆฌ
- ํจ์๊ฐ ํ๋์ ๊ธฐ๋ฅ์ ๊ฐ์ง๋๋ก ๋ถ๋ฆฌ์ํค๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค. ๊ทธ ์ด์ ๋ ์ฌ์ฌ์ฉ ์ธก๋ฉด์
๋๋ค. ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ํจ์ ์ค ํ๊ฐ์ ๊ธฐ๋ฅ๋ง ์ฌ์ฌ์ฉํด์ผ ํ ๋, ์ฌ์ฌ์ฉํ์ง ๋ชปํ๊ณ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๋ถํธํจ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
- makeRandomComputerNumber(), func inputUserNumber()๊ฐ ๊ธฐ๋ฅ๋ถ๋ฆฌ๊ฐ ์๋ ์ผ์ด์ค์
๋๋ค.
---
### 5๏ธโฃ enum
enumํ์
์ ํตํด ๊ฐ์ ๋ถ๋ฌ์ฌ ๋ "**rawValue**"๋ฅผ ์ฌ์ฉํ์ต๋๋ค. .rawValue"๋ ํธ์ถ๋ ๋ ๋ถ๋ช
ํํ ์ด๋ฆ์ผ๋ก ์๋ฏธ๋ฅผ ํ์
ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด enumํ์
์์ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ์ต๋๋ค. ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ํตํด ".rawValue"๊ฐ ์๋ "name"์ด๋ผ๊ณ ์ง์ ํ์ฌ ๋ชจํธํจ์ ๋ฒ์ด๋ฌ์ต๋๋ค.
**- ๋ณ๊ฒฝ ์ **
```swift=
enum winner: String {
case user = "์ฌ์ฉ์"
case computer = "์ปดํจํฐ"
case draw
}
```
**- ๋ณ๊ฒฝ ํ**
```swift=
enum Winner {
case user
case computer
case draw
var name: String {
switch self {
case .user:
return "์ฌ์ฉ์"
case .computer:
return "์ปดํจํฐ"
case .draw:
return "๋ฌด์น๋ถ"
}
}
}
```
**- ํธ์ถ์**
```swift=
print(Winner.rawValue) //๋ณ๊ฒฝ ์
print(Winner.name) //๋ณ๊ฒฝ ํ
```
---
### 6๏ธโฃ ํจ์์ ์ฌ์ฌ์ฉ์ฑ
- ๋ฌต์ฐ๋น ๊ฒ์๊ณผ ๊ฐ์๋ฐ์๋ณด๊ฒ์์์ ์ฌ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋จ๋ "**inputUserNumber**"ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
- ์์ ์ ์๋ "**printMenu()**"(๊ฐ์๋ฐ์๋ณด๋ก์ง์ ์ฌ์ฉ๋๋ ํจ์)๊ฐ ์์ด์ ๋ฌต์ฐ๋น ๊ฒ์์ ์ฌ์ฌ์ฉํ ์ ์์์ง๋ง, "**printMenu()**"์ญ์ , ๊ฐ๋จํ ๋ก์ง ๋ณ๊ฒฝ ๋ฑ์ ๋ฆฌํฉํ ๋ง์ ๊ฑฐ์ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๋ง๋ค์์ต๋๋ค.
**- ์์ ์ **
```swift=
func inputUserNumber() -> Int {
printMenu()
guard let userInput = readLine() else {
return inputUserNumber()
}
guard let userNumber = Int(userInput) else {
print("์๋ชป๋ ์
๋ ฅ์
๋๋ค. ๋ค์ ์๋ํด์ฃผ์ธ์.")
return inputUserNumber()
}
return userNumber
}
```
**- ์์ ํ**
```swift=
func inputUserNumber() throws -> Int {
guard let userInput = readLine(), let userNumber = Int(userInput) else {
throw InputError.invalidInput
}
return userNumber
}
```
## ์ฐธ๊ณ ๋งํฌ
* [draw.io](https://app.diagrams.net/)
* [Swift API Design Guideline](https://www.swift.org/documentation/api-design-guidelines/)
* [Swift Properties](https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties)
* [Swift Enum](https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations)
* [Swift Generics](https://docs.swift.org/swift-book/LanguageGuide/Generics.html#)
* [Switch control Flow](https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html#)
* [The Swift Language Guide](https://jusung.gitbook.io/the-swift-language-guide/)
## 7ํ ํ๊ณ
* [7ํ ํ๊ณ ](https://github.com/gzzjk159/ios-rock-paper-scissors/blob/step2/7%ED%8C%80%20%ED%9A%8C%EA%B3%A0.md)