diff --git a/README.md b/README.md
index 81b03cdba2..c80670b15f 100644
--- a/README.md
+++ b/README.md
@@ -1,207 +1,6 @@
-# ๊ณผ์ - ๋ก๋
-
-## ๐ ์งํ ๋ฐฉ์
-
-- ๊ณผ์ ๋ **๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ, ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ, ๊ณผ์ ์งํ ์๊ตฌ ์ฌํญ** ์ธ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
-- ์ธ ๊ฐ์ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๋ค. ํนํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ง๋ค๊ณ , ๊ธฐ๋ฅ ๋จ์๋ก ์ปค๋ฐ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
-- ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์ ๊ธฐ์ฌ๋์ง ์์ ๋ด์ฉ์ ์ค์ค๋ก ํ๋จํ์ฌ ๊ตฌํํ๋ค.
-
----
-
-## ๐ ๊ณผ์ ์งํ ๋ฐ ์ ์ถ ๋ฐฉ๋ฒ
-
-- ๊ณผ์ ๋ [java-lotto](https://github.com/LandvibeDev/java-lotto) ์ ์ฅ์๋ฅผ Fork/Cloneํด ์์ํ๋ค.
-- **๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ java-baseball-precourse/README.md ํ์ผ์ ๊ตฌํํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌ**ํด ์ถ๊ฐํ๋ค.
-- **Git์ ์ปค๋ฐ ๋จ์๋ ์ ๋จ๊ณ์์ README.md ํ์ผ์ ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก ๋จ์**๋ก ์ถ๊ฐํ๋ค.
- - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) ์ฐธ๊ณ ํด commit log๋ฅผ ๋จ๊ธด๋ค.
-- ๊ณผ์ ์งํ ๋ฐ ์ ์ถ ๋ฐฉ๋ฒ์ [์ฐ์ํ์ฝ์ค ๊ณผ์ ์ ์ถ ๋ฌธ์](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) ๋ฅผ ์ฐธ๊ณ ํ๋ค.
- - base repository๋ฅผ `LandvibeDev/java-lotto`๋ก ์ง์ ํด์ PR ์์ฑํ๋ฉด๋จ
-
-
-
-### ํ
์คํธ ์คํ ๊ฐ์ด๋
-
-- ํฐ๋ฏธ๋์์ `java -version`์ ์คํํ์ฌ Java ๋ฒ์ ์ด 14์ธ์ง ํ์ธํ๋ค. ๋๋ Eclipse ๋๋ IntelliJ IDEA์ ๊ฐ์ IDE์์ Java 14๋ก ์คํ๋๋์ง ํ์ธํ๋ค.
-- ํฐ๋ฏธ๋์์ Mac ๋๋ Linux ์ฌ์ฉ์์ ๊ฒฝ์ฐ `./gradlew clean test` ๋ช
๋ น์ ์คํ ํ๊ณ ,
- Windows ์ฌ์ฉ์์ ๊ฒฝ์ฐ `gradlew.bat clean test` ๋ช
๋ น์ ์คํํ ๋ ๋์ ํ๋์ง ๋ง ํ์ธ(ํ
์คํธ๋ ์คํจ).
-
----
-
-## ๐ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
-
-๋ก๋ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค. ๋ก๋ ๊ฒ์์ ์๋์ ๊ฐ์ ๊ท์น์ผ๋ก ์งํ๋๋ค.
-
-```
-- ๋ก๋ ๋ฒํธ์ ์ซ์ ๋ฒ์๋ 1~45๊น์ง์ด๋ค.
-- 1๊ฐ์ ๋ก๋๋ฅผ ๋ฐํํ ๋ ์ค๋ณต๋์ง ์๋ 6๊ฐ์ ์ซ์๋ฅผ ๋ฝ๋๋ค.
-- ๋น์ฒจ ๋ฒํธ ์ถ์ฒจ ์ ์ค๋ณต๋์ง ์๋ ์ซ์ 6๊ฐ์ ๋ณด๋์ค ๋ฒํธ 1๊ฐ๋ฅผ ๋ฝ๋๋ค.
-- ๋น์ฒจ์ 1๋ฑ๋ถํฐ 5๋ฑ๊น์ง ์๋ค. ๋น์ฒจ ๊ธฐ์ค๊ณผ ๊ธ์ก์ ์๋์ ๊ฐ๋ค.
- - 1๋ฑ: 6๊ฐ ๋ฒํธ ์ผ์น / 2,000,000,000์
- - 2๋ฑ: 5๊ฐ ๋ฒํธ + ๋ณด๋์ค ๋ฒํธ ์ผ์น / 30,000,000์
- - 3๋ฑ: 5๊ฐ ๋ฒํธ ์ผ์น / 1,500,000์
- - 4๋ฑ: 4๊ฐ ๋ฒํธ ์ผ์น / 50,000์
- - 5๋ฑ: 3๊ฐ ๋ฒํธ ์ผ์น / 5,000์
-```
-
-- ๋ก๋ ๊ตฌ์
๊ธ์ก์ ์
๋ ฅํ๋ฉด ๊ตฌ์
๊ธ์ก์ ํด๋นํ๋ ๋งํผ ๋ก๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
-- ๋ก๋ 1์ฅ์ ๊ฐ๊ฒฉ์ 1,000์์ด๋ค.
-- ๋น์ฒจ ๋ฒํธ์ ๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
-- ์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ ๋ก๋ ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ ๋น์ฒจ ๋ด์ญ ๋ฐ ์์ต๋ฅ ์ ์ถ๋ ฅํ๊ณ ๋ก๋ ๊ฒ์์ ์ข
๋ฃํ๋ค.
-- ์ฌ์ฉ์๊ฐ ์๋ชป๋ ๊ฐ์ ์
๋ ฅํ ๊ฒฝ์ฐ `IllegalArgumentException`๋ฅผ ๋ฐ์์ํค๊ณ , "[ERROR]"๋ก ์์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ ํ ์ข
๋ฃํ๋ค.
-
-## โ๐ป ์
์ถ๋ ฅ ์๊ตฌ์ฌํญ
-
-### โจ๏ธ ์
๋ ฅ
-
-- ๋ก๋ ๊ตฌ์
๊ธ์ก์ ์
๋ ฅ ๋ฐ๋๋ค. ๊ตฌ์
๊ธ์ก์ 1,000์ ๋จ์๋ก ์
๋ ฅ ๋ฐ์ผ๋ฉฐ 1,000์์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌํ๋ค.
-
-```
-14000
-```
-
-- ๋น์ฒจ ๋ฒํธ๋ฅผ ์
๋ ฅ ๋ฐ๋๋ค. ๋ฒํธ๋ ์ผํ(,)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ๋ค.
-
-```
-1,2,3,4,5,6
-```
-
-- ๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅ ๋ฐ๋๋ค.
-
-```
-7
-```
-
-### ๐ฅ ์ถ๋ ฅ
-
-- ๋ฐํํ ๋ก๋ ์๋ ๋ฐ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ก๋ ๋ฒํธ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ๋ณด์ฌ์ค๋ค.
-
-```
-8๊ฐ๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.
-[8, 21, 23, 41, 42, 43]
-[3, 5, 11, 16, 32, 38]
-[7, 11, 16, 35, 36, 44]
-[1, 8, 11, 31, 41, 42]
-[13, 14, 16, 38, 42, 45]
-[7, 11, 30, 40, 42, 43]
-[2, 13, 22, 32, 38, 45]
-[1, 3, 5, 14, 22, 45]
-```
-
-- ๋น์ฒจ ๋ด์ญ์ ์ถ๋ ฅํ๋ค.
-
-```
-3๊ฐ ์ผ์น (5,000์) - 1๊ฐ
-4๊ฐ ์ผ์น (50,000์) - 0๊ฐ
-5๊ฐ ์ผ์น (1,500,000์) - 0๊ฐ
-5๊ฐ ์ผ์น, ๋ณด๋์ค ๋ณผ ์ผ์น (30,000,000์) - 0๊ฐ
-6๊ฐ ์ผ์น (2,000,000,000์) - 0๊ฐ
-```
-
-- ์์ต๋ฅ ์ ์์์ ๋์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ๋ค. (ex. 100.0%, 51.5%, 1,000,000.0%)
-
-```
-์ด ์์ต๋ฅ ์ 62.5%์
๋๋ค.
-```
-
-- ์์ธ ์ํฉ ์ ์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค. ๋จ, ์๋ฌ ๋ฌธ๊ตฌ๋ "[ERROR]"๋ก ์์ํด์ผ ํ๋ค.
-
-```
-[ERROR] ๋ก๋ ๋ฒํธ๋ 1๋ถํฐ 45 ์ฌ์ด์ ์ซ์์ฌ์ผ ํฉ๋๋ค.
-```
-
-### ๐ป ์คํ ๊ฒฐ๊ณผ ์์
-
-```
-๊ตฌ์
๊ธ์ก์ ์
๋ ฅํด ์ฃผ์ธ์.
-8000
-
-8๊ฐ๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.
-[8, 21, 23, 41, 42, 43]
-[3, 5, 11, 16, 32, 38]
-[7, 11, 16, 35, 36, 44]
-[1, 8, 11, 31, 41, 42]
-[13, 14, 16, 38, 42, 45]
-[7, 11, 30, 40, 42, 43]
-[2, 13, 22, 32, 38, 45]
-[1, 3, 5, 14, 22, 45]
-
-๋น์ฒจ ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
-1,2,3,4,5,6
-
-๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
-7
-
-๋น์ฒจ ํต๊ณ
----
-3๊ฐ ์ผ์น (5,000์) - 1๊ฐ
-4๊ฐ ์ผ์น (50,000์) - 0๊ฐ
-5๊ฐ ์ผ์น (1,500,000์) - 0๊ฐ
-5๊ฐ ์ผ์น, ๋ณด๋์ค ๋ณผ ์ผ์น (30,000,000์) - 0๊ฐ
-6๊ฐ ์ผ์น (2,000,000,000์) - 0๊ฐ
-์ด ์์ต๋ฅ ์ 62.5%์
๋๋ค.
-```
-
----
-
-## ๐ฏ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ
-
-- JDK 14 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.
-- ํ๋ก๊ทธ๋จ ์คํ์ ์์์ ์ `Application`์ `main()`์ด๋ค.
-- `build.gradle` ํ์ผ์ ๋ณ๊ฒฝํ ์ ์๊ณ , ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
-- [Java ์ฝ๋ ์ปจ๋ฒค์
](https://naver.github.io/hackday-conventions-java/) ๊ฐ์ด๋๋ฅผ ์ค์ํ๋ฉฐ ํ๋ก๊ทธ๋๋ฐํ๋ค.
-- ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์ `System.exit()`๋ฅผ ํธ์ถํ์ง ์๋๋ค.
-- ํ๋ก๊ทธ๋จ ๊ตฌํ์ด ์๋ฃ๋๋ฉด `ApplicationTest`์ ๋ชจ๋ ํ
์คํธ๊ฐ ์ฑ๊ณตํด์ผ ํ๋ค.
-- ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ์์ ๋ฌ๋ฆฌ ๋ช
์ํ์ง ์๋ ํ ํ์ผ, ํจํค์ง ์ด๋ฆ์ ์์ ํ๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค.
-- indent(์ธ๋ดํธ, ๋ค์ฌ์ฐ๊ธฐ) depth๋ฅผ 3์ด ๋์ง ์๋๋ก ๊ตฌํํ๋ค. 2๊น์ง๋ง ํ์ฉํ๋ค.
- - ์๋ฅผ ๋ค์ด while๋ฌธ ์์ if๋ฌธ์ด ์์ผ๋ฉด ๋ค์ฌ์ฐ๊ธฐ๋ 2์ด๋ค.
- - ํํธ: indent(์ธ๋ดํธ, ๋ค์ฌ์ฐ๊ธฐ) depth๋ฅผ ์ค์ด๋ ์ข์ ๋ฐฉ๋ฒ์ ํจ์(๋๋ ๋ฉ์๋)๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋๋ค.
-- 3ํญ ์ฐ์ฐ์๋ฅผ ์ฐ์ง ์๋๋ค.
-- ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ์ต๋ํ ์๊ฒ ๋ง๋ค์ด๋ผ.
-- JUnit 5์ AssertJ๋ฅผ ์ด์ฉํ์ฌ ๋ณธ์ธ์ด ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์ ์ ๋์ํจ์ ํ
์คํธ ์ฝ๋๋ก ํ์ธํ๋ค.
-- ํจ์(๋๋ ๋ฉ์๋)์ ๊ธธ์ด๊ฐ 15๋ผ์ธ์ ๋์ด๊ฐ์ง ์๋๋ก ๊ตฌํํ๋ค.
- - ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ์ ํ๋๋ก ๊ตฌํํ๋ค.
-- else ์์ฝ์ด๋ฅผ ์ฐ์ง ์๋๋ค.
- - ํํธ: if ์กฐ๊ฑด์ ์์ ๊ฐ์ returnํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด else๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
- - else๋ฅผ ์ฐ์ง ๋ง๋ผ๊ณ ํ๋ switch/case๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ switch/case๋ ํ์ฉํ์ง ์๋๋ค.
-- Java Enum์ ์ ์ฉํ๋ค.
-- ๋๋ฉ์ธ ๋ก์ง์ ๋จ์ ํ
์คํธ๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๋จ, UI(System.out, System.in, Scanner) ๋ก์ง์ ์ ์ธํ๋ค.
- - ํต์ฌ ๋ก์ง์ ๊ตฌํํ๋ ์ฝ๋์ UI๋ฅผ ๋ด๋นํ๋ ๋ก์ง์ ๋ถ๋ฆฌํด ๊ตฌํํ๋ค.
-
-### ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
-- [`camp.nextstep.edu.missionutils`](https://github.com/woowacourse-projects/mission-utils)์์ ์ ๊ณตํ๋ `Randoms` ๋ฐ `Console` API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
- - Random ๊ฐ ์ถ์ถ์ `camp.nextstep.edu.missionutils.Randoms`์ `pickUniqueNumbersInRange()`๋ฅผ ํ์ฉํ๋ค.
- - ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ ๊ฐ์ `camp.nextstep.edu.missionutils.Console`์ `readLine()`์ ํ์ฉํ๋ค.
-
-#### ์ฌ์ฉ ์์
-
-```java
-List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6);
-```
-
-### Lotto ํด๋์ค
-
-- ์ ๊ณต๋ `Lotto` ํด๋์ค๋ฅผ ํ์ฉํด ๊ตฌํํด์ผ ํ๋ค.
-- `Lotto`์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
-- `numbers`์ ์ ๊ทผ ์ ์ด์์ธ private์ ๋ณ๊ฒฝํ ์ ์๋ค.
-- `Lotto`์ ํ๋(์ธ์คํด์ค ๋ณ์)๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
-- `Lotto`์ ํจํค์ง ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๋ค.
-
-```java
-public class Lotto {
- private final List numbers;
-
- public Lotto(List numbers) {
- validate(numbers);
- this.numbers = numbers;
- }
-
- private void validate(List numbers) {
- if (numbers.size() != 6) {
- throw new IllegalArgumentException();
- }
- }
-
- // TODO: ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
-}
-```
+# Lotto
+1. ๋์ ์์ฑ
+2. ๋น์ฒจ ๋ฒํธ, ๋ณด๋์ค ๋ฒํธ ์
๋ ฅ
+3. ๋น์ฒจ ์ฌ๋ถ ํ์
+4. ์์ต๋ฅ ๊ณ์ฐ
+5. ์์ธ ์ฒ๋ฆฌ
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 1cd662974c..9d087b142e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,7 +13,7 @@ dependencies {
java {
toolchain {
- languageVersion = JavaLanguageVersion.of(14)
+ languageVersion = JavaLanguageVersion.of(11)
}
}
diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java
index 367ee30584..475cc38e4c 100644
--- a/src/main/java/lotto/Application.java
+++ b/src/main/java/lotto/Application.java
@@ -2,6 +2,8 @@
public class Application {
public static void main(String[] args) {
- // TODO: ํ๋ก๊ทธ๋จ ๊ตฌํ
+ NumberGame chosenNumberGame = new LottoGame();
+ GameManager gameManager = new GameManager(chosenNumberGame);
+ gameManager.playGame();
}
}
\ No newline at end of file
diff --git a/src/main/java/lotto/ConsoleMessages.java b/src/main/java/lotto/ConsoleMessages.java
new file mode 100644
index 0000000000..011a7f6af0
--- /dev/null
+++ b/src/main/java/lotto/ConsoleMessages.java
@@ -0,0 +1,47 @@
+package lotto;
+
+import java.text.DecimalFormat;
+import java.util.List;
+
+import static lotto.Result.*;
+import static lotto.Rule.*;
+
+public class ConsoleMessages {
+
+ public static void printResult(List resultNumber) {
+ DecimalFormat decFormat = new DecimalFormat("###,###");
+ String result = "๋น์ฒจ ํต๊ณ\n";
+ result += "---\n";
+ result += String.format("3๊ฐ ์ผ์น (%s์) - %d๊ฐ\n", decFormat.format(FIFTH.prize) ,resultNumber.get(MIN_RANK-1));
+ result += String.format("4๊ฐ ์ผ์น (%s์) - %d๊ฐ\n", decFormat.format(FOURTH.prize), resultNumber.get(MIN_RANK-2));
+ result += String.format("5๊ฐ ์ผ์น (%s์) - %d๊ฐ\n", decFormat.format(THIRD.prize), resultNumber.get(MIN_RANK-3));
+ result += String.format("5๊ฐ ์ผ์น, ๋ณด๋์ค ๋ณผ ์ผ์น (%s์) - %d๊ฐ\n", decFormat.format(SECOND.prize), resultNumber.get(MIN_RANK-4));
+ result += String.format("6๊ฐ ์ผ์น (%s์) - %d๊ฐ", decFormat.format(FIRST.prize), resultNumber.get(MIN_RANK-5));
+ System.out.println(result);
+ }
+
+ public static void printEarningRate(double earningRate) {
+ System.out.println(String.format("์ด ์์ต๋ฅ ์ %.1f%%์
๋๋ค.", earningRate));
+ }
+
+ public static void printEnterMoney() {
+ System.out.println("๊ตฌ์
๊ธ์ก์ ์
๋ ฅํด์ฃผ์ธ์.");
+ }
+
+ public static void printLottoCount(int lottoCount) {
+ System.out.println(String.format("%d๊ฐ๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.", lottoCount));
+ }
+
+ public static void printEnterWinningNumber() {
+ System.out.println("๋น์ฒจ ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.");
+ }
+
+ public static void printEnterBonusNumber() {
+ System.out.println("๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.");
+ }
+
+ public static void printLottoNumbers(Lotto lotto) {
+ System.out.println(lotto.toString());
+ }
+
+}
diff --git a/src/main/java/lotto/ErrorMessage.java b/src/main/java/lotto/ErrorMessage.java
new file mode 100644
index 0000000000..f29a1c21f0
--- /dev/null
+++ b/src/main/java/lotto/ErrorMessage.java
@@ -0,0 +1,13 @@
+package lotto;
+
+public enum ErrorMessage {
+ WRONG_CHARACTER("[ERROR] ๋ก๋ ๋ฒํธ๋ 1๋ถํฐ 45 ์ฌ์ด์ ์ซ์์ฌ์ผ ํฉ๋๋ค."),
+ DUPLICATION("[ERROR] ์ค๋ณต๋ ์ซ์๊ฐ ์์ต๋๋ค"),
+ WRONG_MONEY("[ERROR] ๋ก๋๋ ์ฒ์ ๋จ์๋ก ๊ตฌ๋งคํ ์ ์์ต๋๋ค");
+
+ public String message;
+
+ ErrorMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/lotto/GameManager.java b/src/main/java/lotto/GameManager.java
new file mode 100644
index 0000000000..a5e302db24
--- /dev/null
+++ b/src/main/java/lotto/GameManager.java
@@ -0,0 +1,14 @@
+package lotto;
+
+public class GameManager {
+
+ private NumberGame numberGame;
+
+ public GameManager(NumberGame chosenGame) {
+ this.numberGame = chosenGame;
+ }
+
+ public void playGame() {
+ numberGame.play();
+ }
+}
diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java
new file mode 100644
index 0000000000..f6aebe18ff
--- /dev/null
+++ b/src/main/java/lotto/Lotto.java
@@ -0,0 +1,31 @@
+package lotto;
+
+import java.util.List;
+
+public class Lotto {
+ private final List numbers;
+
+ public Lotto(List numbers) {
+ this.numbers = numbers;
+ }
+
+ public MatchedNumbers match(WinningNumbers winningNumbers) {
+ MatchedNumbers matchedNumbers = new MatchedNumbers();
+ for (Integer number : numbers) {
+ if(winningNumbers.mainNumbers.contains(number)) {
+ matchedNumbers.mainNumberMatching++;
+ }
+ if(winningNumbers.bonusNumber == number) {
+ matchedNumbers.bonusNumberMatching++;
+ }
+ }
+ return matchedNumbers;
+ }
+
+ @Override
+ public String toString() {
+ numbers.stream()
+ .sorted();
+ return numbers.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/lotto/LottoGame.java b/src/main/java/lotto/LottoGame.java
new file mode 100644
index 0000000000..4fe41bba34
--- /dev/null
+++ b/src/main/java/lotto/LottoGame.java
@@ -0,0 +1,117 @@
+package lotto;
+
+import camp.nextstep.edu.missionutils.Console;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static lotto.ConsoleMessages.*;
+import static lotto.Parsing.parseInput;
+
+public class LottoGame implements NumberGame {
+
+ List lottoList;
+ List resultList;
+ WinningNumbers winningNumbers;
+ int money;
+ int lottoCount;
+ int prize;
+ Validation validation;
+
+ public LottoGame() {
+ winningNumbers = new WinningNumbers();
+ resultList = new ArrayList<>();
+ lottoList = new ArrayList<>() ;
+ validation = new Validation();
+ prize = 0;
+ }
+
+ public void play() {
+ insertMoney();
+ buyLotto();
+ getWinningNumbers();
+ calculateResult();
+ getResult();
+ }
+
+ private void insertMoney() {
+ printEnterMoney();
+ String moneyString = Console.readLine();
+ validation.validateMoney(moneyString);
+ money = Parsing.parseMoney(moneyString);
+ lottoCount = money / 1000;
+ printLottoCount(lottoCount);
+ }
+
+ private void buyLotto() {
+ RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator();
+ List randomNumbers;
+ for(int count = 0; count makeRankArrayList() {
+ List rankArrayList = new ArrayList<>();
+ for(int count = 0; count <= Rule.MIN_RANK; count++) { // ์ต์ ๋ฑ์(5)๋ฑ์ ์ฌ์ด์ฆ๋ฅผ ๊ฐ๋๋ก ํ๋ ๊ฒ
+ rankArrayList.add(0);
+ }
+ return rankArrayList;
+ }
+
+ private void getResult() {
+ List rankArrayList = makeRankArrayList();
+ for (Result result : resultList) {
+ rankArrayList.set(result.order-1, rankArrayList.get(result.order-1)+1);
+ prize += result.prize;
+ }
+ printResult(rankArrayList);
+ printEarningRate(calculateEarningsRate());
+ }
+
+ private double calculateEarningsRate() {
+ if (money == 0) {
+ throw new ArithmeticException("๋์ด 0์์ผ ๊ฒฝ์ฐ ์์ต๋ฅ ์ ๊ณ์ฐํ ์ ์์ต๋๋ค");
+ }
+ return ((double)prize / money) * 100;
+ }
+}
diff --git a/src/main/java/lotto/MatchedNumbers.java b/src/main/java/lotto/MatchedNumbers.java
new file mode 100644
index 0000000000..0369459404
--- /dev/null
+++ b/src/main/java/lotto/MatchedNumbers.java
@@ -0,0 +1,28 @@
+package lotto;
+
+import static lotto.Result.*;
+import static lotto.Rule.COUNT;
+
+public class MatchedNumbers {
+ int bonusNumberMatching;
+ int mainNumberMatching;
+
+ public Result computeResult() {
+ int sum = mainNumberMatching + bonusNumberMatching;
+ if (sum == COUNT) {
+ if (bonusNumberMatching == 0) {
+ return FIRST;
+ }
+ return SECOND;
+ } else if (sum < COUNT) {
+ if (sum == COUNT - 1) {
+ return THIRD;
+ } else if (sum == COUNT - 2) {
+ return FOURTH;
+ } else if (sum == COUNT - 3) {
+ return FIFTH;
+ }
+ }
+ return NONE;
+ }
+}
diff --git a/src/main/java/lotto/NumberGame.java b/src/main/java/lotto/NumberGame.java
new file mode 100644
index 0000000000..ee6cf2114b
--- /dev/null
+++ b/src/main/java/lotto/NumberGame.java
@@ -0,0 +1,7 @@
+package lotto;
+
+import java.util.List;
+
+public interface NumberGame {
+ void play();
+}
diff --git a/src/main/java/lotto/Parsing.java b/src/main/java/lotto/Parsing.java
new file mode 100644
index 0000000000..ecd793dc32
--- /dev/null
+++ b/src/main/java/lotto/Parsing.java
@@ -0,0 +1,37 @@
+package lotto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static lotto.ErrorMessage.*;
+
+public class Parsing {
+
+ public static WinningNumbers parseInput(String mainNumbersString, String bonusNumberString) {
+ WinningNumbers winningNumbers = new WinningNumbers();
+ winningNumbers.mainNumbers = parseMainNumbers(mainNumbersString);
+ winningNumbers.bonusNumber = parseBonusNumber(bonusNumberString);
+ return winningNumbers;
+ }
+
+ private static List parseMainNumbers(String inputString) {
+ List parsedNumbers = new ArrayList<>();
+ String[] parsedString = inputString.split(",");
+ for (String s : parsedString) {
+ int parsedNumber = Integer.parseInt(s);
+ if(parsedNumber < 1 || parsedNumber > 45) {
+ throw new IllegalArgumentException(WRONG_CHARACTER.message);
+ }
+ parsedNumbers.add(parsedNumber);
+ }
+ return parsedNumbers;
+ }
+
+ private static int parseBonusNumber(String bonusNumber) {
+ return Integer.parseInt(bonusNumber);
+ }
+
+ public static int parseMoney(String money) {
+ return Integer.parseInt(money);
+ }
+}
diff --git a/src/main/java/lotto/RandomNumberGenerator.java b/src/main/java/lotto/RandomNumberGenerator.java
new file mode 100644
index 0000000000..08ef5f76a3
--- /dev/null
+++ b/src/main/java/lotto/RandomNumberGenerator.java
@@ -0,0 +1,15 @@
+package lotto;
+
+import camp.nextstep.edu.missionutils.Randoms;
+
+import java.util.List;
+
+import static lotto.Rule.*;
+
+public class RandomNumberGenerator {
+
+ public List generateRandomNumbers() {
+ List randomNumbers = Randoms.pickUniqueNumbersInRange(START, END, COUNT);
+ return randomNumbers;
+ }
+}
diff --git a/src/main/java/lotto/Result.java b/src/main/java/lotto/Result.java
new file mode 100644
index 0000000000..debe1c8b0b
--- /dev/null
+++ b/src/main/java/lotto/Result.java
@@ -0,0 +1,13 @@
+package lotto;
+
+public enum Result {
+ FIRST(2000000000, 1), SECOND(30000000, 2), THIRD(1500000, 3), FOURTH(50000, 4), FIFTH(5000, 5), NONE(0, 6);
+
+ public int prize;
+ public int order;
+
+ Result(int prize, int order) {
+ this.prize = prize;
+ this.order = order;
+ }
+}
diff --git a/src/main/java/lotto/Rule.java b/src/main/java/lotto/Rule.java
new file mode 100644
index 0000000000..6ba0d92b46
--- /dev/null
+++ b/src/main/java/lotto/Rule.java
@@ -0,0 +1,8 @@
+package lotto;
+
+public class Rule {
+ static final int START = 1;
+ static final int END = 45;
+ static final int COUNT = 6;
+ static final int MIN_RANK = 5;
+}
diff --git a/src/main/java/lotto/Validation.java b/src/main/java/lotto/Validation.java
new file mode 100644
index 0000000000..ace6aa83d5
--- /dev/null
+++ b/src/main/java/lotto/Validation.java
@@ -0,0 +1,65 @@
+package lotto;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static lotto.ErrorMessage.*;
+
+public class Validation {
+
+ public void validateMoney(String money) {
+ moneyCharacterCheck(money);
+ checkAmountOfMoney(money);
+ }
+
+ public void validateWinningNumbers(String mainNumbers, String bonusNumber) {
+ mainNumberCharacterCheck(mainNumbers);
+ bonusNumberCharacterCheck(bonusNumber);
+ winningNumberDuplicationCheck(mainNumbers, bonusNumber);
+ }
+
+ private void mainNumberCharacterCheck(String mainNumbers) {
+ String[] mainNumberList = mainNumbers.split(",");
+ for (String mainNumber : mainNumberList) {
+ for (Character character : mainNumber.toCharArray()) {
+ if (!Character.isDigit(character)) {
+ throw new IllegalArgumentException(WRONG_CHARACTER.message);
+ }
+ }
+ }
+ }
+
+ private void bonusNumberCharacterCheck(String bonusNumber) {
+ for (Character character : bonusNumber.toCharArray()) {
+ if (!Character.isDigit(character)) {
+ throw new IllegalArgumentException(WRONG_CHARACTER.message);
+ }
+ }
+ }
+
+ private void winningNumberDuplicationCheck(String inputMainNumbers, String inputBonusNumber) {
+ Set set = new HashSet<>();
+ for (String number : inputMainNumbers.split(",")) {
+ set.add(Integer.parseInt(number));
+ }
+ set.add(Integer.parseInt(inputBonusNumber));
+ if (set.size() != Rule.COUNT + 1) {
+ throw new IllegalArgumentException(DUPLICATION.message);
+ }
+ }
+
+ private void moneyCharacterCheck(String money) {
+ for (char character : money.toCharArray()) {
+ if (!Character.isDigit(character)) {
+ throw new IllegalArgumentException(WRONG_MONEY.message);
+ }
+ }
+ }
+
+ private void checkAmountOfMoney(String money) {
+ if(Integer.parseInt(money) % 1000 != 0 || Integer.parseInt(money) == 0) {
+ throw new IllegalArgumentException(WRONG_MONEY.message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/lotto/WinningNumbers.java b/src/main/java/lotto/WinningNumbers.java
new file mode 100644
index 0000000000..760a88d762
--- /dev/null
+++ b/src/main/java/lotto/WinningNumbers.java
@@ -0,0 +1,9 @@
+package lotto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WinningNumbers {
+ public List mainNumbers = new ArrayList<>();
+ public int bonusNumber;
+}
diff --git a/src/test/java/lotto/ApplicationTest.java b/src/test/java/lotto/ApplicationTest.java
index 4dcf5b19b8..81e7ef4ea6 100644
--- a/src/test/java/lotto/ApplicationTest.java
+++ b/src/test/java/lotto/ApplicationTest.java
@@ -8,6 +8,7 @@
import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomUniqueNumbersInRangeTest;
import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
class ApplicationTest extends NsTest {
private static final String ERROR_MESSAGE = "[ERROR]";
@@ -50,10 +51,38 @@ class ApplicationTest extends NsTest {
void ์์ธ_ํ
์คํธ() {
assertSimpleTest(() -> {
runException("1000j");
- assertThat(output()).contains(ERROR_MESSAGE);
+ assertThat(output()).contains("[ERROR]");
+ });
+
+ assertSimpleTest(() -> {
+ runException("0");
+ assertThat(output()).contains("๋ก๋๋ ์ฒ์ ๋จ์๋ก ๊ตฌ๋งคํ ์ ์์ต๋๋ค");
+ });
+
+ assertSimpleTest(() -> {
+ runException("123");
+ assertThat(output()).contains("๋ก๋๋ ์ฒ์ ๋จ์๋ก ๊ตฌ๋งคํ ์ ์์ต๋๋ค");
});
}
+ @Test
+ void ์์ธ_ํ
์คํธ_๋ฒ์๋ฐ์ซ์() {
+ assertSimpleTest(() -> {
+ runException("1000", "0,46,47,48,49,50" ,"1");
+ assertThat(output()).contains("[ERROR] ๋ก๋ ๋ฒํธ๋ 1๋ถํฐ 45 ์ฌ์ด์ ์ซ์์ฌ์ผ ํฉ๋๋ค.");
+ });
+ }
+
+ @Test
+ void ์์ธ_๋์ง๊ธฐ() {
+ assertSimpleTest(() ->
+ assertThatThrownBy(() -> runException("1234"))
+ .isInstanceOf(IllegalArgumentException.class)
+ );
+ }
+
+
+
@Override
public void runMain() {
Application.main(new String[]{});