From d32da7471dbe866912cd9e48eb62cf0ec68cae29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 12:52:46 +0900 Subject: [PATCH 01/86] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98=20README=20=EC=B4=88=EC=95=88=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1ff5f7b6790..c1f2ae73006 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,119 @@ -# java-blackjack +# ๐ŸŽด ๋ ˆ๋ฒจ1 ๋ธ”๋ž™์žญ ๋ฏธ์…˜ -๋ธ”๋ž™์žญ ๋ฏธ์…˜ ์ €์žฅ์†Œ +๊ทœ์น™์„ ์ ์šฉํ•˜๋ฉด์„œ ๋ธ”๋ž™์žญ์„ ๊ตฌํ˜„ํ•œ๋‹ค. + +--- + +## ๐Ÿ“ฅ ์ž…์ถœ๋ ฅ ๋ช…์„ธ + +### โ–ซ ์ž…๋ ฅ +1) ๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ๋‹ค. +2) ๊ฐ ์‚ฌ๋žŒ์˜ ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น ์—ฌ๋ถ€๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. + +```plaintext +๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ) +pobi,jason + +pobi๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) +y +pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ +``` + +### โ–ซ ์ถœ๋ ฅ +1) ๋”œ๋Ÿฌ์™€ ๊ฐ ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ˆ˜๋ น ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. +2) ๋”œ๋Ÿฌ ์นด๋“œ์˜ ํ•ฉ์ด 16์ดํ•˜์ธ ๊ฒฝ์šฐ, ์นด๋“œ ์ˆ˜๋ น ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. +3) ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜๋ นํ•œ ์นด๋“œ์™€ ์นด๋“œ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. +4) ์ตœ์ข… ์ŠนํŒจ ์—ฌ๋ถ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +### โ–ซ ์‹คํ–‰ ์˜ˆ์‹œ +```plaintext +๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ) +pobi,jason + +๋”œ๋Ÿฌ์™€ pobi, jason์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. +๋”œ๋Ÿฌ์นด๋“œ: 3๋‹ค์ด์•„๋ชฌ๋“œ +pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ +jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ + +pobi๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) +y +pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ +pobi๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) +n +jason๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) +n +jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ + +๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. + +๋”œ๋Ÿฌ์นด๋“œ: 3๋‹ค์ด์•„๋ชฌ๋“œ, 9ํด๋กœ๋ฒ„, 8๋‹ค์ด์•„๋ชฌ๋“œ - ๊ฒฐ๊ณผ: 20 +pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ - ๊ฒฐ๊ณผ: 21 +jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ - ๊ฒฐ๊ณผ: 17 + +## ์ตœ์ข… ์ŠนํŒจ +๋”œ๋Ÿฌ: 1์Šน 1ํŒจ +pobi: ์Šน +jason: ํŒจ +``` + +--- + +## ๐Ÿงพ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก +1) ์นด๋“œ ๋‚˜๋ˆ„๋Š” ๊ธฐ๋Šฅ +2) ์นด๋“œ ๋ฝ‘๋Š” ๊ธฐ๋Šฅ +3) ์นด๋“œ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ ๊ธฐ๋Šฅ +4) ์นด๋“œ์˜ ํ•ฉ์ด 21์„ ๋„˜์—ˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ๋Šฅ +5) ๋”œ๋Ÿฌ ์นด๋“œ์˜ ํ•ฉ์ด 16 ์ดํ•˜์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ +6) ACE ์นด๋“œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ +7) ๋ฝ‘ํžŒ ์นด๋“œ ์ œ์™ธํ•˜๋Š” ๊ธฐ๋Šฅ +8) ์นด๋“œ ๋ฑ ๋งŒ๋“ค์–ด์„œ ์„ž๊ธฐ +9) ์ŠนํŒจ ์—ฌ๋ถ€ ๊ณ„์‚ฐ๊ธฐ๋Šฅ +10) ๋”œ๋Ÿฌ์˜ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ +--- + +## โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ทœ์น™ +์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. +1) ์ตœ๋Œ€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜๊ฐ€ 1๋ช… ๋ฏธ๋งŒ, 7๋ช… ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. +2) ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น ์—ฌ๋ถ€ ๋‹ต๋ณ€ ์‹œ `y, Y, n, N` ์ด์™ธ์˜ ์ž…๋ ฅ์„ ํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. + + +--- + +## ๐Ÿงช ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค (JUnit5 + AssertJ) + + +--- + +## ๐Ÿงฑ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ + +```plaintext + +``` + + +--- + +## ๐Ÿงพ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ (AngularJS Style) + + +--- + +## ๐Ÿ’ก ๊ฐœ๋ฐœ ์ง„ํ–‰ ๋ฐฉ์‹ + + +--- + +## โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ + + + +--- + +## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ +- JUnit 5 User Guide +- AssertJ User Guide / Exception Assertions +- Guide to JUnit 5 Parameterized Tests +- ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค Java Style Guide +- Angular Commit Message Conventions + +--- From ce21f2ce82fb5f181d589f210320b0aa7d82c158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 18:32:09 +0900 Subject: [PATCH 02/86] =?UTF-8?q?docs(=EB=A7=A5=EC=8A=A4):=20README=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B7=9C=EC=B9=99=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1f2ae73006..d7a48bde527 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ jason: ํŒจ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. 1) ์ตœ๋Œ€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜๊ฐ€ 1๋ช… ๋ฏธ๋งŒ, 7๋ช… ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. 2) ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น ์—ฌ๋ถ€ ๋‹ต๋ณ€ ์‹œ `y, Y, n, N` ์ด์™ธ์˜ ์ž…๋ ฅ์„ ํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. - +3) ์‰ผํ‘œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ตฌ๋ถ„ ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. --- From 75962f09765caa80430c0da7393d7f829c1a420e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 20:54:18 +0900 Subject: [PATCH 03/86] =?UTF-8?q?feat:=20InputView=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5,=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 7 +++++++ src/main/java/view/InputView.java | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/view/InputView.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000000..eb052cce416 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,7 @@ +import java.util.Random; + +public class Application { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000000..313211dad72 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,23 @@ +package view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + public static List readParticipants() { + System.out.println("๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)"); + Scanner scanner = new Scanner(System.in); + String input = scanner.nextLine(); + return Arrays.stream(input.split(",")) + .map(String::trim) + .toList(); + } + + public static boolean checkAddCard(String name) { + System.out.printf("%s๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)%n", name); + Scanner scanner = new Scanner(System.in); + String input = scanner.nextLine(); + return input.equalsIgnoreCase("y"); + } +} From d7a1d1887131edf5cf5c81242c1b68de7565aa48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:01:39 +0900 Subject: [PATCH 04/86] =?UTF-8?q?test:=20=EB=8D=B1=EC=97=90=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EA=B0=80=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/DeckTest.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/domain/DeckTest.java diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java new file mode 100644 index 00000000000..a8fe439e8b8 --- /dev/null +++ b/src/test/java/domain/DeckTest.java @@ -0,0 +1,27 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class DeckTest { + @DisplayName("๋ฑ์˜ ์นด๋“œ ๊ฐœ์ˆ˜ ํ™•์ธ ํ…Œ์ŠคํŠธ - 52์žฅ") + @Test + void ์ƒ์„ฑ๋œ_๋ฑ์˜_์นด๋“œ_๊ฐœ์ˆ˜_ํ™•์ธ() { + Deck deck = Deck.createDeck(); + assertThat(deck.getCards().size()).isEqualTo(52); + } + + @DisplayName("๋ฑ์— ์นด๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") + @Test + void ๋ฑ์—_์นด๋“œ_์—†์„_๊ฒฝ์šฐ_์˜ˆ์™ธ_๋ฐœ์ƒ() { + Deck deck = Deck.createDeck(); + List cards = deck.getCards(); + cards.clear(); + assertThatThrownBy(deck::draw).isInstanceOf(IllegalArgumentException.class); + } +} From f70f37118d20b55cff45e5c3f3836a018fd36eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:02:54 +0900 Subject: [PATCH 05/86] =?UTF-8?q?feat:=20Deck=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91=EB=8A=94=20draw=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Deck.java | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/domain/Deck.java diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java new file mode 100644 index 00000000000..a2562b659ff --- /dev/null +++ b/src/main/java/domain/Deck.java @@ -0,0 +1,44 @@ +package domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Deck { + private final List cards; + + private Deck(List cards) { + this.cards = cards; + } + + public static Deck createDeck() { + List cards = generateAllCards(); + Collections.shuffle(cards); + return new Deck(cards); + } + + private static List generateAllCards() { + List cards = new ArrayList<>(); + for (CardShape shape : CardShape.values()) { + addCardsByShape(cards, shape); + } + return cards; + } + + private static void addCardsByShape(List cards, CardShape shape) { + for (CardNumber number : CardNumber.values()) { + cards.add(Card.of(number, shape)); + } + } + + public List getCards() { + return cards; + } + + public Card draw() { + if (cards.isEmpty()) { + throw new IllegalArgumentException("๋ฑ์— ๋‚จ์€ ์นด๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + return cards.removeFirst(); + } +} From 88ff16fe62a6bf9f7001501415e484100ffe325d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:03:31 +0900 Subject: [PATCH 06/86] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=ED=8C=8C=EC=8B=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20NameParser=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/NameParser.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/util/NameParser.java diff --git a/src/main/java/util/NameParser.java b/src/main/java/util/NameParser.java new file mode 100644 index 00000000000..6d6eb82b09b --- /dev/null +++ b/src/main/java/util/NameParser.java @@ -0,0 +1,12 @@ +package util; + +import java.util.Arrays; +import java.util.List; + +public class NameParser { + public static List parse(String input) { + return Arrays.stream(input.split(",")) + .map(String::trim) + .toList(); + } +} From ee164cfc3eb137383406454a95e8054d52fec853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:05:46 +0900 Subject: [PATCH 07/86] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EC=88=AB?= =?UTF-8?q?=EC=9E=90=201~10=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Enum=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CardNumber.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/domain/CardNumber.java diff --git a/src/main/java/domain/CardNumber.java b/src/main/java/domain/CardNumber.java new file mode 100644 index 00000000000..1c620271b99 --- /dev/null +++ b/src/main/java/domain/CardNumber.java @@ -0,0 +1,26 @@ +package domain; + +public enum CardNumber { + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + J(10), + Q(10), + K(10); + + private final int value; + CardNumber(int value) { + this.value = value; + } + public int getValue() { + return value; + } + +} From 4865776c8ee392a796222462538e9f612088e1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:06:49 +0900 Subject: [PATCH 08/86] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=AA=A8?= =?UTF-8?q?=EC=96=91=EC=9D=84=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20Car?= =?UTF-8?q?dShape=EC=9D=84=20Enum=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CardShape.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/domain/CardShape.java diff --git a/src/main/java/domain/CardShape.java b/src/main/java/domain/CardShape.java new file mode 100644 index 00000000000..2f905926036 --- /dev/null +++ b/src/main/java/domain/CardShape.java @@ -0,0 +1,17 @@ +package domain; + +public enum CardShape { + HEART("ํ•˜ํŠธ"), + SPADE("์ŠคํŽ˜์ด๋“œ"), + CLOVER("ํด๋กœ๋ฒ„"), + DIAMOND("๋‹ค์ด์•„๋ชฌ๋“œ"); + + private final String name; + + CardShape(String name) { + this.name=name; + } + public String getName(){ + return name; + } +} From a9f6fb343b9743633a8c90b6cf6303f98e056bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 5 Mar 2026 21:08:04 +0900 Subject: [PATCH 09/86] =?UTF-8?q?feat:=20CardNumber(=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=88=AB=EC=9E=90)=EC=99=80=20CardShape(=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=AA=A8=EC=96=91)=EC=9D=84=20=EB=B0=9B=EC=95=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20Card=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Card.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/domain/Card.java diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java new file mode 100644 index 00000000000..034557dea22 --- /dev/null +++ b/src/main/java/domain/Card.java @@ -0,0 +1,23 @@ +package domain; + +public class Card { + private CardNumber cardNumber; + private CardShape cardShape; + + private Card(CardNumber cardNumber, CardShape cardShape) { + this.cardNumber = cardNumber; + this.cardShape = cardShape; + }; + + public static Card of(CardNumber cardNumber, CardShape cardShape) { + return new Card(cardNumber, cardShape); + } + + public CardNumber getCardNumber() { + return cardNumber; + } + + public CardShape getCardShape() { + return cardShape; + } +} From 3af8be83aad9abee2b80008e62304c6ef5bc348e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 17:33:13 +0900 Subject: [PATCH 10/86] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=99=80=20=EB=94=9C=EB=9F=AC=EA=B0=80=20=EC=86=90?= =?UTF-8?q?=EC=97=90=20=EA=B0=80=EC=A7=80=EA=B3=A0=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=82=98=ED=83=80=EB=82=B4?= =?UTF-8?q?=EB=8A=94=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Hand.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/domain/Hand.java diff --git a/src/main/java/domain/Hand.java b/src/main/java/domain/Hand.java new file mode 100644 index 00000000000..51bd13bfc2d --- /dev/null +++ b/src/main/java/domain/Hand.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; + +public class Hand { + private final List cards; + + public Hand(List cards) { + this.cards = cards; + } + + public void addCard(Card card){ + cards.add(card); + } + + public Score getScore() { + return new Score(ScoreCalculator.calculate(List.copyOf(cards))); + } + + public List getCards() { + return List.copyOf(cards); + } +} From b8311b78d970262823f477dba25475603620a6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 17:34:20 +0900 Subject: [PATCH 11/86] =?UTF-8?q?feat:=20=EC=A0=90=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20Score=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84(=EC=9B=90=EC=8B=9C?= =?UTF-8?q?=EA=B0=92=20=ED=8F=AC=EC=9E=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Score.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/domain/Score.java diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java new file mode 100644 index 00000000000..05f0eaeb7bb --- /dev/null +++ b/src/main/java/domain/Score.java @@ -0,0 +1,17 @@ +package domain; + +public class Score { + private final int value; + + public Score(int value) { + this.value = value; + } + + public boolean isBust(){ + return value > 21; + } + + public int getValue() { + return value; + } +} From f1fa65a4e1b32559f8291361e7b42d3be16dbef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:12:08 +0900 Subject: [PATCH 12/86] =?UTF-8?q?feat:=20CardNumber=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20Symbol=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CardNumber.java | 37 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/domain/CardNumber.java b/src/main/java/domain/CardNumber.java index 1c620271b99..652434d3d1c 100644 --- a/src/main/java/domain/CardNumber.java +++ b/src/main/java/domain/CardNumber.java @@ -1,26 +1,33 @@ package domain; public enum CardNumber { - ACE(1), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - J(10), - Q(10), - K(10); + ACE("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + J("J", 10), + Q("Q", 10), + K("K", 10); + private String symbol; private final int value; - CardNumber(int value) { + + CardNumber(String symbol, int value) { + this.symbol = symbol; this.value = value; } + + public String getSymbol() { + return symbol; + } + public int getValue() { return value; } - } From 6b70e461eace62bf30ee94db443c96c72cdb4e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:15:53 +0900 Subject: [PATCH 13/86] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20OutputView=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000000..f0c870bd7b6 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,39 @@ +package view; + +import domain.Card; +import domain.Dealer; +import domain.Player; +import domain.Players; +import java.util.stream.Collectors; + +public class OutputView { + public static void printHandOutMessage(Players players){ + String playersName = players.getPlayers().stream() + .map(Player::getName) + .collect(Collectors.joining(",")); + + System.out.println("๋”œ๋Ÿฌ์™€ "+ playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); + } + + public static void printCardStatus(Players players, Dealer dealer) { + System.out.printf("๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(dealer)); + for(Player player : players.getPlayers()) { + System.out.printf("%s์นด๋“œ: %s%n", player.getName(), getPlayerCardStatus(player)); + } + } + + private static String getDealerCardStatus(Dealer dealer) { + Card firstCard = dealer.getHand().getFirst(); + return getCardStatus(firstCard); + } + + private static String getPlayerCardStatus(Player player) { + return player.getHand().stream() + .map(OutputView::getCardStatus) + .collect(Collectors.joining(", ")); + } + + private static String getCardStatus(Card card) { + return card.getCardNumber().getSymbol() + card.getCardShape().getName(); + } +} From c7411c4082d23b988ee8893aa3577b6ba73495b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:16:28 +0900 Subject: [PATCH 14/86] =?UTF-8?q?feat:=20Dealer=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/domain/Dealer.java diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java new file mode 100644 index 00000000000..34a1df6eb35 --- /dev/null +++ b/src/main/java/domain/Dealer.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; + +public class Dealer { + private final Hand hand; + + private Dealer(Hand hand) { + this.hand = hand; + } + + public static Dealer from(Hand hand) { + return new Dealer(hand); + } + + public List getHand() { + return hand.getCards(); + } + + public boolean checkThreshold() { + return hand.getScore().getValue() <= 16; + } +} From fc1a1511453778c703dfa5f9fa8a4adb87fbee11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:16:55 +0900 Subject: [PATCH 15/86] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20Player=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Player.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/domain/Player.java diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java new file mode 100644 index 00000000000..e5b2bcf8495 --- /dev/null +++ b/src/main/java/domain/Player.java @@ -0,0 +1,25 @@ +package domain; + +import java.util.List; + +public class Player { + private final String name; + private final Hand hand; + + private Player(String name, Hand hand) { + this.name = name; + this.hand = hand; + } + + public static Player of(String name, Hand hand) { + return new Player(name, hand); + } + + public String getName() { + return name; + } + + public List getHand() { + return hand.getCards(); + } +} From 9ca1e73b3e808aaef0a12a1fff71e86f80152e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:17:36 +0900 Subject: [PATCH 16/86] =?UTF-8?q?feat:=20Player=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EB=AA=A8=EC=95=84=EB=86=93=EC=9D=80=20Pla?= =?UTF-8?q?yers=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Players.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/domain/Players.java diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java new file mode 100644 index 00000000000..24504929c59 --- /dev/null +++ b/src/main/java/domain/Players.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.List; + +public class Players { + private final List players; + + private Players(List players) { + this.players = List.copyOf(players); + } + + public static Players from(List players) { + return new Players(players); + } + + public List getPlayers() { + return List.copyOf(players); + } +} From 9e59c628fa3bc03fcdcfb860701c907af96b534d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:18:13 +0900 Subject: [PATCH 17/86] =?UTF-8?q?feat:=20GameController=20=EB=BC=88?= =?UTF-8?q?=EB=8C=80=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 00000000000..54eb3cf9703 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,12 @@ +package controller; + +import view.InputView; + +import java.util.List; + +public class GameController { + List names = InputView.readParticipants(); + + + +} From 442c9446768cf4486e04f0b48934fb735006ca45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:18:34 +0900 Subject: [PATCH 18/86] =?UTF-8?q?test:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=EA=B3=84=EC=82=B0=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/ScoreCaculatorTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/domain/ScoreCaculatorTest.java diff --git a/src/test/java/domain/ScoreCaculatorTest.java b/src/test/java/domain/ScoreCaculatorTest.java new file mode 100644 index 00000000000..076d7814439 --- /dev/null +++ b/src/test/java/domain/ScoreCaculatorTest.java @@ -0,0 +1,16 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScoreCaculatorTest { + @DisplayName("์ ์ˆ˜ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ") + @Test + void ์ ์ˆ˜_๊ณ„์‚ฐ_ํ…Œ์ŠคํŠธ() { + List cards = List.of(Card.of(CardNumber.J, CardShape.CLOVER), Card.of(CardNumber.Q, CardShape.CLOVER)); + assertThat(ScoreCalculator.calculate(cards)).isEqualTo(20); + } +} From df03b798334c178a96e5e882ba3a8a6bbe2a1476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Fri, 6 Mar 2026 18:24:42 +0900 Subject: [PATCH 19/86] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20Sco?= =?UTF-8?q?reCalculator=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ScoreCalculator.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/domain/ScoreCalculator.java diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/ScoreCalculator.java new file mode 100644 index 00000000000..8e618548318 --- /dev/null +++ b/src/main/java/domain/ScoreCalculator.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; + +public class ScoreCalculator { + public static int calculate(List cards) { + int sum = 0; + int aceCount = 0; + for (Card card : cards) { + sum += card.getCardNumber().getValue(); + if (card.getCardNumber() == CardNumber.ACE) { + aceCount++; + } + } + + for (int i = 0; i < aceCount; i++) { + if (sum + 10 < 21) { + sum += 10; + } + } + return sum; + } +} From fe606357553422e3e27744312c7924fd9ebea1dd Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:05:31 +0900 Subject: [PATCH 20/86] =?UTF-8?q?feat:=20View=EC=97=90=20=EA=B0=92=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=EC=9D=84=20=EC=9C=84=ED=95=9C=20DealerResult?= =?UTF-8?q?Dto,=20PlayerDto,=20PlayersDto,=20PlayerResultDto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/DealerResultDto.java | 18 ++++++++++++++++++ src/main/java/dto/PlayerDto.java | 12 ++++++++++++ src/main/java/dto/PlayerResultDto.java | 17 +++++++++++++++++ src/main/java/dto/PlayersDto.java | 14 ++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 src/main/java/dto/DealerResultDto.java create mode 100644 src/main/java/dto/PlayerDto.java create mode 100644 src/main/java/dto/PlayerResultDto.java create mode 100644 src/main/java/dto/PlayersDto.java diff --git a/src/main/java/dto/DealerResultDto.java b/src/main/java/dto/DealerResultDto.java new file mode 100644 index 00000000000..af3e0a82dd1 --- /dev/null +++ b/src/main/java/dto/DealerResultDto.java @@ -0,0 +1,18 @@ +package dto; + +import domain.Dealer; +import java.util.List; + +public record DealerResultDto( + List cards, + int score +) { + public static DealerResultDto from(Dealer dealer) { + // TODO ๋ถ„๋ฆฌ? -> ํ˜„์žฌ PlayerResultDto์™€ ์ค‘๋ณต๋จ. + List cardInfo = dealer.getHandCards().stream() + .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .toList(); + + return new DealerResultDto(cardInfo, dealer.getHand().getScore().getValue()); + } +} diff --git a/src/main/java/dto/PlayerDto.java b/src/main/java/dto/PlayerDto.java new file mode 100644 index 00000000000..397476ffb53 --- /dev/null +++ b/src/main/java/dto/PlayerDto.java @@ -0,0 +1,12 @@ +package dto; + +import domain.Player; + +public record PlayerDto( + String name, + PlayerResultDto playerResultDto +) { + public static PlayerDto from(Player player) { + return new PlayerDto(player.getName(), PlayerResultDto.from(player)); + } +} diff --git a/src/main/java/dto/PlayerResultDto.java b/src/main/java/dto/PlayerResultDto.java new file mode 100644 index 00000000000..e9909e2dbb0 --- /dev/null +++ b/src/main/java/dto/PlayerResultDto.java @@ -0,0 +1,17 @@ +package dto; + +import domain.Player; +import java.util.List; + +public record PlayerResultDto( + List cards, + int score +) { + public static PlayerResultDto from(Player player) { + List cardInfo = player.getHandCards().stream() + .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .toList(); + + return new PlayerResultDto(cardInfo, player.getHand().getScore().getValue()); + } +} diff --git a/src/main/java/dto/PlayersDto.java b/src/main/java/dto/PlayersDto.java new file mode 100644 index 00000000000..3e8156f4b2b --- /dev/null +++ b/src/main/java/dto/PlayersDto.java @@ -0,0 +1,14 @@ +package dto; + +import domain.Players; +import java.util.List; + +public record PlayersDto( + List playersDto +) { + public static PlayersDto from(Players players) { + return new PlayersDto(players.getPlayers().stream() + .map(PlayerDto::from) + .toList()); + } +} From c26fded81a212e838ebc31f76ed4baa137eb24a7 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:09:12 +0900 Subject: [PATCH 21/86] =?UTF-8?q?feat:=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20Dto=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=98=84=ED=99=A9=20=EC=B6=9C=EB=A0=A5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B0=8F=20=EC=A0=90=EC=88=98=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 73 +++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index f0c870bd7b6..8e54893191a 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,39 +1,70 @@ package view; -import domain.Card; -import domain.Dealer; -import domain.Player; -import domain.Players; +import dto.DealerResultDto; +import dto.PlayerDto; +import dto.PlayersDto; +import java.util.List; import java.util.stream.Collectors; public class OutputView { - public static void printHandOutMessage(Players players){ - String playersName = players.getPlayers().stream() - .map(Player::getName) + public static void printHandOutMessage(PlayersDto playersDto) { + String playersName = playersDto.playersDto().stream() + .map(PlayerDto::name) .collect(Collectors.joining(",")); - System.out.println("๋”œ๋Ÿฌ์™€ "+ playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); + System.out.print("\n๋”œ๋Ÿฌ์™€ " + playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); } - public static void printCardStatus(Players players, Dealer dealer) { - System.out.printf("๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(dealer)); - for(Player player : players.getPlayers()) { - System.out.printf("%s์นด๋“œ: %s%n", player.getName(), getPlayerCardStatus(player)); + // ๋”œ๋Ÿฌ์นด๋“œ ์ถœ๋ ฅ + public static void printDealerCardStatus(DealerResultDto dealerResultDto) { + System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(dealerResultDto)); + } + + //ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถœ๋ ฅ + public static void printPlayerCardStatus(PlayerDto playerDto) { + System.out.printf("%s์นด๋“œ: %s%n", playerDto.name(), getCardStatusFormat(playerDto.playerResultDto().cards())); + } + + public static void printCardStatus(PlayersDto playersDto, DealerResultDto dealerResultDto) { + printDealerCardStatus(dealerResultDto); + for (PlayerDto playerDto : playersDto.playersDto()) { + printPlayerCardStatus(playerDto); } + System.out.print(System.lineSeparator()); } - private static String getDealerCardStatus(Dealer dealer) { - Card firstCard = dealer.getHand().getFirst(); - return getCardStatus(firstCard); + private static String getDealerCardStatus(DealerResultDto dealerResultDto) { + return dealerResultDto.cards().getFirst(); } - private static String getPlayerCardStatus(Player player) { - return player.getHand().stream() - .map(OutputView::getCardStatus) - .collect(Collectors.joining(", ")); + private static String getCardStatusFormat(List cards) { + return String.join(", ", cards); + } + + public static void printAddDealerCardMessage() { + System.out.println("\n๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."); + } + + public static void printCardResult(DealerResultDto dealerResultDto, PlayersDto playersDto) { + printDealerCardResult(dealerResultDto); + printPlayersCardResult(playersDto); + } + + private static void printDealerCardResult(DealerResultDto dealerResultDto) { + System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", getCardStatusFormat(dealerResultDto.cards()), + dealerResultDto.score()); + } + + private static void printPlayersCardResult(PlayersDto playersDto) { + for (PlayerDto playerDto : playersDto.playersDto()) { + printPlayerCardResult(playerDto); + } } - private static String getCardStatus(Card card) { - return card.getCardNumber().getSymbol() + card.getCardShape().getName(); + // TODO ๋ฒ„์ŠคํŠธ ๋‚˜๋ฉด ๋ฒ„์ŠคํŠธ๋กœ ํ‘œ์‹œ? + private static void printPlayerCardResult(PlayerDto playerDto) { + System.out.printf("%n%s์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", playerDto.name(), + getCardStatusFormat(playerDto.playerResultDto().cards()), + playerDto.playerResultDto().score()); } } From 896b284e035d492f55c8eea56d17cac57d109ea9 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:09:35 +0900 Subject: [PATCH 22/86] =?UTF-8?q?refactor:=20Scanner=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 313211dad72..fe63d095268 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,23 +1,19 @@ package view; -import java.util.Arrays; import java.util.List; import java.util.Scanner; +import util.NameParser; public class InputView { + private static final Scanner scanner = new Scanner(System.in); + public static List readParticipants() { System.out.println("๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)"); - Scanner scanner = new Scanner(System.in); - String input = scanner.nextLine(); - return Arrays.stream(input.split(",")) - .map(String::trim) - .toList(); + return NameParser.parse(scanner.nextLine()); } public static boolean checkAddCard(String name) { System.out.printf("%s๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)%n", name); - Scanner scanner = new Scanner(System.in); - String input = scanner.nextLine(); - return input.equalsIgnoreCase("y"); + return scanner.nextLine().equalsIgnoreCase("y"); } } From 75c7e6f2f47ba9cca0606335ae463ffdd944a582 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:25:22 +0900 Subject: [PATCH 23/86] =?UTF-8?q?test:=20Dealer=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๋”œ๋Ÿฌ ์นด๋“œ 16์ดํ•˜ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ - ์นด๋“œ ์ถ”๊ฐ€ ํ™•์ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ --- src/test/java/domain/DealerTest.java | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/test/java/domain/DealerTest.java diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java new file mode 100644 index 00000000000..0a3bd830454 --- /dev/null +++ b/src/test/java/domain/DealerTest.java @@ -0,0 +1,34 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + Dealer underThreshold = Dealer.from(new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.EIGHT, CardShape.CLOVER), + Card.of(CardNumber.SEVEN, CardShape.CLOVER))))); + + Dealer overThreshold = Dealer.from(new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.EIGHT, CardShape.CLOVER), + Card.of(CardNumber.J, CardShape.CLOVER))))); + + @Test + @DisplayName("๋”œ๋Ÿฌ ์นด๋“œ 16์ดํ•˜ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") + void ๋”œ๋Ÿฌ_16์ดํ•˜_์—ฌ๋ถ€_ํ™•์ธ() { + assertThat(underThreshold.checkThreshold()).isTrue(); + assertThat(overThreshold.checkThreshold()).isFalse(); + } + + @Test + @DisplayName("์นด๋“œ ์ถ”๊ฐ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") + void ์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { + underThreshold.addHandCard(Card.of(CardNumber.FIVE, CardShape.DIAMOND)); + overThreshold.addHandCard(Card.of(CardNumber.FOUR, CardShape.DIAMOND)); + assertThat(underThreshold.getHandCards().size()).isEqualTo(3); + assertThat(overThreshold.getHandCards().size()).isEqualTo(3); + } +} \ No newline at end of file From 26c5b868ee010fe2b5769dfb03d3c372c514cbf3 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:25:52 +0900 Subject: [PATCH 24/86] =?UTF-8?q?feat:=20Dealer=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 34a1df6eb35..1b233d8923a 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -13,11 +13,19 @@ public static Dealer from(Hand hand) { return new Dealer(hand); } - public List getHand() { + public List getHandCards() { return hand.getCards(); } + public Hand getHand() { + return hand; + } + public boolean checkThreshold() { return hand.getScore().getValue() <= 16; } + + public void addHandCard(Card card) { + hand.addCard(card); + } } From 71ab035e39445083f4b69ee24eff7af6493311ca Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:32:56 +0900 Subject: [PATCH 25/86] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ถ”๊ฐ€ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ - ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ --- src/test/java/domain/PlayerTest.java | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/test/java/domain/PlayerTest.java diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java new file mode 100644 index 00000000000..3e8ed36e230 --- /dev/null +++ b/src/test/java/domain/PlayerTest.java @@ -0,0 +1,35 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + Player bustPlayer = Player.of(Name.from("pobi"), new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.J, CardShape.CLOVER), + Card.of(CardNumber.K, CardShape.HEART), + Card.of(CardNumber.Q, CardShape.DIAMOND))))); + + Player normalPlayer = Player.of(Name.from("jason"), new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.J, CardShape.CLOVER), + Card.of(CardNumber.Q, CardShape.DIAMOND))))); + + @Test + @DisplayName("ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ถ”๊ฐ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") + void ์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { + bustPlayer.addHandCard(Card.of(CardNumber.FIVE, CardShape.DIAMOND)); + normalPlayer.addHandCard(Card.of(CardNumber.FOUR, CardShape.DIAMOND)); + assertThat(bustPlayer.getHandCards().size()).isEqualTo(4); + assertThat(normalPlayer.getHandCards().size()).isEqualTo(3); + } + + @Test + @DisplayName("ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") + void ๋ฒ„์ŠคํŠธ_์—ฌ๋ถ€_ํ™•์ธ() { + assertThat(bustPlayer.isBust()).isTrue(); + assertThat(normalPlayer.isBust()).isFalse(); + } +} \ No newline at end of file From 1cdc20b9029d0115b5828fc1ca9fcc15b1d30102 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:34:08 +0900 Subject: [PATCH 26/86] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=9D=98=20=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Player.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index e5b2bcf8495..5fbf8098d7a 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -3,23 +3,35 @@ import java.util.List; public class Player { - private final String name; + private final Name name; private final Hand hand; - private Player(String name, Hand hand) { + private Player(Name name, Hand hand) { this.name = name; this.hand = hand; } - public static Player of(String name, Hand hand) { + public static Player of(Name name, Hand hand) { return new Player(name, hand); } public String getName() { - return name; + return name.getName(); } - public List getHand() { + public List getHandCards() { return hand.getCards(); } + + public Hand getHand() { + return hand; + } + + public void addHandCard(Card card) { + hand.addCard(card); + } + + public boolean isBust() { + return hand.getScore().isBust(); + } } From 9ab3080be8538da10a32db0e302db47609ea4935 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:38:42 +0900 Subject: [PATCH 27/86] =?UTF-8?q?test:=20Players=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๋“ค์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ --- src/test/java/domain/PlayersTest.java | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/test/java/domain/PlayersTest.java diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java new file mode 100644 index 00000000000..13f5b52ed0e --- /dev/null +++ b/src/test/java/domain/PlayersTest.java @@ -0,0 +1,32 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayersTest { + Player bustPlayer = Player.of(Name.from("pobi"), new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.J, CardShape.CLOVER), + Card.of(CardNumber.K, CardShape.HEART), + Card.of(CardNumber.Q, CardShape.DIAMOND))))); + + Player normalPlayer = Player.of(Name.from("jason"), new Hand(new ArrayList<>(List.of( + Card.of(CardNumber.J, CardShape.CLOVER), + Card.of(CardNumber.Q, CardShape.DIAMOND))))); + + Players allBustPlayers = Players.from(List.of(bustPlayer, bustPlayer, bustPlayer)); + Players containBustPlayers = Players.from(List.of(bustPlayer, normalPlayer, normalPlayer)); + Players allNormalPlayers = Players.from(List.of(normalPlayer, normalPlayer, normalPlayer)); + + @Test + @DisplayName("๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๋“ค์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") + void ๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด_๋ฒ„์ŠคํŠธ_์—ฌ๋ถ€_ํ™•์ธ() { + assertThat(allBustPlayers.isAllBust()).isTrue(); + assertThat(containBustPlayers.isAllBust()).isFalse(); + assertThat(allNormalPlayers.isAllBust()).isFalse(); + } +} \ No newline at end of file From f7b44e25518ebe7f0cb76710dbd87143ce8dca79 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:39:06 +0900 Subject: [PATCH 28/86] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EB=93=A4=EC=9D=98=20=EB=B2=84?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Players.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java index 24504929c59..3efb19c5cdf 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/Players.java @@ -16,4 +16,8 @@ public static Players from(List players) { public List getPlayers() { return List.copyOf(players); } + + public boolean isAllBust() { + return players.stream().allMatch(Player::isBust); + } } From e95ef28c9e15f9c19d95df6f5248a4043224bb9c Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:48:30 +0900 Subject: [PATCH 29/86] =?UTF-8?q?test:=20Name=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„ ๊ธธ์ด๊ฐ€ 20์ž๋ฅผ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ - Null ํ˜น์€ ๋นˆ ๊ฐ’ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ --- src/test/java/domain/NameTest.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/test/java/domain/NameTest.java diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java new file mode 100644 index 00000000000..8338b916dc0 --- /dev/null +++ b/src/test/java/domain/NameTest.java @@ -0,0 +1,26 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class NameTest { + @Test + @DisplayName("ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์˜ ๊ธธ์ด 20์ž ์ดˆ๊ณผ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") + void ๊ธธ์ด_์ดˆ๊ณผ_์˜ˆ์™ธ๋ฐœ์ƒํ…Œ์ŠคํŠธ() { + String exceptionName = "ddddddddddddddddddddd"; + assertThatThrownBy(() -> Name.from(exceptionName)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("Null ํ˜น์€ ๋นˆ ๊ฐ’ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") + void Null๊ฐ’_ํ˜น์€_๋นˆ๊ฐ’_์˜ˆ์™ธ๋ฐœ์ƒํ…Œ์ŠคํŠธ() { + String blankName = " "; + String emptyName = ""; + assertThatThrownBy(() -> Name.from(null)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> Name.from(blankName)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> Name.from(emptyName)).isInstanceOf(IllegalArgumentException.class); + } + +} \ No newline at end of file From a83d96c18bd7a805220fecf8671ba1eba6bedefd Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 15:48:57 +0900 Subject: [PATCH 30/86] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20Name=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Name.java | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/domain/Name.java diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java new file mode 100644 index 00000000000..9822d9c6493 --- /dev/null +++ b/src/main/java/domain/Name.java @@ -0,0 +1,35 @@ +package domain; + +public class Name { + private final String name; + + private Name(String name) { + this.name = name; + } + + public static Name from(String name) { + return new Name(validateName(name)); + } + + private static String validateName(String name) { + validateNullOrEmpty(name); + validateLength(name); + return name.trim(); + } + + private static void validateLength(String name) { + if (name.trim().length() > 20) { + throw new IllegalArgumentException("์ด๋ฆ„์€ 20์ž ์ดํ•˜๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + } + } + + private static void validateNullOrEmpty(String name) { + if ( name == null|| name.isBlank()) { + throw new IllegalArgumentException("์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ•ด์ฃผ์„ธ์š”."); + } + } + + public String getName() { + return name; + } +} From a46f68e2c86fbead164d7d73904fd73a9132fecb Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 16:08:40 +0900 Subject: [PATCH 31/86] =?UTF-8?q?feat:=20GameController=20=EB=B0=8F=20Appl?= =?UTF-8?q?ication=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 5 +- src/main/java/controller/GameController.java | 102 ++++++++++++++++++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index eb052cce416..ceb401a4f9f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,7 +1,8 @@ -import java.util.Random; +import controller.GameController; public class Application { public static void main(String[] args) { - + GameController gameController = new GameController(); + gameController.start(); } } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 54eb3cf9703..92c9ee7cb36 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,12 +1,112 @@ package controller; +import domain.Card; +import domain.Dealer; +import domain.Deck; +import domain.Hand; +import domain.Name; +import domain.Player; +import domain.Players; +import dto.DealerResultDto; +import dto.PlayerDto; +import dto.PlayersDto; +import java.util.ArrayList; import view.InputView; import java.util.List; +import view.OutputView; public class GameController { - List names = InputView.readParticipants(); + private static final int INITIAL_CARD_COUNT = 2; + private final Deck deck; + public GameController() { + this.deck = Deck.createDeck(); + } + public void start() { + // ์นด๋“œ ์ดˆ๊ธฐํ™” + Dealer dealer = initDealer(); + Players players = initPlayers(); + + // ์นด๋“œ ์ถœ๋ ฅ + PlayersDto playersDto = PlayersDto.from(players); + OutputView.printHandOutMessage(playersDto); + OutputView.printCardStatus(playersDto, DealerResultDto.from(dealer)); + + // ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น + addPlayersCard(players); + + // ๋”œ๋Ÿฌ ๊ฒŒ์ž„ ์ง„ํ–‰ + addDealerCards(dealer, players); + + // ์นด๋“œ ๊ฒฐ๊ณผ, ์ ์ˆ˜ ์ถœ๋ ฅ + printCardResults(DealerResultDto.from(dealer), PlayersDto.from(players)); + + // ์ตœ์ข… ์ŠนํŒจ ์ถœ๋ ฅ + } + + // ํ”Œ๋ ˆ์ด์–ด๋“ค ์ดˆ๊ธฐํ™” + private Players initPlayers() { + List names = InputView.readParticipants(); + List players = new ArrayList<>(); + for (String name : names) { + players.add(initPlayer(name)); + } + + return Players.from(players); + } + + // ํ”Œ๋ ˆ์ด์–ด ์ดˆ๊ธฐ ์นด๋“œ + private Player initPlayer(String name) { + return Player.of(Name.from(name), new Hand(initCards())); + } + + private List initCards() { + List cards = new ArrayList<>(); + for (int count = 0; count < INITIAL_CARD_COUNT; count++) { + cards.add(deck.draw()); + } + return cards; + } + + + private Dealer initDealer() { + return Dealer.from(new Hand(initCards())); + } + + // ํ”Œ๋ ˆ์ด์–ด ์ „์ฒด ์นด๋“œ ์ถ”๊ฐ€ TODO ์นด๋“œ ๋ฒ„์ŠคํŠธ ์ „๊นŒ์ง€ ๊ณ„์† ๋ฐ›์„์ง€ ํ™•์ธ + private void addPlayersCard(Players players) { + for (Player player : players.getPlayers()) { + addPlayerCard(player); + } + } + + // ๊ฐ ํ”Œ๋ ˆ์ด์–ด๋ณ„ ์นด๋“œ์ถ”๊ฐ€ + private void addPlayerCard(Player player) { + if (InputView.checkAddCard(player.getName())) { + player.addHandCard(deck.draw()); + OutputView.printPlayerCardStatus(PlayerDto.from(player)); + } + } + + // ๋”œ๋Ÿฌ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ (๋ฐ˜๋ณต) + private void addDealerCards(Dealer dealer, Players players) { + if (dealer.checkThreshold() && !players.isAllBust()) { + OutputView.printAddDealerCardMessage(); + addDealerCard(dealer); + } + } + + // ๋”œ๋Ÿฌ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ + private void addDealerCard(Dealer dealer) { + while (dealer.checkThreshold()) { + dealer.addHandCard(deck.draw()); + } + } + + private void printCardResults(DealerResultDto dealerResultDto, PlayersDto playersDto) { + OutputView.printCardResult(dealerResultDto, playersDto); + } } From d694cd610b6f03e973ca02cd33cd2ad034b3c91d Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 16:32:06 +0900 Subject: [PATCH 32/86] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EC=88=98?= =?UTF-8?q?=EB=A0=B9=20=EC=97=AC=EB=B6=80=20=EB=B0=98=EB=B3=B5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 92c9ee7cb36..c9871b65af6 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -76,9 +76,15 @@ private Dealer initDealer() { return Dealer.from(new Hand(initCards())); } - // ํ”Œ๋ ˆ์ด์–ด ์ „์ฒด ์นด๋“œ ์ถ”๊ฐ€ TODO ์นด๋“œ ๋ฒ„์ŠคํŠธ ์ „๊นŒ์ง€ ๊ณ„์† ๋ฐ›์„์ง€ ํ™•์ธ + // ํ”Œ๋ ˆ์ด์–ด ์ „์ฒด ์นด๋“œ ์ถ”๊ฐ€ private void addPlayersCard(Players players) { for (Player player : players.getPlayers()) { + checkBustPlayer(player); + } + } + + private void checkBustPlayer(Player player) { + while (!player.isBust()) { addPlayerCard(player); } } From 3272e7632fc4ff9f03ba89899a36b43fcf5ce5d1 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:56:13 +0900 Subject: [PATCH 33/86] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?Dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/CardShape.java | 1 + src/main/java/dto/DealerFinalResultDto.java | 36 +++++++++++++++++++++ src/main/java/dto/PlayerDto.java | 2 +- src/main/java/dto/TotalFinalResultsDto.java | 22 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dto/DealerFinalResultDto.java create mode 100644 src/main/java/dto/TotalFinalResultsDto.java diff --git a/src/main/java/domain/CardShape.java b/src/main/java/domain/CardShape.java index 2f905926036..9a3bcc3a1b8 100644 --- a/src/main/java/domain/CardShape.java +++ b/src/main/java/domain/CardShape.java @@ -11,6 +11,7 @@ public enum CardShape { CardShape(String name) { this.name=name; } + public String getName(){ return name; } diff --git a/src/main/java/dto/DealerFinalResultDto.java b/src/main/java/dto/DealerFinalResultDto.java new file mode 100644 index 00000000000..047a34c3c5f --- /dev/null +++ b/src/main/java/dto/DealerFinalResultDto.java @@ -0,0 +1,36 @@ +package dto; + +import domain.FinalResult; +import domain.ResultType; +import domain.TotalFinalResult; + +public record DealerFinalResultDto( + String result +) { + public static DealerFinalResultDto from(TotalFinalResult totalFinalResult) { + int winCount = 0; + int drawCount = 0; + int loseCount = 0; + + for (FinalResult finalResult : totalFinalResult.getTotalResult()) { + if (finalResult.getResultType().equals(ResultType.WIN)) { + loseCount++; + continue; + } + if (finalResult.getResultType().equals(ResultType.DRAW)) { + drawCount++; + continue; + } + winCount++; + } + + return new DealerFinalResultDto(checkDrawCount(winCount, drawCount, loseCount)); + } + + private static String checkDrawCount(int winCount, int drawCount, int loseCount) { + if (drawCount > 0) { + return String.format("๋”œ๋Ÿฌ: %d์Šน %d๋ฌด %dํŒจ%n", winCount, drawCount, loseCount); + } + return String.format("๋”œ๋Ÿฌ: %d์Šน %dํŒจ%n", winCount, loseCount); + } +} diff --git a/src/main/java/dto/PlayerDto.java b/src/main/java/dto/PlayerDto.java index 397476ffb53..d0b19057f89 100644 --- a/src/main/java/dto/PlayerDto.java +++ b/src/main/java/dto/PlayerDto.java @@ -7,6 +7,6 @@ public record PlayerDto( PlayerResultDto playerResultDto ) { public static PlayerDto from(Player player) { - return new PlayerDto(player.getName(), PlayerResultDto.from(player)); + return new PlayerDto(player.getName().getName(), PlayerResultDto.from(player)); } } diff --git a/src/main/java/dto/TotalFinalResultsDto.java b/src/main/java/dto/TotalFinalResultsDto.java new file mode 100644 index 00000000000..4f127e958be --- /dev/null +++ b/src/main/java/dto/TotalFinalResultsDto.java @@ -0,0 +1,22 @@ +package dto; + +import domain.FinalResult; +import domain.TotalFinalResult; +import java.util.ArrayList; +import java.util.List; + +public record TotalFinalResultsDto( + List totalResults +) { + public static TotalFinalResultsDto from(TotalFinalResult totalFinalResult) { + List finalResults = totalFinalResult.getTotalResult(); + List totalResults = new ArrayList<>(); + for (FinalResult finalResult : finalResults) { + totalResults.add(String.format("%s: %s%n", + finalResult.getName().getName(), + finalResult.getResultType().getType())); + } + + return new TotalFinalResultsDto(totalResults); + } +} From 52506d29c0fdbd0e07f433e6328b62deebdc038c Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:56:41 +0900 Subject: [PATCH 34/86] =?UTF-8?q?fix:=20=EC=A0=90=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๊ธฐ์กด 21 ๋ฏธ๋งŒ์ผ ๊ฒฝ์šฐ์—๋งŒ ๋”ํ–ˆ๋˜ ๋กœ์ง์€ 21 ์ดํ•˜๋กœ ๋ณ€๊ฒฝ --- src/main/java/domain/ScoreCalculator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/ScoreCalculator.java index 8e618548318..af25ba99a9f 100644 --- a/src/main/java/domain/ScoreCalculator.java +++ b/src/main/java/domain/ScoreCalculator.java @@ -3,18 +3,19 @@ import java.util.List; public class ScoreCalculator { + // TODO ๊ณ„์‚ฐ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง ํ•„์š” public static int calculate(List cards) { int sum = 0; int aceCount = 0; for (Card card : cards) { sum += card.getCardNumber().getValue(); - if (card.getCardNumber() == CardNumber.ACE) { + if (card.getCardNumber().equals(CardNumber.ACE)) { aceCount++; } } for (int i = 0; i < aceCount; i++) { - if (sum + 10 < 21) { + if (sum + 10 <= 21) { sum += 10; } } From 0786e8f88f4c98dc39654913a86da05256d8b9ac Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:57:03 +0900 Subject: [PATCH 35/86] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EC=B5=9C?= =?UTF-8?q?=EC=A2=85=20=EA=B2=B0=EA=B3=BC=20=EA=B4=80=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20TotalFinalResult=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/TotalFinalResult.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/domain/TotalFinalResult.java diff --git a/src/main/java/domain/TotalFinalResult.java b/src/main/java/domain/TotalFinalResult.java new file mode 100644 index 00000000000..2862e0caa43 --- /dev/null +++ b/src/main/java/domain/TotalFinalResult.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.List; + +public class TotalFinalResult { + private final List totalResult; + + private TotalFinalResult(List totalResult) { + this.totalResult = totalResult; + } + + public static TotalFinalResult from(List totalResult) { + return new TotalFinalResult(totalResult); + } + + public List getTotalResult() { + return totalResult; + } +} From c1cb6943cef99fbfae11822a764fcc4d523960bc Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:57:35 +0900 Subject: [PATCH 36/86] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=B3=84=20=EC=B5=9C=EC=A2=85=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20FinalResult?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/FinalResult.java | 23 +++++++++++++++++++++++ src/main/java/domain/Player.java | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/java/domain/FinalResult.java diff --git a/src/main/java/domain/FinalResult.java b/src/main/java/domain/FinalResult.java new file mode 100644 index 00000000000..3b7c1fc8b3b --- /dev/null +++ b/src/main/java/domain/FinalResult.java @@ -0,0 +1,23 @@ +package domain; + +public class FinalResult { + private final Name name; + private final ResultType resultType; + + private FinalResult(Name name, ResultType resultType) { + this.name = name; + this.resultType = resultType; + } + + public static FinalResult from(Name name, ResultType resultType) { + return new FinalResult(name, resultType); + } + + public Name getName() { + return name; + } + + public ResultType getResultType() { + return resultType; + } +} \ No newline at end of file diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 5fbf8098d7a..7a4fbc96fa3 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -15,8 +15,8 @@ public static Player of(Name name, Hand hand) { return new Player(name, hand); } - public String getName() { - return name.getName(); + public Name getName() { + return name; } public List getHandCards() { From c399b48bab55f2d20d42844f5dd42f87647a54ee Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:57:56 +0900 Subject: [PATCH 37/86] =?UTF-8?q?feat:=20=EC=8A=B9,=20=EB=AC=B4,=20?= =?UTF-8?q?=ED=8C=A8=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Enu?= =?UTF-8?q?m=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ResultType.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/domain/ResultType.java diff --git a/src/main/java/domain/ResultType.java b/src/main/java/domain/ResultType.java new file mode 100644 index 00000000000..fbc2e701327 --- /dev/null +++ b/src/main/java/domain/ResultType.java @@ -0,0 +1,17 @@ +package domain; + +public enum ResultType { + WIN("์Šน"), + DRAW("๋ฌด"), + LOSE("ํŒจ"); + + private final String type; + + ResultType(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} From b75dd976a7f43db6440ff664362f20fb515eccbe Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:58:21 +0900 Subject: [PATCH 38/86] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 8e54893191a..24ee3feaf5c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,8 +1,10 @@ package view; +import dto.DealerFinalResultDto; import dto.DealerResultDto; import dto.PlayerDto; import dto.PlayersDto; +import dto.TotalFinalResultsDto; import java.util.List; import java.util.stream.Collectors; @@ -67,4 +69,13 @@ private static void printPlayerCardResult(PlayerDto playerDto) { getCardStatusFormat(playerDto.playerResultDto().cards()), playerDto.playerResultDto().score()); } + + public static void printTotalResult(DealerFinalResultDto dealerFinalResultDto, + TotalFinalResultsDto totalFinalResultsDto) { + System.out.println("\n\n## ์ตœ์ข… ์ŠนํŒจ"); + System.out.print(dealerFinalResultDto.result()); + for (String finalResult : totalFinalResultsDto.totalResults()) { + System.out.print(finalResult); + } + } } From 091289a093df821fe8b18a7585b70b3ecaddb209 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:58:34 +0900 Subject: [PATCH 39/86] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 24 ++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index c9871b65af6..013d95a54d2 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -3,17 +3,20 @@ import domain.Card; import domain.Dealer; import domain.Deck; +import domain.GameResultCalculator; import domain.Hand; import domain.Name; import domain.Player; import domain.Players; +import domain.TotalFinalResult; +import dto.DealerFinalResultDto; import dto.DealerResultDto; import dto.PlayerDto; import dto.PlayersDto; +import dto.TotalFinalResultsDto; import java.util.ArrayList; -import view.InputView; - import java.util.List; +import view.InputView; import view.OutputView; public class GameController { @@ -45,6 +48,7 @@ public void start() { printCardResults(DealerResultDto.from(dealer), PlayersDto.from(players)); // ์ตœ์ข… ์ŠนํŒจ ์ถœ๋ ฅ + printFinalResults(players, dealer); } // ํ”Œ๋ ˆ์ด์–ด๋“ค ์ดˆ๊ธฐํ™” @@ -84,17 +88,15 @@ private void addPlayersCard(Players players) { } private void checkBustPlayer(Player player) { - while (!player.isBust()) { + while (!player.isBust() && InputView.checkAddCard(player.getName().getName())) { addPlayerCard(player); } } // ๊ฐ ํ”Œ๋ ˆ์ด์–ด๋ณ„ ์นด๋“œ์ถ”๊ฐ€ private void addPlayerCard(Player player) { - if (InputView.checkAddCard(player.getName())) { - player.addHandCard(deck.draw()); - OutputView.printPlayerCardStatus(PlayerDto.from(player)); - } + player.addHandCard(deck.draw()); + OutputView.printPlayerCardStatus(PlayerDto.from(player)); } // ๋”œ๋Ÿฌ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ (๋ฐ˜๋ณต) @@ -115,4 +117,12 @@ private void addDealerCard(Dealer dealer) { private void printCardResults(DealerResultDto dealerResultDto, PlayersDto playersDto) { OutputView.printCardResult(dealerResultDto, playersDto); } + + private void printFinalResults(Players players, Dealer dealer) { + TotalFinalResult totalFinalResult = GameResultCalculator.checkGameResult(players, dealer); + DealerFinalResultDto dealerFinalResultDto = DealerFinalResultDto.from(totalFinalResult); + TotalFinalResultsDto totalFinalResultsDto = TotalFinalResultsDto.from(totalFinalResult); + + OutputView.printTotalResult(dealerFinalResultDto, totalFinalResultsDto); + } } From 48e7f1b375516a31a32eec2d16a8a47108a91e6b Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sat, 7 Mar 2026 17:59:57 +0900 Subject: [PATCH 40/86] =?UTF-8?q?feat:=20=EC=8A=B9=ED=8C=A8=20=ED=8C=90?= =?UTF-8?q?=EC=A0=95=EC=9D=84=20=EC=9C=84=ED=95=9C=20GameResultCalculator?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/GameResultCalculator.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/domain/GameResultCalculator.java diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java new file mode 100644 index 00000000000..8d2742fdb45 --- /dev/null +++ b/src/main/java/domain/GameResultCalculator.java @@ -0,0 +1,25 @@ +package domain; + +public class GameResultCalculator { + public static TotalFinalResult checkGameResult(Players players, Dealer dealer){ + return TotalFinalResult.from(players.getPlayers().stream() + .map(player -> checkFinalResult(player, dealer)) + .toList()); + } + + private static FinalResult checkFinalResult(Player player, Dealer dealer) { + return FinalResult.from(player.getName(), + getResultType(player.getHand().getScore(), + dealer.getHand().getScore())); + } + + private static ResultType getResultType(Score playerScore, Score dealerScore) { + if (playerScore.isBust() || (playerScore.getValue() < dealerScore.getValue() && !dealerScore.isBust())) { + return ResultType.LOSE; + } + if (dealerScore.isBust() || playerScore.getValue() > dealerScore.getValue()) { + return ResultType.WIN; + } + return ResultType.DRAW; + } +} From 9bb0cfd49f80d05f4304f9d6b28ce394bfbe2ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:04:09 +0900 Subject: [PATCH 41/86] =?UTF-8?q?feat:=20Dealer=EC=99=80=20Player=EC=9D=98?= =?UTF-8?q?=20=EA=B3=B5=ED=86=B5=EB=90=9C=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=9C=EA=B1=B0=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20Participant=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Participant.java | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/domain/Participant.java diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java new file mode 100644 index 00000000000..0d2b73e9c4a --- /dev/null +++ b/src/main/java/domain/Participant.java @@ -0,0 +1,28 @@ +package domain; + +import java.util.List; + +public abstract class Participant { + private final Hand hand; + + protected Participant(Hand hand){ + this.hand=hand; + } + + public List getHandCards(){ + return hand.getCards(); + } + + public Hand getHand(){ + return hand; + } + + public void addHandCard(Card card){ + hand.addCard(card); + } + + public boolean isBust(){ + return hand.getScore().isBust(); + } + +} From ea79a35029854751f78829d71806eb36d90c13d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:04:34 +0900 Subject: [PATCH 42/86] =?UTF-8?q?feat:=20Player=EC=99=80=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EB=90=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=B4=EC=84=9C=20=EB=8B=A4=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 1b233d8923a..99f8b2ef63f 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -2,30 +2,21 @@ import java.util.List; -public class Dealer { - private final Hand hand; +public class Dealer extends Participant{ + private static final int DEALER_CARD_SUM_THRESHOLD=16; private Dealer(Hand hand) { - this.hand = hand; + super(hand); } public static Dealer from(Hand hand) { return new Dealer(hand); } - public List getHandCards() { - return hand.getCards(); - } - - public Hand getHand() { - return hand; - } public boolean checkThreshold() { - return hand.getScore().getValue() <= 16; + return getHand().getScore().getValue() <= DEALER_CARD_SUM_THRESHOLD; } - public void addHandCard(Card card) { - hand.addCard(card); - } + } From 33c29102bbc6dcb14064e1c73cc24965cae04d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:04:50 +0900 Subject: [PATCH 43/86] =?UTF-8?q?feat:=20Dealer=EC=99=80=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EB=90=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=B4=EC=84=9C=20=EB=8B=A4=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Player.java | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 7a4fbc96fa3..21880c1c18d 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -1,14 +1,12 @@ package domain; -import java.util.List; -public class Player { +public class Player extends Participant{ private final Name name; - private final Hand hand; private Player(Name name, Hand hand) { - this.name = name; - this.hand = hand; + super(hand); + this.name=name; } public static Player of(Name name, Hand hand) { @@ -19,19 +17,4 @@ public Name getName() { return name; } - public List getHandCards() { - return hand.getCards(); - } - - public Hand getHand() { - return hand; - } - - public void addHandCard(Card card) { - hand.addCard(card); - } - - public boolean isBust() { - return hand.getScore().isBust(); - } } From 14baaeb98af1f611162adf6ddd3dfca2a4f318c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:05:46 +0900 Subject: [PATCH 44/86] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=20?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Score.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index 05f0eaeb7bb..c2c6ea45760 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -1,6 +1,7 @@ package domain; public class Score { + private static final int BUST_LIMIT_SCORE = 21; private final int value; public Score(int value) { @@ -8,7 +9,7 @@ public Score(int value) { } public boolean isBust(){ - return value > 21; + return value > BUST_LIMIT_SCORE; } public int getValue() { From 53119fc2f74d63dc70903c99a840891c8f491f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:06:29 +0900 Subject: [PATCH 45/86] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=20?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Name.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java index 9822d9c6493..8609ba984a0 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/Name.java @@ -1,6 +1,7 @@ package domain; public class Name { + private static final int NAME_LIMIT_LENGTH = 20; private final String name; private Name(String name) { @@ -18,7 +19,7 @@ private static String validateName(String name) { } private static void validateLength(String name) { - if (name.trim().length() > 20) { + if (name.trim().length() > NAME_LIMIT_LENGTH) { throw new IllegalArgumentException("์ด๋ฆ„์€ 20์ž ์ดํ•˜๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } } From 0337cad6653a5a6e209e2a48e7b2f66a57c1a8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:07:06 +0900 Subject: [PATCH 46/86] =?UTF-8?q?refactor:=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=9D=B8=EB=8D=B4=ED=8A=B8=201=EB=A1=9C?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ScoreCalculator.java | 50 +++++++++++++++++------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/ScoreCalculator.java index af25ba99a9f..0a2407691e5 100644 --- a/src/main/java/domain/ScoreCalculator.java +++ b/src/main/java/domain/ScoreCalculator.java @@ -4,21 +4,47 @@ public class ScoreCalculator { // TODO ๊ณ„์‚ฐ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง ํ•„์š” + + private static final int ACE_BONUS = 10; + private static final int BUST_LIMIT_SCORE = 21; + public static int calculate(List cards) { - int sum = 0; - int aceCount = 0; - for (Card card : cards) { - sum += card.getCardNumber().getValue(); - if (card.getCardNumber().equals(CardNumber.ACE)) { - aceCount++; - } - } - for (int i = 0; i < aceCount; i++) { - if (sum + 10 <= 21) { - sum += 10; - } + int baseSum = calculateBaseSum(cards); + int aceCount = countAce(cards); + return applyAceLogic(baseSum, aceCount); + } + + + private static int calculateBaseSum(List cards) { + int sum=0; + for(Card card: cards) { + sum+=card.getCardNumber().getValue(); } return sum; } + + private static int countAce(List cards) { + return (int)cards.stream() + .map(Card::getCardNumber) + .filter(cardNumber->cardNumber==CardNumber.ACE) + .count(); + } + + private static int applyAceLogic(int baseSum, int aceCount) { + int score = baseSum; + for(int i=0; i Date: Sun, 8 Mar 2026 15:11:38 +0900 Subject: [PATCH 47/86] =?UTF-8?q?test:=20=EC=B9=B4=EB=93=9C,=EB=94=9C?= =?UTF-8?q?=EB=9F=AC,=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=EC=99=80=20=EA=B2=8C=EC=9E=84=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=EC=9D=84=20=EA=B0=80=EC=A7=80=EB=8A=94=20Blackjack=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BlackjackGameTest.java | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/test/java/domain/BlackjackGameTest.java diff --git a/src/test/java/domain/BlackjackGameTest.java b/src/test/java/domain/BlackjackGameTest.java new file mode 100644 index 00000000000..07096fe9795 --- /dev/null +++ b/src/test/java/domain/BlackjackGameTest.java @@ -0,0 +1,44 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class BlackjackGameTest { + + @Test + @DisplayName("๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ๋”œ๋Ÿฌ์™€ ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ ์นด๋“œ 2์žฅ์„ ๋ฐ›๋Š”๋‹ค") + void ๊ฒŒ์ž„_์‹œ์ž‘์‹œ_๋”œ๋Ÿฌ์™€_ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ_์นด๋“œ2์žฅ_๋ฐฐ๋ถ„() { + List names = List.of("pobi", "jason"); + + BlackjackGame blackjackGame = BlackjackGame.start(names); + + Dealer dealer = blackjackGame.getDealer(); + Players players = blackjackGame.getPlayers(); + + assertThat(dealer.getHand().getCards()).hasSize(2); + assertThat(players.getPlayers()).hasSize(2); + + for (Player player : players.getPlayers()) { + assertThat(player.getHand().getCards()).hasSize(2); + } + } + + + + @Test + @DisplayName("๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฒ„์ŠคํŠธ๋ฉด ๋”œ๋Ÿฌ๋Š” ์นด๋“œ๋ฅผ ๋” ๋ฝ‘์ง€ ์•Š๋Š”๋‹ค") + void ๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด_๋ฒ„์ŠคํŠธ๋ฉด_๋”œ๋Ÿฌ๋Š”_์นด๋“œ๋ฝ‘๋Š”๊ฑธ_์ค‘๋‹จํ•œ๋‹ค(){ + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi")); + Player player = blackjackGame.getPlayers().getPlayers().getFirst(); + + while (!player.isBust()) { + blackjackGame.addPlayerCard(player); + } + + boolean result = blackjackGame.shouldDealerDraw(); + assertThat(result).isFalse(); + } +} \ No newline at end of file From efcb0f1b97d6f475d60198cf1896eb5bc8623955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:12:01 +0900 Subject: [PATCH 48/86] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C,=EB=94=9C?= =?UTF-8?q?=EB=9F=AC,=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=EC=99=80=20=EA=B2=8C=EC=9E=84=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=EC=9D=84=20=EA=B0=80=EC=A7=80=EB=8A=94=20Blackjack=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackGame.java | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/main/java/domain/BlackjackGame.java diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java new file mode 100644 index 00000000000..95e414a14be --- /dev/null +++ b/src/main/java/domain/BlackjackGame.java @@ -0,0 +1,65 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class BlackjackGame { + private static final int INITIAL_CARD_COUNT = 2; + + private final Deck deck; + private final GameParticipants participants; + + private BlackjackGame(Deck deck, GameParticipants participants) { + this.deck = deck; + this.participants = participants; + } + + public static BlackjackGame start(List names) { + Deck deck = Deck.createDeck(); + Dealer dealer = Dealer.from(new Hand(initCards(deck))); + Players players = createPlayers(names, deck); + return new BlackjackGame(deck, GameParticipants.of(dealer, players)); + } + + private static Players createPlayers(List names, Deck deck) { + List players = new ArrayList<>(); + for (String name : names) { + players.add(createPlayer(name, deck)); + } + return Players.from(players); + } + + private static Player createPlayer(String name, Deck deck) { + return Player.of(Name.from(name), new Hand(initCards(deck))); + } + + private static List initCards(Deck deck) { + List cards = new ArrayList<>(); + for (int count = 0; count < INITIAL_CARD_COUNT; count++) { + cards.add(deck.draw()); + } + return cards; + } + + public void addPlayerCard(Player player) { + player.addHandCard(deck.draw()); + } + + public boolean shouldDealerDraw() { + return getDealer().checkThreshold() && !participants.isAllPlayersBust(); + } + + public void playDealerTurn() { + while (getDealer().checkThreshold()) { + getDealer().addHandCard(deck.draw()); + } + } + + public Dealer getDealer() { + return participants.getDealer(); + } + + public Players getPlayers() { + return participants.getPlayers(); + } +} \ No newline at end of file From adcd3bcf2e74945f4aa433720ce74d993f26802c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:12:48 +0900 Subject: [PATCH 49/86] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20GameParticipants=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameParticipants.java | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/domain/GameParticipants.java diff --git a/src/main/java/domain/GameParticipants.java b/src/main/java/domain/GameParticipants.java new file mode 100644 index 00000000000..37a7bfb9a13 --- /dev/null +++ b/src/main/java/domain/GameParticipants.java @@ -0,0 +1,27 @@ +package domain; + +public class GameParticipants { + private final Dealer dealer; + private final Players players; + + private GameParticipants(Dealer dealer, Players players) { + this.dealer = dealer; + this.players = players; + } + + public static GameParticipants of(Dealer dealer, Players players) { + return new GameParticipants(dealer, players); + } + + public Dealer getDealer() { + return dealer; + } + + public Players getPlayers() { + return players; + } + + public boolean isAllPlayersBust() { + return players.isAllBust(); + } +} \ No newline at end of file From 7e15fc95c015d6efc5aa1a0f6491463b80ec53c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 8 Mar 2026 15:13:44 +0900 Subject: [PATCH 50/86] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C,=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4,=EB=94=9C=EB=9F=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A5=BC=20Blackjack=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=98=AE=EA=B2=A8=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 86 ++++---------------- 1 file changed, 17 insertions(+), 69 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 013d95a54d2..6d581d4e3bc 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,11 +1,8 @@ package controller; -import domain.Card; +import domain.BlackjackGame; import domain.Dealer; -import domain.Deck; import domain.GameResultCalculator; -import domain.Hand; -import domain.Name; import domain.Player; import domain.Players; import domain.TotalFinalResult; @@ -14,35 +11,29 @@ import dto.PlayerDto; import dto.PlayersDto; import dto.TotalFinalResultsDto; -import java.util.ArrayList; import java.util.List; import view.InputView; import view.OutputView; public class GameController { - private static final int INITIAL_CARD_COUNT = 2; - private final Deck deck; + public void start() { + List names = InputView.readParticipants(); + BlackjackGame blackjackGame = BlackjackGame.start(names); - public GameController() { - this.deck = Deck.createDeck(); - } - public void start() { - // ์นด๋“œ ์ดˆ๊ธฐํ™” - Dealer dealer = initDealer(); - Players players = initPlayers(); + Dealer dealer = blackjackGame.getDealer(); + Players players = blackjackGame.getPlayers(); - // ์นด๋“œ ์ถœ๋ ฅ PlayersDto playersDto = PlayersDto.from(players); OutputView.printHandOutMessage(playersDto); OutputView.printCardStatus(playersDto, DealerResultDto.from(dealer)); // ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น - addPlayersCard(players); + addPlayersCard(blackjackGame, players); // ๋”œ๋Ÿฌ ๊ฒŒ์ž„ ์ง„ํ–‰ - addDealerCards(dealer, players); + addDealerCards(blackjackGame); // ์นด๋“œ ๊ฒฐ๊ณผ, ์ ์ˆ˜ ์ถœ๋ ฅ printCardResults(DealerResultDto.from(dealer), PlayersDto.from(players)); @@ -51,66 +42,23 @@ public void start() { printFinalResults(players, dealer); } - // ํ”Œ๋ ˆ์ด์–ด๋“ค ์ดˆ๊ธฐํ™” - private Players initPlayers() { - List names = InputView.readParticipants(); - List players = new ArrayList<>(); - for (String name : names) { - players.add(initPlayer(name)); - } - - return Players.from(players); - } - - // ํ”Œ๋ ˆ์ด์–ด ์ดˆ๊ธฐ ์นด๋“œ - private Player initPlayer(String name) { - return Player.of(Name.from(name), new Hand(initCards())); - } - - private List initCards() { - List cards = new ArrayList<>(); - for (int count = 0; count < INITIAL_CARD_COUNT; count++) { - cards.add(deck.draw()); - } - return cards; - } - - - private Dealer initDealer() { - return Dealer.from(new Hand(initCards())); - } - - // ํ”Œ๋ ˆ์ด์–ด ์ „์ฒด ์นด๋“œ ์ถ”๊ฐ€ - private void addPlayersCard(Players players) { + private void addPlayersCard(BlackjackGame blackjackGame, Players players) { for (Player player : players.getPlayers()) { - checkBustPlayer(player); + addPlayerCards(blackjackGame, player); } } - private void checkBustPlayer(Player player) { + private void addPlayerCards(BlackjackGame blackjackGame, Player player) { while (!player.isBust() && InputView.checkAddCard(player.getName().getName())) { - addPlayerCard(player); + blackjackGame.addPlayerCard(player); + OutputView.printPlayerCardStatus(PlayerDto.from(player)); } } - // ๊ฐ ํ”Œ๋ ˆ์ด์–ด๋ณ„ ์นด๋“œ์ถ”๊ฐ€ - private void addPlayerCard(Player player) { - player.addHandCard(deck.draw()); - OutputView.printPlayerCardStatus(PlayerDto.from(player)); - } - - // ๋”œ๋Ÿฌ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ (๋ฐ˜๋ณต) - private void addDealerCards(Dealer dealer, Players players) { - if (dealer.checkThreshold() && !players.isAllBust()) { + private void addDealerCards(BlackjackGame blackjackGame) { + if (blackjackGame.shouldDealerDraw()) { OutputView.printAddDealerCardMessage(); - addDealerCard(dealer); - } - } - - // ๋”œ๋Ÿฌ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ - private void addDealerCard(Dealer dealer) { - while (dealer.checkThreshold()) { - dealer.addHandCard(deck.draw()); + blackjackGame.playDealerTurn(); } } @@ -125,4 +73,4 @@ private void printFinalResults(Players players, Dealer dealer) { OutputView.printTotalResult(dealerFinalResultDto, totalFinalResultsDto); } -} +} \ No newline at end of file From e0175cabdd33fe7c213e4fada125cac571ee8b76 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sun, 8 Mar 2026 15:34:07 +0900 Subject: [PATCH 51/86] =?UTF-8?q?refactor:=20DealerResultDto=EC=99=80=20Pl?= =?UTF-8?q?ayerResultDto=EB=A5=BC=20ResultDto=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EC=A4=84=EB=B0=94=EA=BF=88,=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 23 ++++---------- src/main/java/domain/CardNumber.java | 2 +- src/main/java/domain/Dealer.java | 8 ++--- .../java/domain/GameResultCalculator.java | 4 +-- src/main/java/domain/Name.java | 1 + src/main/java/domain/Participant.java | 1 - src/main/java/domain/Player.java | 3 +- src/main/java/domain/ScoreCalculator.java | 2 -- src/main/java/dto/DealerResultDto.java | 18 ----------- src/main/java/dto/PlayerDto.java | 4 +-- src/main/java/dto/PlayerResultDto.java | 17 ---------- src/main/java/dto/ResultDto.java | 17 ++++++++++ src/main/java/view/OutputView.java | 31 ++++++++++--------- 13 files changed, 48 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/dto/DealerResultDto.java delete mode 100644 src/main/java/dto/PlayerResultDto.java create mode 100644 src/main/java/dto/ResultDto.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 6d581d4e3bc..d496e372470 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -7,38 +7,27 @@ import domain.Players; import domain.TotalFinalResult; import dto.DealerFinalResultDto; -import dto.DealerResultDto; import dto.PlayerDto; import dto.PlayersDto; +import dto.ResultDto; import dto.TotalFinalResultsDto; -import java.util.List; import view.InputView; import view.OutputView; public class GameController { public void start() { - List names = InputView.readParticipants(); - BlackjackGame blackjackGame = BlackjackGame.start(names); - - + BlackjackGame blackjackGame = BlackjackGame.start(InputView.readParticipants()); Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); PlayersDto playersDto = PlayersDto.from(players); OutputView.printHandOutMessage(playersDto); - OutputView.printCardStatus(playersDto, DealerResultDto.from(dealer)); + OutputView.printCardStatus(playersDto, ResultDto.from(dealer)); - // ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น addPlayersCard(blackjackGame, players); - - // ๋”œ๋Ÿฌ ๊ฒŒ์ž„ ์ง„ํ–‰ addDealerCards(blackjackGame); - - // ์นด๋“œ ๊ฒฐ๊ณผ, ์ ์ˆ˜ ์ถœ๋ ฅ - printCardResults(DealerResultDto.from(dealer), PlayersDto.from(players)); - - // ์ตœ์ข… ์ŠนํŒจ ์ถœ๋ ฅ + printCardResults(ResultDto.from(dealer), PlayersDto.from(players)); printFinalResults(players, dealer); } @@ -62,8 +51,8 @@ private void addDealerCards(BlackjackGame blackjackGame) { } } - private void printCardResults(DealerResultDto dealerResultDto, PlayersDto playersDto) { - OutputView.printCardResult(dealerResultDto, playersDto); + private void printCardResults(ResultDto resultDto, PlayersDto playersDto) { + OutputView.printCardResult(resultDto, playersDto); } private void printFinalResults(Players players, Dealer dealer) { diff --git a/src/main/java/domain/CardNumber.java b/src/main/java/domain/CardNumber.java index 652434d3d1c..f03d4561b06 100644 --- a/src/main/java/domain/CardNumber.java +++ b/src/main/java/domain/CardNumber.java @@ -15,7 +15,7 @@ public enum CardNumber { Q("Q", 10), K("K", 10); - private String symbol; + private final String symbol; private final int value; CardNumber(String symbol, int value) { diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 99f8b2ef63f..3e1c4183fc8 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -1,9 +1,7 @@ package domain; -import java.util.List; - public class Dealer extends Participant{ - private static final int DEALER_CARD_SUM_THRESHOLD=16; + private static final int DEALER_CARD_SUM_THRESHOLD = 16; private Dealer(Hand hand) { super(hand); @@ -15,8 +13,6 @@ public static Dealer from(Hand hand) { public boolean checkThreshold() { - return getHand().getScore().getValue() <= DEALER_CARD_SUM_THRESHOLD; + return getHand().getScore().value() <= DEALER_CARD_SUM_THRESHOLD; } - - } diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 8d2742fdb45..53fafa02d3b 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -14,10 +14,10 @@ private static FinalResult checkFinalResult(Player player, Dealer dealer) { } private static ResultType getResultType(Score playerScore, Score dealerScore) { - if (playerScore.isBust() || (playerScore.getValue() < dealerScore.getValue() && !dealerScore.isBust())) { + if (playerScore.isBust() || (playerScore.value() < dealerScore.value() && !dealerScore.isBust())) { return ResultType.LOSE; } - if (dealerScore.isBust() || playerScore.getValue() > dealerScore.getValue()) { + if (dealerScore.isBust() || playerScore.value() > dealerScore.value()) { return ResultType.WIN; } return ResultType.DRAW; diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java index 8609ba984a0..1f5eaaf151c 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/Name.java @@ -2,6 +2,7 @@ public class Name { private static final int NAME_LIMIT_LENGTH = 20; + private final String name; private Name(String name) { diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 0d2b73e9c4a..5b28d2bf9a5 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -24,5 +24,4 @@ public void addHandCard(Card card){ public boolean isBust(){ return hand.getScore().isBust(); } - } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 21880c1c18d..b1da30c82b6 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -6,7 +6,7 @@ public class Player extends Participant{ private Player(Name name, Hand hand) { super(hand); - this.name=name; + this.name = name; } public static Player of(Name name, Hand hand) { @@ -16,5 +16,4 @@ public static Player of(Name name, Hand hand) { public Name getName() { return name; } - } diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/ScoreCalculator.java index 0a2407691e5..e1f9658ddf1 100644 --- a/src/main/java/domain/ScoreCalculator.java +++ b/src/main/java/domain/ScoreCalculator.java @@ -3,8 +3,6 @@ import java.util.List; public class ScoreCalculator { - // TODO ๊ณ„์‚ฐ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง ํ•„์š” - private static final int ACE_BONUS = 10; private static final int BUST_LIMIT_SCORE = 21; diff --git a/src/main/java/dto/DealerResultDto.java b/src/main/java/dto/DealerResultDto.java deleted file mode 100644 index af3e0a82dd1..00000000000 --- a/src/main/java/dto/DealerResultDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package dto; - -import domain.Dealer; -import java.util.List; - -public record DealerResultDto( - List cards, - int score -) { - public static DealerResultDto from(Dealer dealer) { - // TODO ๋ถ„๋ฆฌ? -> ํ˜„์žฌ PlayerResultDto์™€ ์ค‘๋ณต๋จ. - List cardInfo = dealer.getHandCards().stream() - .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) - .toList(); - - return new DealerResultDto(cardInfo, dealer.getHand().getScore().getValue()); - } -} diff --git a/src/main/java/dto/PlayerDto.java b/src/main/java/dto/PlayerDto.java index d0b19057f89..b746027b8b9 100644 --- a/src/main/java/dto/PlayerDto.java +++ b/src/main/java/dto/PlayerDto.java @@ -4,9 +4,9 @@ public record PlayerDto( String name, - PlayerResultDto playerResultDto + ResultDto resultDto ) { public static PlayerDto from(Player player) { - return new PlayerDto(player.getName().getName(), PlayerResultDto.from(player)); + return new PlayerDto(player.getName().getName(), ResultDto.from(player)); } } diff --git a/src/main/java/dto/PlayerResultDto.java b/src/main/java/dto/PlayerResultDto.java deleted file mode 100644 index e9909e2dbb0..00000000000 --- a/src/main/java/dto/PlayerResultDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package dto; - -import domain.Player; -import java.util.List; - -public record PlayerResultDto( - List cards, - int score -) { - public static PlayerResultDto from(Player player) { - List cardInfo = player.getHandCards().stream() - .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) - .toList(); - - return new PlayerResultDto(cardInfo, player.getHand().getScore().getValue()); - } -} diff --git a/src/main/java/dto/ResultDto.java b/src/main/java/dto/ResultDto.java new file mode 100644 index 00000000000..ca12e28651f --- /dev/null +++ b/src/main/java/dto/ResultDto.java @@ -0,0 +1,17 @@ +package dto; + +import domain.Participant; +import java.util.List; + +public record ResultDto( + List cards, + int score +) { + public static ResultDto from(Participant participant) { + List cardInfo = participant.getHandCards().stream() + .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .toList(); + + return new ResultDto(cardInfo, participant.getHand().getScore().value()); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 24ee3feaf5c..ddd6a348f80 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,9 +1,9 @@ package view; import dto.DealerFinalResultDto; -import dto.DealerResultDto; import dto.PlayerDto; import dto.PlayersDto; +import dto.ResultDto; import dto.TotalFinalResultsDto; import java.util.List; import java.util.stream.Collectors; @@ -18,25 +18,25 @@ public static void printHandOutMessage(PlayersDto playersDto) { } // ๋”œ๋Ÿฌ์นด๋“œ ์ถœ๋ ฅ - public static void printDealerCardStatus(DealerResultDto dealerResultDto) { - System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(dealerResultDto)); + public static void printDealerCardStatus(ResultDto resultDto) { + System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(resultDto)); } //ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถœ๋ ฅ public static void printPlayerCardStatus(PlayerDto playerDto) { - System.out.printf("%s์นด๋“œ: %s%n", playerDto.name(), getCardStatusFormat(playerDto.playerResultDto().cards())); + System.out.printf("%s์นด๋“œ: %s%n", playerDto.name(), getCardStatusFormat(playerDto.resultDto().cards())); } - public static void printCardStatus(PlayersDto playersDto, DealerResultDto dealerResultDto) { - printDealerCardStatus(dealerResultDto); + public static void printCardStatus(PlayersDto playersDto, ResultDto resultDto) { + printDealerCardStatus(resultDto); for (PlayerDto playerDto : playersDto.playersDto()) { printPlayerCardStatus(playerDto); } System.out.print(System.lineSeparator()); } - private static String getDealerCardStatus(DealerResultDto dealerResultDto) { - return dealerResultDto.cards().getFirst(); + private static String getDealerCardStatus(ResultDto resultDto) { + return resultDto.cards().getFirst(); } private static String getCardStatusFormat(List cards) { @@ -47,14 +47,15 @@ public static void printAddDealerCardMessage() { System.out.println("\n๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."); } - public static void printCardResult(DealerResultDto dealerResultDto, PlayersDto playersDto) { - printDealerCardResult(dealerResultDto); + public static void printCardResult(ResultDto resultDto, PlayersDto playersDto) { + printDealerCardResult(resultDto); printPlayersCardResult(playersDto); } - private static void printDealerCardResult(DealerResultDto dealerResultDto) { - System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", getCardStatusFormat(dealerResultDto.cards()), - dealerResultDto.score()); + private static void printDealerCardResult(ResultDto resultDto) { + System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", + getCardStatusFormat(resultDto.cards()), + resultDto.score()); } private static void printPlayersCardResult(PlayersDto playersDto) { @@ -66,8 +67,8 @@ private static void printPlayersCardResult(PlayersDto playersDto) { // TODO ๋ฒ„์ŠคํŠธ ๋‚˜๋ฉด ๋ฒ„์ŠคํŠธ๋กœ ํ‘œ์‹œ? private static void printPlayerCardResult(PlayerDto playerDto) { System.out.printf("%n%s์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", playerDto.name(), - getCardStatusFormat(playerDto.playerResultDto().cards()), - playerDto.playerResultDto().score()); + getCardStatusFormat(playerDto.resultDto().cards()), + playerDto.resultDto().score()); } public static void printTotalResult(DealerFinalResultDto dealerFinalResultDto, From 5c25a3c09d505935cfcfeb346d0ef0ae6ea13894 Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sun, 8 Mar 2026 15:34:27 +0900 Subject: [PATCH 52/86] =?UTF-8?q?refactor:=20Score=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20Record=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Score.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index c2c6ea45760..6737c751c29 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -1,18 +1,9 @@ package domain; -public class Score { +public record Score(int value) { private static final int BUST_LIMIT_SCORE = 21; - private final int value; - public Score(int value) { - this.value = value; - } - - public boolean isBust(){ + public boolean isBust() { return value > BUST_LIMIT_SCORE; } - - public int getValue() { - return value; - } } From 6707507614177243c70d6836ab4181aba7836c6a Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sun, 8 Mar 2026 15:34:47 +0900 Subject: [PATCH 53/86] =?UTF-8?q?refactor:=20=EC=A4=84=EB=B0=94=EA=BF=88?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ScoreCalculator.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/ScoreCalculator.java index e1f9658ddf1..db553277cab 100644 --- a/src/main/java/domain/ScoreCalculator.java +++ b/src/main/java/domain/ScoreCalculator.java @@ -7,7 +7,6 @@ public class ScoreCalculator { private static final int BUST_LIMIT_SCORE = 21; public static int calculate(List cards) { - int baseSum = calculateBaseSum(cards); int aceCount = countAce(cards); return applyAceLogic(baseSum, aceCount); @@ -15,34 +14,32 @@ public static int calculate(List cards) { private static int calculateBaseSum(List cards) { - int sum=0; - for(Card card: cards) { - sum+=card.getCardNumber().getValue(); + int sum = 0; + for (Card card : cards) { + sum += card.getCardNumber().getValue(); } return sum; } private static int countAce(List cards) { - return (int)cards.stream() + return (int) cards.stream() .map(Card::getCardNumber) - .filter(cardNumber->cardNumber==CardNumber.ACE) + .filter(cardNumber -> cardNumber == CardNumber.ACE) .count(); } private static int applyAceLogic(int baseSum, int aceCount) { int score = baseSum; - for(int i=0; i Date: Sun, 8 Mar 2026 15:46:35 +0900 Subject: [PATCH 54/86] =?UTF-8?q?refactor:=20DealerFinalResultDto=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EC=9D=B8=EB=8D=B4=ED=8A=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/DealerFinalResultDto.java | 25 +++++++-------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/java/dto/DealerFinalResultDto.java b/src/main/java/dto/DealerFinalResultDto.java index 047a34c3c5f..80dc466c433 100644 --- a/src/main/java/dto/DealerFinalResultDto.java +++ b/src/main/java/dto/DealerFinalResultDto.java @@ -1,6 +1,5 @@ package dto; -import domain.FinalResult; import domain.ResultType; import domain.TotalFinalResult; @@ -8,23 +7,15 @@ public record DealerFinalResultDto( String result ) { public static DealerFinalResultDto from(TotalFinalResult totalFinalResult) { - int winCount = 0; - int drawCount = 0; - int loseCount = 0; - - for (FinalResult finalResult : totalFinalResult.getTotalResult()) { - if (finalResult.getResultType().equals(ResultType.WIN)) { - loseCount++; - continue; - } - if (finalResult.getResultType().equals(ResultType.DRAW)) { - drawCount++; - continue; - } - winCount++; - } + return new DealerFinalResultDto(checkDrawCount(countResult(totalFinalResult, ResultType.LOSE), + countResult(totalFinalResult, ResultType.DRAW), + countResult(totalFinalResult, ResultType.WIN))); + } - return new DealerFinalResultDto(checkDrawCount(winCount, drawCount, loseCount)); + private static int countResult(TotalFinalResult totalFinalResult, ResultType resultType) { + return (int) totalFinalResult.getTotalResult().stream() + .filter(finalResult -> finalResult.getResultType().equals(resultType)) + .count(); } private static String checkDrawCount(int winCount, int drawCount, int loseCount) { From 1134e847d4635a299dd1d05ae840ba8125556fdc Mon Sep 17 00:00:00 2001 From: minzzun99 Date: Sun, 8 Mar 2026 15:53:23 +0900 Subject: [PATCH 55/86] =?UTF-8?q?docs:=20README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 50 +------------------------------------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/README.md b/README.md index d7a48bde527..43ef453f1ce 100644 --- a/README.md +++ b/README.md @@ -68,52 +68,4 @@ jason: ํŒจ 7) ๋ฝ‘ํžŒ ์นด๋“œ ์ œ์™ธํ•˜๋Š” ๊ธฐ๋Šฅ 8) ์นด๋“œ ๋ฑ ๋งŒ๋“ค์–ด์„œ ์„ž๊ธฐ 9) ์ŠนํŒจ ์—ฌ๋ถ€ ๊ณ„์‚ฐ๊ธฐ๋Šฅ -10) ๋”œ๋Ÿฌ์˜ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ ---- - -## โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ทœ์น™ -์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. -1) ์ตœ๋Œ€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜๊ฐ€ 1๋ช… ๋ฏธ๋งŒ, 7๋ช… ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. -2) ์นด๋“œ ์ถ”๊ฐ€ ์ˆ˜๋ น ์—ฌ๋ถ€ ๋‹ต๋ณ€ ์‹œ `y, Y, n, N` ์ด์™ธ์˜ ์ž…๋ ฅ์„ ํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. -3) ์‰ผํ‘œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ตฌ๋ถ„ ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. - ---- - -## ๐Ÿงช ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค (JUnit5 + AssertJ) - - ---- - -## ๐Ÿงฑ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ - -```plaintext - -``` - - ---- - -## ๐Ÿงพ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ (AngularJS Style) - - ---- - -## ๐Ÿ’ก ๊ฐœ๋ฐœ ์ง„ํ–‰ ๋ฐฉ์‹ - - ---- - -## โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - - - ---- - -## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ -- JUnit 5 User Guide -- AssertJ User Guide / Exception Assertions -- Guide to JUnit 5 Parameterized Tests -- ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค Java Style Guide -- Angular Commit Message Conventions - ---- +10) ๋”œ๋Ÿฌ์˜ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ \ No newline at end of file From db4570d2d4a936546b6e7cc137e1da7e59de1d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Wed, 11 Mar 2026 14:14:18 +0900 Subject: [PATCH 56/86] =?UTF-8?q?refactor:=20GameController=20start()=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20run()=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=84=A4=EC=9E=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 2 +- src/main/java/controller/GameController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index ceb401a4f9f..8a5808ea278 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -3,6 +3,6 @@ public class Application { public static void main(String[] args) { GameController gameController = new GameController(); - gameController.start(); + gameController.run(); } } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index d496e372470..8523ba9b0cf 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -16,7 +16,7 @@ public class GameController { - public void start() { + public void run() { BlackjackGame blackjackGame = BlackjackGame.start(InputView.readParticipants()); Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); @@ -62,4 +62,4 @@ private void printFinalResults(Players players, Dealer dealer) { OutputView.printTotalResult(dealerFinalResultDto, totalFinalResultsDto); } -} \ No newline at end of file +} From 06d9e2ac39b5736b85ce21b3cebb32615282d6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Wed, 11 Mar 2026 17:25:32 +0900 Subject: [PATCH 57/86] =?UTF-8?q?refactor:=20=EB=A7=88=EC=A7=80=EB=A7=89?= =?UTF-8?q?=20=EC=A4=84=EC=97=90=20=EA=B0=9C=ED=96=89=EB=AC=B8=EC=9E=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 8523ba9b0cf..38ff86a30a6 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -45,9 +45,9 @@ private void addPlayerCards(BlackjackGame blackjackGame, Player player) { } private void addDealerCards(BlackjackGame blackjackGame) { - if (blackjackGame.shouldDealerDraw()) { + boolean dealerDrew = blackjackGame.playDealerTurn(); + if(dealerDrew){ OutputView.printAddDealerCardMessage(); - blackjackGame.playDealerTurn(); } } From dca898fde7462150aec33ece4ed9dc0f6617db3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Wed, 11 Mar 2026 17:26:45 +0900 Subject: [PATCH 58/86] =?UTF-8?q?refactor:=20cardNumber=EC=99=80=20cardSha?= =?UTF-8?q?pe=EC=97=90=20final=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Card.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index 034557dea22..cb2c09cac83 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1,8 +1,8 @@ package domain; public class Card { - private CardNumber cardNumber; - private CardShape cardShape; + private final CardNumber cardNumber; + private final CardShape cardShape; private Card(CardNumber cardNumber, CardShape cardShape) { this.cardNumber = cardNumber; From e77d81f5d6b7672cae69edaebb0c987ab3cad109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 00:17:45 +0900 Subject: [PATCH 59/86] =?UTF-8?q?refactor:=20BlackjackGame=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -playDealerTurn() ํ•˜๋‚˜๋งŒ ํ˜ธ์ถœํ•ด๋„ ๋˜๋„๋ก ๋”œ๋Ÿฌ ํ„ด ๊ทœ์น™ ์บก์Аํ™” --- src/main/java/domain/BlackjackGame.java | 21 ++++++++++++++++----- src/main/java/domain/Dealer.java | 1 - src/main/java/domain/Deck.java | 6 +++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index 95e414a14be..eaa3537391b 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -14,8 +14,11 @@ private BlackjackGame(Deck deck, GameParticipants participants) { this.participants = participants; } - public static BlackjackGame start(List names) { - Deck deck = Deck.createDeck(); + public static BlackjackGame start(List names){ + return start(names, Deck.createDeck()); + } + + public static BlackjackGame start(List names, Deck deck) { Dealer dealer = Dealer.from(new Hand(initCards(deck))); Players players = createPlayers(names, deck); return new BlackjackGame(deck, GameParticipants.of(dealer, players)); @@ -45,11 +48,19 @@ public void addPlayerCard(Player player) { player.addHandCard(deck.draw()); } - public boolean shouldDealerDraw() { - return getDealer().checkThreshold() && !participants.isAllPlayersBust(); + public boolean playDealerTurn() { + if (cannotDealerDraw()) { + return false; + } + drawDealerCards(); + return true; + } + + private boolean cannotDealerDraw() { + return participants.isAllPlayersBust() || !getDealer().checkThreshold(); } - public void playDealerTurn() { + private void drawDealerCards() { while (getDealer().checkThreshold()) { getDealer().addHandCard(deck.draw()); } diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 3e1c4183fc8..b574ef7770a 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -11,7 +11,6 @@ public static Dealer from(Hand hand) { return new Dealer(hand); } - public boolean checkThreshold() { return getHand().getScore().value() <= DEALER_CARD_SUM_THRESHOLD; } diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index a2562b659ff..3ad19288b60 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -17,6 +17,10 @@ public static Deck createDeck() { return new Deck(cards); } + public static Deck from(List cards){ + return new Deck(new ArrayList<>(cards)); + } + private static List generateAllCards() { List cards = new ArrayList<>(); for (CardShape shape : CardShape.values()) { @@ -32,7 +36,7 @@ private static void addCardsByShape(List cards, CardShape shape) { } public List getCards() { - return cards; + return List.copyOf(cards); } public Card draw() { From c4d6107f46bf2611fa07e8d243b786688ded242d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 00:27:45 +0900 Subject: [PATCH 60/86] =?UTF-8?q?refactor(test):=20BlackjackGame=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BlackjackGameTest.java | 90 ++++++++++++++++++--- 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/src/test/java/domain/BlackjackGameTest.java b/src/test/java/domain/BlackjackGameTest.java index 07096fe9795..b3861e36ae1 100644 --- a/src/test/java/domain/BlackjackGameTest.java +++ b/src/test/java/domain/BlackjackGameTest.java @@ -1,19 +1,14 @@ package domain; import static org.assertj.core.api.Assertions.assertThat; - import java.util.List; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class BlackjackGameTest { @Test - @DisplayName("๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ๋”œ๋Ÿฌ์™€ ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ ์นด๋“œ 2์žฅ์„ ๋ฐ›๋Š”๋‹ค") void ๊ฒŒ์ž„_์‹œ์ž‘์‹œ_๋”œ๋Ÿฌ์™€_ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ_์นด๋“œ2์žฅ_๋ฐฐ๋ถ„() { - List names = List.of("pobi", "jason"); - - BlackjackGame blackjackGame = BlackjackGame.start(names); + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi", "jason")); Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); @@ -26,19 +21,88 @@ class BlackjackGameTest { } } + @Test + void ํ”Œ๋ ˆ์ด์–ด๊ฐ€_์นด๋“œ๋ฅผ_์ถ”๊ฐ€๋กœ_๋ฝ‘์œผ๋ฉด_์นด๋“œ์ˆ˜๊ฐ€_1์žฅ_์ฆ๊ฐ€ํ•œ๋‹ค() { + Deck deck = Deck.from(List.of( + Card.of(CardNumber.TEN, CardShape.SPADE), // dealer 1 + Card.of(CardNumber.SIX, CardShape.HEART), // dealer 2 + Card.of(CardNumber.NINE, CardShape.CLOVER), // player 1 + Card.of(CardNumber.SEVEN, CardShape.DIAMOND), // player 2 + Card.of(CardNumber.TWO, CardShape.SPADE) // player draw + )); + + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); + Player player = blackjackGame.getPlayers().getPlayers().getFirst(); + + int before = player.getHand().getCards().size(); + blackjackGame.addPlayerCard(player); + + assertThat(player.getHand().getCards()).hasSize(before + 1); + } @Test - @DisplayName("๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฒ„์ŠคํŠธ๋ฉด ๋”œ๋Ÿฌ๋Š” ์นด๋“œ๋ฅผ ๋” ๋ฝ‘์ง€ ์•Š๋Š”๋‹ค") - void ๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด_๋ฒ„์ŠคํŠธ๋ฉด_๋”œ๋Ÿฌ๋Š”_์นด๋“œ๋ฝ‘๋Š”๊ฑธ_์ค‘๋‹จํ•œ๋‹ค(){ - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi")); + void ๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด๊ฐ€_๋ฒ„์ŠคํŠธ๋ฉด_๋”œ๋Ÿฌํ„ด์€_์ง„ํ–‰๋˜์ง€_์•Š๋Š”๋‹ค() { + Deck deck = Deck.from(List.of( + Card.of(CardNumber.TEN, CardShape.SPADE), // dealer 1 + Card.of(CardNumber.SIX, CardShape.HEART), // dealer 2 -> 16 + Card.of(CardNumber.TEN, CardShape.CLOVER), // player 1 + Card.of(CardNumber.NINE, CardShape.DIAMOND), // player 2 -> 19 + Card.of(CardNumber.THREE, CardShape.SPADE) // player draw -> 22 + )); + + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); Player player = blackjackGame.getPlayers().getPlayers().getFirst(); + Dealer dealer = blackjackGame.getDealer(); - while (!player.isBust()) { - blackjackGame.addPlayerCard(player); - } + int dealerCardCountBefore = dealer.getHand().getCards().size(); + + blackjackGame.addPlayerCard(player); + boolean result = blackjackGame.playDealerTurn(); + + assertThat(player.isBust()).isTrue(); + assertThat(result).isFalse(); + assertThat(dealer.getHand().getCards()).hasSize(dealerCardCountBefore); + } + + @Test + void ํ”Œ๋ ˆ์ด์–ด๊ฐ€_์‚ด์•„์žˆ๊ณ _๋”œ๋Ÿฌ์ ์ˆ˜๊ฐ€_16์ดํ•˜๋ฉด_๋”œ๋Ÿฌํ„ด์ด_์ง„ํ–‰๋œ๋‹ค() { + Deck deck = Deck.from(List.of( + Card.of(CardNumber.TEN, CardShape.SPADE), // dealer 1 + Card.of(CardNumber.SIX, CardShape.HEART), // dealer 2 -> 16 + Card.of(CardNumber.NINE, CardShape.CLOVER), // player 1 + Card.of(CardNumber.SEVEN, CardShape.DIAMOND), // player 2 -> 16 + Card.of(CardNumber.TWO, CardShape.SPADE) // dealer draw -> 18 + )); + + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); + Dealer dealer = blackjackGame.getDealer(); + + int dealerCardCountBefore = dealer.getHand().getCards().size(); + + boolean result = blackjackGame.playDealerTurn(); + + assertThat(result).isTrue(); + assertThat(dealer.getHand().getCards().size()).isGreaterThan(dealerCardCountBefore); + } + + @Test + void ๋”œ๋Ÿฌ์ ์ˆ˜๊ฐ€_17์ด์ƒ์ด๋ฉด_๋”œ๋Ÿฌํ„ด์€_์ง„ํ–‰๋˜์ง€_์•Š๋Š”๋‹ค() { + Deck deck = Deck.from(List.of( + Card.of(CardNumber.TEN, CardShape.SPADE), // dealer 1 + Card.of(CardNumber.SEVEN, CardShape.HEART), // dealer 2 -> 17 + Card.of(CardNumber.NINE, CardShape.CLOVER), // player 1 + Card.of(CardNumber.SIX, CardShape.DIAMOND) // player 2 -> 15 + )); + + BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); + Dealer dealer = blackjackGame.getDealer(); + + int dealerCardCountBefore = dealer.getHand().getCards().size(); + + boolean result = blackjackGame.playDealerTurn(); - boolean result = blackjackGame.shouldDealerDraw(); assertThat(result).isFalse(); + assertThat(dealer.getHand().getCards()).hasSize(dealerCardCountBefore); } } \ No newline at end of file From 5ccee000f240e9fd86c6c33f2a983e7fb224d88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 00:28:16 +0900 Subject: [PATCH 61/86] =?UTF-8?q?refactor:=20Deck=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackGame.java | 2 +- src/main/java/domain/Deck.java | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index eaa3537391b..b446f03a4ee 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -73,4 +73,4 @@ public Dealer getDealer() { public Players getPlayers() { return participants.getPlayers(); } -} \ No newline at end of file +} diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index 3ad19288b60..94b144384aa 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -17,10 +17,21 @@ public static Deck createDeck() { return new Deck(cards); } - public static Deck from(List cards){ + public static Deck from(List cards) { return new Deck(new ArrayList<>(cards)); } + public List getCards() { + return List.copyOf(cards); + } + + public Card draw() { + if (cards.isEmpty()) { + throw new IllegalArgumentException("๋ฑ์— ๋‚จ์€ ์นด๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + return cards.removeFirst(); + } + private static List generateAllCards() { List cards = new ArrayList<>(); for (CardShape shape : CardShape.values()) { @@ -34,15 +45,4 @@ private static void addCardsByShape(List cards, CardShape shape) { cards.add(Card.of(number, shape)); } } - - public List getCards() { - return List.copyOf(cards); - } - - public Card draw() { - if (cards.isEmpty()) { - throw new IllegalArgumentException("๋ฑ์— ๋‚จ์€ ์นด๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); - } - return cards.removeFirst(); - } } From c7d3de84f9043df4287e922f018abaa2a16aaf4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 00:29:25 +0900 Subject: [PATCH 62/86] =?UTF-8?q?refactor:=20PlayersDto.from(players)=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EC=82=AC=EC=9A=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 38ff86a30a6..9412c3d0a6d 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -27,7 +27,7 @@ public void run() { addPlayersCard(blackjackGame, players); addDealerCards(blackjackGame); - printCardResults(ResultDto.from(dealer), PlayersDto.from(players)); + printCardResults(ResultDto.from(dealer), playersDto); printFinalResults(players, dealer); } @@ -46,7 +46,7 @@ private void addPlayerCards(BlackjackGame blackjackGame, Player player) { private void addDealerCards(BlackjackGame blackjackGame) { boolean dealerDrew = blackjackGame.playDealerTurn(); - if(dealerDrew){ + if (dealerDrew) { OutputView.printAddDealerCardMessage(); } } From d127436336f0d35a877b2deae83d4c2ecb37d148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 00:34:29 +0900 Subject: [PATCH 63/86] =?UTF-8?q?refactor(test):=20Deck=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20draw=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 3 --- src/test/java/domain/DeckTest.java | 13 ++++++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index ddd6a348f80..3258c5c2aef 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -17,12 +17,10 @@ public static void printHandOutMessage(PlayersDto playersDto) { System.out.print("\n๋”œ๋Ÿฌ์™€ " + playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); } - // ๋”œ๋Ÿฌ์นด๋“œ ์ถœ๋ ฅ public static void printDealerCardStatus(ResultDto resultDto) { System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(resultDto)); } - //ํ”Œ๋ ˆ์ด์–ด ์นด๋“œ ์ถœ๋ ฅ public static void printPlayerCardStatus(PlayerDto playerDto) { System.out.printf("%s์นด๋“œ: %s%n", playerDto.name(), getCardStatusFormat(playerDto.resultDto().cards())); } @@ -64,7 +62,6 @@ private static void printPlayersCardResult(PlayersDto playersDto) { } } - // TODO ๋ฒ„์ŠคํŠธ ๋‚˜๋ฉด ๋ฒ„์ŠคํŠธ๋กœ ํ‘œ์‹œ? private static void printPlayerCardResult(PlayerDto playerDto) { System.out.printf("%n%s์นด๋“œ: %s - ๊ฒฐ๊ณผ: %d", playerDto.name(), getCardStatusFormat(playerDto.resultDto().cards()), diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index a8fe439e8b8..76e4f413800 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -9,14 +9,21 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class DeckTest { - @DisplayName("๋ฑ์˜ ์นด๋“œ ๊ฐœ์ˆ˜ ํ™•์ธ ํ…Œ์ŠคํŠธ - 52์žฅ") @Test - void ์ƒ์„ฑ๋œ_๋ฑ์˜_์นด๋“œ_๊ฐœ์ˆ˜_ํ™•์ธ() { + void ์ƒ์„ฑ๋œ_๋ฑ์˜_์นด๋“œ_๊ฐœ์ˆ˜_52์žฅ_ํ™•์ธ() { Deck deck = Deck.createDeck(); assertThat(deck.getCards().size()).isEqualTo(52); } - @DisplayName("๋ฑ์— ์นด๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") + @Test + void ์นด๋“œ_ํ•œ์žฅ_๋ฝ‘์œผ๋ฉด_๋ฑ์˜_ํฌ๊ธฐ_1๊ฐ์†Œ() { + Deck deck = Deck.createDeck(); + int before = deck.getCards().size(); + deck.draw(); + int after = deck.getCards().size(); + assertThat(after).isEqualTo(before - 1); + } + @Test void ๋ฑ์—_์นด๋“œ_์—†์„_๊ฒฝ์šฐ_์˜ˆ์™ธ_๋ฐœ์ƒ() { Deck deck = Deck.createDeck(); From b83635ba72b5539b9141e16f26a22b972377e527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 01:49:05 +0900 Subject: [PATCH 64/86] =?UTF-8?q?refactor:=20getDealerCardStatus=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0=20-=20=20DTO=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=8B=A8=EA=B3=84=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B3=B5=EA=B0=9C=ED=95=A0=20=EC=B9=B4=EB=93=9C=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=EB=A5=BC=20=EA=B2=B0=EC=A0=95=ED=95=98=EA=B3=A0,=20?= =?UTF-8?q?=EB=B7=B0=EB=8A=94=20=EC=A0=84=EB=8B=AC=EB=B0=9B=EC=9D=80=20?= =?UTF-8?q?=EA=B0=92=EB=A7=8C=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 4 ++-- src/main/java/dto/ResultDto.java | 11 +++++++++++ src/main/java/view/OutputView.java | 5 +---- src/test/java/domain/DeckTest.java | 8 ++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 9412c3d0a6d..cdefd06cbad 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -23,11 +23,11 @@ public void run() { PlayersDto playersDto = PlayersDto.from(players); OutputView.printHandOutMessage(playersDto); - OutputView.printCardStatus(playersDto, ResultDto.from(dealer)); + OutputView.printCardStatus(playersDto, ResultDto.fromDealerInitial(dealer)); addPlayersCard(blackjackGame, players); addDealerCards(blackjackGame); - printCardResults(ResultDto.from(dealer), playersDto); + printCardResults(ResultDto.from(dealer), PlayersDto.from(players)); printFinalResults(players, dealer); } diff --git a/src/main/java/dto/ResultDto.java b/src/main/java/dto/ResultDto.java index ca12e28651f..69566e1e552 100644 --- a/src/main/java/dto/ResultDto.java +++ b/src/main/java/dto/ResultDto.java @@ -1,5 +1,6 @@ package dto; +import domain.Dealer; import domain.Participant; import java.util.List; @@ -14,4 +15,14 @@ public static ResultDto from(Participant participant) { return new ResultDto(cardInfo, participant.getHand().getScore().value()); } + + public static ResultDto fromDealerInitial(Dealer dealer){ + List cardInfo = dealer.getHandCards().stream() + .limit(1) + .map(card->card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .toList(); + + return new ResultDto(cardInfo, dealer.getHand().getScore().value()); + } + } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 3258c5c2aef..71a70c3029c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -18,7 +18,7 @@ public static void printHandOutMessage(PlayersDto playersDto) { } public static void printDealerCardStatus(ResultDto resultDto) { - System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getDealerCardStatus(resultDto)); + System.out.printf("%n๋”œ๋Ÿฌ์นด๋“œ: %s%n", getCardStatusFormat(resultDto.cards())); } public static void printPlayerCardStatus(PlayerDto playerDto) { @@ -33,9 +33,6 @@ public static void printCardStatus(PlayersDto playersDto, ResultDto resultDto) { System.out.print(System.lineSeparator()); } - private static String getDealerCardStatus(ResultDto resultDto) { - return resultDto.cards().getFirst(); - } private static String getCardStatusFormat(List cards) { return String.join(", ", cards); diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index 76e4f413800..95bef2ba378 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -26,9 +26,9 @@ public class DeckTest { @Test void ๋ฑ์—_์นด๋“œ_์—†์„_๊ฒฝ์šฐ_์˜ˆ์™ธ_๋ฐœ์ƒ() { - Deck deck = Deck.createDeck(); - List cards = deck.getCards(); - cards.clear(); - assertThatThrownBy(deck::draw).isInstanceOf(IllegalArgumentException.class); + Deck deck = Deck.from(List.of()); + assertThatThrownBy(deck::draw) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("๋ฑ์— ๋‚จ์€ ์นด๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); } } From 7875c22e17d1537225a1a9c471f8c5ff4ef514c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 02:00:32 +0900 Subject: [PATCH 65/86] =?UTF-8?q?refactor:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A4=84=EB=A7=9E=EC=B6=A4(Ctrl+alt+l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackGame.java | 2 +- src/main/java/domain/CardShape.java | 4 ++-- src/main/java/domain/Dealer.java | 2 +- src/main/java/domain/GameResultCalculator.java | 2 +- src/main/java/domain/Hand.java | 2 +- src/main/java/domain/Name.java | 2 +- src/main/java/domain/Participant.java | 12 ++++++------ src/main/java/domain/Player.java | 2 +- src/main/java/dto/PlayersDto.java | 1 + src/main/java/dto/ResultDto.java | 5 +++-- src/main/java/dto/TotalFinalResultsDto.java | 1 + src/main/java/view/InputView.java | 1 + src/main/java/view/OutputView.java | 2 +- src/test/java/domain/DealerTest.java | 2 -- src/test/java/domain/NameTest.java | 4 +--- src/test/java/domain/PlayerTest.java | 5 ++--- src/test/java/domain/PlayersTest.java | 2 +- src/test/java/domain/ScoreCaculatorTest.java | 1 + 18 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index b446f03a4ee..4e02e88168d 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -14,7 +14,7 @@ private BlackjackGame(Deck deck, GameParticipants participants) { this.participants = participants; } - public static BlackjackGame start(List names){ + public static BlackjackGame start(List names) { return start(names, Deck.createDeck()); } diff --git a/src/main/java/domain/CardShape.java b/src/main/java/domain/CardShape.java index 9a3bcc3a1b8..98a12af1f05 100644 --- a/src/main/java/domain/CardShape.java +++ b/src/main/java/domain/CardShape.java @@ -9,10 +9,10 @@ public enum CardShape { private final String name; CardShape(String name) { - this.name=name; + this.name = name; } - public String getName(){ + public String getName() { return name; } } diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index b574ef7770a..afb9dc6862b 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -1,6 +1,6 @@ package domain; -public class Dealer extends Participant{ +public class Dealer extends Participant { private static final int DEALER_CARD_SUM_THRESHOLD = 16; private Dealer(Hand hand) { diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 53fafa02d3b..5952a5629d6 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -1,7 +1,7 @@ package domain; public class GameResultCalculator { - public static TotalFinalResult checkGameResult(Players players, Dealer dealer){ + public static TotalFinalResult checkGameResult(Players players, Dealer dealer) { return TotalFinalResult.from(players.getPlayers().stream() .map(player -> checkFinalResult(player, dealer)) .toList()); diff --git a/src/main/java/domain/Hand.java b/src/main/java/domain/Hand.java index 51bd13bfc2d..ad2b6a8720d 100644 --- a/src/main/java/domain/Hand.java +++ b/src/main/java/domain/Hand.java @@ -9,7 +9,7 @@ public Hand(List cards) { this.cards = cards; } - public void addCard(Card card){ + public void addCard(Card card) { cards.add(card); } diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java index 1f5eaaf151c..b2d64a973ae 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/Name.java @@ -26,7 +26,7 @@ private static void validateLength(String name) { } private static void validateNullOrEmpty(String name) { - if ( name == null|| name.isBlank()) { + if (name == null || name.isBlank()) { throw new IllegalArgumentException("์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ•ด์ฃผ์„ธ์š”."); } } diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 5b28d2bf9a5..1a204c09b76 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -5,23 +5,23 @@ public abstract class Participant { private final Hand hand; - protected Participant(Hand hand){ - this.hand=hand; + protected Participant(Hand hand) { + this.hand = hand; } - public List getHandCards(){ + public List getHandCards() { return hand.getCards(); } - public Hand getHand(){ + public Hand getHand() { return hand; } - public void addHandCard(Card card){ + public void addHandCard(Card card) { hand.addCard(card); } - public boolean isBust(){ + public boolean isBust() { return hand.getScore().isBust(); } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index b1da30c82b6..2bb7557dfd7 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -1,7 +1,7 @@ package domain; -public class Player extends Participant{ +public class Player extends Participant { private final Name name; private Player(Name name, Hand hand) { diff --git a/src/main/java/dto/PlayersDto.java b/src/main/java/dto/PlayersDto.java index 3e8156f4b2b..c62a3e5269e 100644 --- a/src/main/java/dto/PlayersDto.java +++ b/src/main/java/dto/PlayersDto.java @@ -1,6 +1,7 @@ package dto; import domain.Players; + import java.util.List; public record PlayersDto( diff --git a/src/main/java/dto/ResultDto.java b/src/main/java/dto/ResultDto.java index 69566e1e552..d210febf5b9 100644 --- a/src/main/java/dto/ResultDto.java +++ b/src/main/java/dto/ResultDto.java @@ -2,6 +2,7 @@ import domain.Dealer; import domain.Participant; + import java.util.List; public record ResultDto( @@ -16,10 +17,10 @@ public static ResultDto from(Participant participant) { return new ResultDto(cardInfo, participant.getHand().getScore().value()); } - public static ResultDto fromDealerInitial(Dealer dealer){ + public static ResultDto fromDealerInitial(Dealer dealer) { List cardInfo = dealer.getHandCards().stream() .limit(1) - .map(card->card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) .toList(); return new ResultDto(cardInfo, dealer.getHand().getScore().value()); diff --git a/src/main/java/dto/TotalFinalResultsDto.java b/src/main/java/dto/TotalFinalResultsDto.java index 4f127e958be..25c3547dc74 100644 --- a/src/main/java/dto/TotalFinalResultsDto.java +++ b/src/main/java/dto/TotalFinalResultsDto.java @@ -2,6 +2,7 @@ import domain.FinalResult; import domain.TotalFinalResult; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index fe63d095268..f2e7af0632e 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Scanner; + import util.NameParser; public class InputView { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 71a70c3029c..f98069db45c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -5,6 +5,7 @@ import dto.PlayersDto; import dto.ResultDto; import dto.TotalFinalResultsDto; + import java.util.List; import java.util.stream.Collectors; @@ -33,7 +34,6 @@ public static void printCardStatus(PlayersDto playersDto, ResultDto resultDto) { System.out.print(System.lineSeparator()); } - private static String getCardStatusFormat(List cards) { return String.join(", ", cards); } diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index 0a3bd830454..1fed2102a43 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -17,14 +17,12 @@ class DealerTest { Card.of(CardNumber.J, CardShape.CLOVER))))); @Test - @DisplayName("๋”œ๋Ÿฌ ์นด๋“œ 16์ดํ•˜ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") void ๋”œ๋Ÿฌ_16์ดํ•˜_์—ฌ๋ถ€_ํ™•์ธ() { assertThat(underThreshold.checkThreshold()).isTrue(); assertThat(overThreshold.checkThreshold()).isFalse(); } @Test - @DisplayName("์นด๋“œ ์ถ”๊ฐ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") void ์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { underThreshold.addHandCard(Card.of(CardNumber.FIVE, CardShape.DIAMOND)); overThreshold.addHandCard(Card.of(CardNumber.FOUR, CardShape.DIAMOND)); diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index 8338b916dc0..663dfc70f30 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -7,14 +7,12 @@ class NameTest { @Test - @DisplayName("ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์˜ ๊ธธ์ด 20์ž ์ดˆ๊ณผ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") - void ๊ธธ์ด_์ดˆ๊ณผ_์˜ˆ์™ธ๋ฐœ์ƒํ…Œ์ŠคํŠธ() { + void ํ”Œ๋ ˆ์ด์–ด_์ด๋ฆ„_๊ธธ์ด_20์ž_์ดˆ๊ณผ_์˜ˆ์™ธ๋ฐœ์ƒํ…Œ์ŠคํŠธ() { String exceptionName = "ddddddddddddddddddddd"; assertThatThrownBy(() -> Name.from(exceptionName)).isInstanceOf(IllegalArgumentException.class); } @Test - @DisplayName("Null ํ˜น์€ ๋นˆ ๊ฐ’ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ ํ…Œ์ŠคํŠธ") void Null๊ฐ’_ํ˜น์€_๋นˆ๊ฐ’_์˜ˆ์™ธ๋ฐœ์ƒํ…Œ์ŠคํŠธ() { String blankName = " "; String emptyName = ""; diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index 3e8ed36e230..b90170fcdd4 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,8 +19,7 @@ class PlayerTest { Card.of(CardNumber.Q, CardShape.DIAMOND))))); @Test - @DisplayName("ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ถ”๊ฐ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") - void ์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { + void ํ”Œ๋ ˆ์ด์–ด_์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { bustPlayer.addHandCard(Card.of(CardNumber.FIVE, CardShape.DIAMOND)); normalPlayer.addHandCard(Card.of(CardNumber.FOUR, CardShape.DIAMOND)); assertThat(bustPlayer.getHandCards().size()).isEqualTo(4); @@ -27,7 +27,6 @@ class PlayerTest { } @Test - @DisplayName("ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") void ๋ฒ„์ŠคํŠธ_์—ฌ๋ถ€_ํ™•์ธ() { assertThat(bustPlayer.isBust()).isTrue(); assertThat(normalPlayer.isBust()).isFalse(); diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index 13f5b52ed0e..1729bdf4a8f 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,7 +24,6 @@ class PlayersTest { Players allNormalPlayers = Players.from(List.of(normalPlayer, normalPlayer, normalPlayer)); @Test - @DisplayName("๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด๋“ค์˜ ๋ฒ„์ŠคํŠธ ์—ฌ๋ถ€ ํ™•์ธ ํ…Œ์ŠคํŠธ") void ๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด_๋ฒ„์ŠคํŠธ_์—ฌ๋ถ€_ํ™•์ธ() { assertThat(allBustPlayers.isAllBust()).isTrue(); assertThat(containBustPlayers.isAllBust()).isFalse(); diff --git a/src/test/java/domain/ScoreCaculatorTest.java b/src/test/java/domain/ScoreCaculatorTest.java index 076d7814439..6c0a863ff1f 100644 --- a/src/test/java/domain/ScoreCaculatorTest.java +++ b/src/test/java/domain/ScoreCaculatorTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; + import java.util.List; import static org.assertj.core.api.Assertions.assertThat; From a08777d736e167519ed1111d4bbce3d35777e1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 02:05:29 +0900 Subject: [PATCH 66/86] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=88=9C=EC=84=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackGame.java | 50 ++++++++++++------------- src/main/java/domain/Name.java | 7 ++-- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index 4e02e88168d..0111fab8444 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -24,26 +24,6 @@ public static BlackjackGame start(List names, Deck deck) { return new BlackjackGame(deck, GameParticipants.of(dealer, players)); } - private static Players createPlayers(List names, Deck deck) { - List players = new ArrayList<>(); - for (String name : names) { - players.add(createPlayer(name, deck)); - } - return Players.from(players); - } - - private static Player createPlayer(String name, Deck deck) { - return Player.of(Name.from(name), new Hand(initCards(deck))); - } - - private static List initCards(Deck deck) { - List cards = new ArrayList<>(); - for (int count = 0; count < INITIAL_CARD_COUNT; count++) { - cards.add(deck.draw()); - } - return cards; - } - public void addPlayerCard(Player player) { player.addHandCard(deck.draw()); } @@ -56,6 +36,14 @@ public boolean playDealerTurn() { return true; } + public Dealer getDealer() { + return participants.getDealer(); + } + + public Players getPlayers() { + return participants.getPlayers(); + } + private boolean cannotDealerDraw() { return participants.isAllPlayersBust() || !getDealer().checkThreshold(); } @@ -66,11 +54,23 @@ private void drawDealerCards() { } } - public Dealer getDealer() { - return participants.getDealer(); + private static Players createPlayers(List names, Deck deck) { + List players = new ArrayList<>(); + for (String name : names) { + players.add(createPlayer(name, deck)); + } + return Players.from(players); } - public Players getPlayers() { - return participants.getPlayers(); + private static Player createPlayer(String name, Deck deck) { + return Player.of(Name.from(name), new Hand(initCards(deck))); + } + + private static List initCards(Deck deck) { + List cards = new ArrayList<>(); + for (int count = 0; count < INITIAL_CARD_COUNT; count++) { + cards.add(deck.draw()); + } + return cards; } -} +} \ No newline at end of file diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java index b2d64a973ae..07408b954dc 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/Name.java @@ -13,6 +13,10 @@ public static Name from(String name) { return new Name(validateName(name)); } + public String getName() { + return name; + } + private static String validateName(String name) { validateNullOrEmpty(name); validateLength(name); @@ -31,7 +35,4 @@ private static void validateNullOrEmpty(String name) { } } - public String getName() { - return name; - } } From e649ed86ff98d5ce2b3b71b648aae9d098d48d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 02:14:35 +0900 Subject: [PATCH 67/86] =?UTF-8?q?refactor:=20=EB=94=94=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EB=B2=95=EC=B9=99=20=EC=A0=81=EC=9A=A9=20-=20Hand?= =?UTF-8?q?=EC=97=90=20hasScoreLessThanOrEqual=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20Dea?= =?UTF-8?q?ler=EC=9D=98=20checkThreshold=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EC=9D=98=20=EB=B0=98=ED=99=98=EA=B0=92=EC=97=90=EC=84=9C?= =?UTF-8?q?=EC=9D=98=20=EC=A7=84=EC=9E=85=EA=B0=9C=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EC=A4=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 2 +- src/main/java/domain/Hand.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index afb9dc6862b..6665a387d2a 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -12,6 +12,6 @@ public static Dealer from(Hand hand) { } public boolean checkThreshold() { - return getHand().getScore().value() <= DEALER_CARD_SUM_THRESHOLD; + return getHand().hasScoreLessThanOrEqual(DEALER_CARD_SUM_THRESHOLD); } } diff --git a/src/main/java/domain/Hand.java b/src/main/java/domain/Hand.java index ad2b6a8720d..ae15e8b6b0d 100644 --- a/src/main/java/domain/Hand.java +++ b/src/main/java/domain/Hand.java @@ -20,4 +20,9 @@ public Score getScore() { public List getCards() { return List.copyOf(cards); } + + public boolean hasScoreLessThanOrEqual(int value) { + return getScore().value() <= value; + } + } From 5d50dc689bcdf059a20c8fc93be420a80c643988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Thu, 12 Mar 2026 02:42:48 +0900 Subject: [PATCH 68/86] =?UTF-8?q?refactor(all):=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EC=97=90=20=EB=94=94=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EB=B2=95=EC=B9=99=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 2 +- src/main/java/domain/Card.java | 4 ++-- src/main/java/domain/FinalResult.java | 8 ++++++++ src/main/java/domain/GameResultCalculator.java | 3 +-- src/main/java/domain/Participant.java | 8 ++++++++ src/main/java/domain/Player.java | 4 ++++ src/main/java/dto/PlayerDto.java | 2 +- src/main/java/dto/ResultDto.java | 9 +++++---- src/main/java/dto/TotalFinalResultsDto.java | 4 ++-- 9 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index cdefd06cbad..6c099a8fba0 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -38,7 +38,7 @@ private void addPlayersCard(BlackjackGame blackjackGame, Players players) { } private void addPlayerCards(BlackjackGame blackjackGame, Player player) { - while (!player.isBust() && InputView.checkAddCard(player.getName().getName())) { + while (!player.isBust() && InputView.checkAddCard(player.getNameValue())) { blackjackGame.addPlayerCard(player); OutputView.printPlayerCardStatus(PlayerDto.from(player)); } diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index cb2c09cac83..75ceb65f3c8 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -17,7 +17,7 @@ public CardNumber getCardNumber() { return cardNumber; } - public CardShape getCardShape() { - return cardShape; + public String getDisplayName() { + return cardNumber.getSymbol() + cardShape.getName(); } } diff --git a/src/main/java/domain/FinalResult.java b/src/main/java/domain/FinalResult.java index 3b7c1fc8b3b..0292c6b43d5 100644 --- a/src/main/java/domain/FinalResult.java +++ b/src/main/java/domain/FinalResult.java @@ -20,4 +20,12 @@ public Name getName() { public ResultType getResultType() { return resultType; } + + public String getNameText() { + return name.getName(); + } + + public String getResultText() { + return resultType.getType(); + } } \ No newline at end of file diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 5952a5629d6..bb35b23a513 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -9,8 +9,7 @@ public static TotalFinalResult checkGameResult(Players players, Dealer dealer) { private static FinalResult checkFinalResult(Player player, Dealer dealer) { return FinalResult.from(player.getName(), - getResultType(player.getHand().getScore(), - dealer.getHand().getScore())); + getResultType(player.getScore(), dealer.getScore())); } private static ResultType getResultType(Score playerScore, Score dealerScore) { diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 1a204c09b76..ef612f92e09 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -24,4 +24,12 @@ public void addHandCard(Card card) { public boolean isBust() { return hand.getScore().isBust(); } + + public Score getScore() { + return hand.getScore(); + } + + public int getScoreValue() { + return hand.getScore().value(); + } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 2bb7557dfd7..0e3c40fa39e 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -16,4 +16,8 @@ public static Player of(Name name, Hand hand) { public Name getName() { return name; } + + public String getNameValue() { + return name.getName(); + } } diff --git a/src/main/java/dto/PlayerDto.java b/src/main/java/dto/PlayerDto.java index b746027b8b9..466c62c1a98 100644 --- a/src/main/java/dto/PlayerDto.java +++ b/src/main/java/dto/PlayerDto.java @@ -7,6 +7,6 @@ public record PlayerDto( ResultDto resultDto ) { public static PlayerDto from(Player player) { - return new PlayerDto(player.getName().getName(), ResultDto.from(player)); + return new PlayerDto(player.getNameValue(), ResultDto.from(player)); } } diff --git a/src/main/java/dto/ResultDto.java b/src/main/java/dto/ResultDto.java index d210febf5b9..84df7101270 100644 --- a/src/main/java/dto/ResultDto.java +++ b/src/main/java/dto/ResultDto.java @@ -1,5 +1,6 @@ package dto; +import domain.Card; import domain.Dealer; import domain.Participant; @@ -11,19 +12,19 @@ public record ResultDto( ) { public static ResultDto from(Participant participant) { List cardInfo = participant.getHandCards().stream() - .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .map(Card::getDisplayName) .toList(); - return new ResultDto(cardInfo, participant.getHand().getScore().value()); + return new ResultDto(cardInfo, participant.getScoreValue()); } public static ResultDto fromDealerInitial(Dealer dealer) { List cardInfo = dealer.getHandCards().stream() .limit(1) - .map(card -> card.getCardNumber().getSymbol() + card.getCardShape().getName()) + .map(Card::getDisplayName) .toList(); - return new ResultDto(cardInfo, dealer.getHand().getScore().value()); + return new ResultDto(cardInfo, dealer.getScoreValue()); } } diff --git a/src/main/java/dto/TotalFinalResultsDto.java b/src/main/java/dto/TotalFinalResultsDto.java index 25c3547dc74..0ad8bcf1a9d 100644 --- a/src/main/java/dto/TotalFinalResultsDto.java +++ b/src/main/java/dto/TotalFinalResultsDto.java @@ -14,8 +14,8 @@ public static TotalFinalResultsDto from(TotalFinalResult totalFinalResult) { List totalResults = new ArrayList<>(); for (FinalResult finalResult : finalResults) { totalResults.add(String.format("%s: %s%n", - finalResult.getName().getName(), - finalResult.getResultType().getType())); + finalResult.getNameText(), + finalResult.getResultText())); } return new TotalFinalResultsDto(totalResults); From 35c13aae4d02e55c3f771e6695a473f1b784f170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 10:59:37 +0900 Subject: [PATCH 69/86] =?UTF-8?q?test:=20BettingMoney=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BettingMoneyTest.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/java/domain/BettingMoneyTest.java diff --git a/src/test/java/domain/BettingMoneyTest.java b/src/test/java/domain/BettingMoneyTest.java new file mode 100644 index 00000000000..b8526e4bf4f --- /dev/null +++ b/src/test/java/domain/BettingMoneyTest.java @@ -0,0 +1,23 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class BettingMoneyTest { + + @Test + void ๋ฒ ํŒ…๊ธˆ์•ก์„_์ƒ์„ฑํ• _์ˆ˜_์žˆ๋‹ค(){ + BettingMoney bettingMoney = BettingMoney.of(1000); + assertThat(bettingMoney.getMoney()).isEqualTo(1000); + } + + @Test + void ๋ฒ ํŒ…๊ธˆ์•ก์ด_0์ดํ•˜๋ฉด_์˜ˆ์™ธ๊ฐ€_๋ฐœ์ƒํ•œ๋‹ค(){ + assertThatThrownBy(() -> BettingMoney.of(0)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> BettingMoney.of(-1000)) + .isInstanceOf(IllegalArgumentException.class); + } +} From 238769e3004c4d12f2e3a2365bf664cf1dffe460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:00:07 +0900 Subject: [PATCH 70/86] =?UTF-8?q?feat:=20=EB=B0=B0=ED=8C=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Bet?= =?UTF-8?q?tingMoney=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BettingMoney.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/domain/BettingMoney.java diff --git a/src/main/java/domain/BettingMoney.java b/src/main/java/domain/BettingMoney.java new file mode 100644 index 00000000000..32127ee7b72 --- /dev/null +++ b/src/main/java/domain/BettingMoney.java @@ -0,0 +1,24 @@ +package domain; + +public class BettingMoney { + private final int money; + + private BettingMoney(int money) { + validate(money); + this.money = money; + } + + public static BettingMoney of(int money){ + return new BettingMoney(money); + } + + private void validate(int money){ + if(money<=0){ + throw new IllegalArgumentException("๋ฐฐํŒ… ๊ธˆ์•ก์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค."); + } + } + + public int getMoney(){ + return money; + } +} From a88c4c69ad3c3eca564102740f0347c16ca7becc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:00:46 +0900 Subject: [PATCH 71/86] =?UTF-8?q?feat:=20Hand=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9D=84=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=ED=95=98=EB=8A=94=20isBlackjack=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Hand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/Hand.java b/src/main/java/domain/Hand.java index ae15e8b6b0d..06600193f47 100644 --- a/src/main/java/domain/Hand.java +++ b/src/main/java/domain/Hand.java @@ -25,4 +25,8 @@ public boolean hasScoreLessThanOrEqual(int value) { return getScore().value() <= value; } + public boolean isBlackjack(){ + return cards.size() == 2 && getScore().value()==21; + } + } From f743aa873f24c60b42305cd4414ade0540f3e98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:03:49 +0900 Subject: [PATCH 72/86] =?UTF-8?q?test:=20Hand=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20-=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20=ED=8C=90=EB=8B=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/HandTest.java | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/domain/HandTest.java diff --git a/src/test/java/domain/HandTest.java b/src/test/java/domain/HandTest.java new file mode 100644 index 00000000000..dd0a3132aa1 --- /dev/null +++ b/src/test/java/domain/HandTest.java @@ -0,0 +1,38 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HandTest { + + @Test + void ์ฒ˜์Œ_๋‘์žฅ_ํ•ฉ์ด_21์ด๋ฉด_๋ธ”๋ž™์žญ์ด๋‹ค(){ + Hand hand = new Hand(List.of( + Card.of(CardNumber.ACE, CardShape.CLOVER), + Card.of(CardNumber.J, CardShape.SPADE) + )); + assertThat(hand.isBlackjack()).isTrue(); + } + + @Test + void ์นด๋“œ๊ฐ€_์„ธ์žฅ์ด๋ฉด_21์ด์–ด๋„_๋ธ”๋ž™์žญ์ด_์•„๋‹ˆ๋‹ค(){ + Hand hand = new Hand(List.of( + Card.of(CardNumber.ACE, CardShape.CLOVER), + Card.of(CardNumber.FIVE, CardShape.SPADE), + Card.of(CardNumber.FIVE, CardShape.DIAMOND) + )); + assertThat(hand.isBlackjack()).isFalse(); + } + + @Test + void ๋‘์žฅ์ด์ง€๋งŒ_ํ•ฉ์ด_21์ด_์•„๋‹ˆ๋ฉด_๋ธ”๋ž™์žญ์ด_์•„๋‹ˆ๋‹ค(){ + Hand hand = new Hand(List.of( + Card.of(CardNumber.ACE, CardShape.CLOVER), + Card.of(CardNumber.FIVE, CardShape.DIAMOND) + )); + assertThat(hand.isBlackjack()).isFalse(); + } +} From ac97136c60ee7c83c032366f453b4b29a560690a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:05:34 +0900 Subject: [PATCH 73/86] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/GameResultCalculator.java | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 src/main/java/domain/GameResultCalculator.java diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java deleted file mode 100644 index bb35b23a513..00000000000 --- a/src/main/java/domain/GameResultCalculator.java +++ /dev/null @@ -1,24 +0,0 @@ -package domain; - -public class GameResultCalculator { - public static TotalFinalResult checkGameResult(Players players, Dealer dealer) { - return TotalFinalResult.from(players.getPlayers().stream() - .map(player -> checkFinalResult(player, dealer)) - .toList()); - } - - private static FinalResult checkFinalResult(Player player, Dealer dealer) { - return FinalResult.from(player.getName(), - getResultType(player.getScore(), dealer.getScore())); - } - - private static ResultType getResultType(Score playerScore, Score dealerScore) { - if (playerScore.isBust() || (playerScore.value() < dealerScore.value() && !dealerScore.isBust())) { - return ResultType.LOSE; - } - if (dealerScore.isBust() || playerScore.value() > dealerScore.value()) { - return ResultType.WIN; - } - return ResultType.DRAW; - } -} From 6d807007da6779ab898f05a737d9c897ca6f348d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:07:44 +0900 Subject: [PATCH 74/86] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=B4=EB=A6=84=EA=B3=BC=20=EB=B0=B0=ED=8C=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=EC=9D=84=20=EA=B0=80=EC=A7=80=EA=B3=A0=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20PlayerCreationInfo=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/PlayerCreationInfoTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/java/domain/PlayerCreationInfoTest.java diff --git a/src/test/java/domain/PlayerCreationInfoTest.java b/src/test/java/domain/PlayerCreationInfoTest.java new file mode 100644 index 00000000000..e1f0694a525 --- /dev/null +++ b/src/test/java/domain/PlayerCreationInfoTest.java @@ -0,0 +1,18 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerCreationInfoTest { + + @Test + void ํ”Œ๋ ˆ์ด์–ด_์ƒ์„ฑ์ •๋ณด๋ฅผ_๋งŒ๋“ค_์ˆ˜_์žˆ๋‹ค(){ + Name name = Name.from("pobi"); + BettingMoney bettingMoney = BettingMoney.of(1000); + PlayerCreationInfo playerCreationInfo = PlayerCreationInfo.of(name, bettingMoney); + + assertThat(playerCreationInfo.getName()).isEqualTo(name); + assertThat(playerCreationInfo.getBettingMoney()).isEqualTo(bettingMoney); + } +} From edae525fd99073cd55f5fc06d137eda27d328958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:07:53 +0900 Subject: [PATCH 75/86] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=B4=EB=A6=84=EA=B3=BC=20=EB=B0=B0=ED=8C=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=EC=9D=84=20=EA=B0=80=EC=A7=80=EA=B3=A0=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20PlayerCreationInfo=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/PlayerCreationInfo.java | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/domain/PlayerCreationInfo.java diff --git a/src/main/java/domain/PlayerCreationInfo.java b/src/main/java/domain/PlayerCreationInfo.java new file mode 100644 index 00000000000..b1aca84ce7b --- /dev/null +++ b/src/main/java/domain/PlayerCreationInfo.java @@ -0,0 +1,24 @@ +package domain; + +public class PlayerCreationInfo { + private final Name name; + private final BettingMoney bettingMoney; + + private PlayerCreationInfo(Name name, BettingMoney bettingMoney){ + this.name = name; + this.bettingMoney = bettingMoney; + } + + public static PlayerCreationInfo of(Name name, BettingMoney bettingMoney){ + return new PlayerCreationInfo(name, bettingMoney); + } + + public Name getName(){ + return name; + } + + public BettingMoney getBettingMoney(){ + return bettingMoney; + } + +} From ade6ff6756bb3115d23418b4261e8a676a69f470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:12:01 +0900 Subject: [PATCH 76/86] =?UTF-8?q?refactor:=20=EB=A7=88=EC=A7=80=EB=A7=89?= =?UTF-8?q?=20=EC=A4=84=20=EA=B0=9C=ED=96=89=EB=AC=B8=EC=9E=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/FinalResult.java | 2 +- src/main/java/domain/GameParticipants.java | 6 +++--- src/test/java/domain/DealerTest.java | 2 +- src/test/java/domain/NameTest.java | 2 +- .../{ScoreCaculatorTest.java => ScoreCalculatorTest.java} | 3 +-- 5 files changed, 7 insertions(+), 8 deletions(-) rename src/test/java/domain/{ScoreCaculatorTest.java => ScoreCalculatorTest.java} (84%) diff --git a/src/main/java/domain/FinalResult.java b/src/main/java/domain/FinalResult.java index 0292c6b43d5..87dfcc208a9 100644 --- a/src/main/java/domain/FinalResult.java +++ b/src/main/java/domain/FinalResult.java @@ -28,4 +28,4 @@ public String getNameText() { public String getResultText() { return resultType.getType(); } -} \ No newline at end of file +} diff --git a/src/main/java/domain/GameParticipants.java b/src/main/java/domain/GameParticipants.java index 37a7bfb9a13..18ec446d430 100644 --- a/src/main/java/domain/GameParticipants.java +++ b/src/main/java/domain/GameParticipants.java @@ -21,7 +21,7 @@ public Players getPlayers() { return players; } - public boolean isAllPlayersBust() { - return players.isAllBust(); + public boolean cannotDealerDraw() { + return players.isAllBust() || !dealer.checkThreshold(); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index 1fed2102a43..728dde56471 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -29,4 +29,4 @@ class DealerTest { assertThat(underThreshold.getHandCards().size()).isEqualTo(3); assertThat(overThreshold.getHandCards().size()).isEqualTo(3); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index 663dfc70f30..dd4aa27a231 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -21,4 +21,4 @@ class NameTest { assertThatThrownBy(() -> Name.from(emptyName)).isInstanceOf(IllegalArgumentException.class); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/ScoreCaculatorTest.java b/src/test/java/domain/ScoreCalculatorTest.java similarity index 84% rename from src/test/java/domain/ScoreCaculatorTest.java rename to src/test/java/domain/ScoreCalculatorTest.java index 6c0a863ff1f..49d057b6982 100644 --- a/src/test/java/domain/ScoreCaculatorTest.java +++ b/src/test/java/domain/ScoreCalculatorTest.java @@ -7,8 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ScoreCaculatorTest { - @DisplayName("์ ์ˆ˜ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ") +public class ScoreCalculatorTest { @Test void ์ ์ˆ˜_๊ณ„์‚ฐ_ํ…Œ์ŠคํŠธ() { List cards = List.of(Card.of(CardNumber.J, CardShape.CLOVER), Card.of(CardNumber.Q, CardShape.CLOVER)); From 91f074053cd3b2b1ddc4f181d47ba5a29078c419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:15:58 +0900 Subject: [PATCH 77/86] =?UTF-8?q?test:=20=EC=88=98=EC=9D=B5=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EC=9D=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/ProfitCalculatorTest.java | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 src/test/java/domain/ProfitCalculatorTest.java diff --git a/src/test/java/domain/ProfitCalculatorTest.java b/src/test/java/domain/ProfitCalculatorTest.java new file mode 100644 index 00000000000..f9baeb103fe --- /dev/null +++ b/src/test/java/domain/ProfitCalculatorTest.java @@ -0,0 +1,153 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ProfitCalculatorTest { + + @Test + void ํ”Œ๋ ˆ์ด์–ด๊ฐ€_๋ฒ„์ŠคํŠธ๋ฉด_๋ฐฐํŒ…๊ธˆ์•ก๋งŒํผ_์žƒ๋Š”๋‹ค() { + Player player = player("pobi",1000, + card(CardNumber.K, CardShape.SPADE), + card(CardNumber.Q, CardShape.HEART), + card(CardNumber.TWO, CardShape.CLOVER)); + + Dealer dealer = dealer( + card(CardNumber.TEN, CardShape.DIAMOND), + card(CardNumber.SEVEN, CardShape.CLOVER)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + + assertThat(profit).isEqualTo(-1000); + } + + @Test + void ํ”Œ๋ ˆ์ด์–ด๊ฐ€_๋ธ”๋ž™์žญ์ด๋ฉด_๋ฐฐํŒ…๊ธˆ์•ก์˜_1์ 5๋ฐฐ๋ฅผ_๋ฒˆ๋‹ค(){ + Player player = player("pobi",1000, + card(CardNumber.ACE, CardShape.DIAMOND), + card(CardNumber.K, CardShape.CLOVER)); + + Dealer dealer = dealer( + card(CardNumber.TEN, CardShape.CLOVER), + card(CardNumber.EIGHT, CardShape.DIAMOND)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + assertThat(profit).isEqualTo(1500); + } + + @Test + void ํ”Œ๋ ˆ์ด์–ด์™€_๋”œ๋Ÿฌ๊ฐ€_๋ชจ๋‘_๋ธ”๋ž™์žญ์ด๋ฉด_๋ฌด์Šน๋ถ€๋‹ค(){ + Player player = player("pobi",1000, + card(CardNumber.ACE, CardShape.SPADE), + card(CardNumber.K, CardShape.HEART)); + + Dealer dealer = dealer( + card(CardNumber.ACE, CardShape.DIAMOND), + card(CardNumber.Q, CardShape.CLOVER)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + + assertThat(profit).isEqualTo(0); + } + + @Test + void ๋”œ๋Ÿฌ๊ฐ€_๋ฒ„์ŠคํŠธ๋ฉด_ํ”Œ๋ ˆ์ด์–ด๋Š”_๋ฐฐํŒ…๊ธˆ์•ก๋งŒํผ_์ˆ˜์ต(){ + Player player = player("pobi",1000, + card(CardNumber.TEN, CardShape.SPADE), + card(CardNumber.NINE, CardShape.HEART)); + + Dealer dealer = dealer( + card(CardNumber.K, CardShape.DIAMOND), + card(CardNumber.TWO, CardShape.CLOVER), + card(CardNumber.Q, CardShape.HEART)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + + assertThat(profit).isEqualTo(1000); + } + + @Test + void ํ”Œ๋ ˆ์ด์–ด_์ ์ˆ˜๊ฐ€_๋”_ํฌ๋ฉด_๋ฐฐํŒ…๊ธˆ์•ก๋งŒํผ_์ˆ˜์ต(){ + Player player = player("pobi",1000, + card(CardNumber.EIGHT, CardShape.DIAMOND), + card(CardNumber.K, CardShape.SPADE)); + + Dealer dealer = dealer( + card(CardNumber.TEN, CardShape.CLOVER), + card(CardNumber.SEVEN, CardShape.HEART)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + assertThat(profit).isEqualTo(1000); + } + @Test + void ํ”Œ๋ ˆ์ด์–ด_์ ์ˆ˜๊ฐ€_๋”_์ž‘์œผ๋ฉด_๋ฐฐํŒ…๊ธˆ์•ก๋งŒํผ_์žƒ๋Š”๋‹ค() { + Player player = player("pobi",1000, + card(CardNumber.TEN, CardShape.SPADE), + card(CardNumber.SEVEN, CardShape.HEART)); + + Dealer dealer = dealer( + card(CardNumber.TEN, CardShape.DIAMOND), + card(CardNumber.NINE, CardShape.CLOVER)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + + assertThat(profit).isEqualTo(-1000); + } + + @Test + void ์ ์ˆ˜๊ฐ€_๊ฐ™์œผ๋ฉด_๋ฌด์Šน๋ถ€๋‹ค() { + Player player = player("pobi",1000, + card(CardNumber.TEN, CardShape.SPADE), + card(CardNumber.EIGHT, CardShape.HEART)); + + Dealer dealer = dealer( + card(CardNumber.NINE, CardShape.DIAMOND), + card(CardNumber.NINE, CardShape.CLOVER)); + + double profit = ProfitCalculator.calculatePlayerProfit(player, dealer); + + assertThat(profit).isEqualTo(0); + } + + @Test + void ๋”œ๋Ÿฌ_์ˆ˜์ต์€_๋ชจ๋“ _ํ”Œ๋ ˆ์ด์–ด_์ˆ˜์ต์˜_๋ฐ˜๋Œ€๊ฐ’์ด๋‹ค() { + Player winPlayer = player("pobi", 1000, + card(CardNumber.TEN, CardShape.SPADE), + card(CardNumber.NINE, CardShape.HEART)); + + Player losePlayer = player("jason", 2000, + card(CardNumber.TEN, CardShape.CLOVER), + card(CardNumber.SEVEN, CardShape.DIAMOND)); + + Dealer dealer = dealer( + card(CardNumber.TEN, CardShape.DIAMOND), + card(CardNumber.EIGHT, CardShape.CLOVER)); + + Players players = Players.from(List.of(winPlayer, losePlayer)); + + double dealerProfit = ProfitCalculator.calculateDealerProfit(players, dealer); + + assertThat(dealerProfit).isEqualTo(1000); + } + + + private Player player(String name, int bettingMoney, Card... cards) { + return Player.of( + Name.from(name), + new Hand(List.of(cards)), + BettingMoney.of(bettingMoney) + ); + } + + private Dealer dealer(Card... cards) { + return Dealer.from(new Hand(List.of(cards))); + } + + private Card card(CardNumber cardNumber, CardShape cardShape){ + return Card.of(cardNumber, cardShape); + } + +} From 545e9edd48c61ed06215a49fac7955e948f8d3e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:16:18 +0900 Subject: [PATCH 78/86] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EC=9D=84=20=EB=8B=B4=EB=8B=B9=ED=95=98=EB=8A=94=20Pro?= =?UTF-8?q?fitCalculator=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/ProfitCalculator.java | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/domain/ProfitCalculator.java diff --git a/src/main/java/domain/ProfitCalculator.java b/src/main/java/domain/ProfitCalculator.java new file mode 100644 index 00000000000..afd3c50e20a --- /dev/null +++ b/src/main/java/domain/ProfitCalculator.java @@ -0,0 +1,47 @@ +package domain; + +public class ProfitCalculator { + private static final double BLACKJACK_PROFIT_RATE = 1.5; + + public static double calculatePlayerProfit(Player player, Dealer dealer) { + int bettingMoney = player.getBettingMoneyValue(); + int playerScore = player.getScoreValue(); + int dealerScore = dealer.getScoreValue(); + + if (player.isBlackjack() && dealer.isBlackjack()) { + return 0; + } + if (player.isBlackjack()) { + return bettingMoney * BLACKJACK_PROFIT_RATE; + } + if (dealer.isBlackjack()) { + return -bettingMoney; + } + if (player.isBust()) { + return -bettingMoney; + } + if (dealer.isBust()) { + return bettingMoney; + } + if (playerScore > dealerScore) { + return bettingMoney; + } + if (playerScore < dealerScore) { + return -bettingMoney; + } + return 0; + } + + public static double calculateDealerProfit(Players players, Dealer dealer) { + return -players.getPlayers().stream() + .mapToDouble(player -> calculatePlayerProfit(player, dealer)) + .sum(); + } + + public static String formatProfit(double profit) { + if (profit == (long) profit) { + return String.valueOf((long) profit); + } + return String.valueOf(profit); + } +} From 85c4481daddb155f02a8ca88d150d4fbd39999ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:18:07 +0900 Subject: [PATCH 79/86] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlayerCreationInfo ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ --- src/main/java/domain/BlackjackGame.java | 30 ++++++++++++++----------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index 0111fab8444..a0f14045709 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -14,13 +14,13 @@ private BlackjackGame(Deck deck, GameParticipants participants) { this.participants = participants; } - public static BlackjackGame start(List names) { - return start(names, Deck.createDeck()); + public static BlackjackGame start(List playerCreationInfos) { + return start(playerCreationInfos, Deck.createDeck()); } - public static BlackjackGame start(List names, Deck deck) { + public static BlackjackGame start(List playerCreationInfos, Deck deck) { Dealer dealer = Dealer.from(new Hand(initCards(deck))); - Players players = createPlayers(names, deck); + Players players = createPlayers(playerCreationInfos, deck); return new BlackjackGame(deck, GameParticipants.of(dealer, players)); } @@ -29,7 +29,7 @@ public void addPlayerCard(Player player) { } public boolean playDealerTurn() { - if (cannotDealerDraw()) { + if (participants.cannotDealerDraw()) { return false; } drawDealerCards(); @@ -44,8 +44,8 @@ public Players getPlayers() { return participants.getPlayers(); } - private boolean cannotDealerDraw() { - return participants.isAllPlayersBust() || !getDealer().checkThreshold(); + public List getPlayersValue() { + return participants.getPlayers().getPlayers(); } private void drawDealerCards() { @@ -54,16 +54,20 @@ private void drawDealerCards() { } } - private static Players createPlayers(List names, Deck deck) { + private static Players createPlayers(List playerCreationInfos, Deck deck) { List players = new ArrayList<>(); - for (String name : names) { - players.add(createPlayer(name, deck)); + for (PlayerCreationInfo playerCreationInfo : playerCreationInfos) { + players.add(createPlayer(playerCreationInfo, deck)); } return Players.from(players); } - private static Player createPlayer(String name, Deck deck) { - return Player.of(Name.from(name), new Hand(initCards(deck))); + private static Player createPlayer(PlayerCreationInfo playerCreationInfo, Deck deck) { + return Player.of( + playerCreationInfo.getName(), + new Hand(initCards(deck)), + playerCreationInfo.getBettingMoney() + ); } private static List initCards(Deck deck) { @@ -73,4 +77,4 @@ private static List initCards(Deck deck) { } return cards; } -} \ No newline at end of file +} From e34f9d1117b7ec38b9093c86facdb730ebfd42c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:18:27 +0900 Subject: [PATCH 80/86] =?UTF-8?q?refactor(test):=20=EB=B0=B0=ED=8C=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlayerCreationInfo ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ --- src/test/java/domain/BlackjackGameTest.java | 53 ++++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/src/test/java/domain/BlackjackGameTest.java b/src/test/java/domain/BlackjackGameTest.java index b3861e36ae1..09467ac3437 100644 --- a/src/test/java/domain/BlackjackGameTest.java +++ b/src/test/java/domain/BlackjackGameTest.java @@ -8,12 +8,17 @@ class BlackjackGameTest { @Test void ๊ฒŒ์ž„_์‹œ์ž‘์‹œ_๋”œ๋Ÿฌ์™€_ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ_์นด๋“œ2์žฅ_๋ฐฐ๋ถ„() { - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi", "jason")); + List playerCreationInfos = List.of( + PlayerCreationInfo.of(Name.from("pobi"), BettingMoney.of(1000)), + PlayerCreationInfo.of(Name.from("jason"), BettingMoney.of(2000)) + ); + + BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos); Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); - assertThat(dealer.getHand().getCards()).hasSize(2); + assertThat(dealer.getHandCards()).hasSize(2); assertThat(players.getPlayers()).hasSize(2); for (Player player : players.getPlayers()) { @@ -31,11 +36,14 @@ class BlackjackGameTest { Card.of(CardNumber.TWO, CardShape.SPADE) // player draw )); - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); - Player player = blackjackGame.getPlayers().getPlayers().getFirst(); + List playerCreationInfos = List.of( + PlayerCreationInfo.of(Name.from("pobi"), BettingMoney.of(1000)) + ); - int before = player.getHand().getCards().size(); + BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos, deck); + Player player = blackjackGame.getPlayersValue().getFirst(); + int before = player.getHand().getCards().size(); blackjackGame.addPlayerCard(player); assertThat(player.getHand().getCards()).hasSize(before + 1); @@ -51,18 +59,21 @@ class BlackjackGameTest { Card.of(CardNumber.THREE, CardShape.SPADE) // player draw -> 22 )); - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); - Player player = blackjackGame.getPlayers().getPlayers().getFirst(); + List playerCreationInfos = List.of( + PlayerCreationInfo.of(Name.from("pobi"), BettingMoney.of(1000)) + ); + BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos, deck); + Player player = blackjackGame.getPlayersValue().getFirst(); Dealer dealer = blackjackGame.getDealer(); - int dealerCardCountBefore = dealer.getHand().getCards().size(); + int dealerCardCountBefore = dealer.getHandCards().size(); blackjackGame.addPlayerCard(player); boolean result = blackjackGame.playDealerTurn(); assertThat(player.isBust()).isTrue(); assertThat(result).isFalse(); - assertThat(dealer.getHand().getCards()).hasSize(dealerCardCountBefore); + assertThat(dealer.getHandCards()).hasSize(dealerCardCountBefore); } @Test @@ -75,15 +86,18 @@ class BlackjackGameTest { Card.of(CardNumber.TWO, CardShape.SPADE) // dealer draw -> 18 )); - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); - Dealer dealer = blackjackGame.getDealer(); + List playerCreationInfos = List.of( + PlayerCreationInfo.of(Name.from("pobi"), BettingMoney.of(1000)) + ); - int dealerCardCountBefore = dealer.getHand().getCards().size(); + BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos, deck); + Dealer dealer = blackjackGame.getDealer(); + int dealerCardCountBefore = dealer.getHandCards().size(); boolean result = blackjackGame.playDealerTurn(); assertThat(result).isTrue(); - assertThat(dealer.getHand().getCards().size()).isGreaterThan(dealerCardCountBefore); + assertThat(dealer.getHandCards().size()).isGreaterThan(dealerCardCountBefore); } @Test @@ -95,14 +109,17 @@ class BlackjackGameTest { Card.of(CardNumber.SIX, CardShape.DIAMOND) // player 2 -> 15 )); - BlackjackGame blackjackGame = BlackjackGame.start(List.of("pobi"), deck); - Dealer dealer = blackjackGame.getDealer(); + List playerCreationInfos = List.of( + PlayerCreationInfo.of(Name.from("pobi"), BettingMoney.of(1000)) + ); - int dealerCardCountBefore = dealer.getHand().getCards().size(); + BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos, deck); + Dealer dealer = blackjackGame.getDealer(); + int dealerCardCountBefore = dealer.getHandCards().size(); boolean result = blackjackGame.playDealerTurn(); assertThat(result).isFalse(); - assertThat(dealer.getHand().getCards()).hasSize(dealerCardCountBefore); + assertThat(dealer.getHandCards()).hasSize(dealerCardCountBefore); } -} \ No newline at end of file +} From 34cc79dccaeace4ed67b8b7c29924a9c2bb53432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:19:46 +0900 Subject: [PATCH 81/86] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=B6=94=EA=B0=80,=20=EC=B5=9C=EC=A2=85?= =?UTF-8?q?=20=EC=88=98=EC=9D=B5=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 9 ++++++++- src/main/java/view/OutputView.java | 13 ++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index f2e7af0632e..a85bac2c79d 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -10,11 +10,18 @@ public class InputView { public static List readParticipants() { System.out.println("๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)"); - return NameParser.parse(scanner.nextLine()); + String input = scanner.nextLine(); + System.out.println(); + return NameParser.parse(input); } public static boolean checkAddCard(String name) { System.out.printf("%s๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)%n", name); return scanner.nextLine().equalsIgnoreCase("y"); } + + public static Integer readBettingMoney(String name){ + System.out.printf("%s์˜ ๋ฐฐํŒ… ๊ธˆ์•ก์€?%n",name); + return Integer.parseInt(scanner.nextLine()); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index f98069db45c..434bb78165a 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -15,7 +15,7 @@ public static void printHandOutMessage(PlayersDto playersDto) { .map(PlayerDto::name) .collect(Collectors.joining(",")); - System.out.print("\n๋”œ๋Ÿฌ์™€ " + playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); + System.out.print("๋”œ๋Ÿฌ์™€ " + playersName + "์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค."); } public static void printDealerCardStatus(ResultDto resultDto) { @@ -65,12 +65,11 @@ private static void printPlayerCardResult(PlayerDto playerDto) { playerDto.resultDto().score()); } - public static void printTotalResult(DealerFinalResultDto dealerFinalResultDto, - TotalFinalResultsDto totalFinalResultsDto) { - System.out.println("\n\n## ์ตœ์ข… ์ŠนํŒจ"); - System.out.print(dealerFinalResultDto.result()); - for (String finalResult : totalFinalResultsDto.totalResults()) { - System.out.print(finalResult); + public static void printTotalProfit(String dealerProfit, List playerProfitResults) { + System.out.println("\n\n## ์ตœ์ข… ์ˆ˜์ต"); + System.out.printf("๋”œ๋Ÿฌ: %s%n", dealerProfit); + for (String playerProfitResult : playerProfitResults) { + System.out.print(playerProfitResult); } } } From 7b050bbfd2a8ff77f21d3e14b23fe80b73cc371f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:22:40 +0900 Subject: [PATCH 82/86] =?UTF-8?q?refactor(test):=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/PlayerTest.java | 8 +++++--- src/test/java/domain/PlayersTest.java | 13 ++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index b90170fcdd4..2d6c59b3f62 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -12,11 +12,13 @@ class PlayerTest { Player bustPlayer = Player.of(Name.from("pobi"), new Hand(new ArrayList<>(List.of( Card.of(CardNumber.J, CardShape.CLOVER), Card.of(CardNumber.K, CardShape.HEART), - Card.of(CardNumber.Q, CardShape.DIAMOND))))); + Card.of(CardNumber.Q, CardShape.DIAMOND)))), + BettingMoney.of(1000)); Player normalPlayer = Player.of(Name.from("jason"), new Hand(new ArrayList<>(List.of( Card.of(CardNumber.J, CardShape.CLOVER), - Card.of(CardNumber.Q, CardShape.DIAMOND))))); + Card.of(CardNumber.Q, CardShape.DIAMOND)))), + BettingMoney.of(2000)); @Test void ํ”Œ๋ ˆ์ด์–ด_์นด๋“œ_์ถ”๊ฐ€_ํ™•์ธ() { @@ -31,4 +33,4 @@ class PlayerTest { assertThat(bustPlayer.isBust()).isTrue(); assertThat(normalPlayer.isBust()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index 1729bdf4a8f..553b0b7d33a 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -11,13 +11,16 @@ class PlayersTest { Player bustPlayer = Player.of(Name.from("pobi"), new Hand(new ArrayList<>(List.of( - Card.of(CardNumber.J, CardShape.CLOVER), - Card.of(CardNumber.K, CardShape.HEART), - Card.of(CardNumber.Q, CardShape.DIAMOND))))); + Card.of(CardNumber.J, CardShape.CLOVER), + Card.of(CardNumber.K, CardShape.HEART), + Card.of(CardNumber.Q, CardShape.DIAMOND)))) + , BettingMoney.of(1000) + ); Player normalPlayer = Player.of(Name.from("jason"), new Hand(new ArrayList<>(List.of( Card.of(CardNumber.J, CardShape.CLOVER), - Card.of(CardNumber.Q, CardShape.DIAMOND))))); + Card.of(CardNumber.Q, CardShape.DIAMOND)))), + BettingMoney.of(2000)); Players allBustPlayers = Players.from(List.of(bustPlayer, bustPlayer, bustPlayer)); Players containBustPlayers = Players.from(List.of(bustPlayer, normalPlayer, normalPlayer)); @@ -29,4 +32,4 @@ class PlayersTest { assertThat(containBustPlayers.isAllBust()).isFalse(); assertThat(allNormalPlayers.isAllBust()).isFalse(); } -} \ No newline at end of file +} From dca12aab84f49e078ad1089dc09848005c989d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:24:50 +0900 Subject: [PATCH 83/86] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=91=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Player: ์ƒ์„ฑ์ž๋ถ€๋ถ„์— BettingMoney ์ถ”๊ฐ€ - Participant: getHand()๋ฉ”์„œ๋“œ ์ ‘๊ทผ์ œ์–ด์ž ๋ณ€๊ฒฝ(public -> protected๋กœ ๋ณ€๊ฒฝ) --- src/main/java/domain/Participant.java | 13 ++++++------- src/main/java/domain/Player.java | 13 +++++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index ef612f92e09..1d73e388d14 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -13,9 +13,7 @@ public List getHandCards() { return hand.getCards(); } - public Hand getHand() { - return hand; - } + protected Hand getHand() {return hand;} public void addHandCard(Card card) { hand.addCard(card); @@ -25,11 +23,12 @@ public boolean isBust() { return hand.getScore().isBust(); } - public Score getScore() { - return hand.getScore(); - } - public int getScoreValue() { return hand.getScore().value(); } + + public boolean isBlackjack(){ + return hand.isBlackjack(); + } + } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 0e3c40fa39e..bfce5e80aae 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -3,14 +3,15 @@ public class Player extends Participant { private final Name name; - - private Player(Name name, Hand hand) { + private final BettingMoney bettingMoney; + private Player(Name name, Hand hand ,BettingMoney bettingMoney) { super(hand); this.name = name; + this.bettingMoney = bettingMoney; } - public static Player of(Name name, Hand hand) { - return new Player(name, hand); + public static Player of(Name name, Hand hand, BettingMoney bettingMoney) { + return new Player(name, hand, bettingMoney); } public Name getName() { @@ -20,4 +21,8 @@ public Name getName() { public String getNameValue() { return name.getName(); } + + public int getBettingMoneyValue(){ + return bettingMoney.getMoney(); + } } From 0910024419b84dc82aad6e917703ea5e7b698c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 11:28:51 +0900 Subject: [PATCH 84/86] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=B4=20=EC=B6=94=EA=B0=80=EB=90=98=EC=96=B4=20Con?= =?UTF-8?q?troller=20=EC=A0=84=EC=B2=B4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BlackjackGame.start()์˜ ์ธ์ž๋ฅผ ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„๊ณผ ๋ฐฐํŒ…๊ธˆ์•ก์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” PlayerCreationInfo๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ --- src/main/java/controller/GameController.java | 69 ++++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 6c099a8fba0..05a5d2fb85c 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,34 +1,69 @@ package controller; import domain.BlackjackGame; +import domain.BettingMoney; import domain.Dealer; -import domain.GameResultCalculator; +import domain.Name; import domain.Player; +import domain.PlayerCreationInfo; import domain.Players; -import domain.TotalFinalResult; -import dto.DealerFinalResultDto; +import domain.ProfitCalculator; import dto.PlayerDto; import dto.PlayersDto; import dto.ResultDto; -import dto.TotalFinalResultsDto; import view.InputView; import view.OutputView; +import java.util.ArrayList; +import java.util.List; + public class GameController { public void run() { - BlackjackGame blackjackGame = BlackjackGame.start(InputView.readParticipants()); + BlackjackGame blackjackGame = startGame(); + printInitialStatus(blackjackGame); + playGame(blackjackGame); + printGameResult(blackjackGame); + } + + private BlackjackGame startGame() { + List names = InputView.readParticipants(); + List playerCreationInfos = createPlayerCreationInfos(names); + return BlackjackGame.start(playerCreationInfos); + } + + private void printInitialStatus(BlackjackGame blackjackGame) { Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); - PlayersDto playersDto = PlayersDto.from(players); + OutputView.printHandOutMessage(playersDto); OutputView.printCardStatus(playersDto, ResultDto.fromDealerInitial(dealer)); + } + private void playGame(BlackjackGame blackjackGame) { + Players players = blackjackGame.getPlayers(); addPlayersCard(blackjackGame, players); addDealerCards(blackjackGame); - printCardResults(ResultDto.from(dealer), PlayersDto.from(players)); - printFinalResults(players, dealer); + } + + private void printGameResult(BlackjackGame blackjackGame) { + Dealer dealer = blackjackGame.getDealer(); + Players players = blackjackGame.getPlayers(); + PlayersDto playersDto = PlayersDto.from(players); + + printCardResults(ResultDto.from(dealer), playersDto); + printProfitResults(players, dealer); + } + + private List createPlayerCreationInfos(List names) { + List playerCreationInfos = new ArrayList<>(); + for (String name : names) { + Integer money = InputView.readBettingMoney(name); + System.out.println(); + playerCreationInfos.add(PlayerCreationInfo.of(Name.from(name), BettingMoney.of(money))); + } + return playerCreationInfos; } private void addPlayersCard(BlackjackGame blackjackGame, Players players) { @@ -55,11 +90,19 @@ private void printCardResults(ResultDto resultDto, PlayersDto playersDto) { OutputView.printCardResult(resultDto, playersDto); } - private void printFinalResults(Players players, Dealer dealer) { - TotalFinalResult totalFinalResult = GameResultCalculator.checkGameResult(players, dealer); - DealerFinalResultDto dealerFinalResultDto = DealerFinalResultDto.from(totalFinalResult); - TotalFinalResultsDto totalFinalResultsDto = TotalFinalResultsDto.from(totalFinalResult); + private void printProfitResults(Players players, Dealer dealer) { + String dealerProfit = ProfitCalculator.formatProfit( + ProfitCalculator.calculateDealerProfit(players, dealer) + ); + + List playerProfitResults = players.getPlayers().stream() + .map(player -> String.format("%s: %s%n", + player.getNameValue(), + ProfitCalculator.formatProfit( + ProfitCalculator.calculatePlayerProfit(player, dealer) + ))) + .toList(); - OutputView.printTotalResult(dealerFinalResultDto, totalFinalResultsDto); + OutputView.printTotalProfit(dealerProfit, playerProfitResults); } } From c7fb9c0eac982c3a758cff074a71af7278ab964c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 14:42:26 +0900 Subject: [PATCH 85/86] =?UTF-8?q?refactor:=20=EC=95=88=EC=93=B0=EB=8A=94?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4,=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20/=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/GameController.java | 20 ++++++------ src/main/java/domain/BlackjackGame.java | 5 +++ src/main/java/domain/FinalResult.java | 31 ------------------- src/main/java/domain/ProfitCalculator.java | 4 +++ src/main/java/domain/ResultType.java | 17 ---------- src/main/java/domain/TotalFinalResult.java | 19 ------------ src/main/java/domain/{ => card}/Card.java | 2 +- .../java/domain/{ => card}/CardNumber.java | 2 +- .../java/domain/{ => card}/CardShape.java | 2 +- src/main/java/domain/{ => card}/Deck.java | 2 +- src/main/java/domain/{ => hand}/Hand.java | 4 ++- src/main/java/domain/{ => hand}/Score.java | 2 +- .../domain/{ => hand}/ScoreCalculator.java | 5 ++- .../{ => participant}/BettingMoney.java | 2 +- .../java/domain/{ => participant}/Dealer.java | 4 ++- .../{ => participant}/GameParticipants.java | 2 +- .../java/domain/{ => participant}/Name.java | 2 +- .../domain/{ => participant}/Participant.java | 5 ++- .../java/domain/{ => participant}/Player.java | 6 ++-- .../{ => participant}/PlayerCreationInfo.java | 2 +- .../domain/{ => participant}/Players.java | 2 +- src/main/java/dto/DealerFinalResultDto.java | 27 ---------------- src/main/java/dto/PlayerDto.java | 2 +- src/main/java/dto/PlayersDto.java | 2 +- src/main/java/dto/ResultDto.java | 6 ++-- src/main/java/dto/TotalFinalResultsDto.java | 23 -------------- src/main/java/view/OutputView.java | 3 -- src/test/java/domain/BettingMoneyTest.java | 1 + src/test/java/domain/BlackjackGameTest.java | 12 +++++-- src/test/java/domain/DealerTest.java | 7 ++++- src/test/java/domain/DeckTest.java | 2 +- src/test/java/domain/HandTest.java | 4 +++ src/test/java/domain/NameTest.java | 2 +- .../java/domain/PlayerCreationInfoTest.java | 3 ++ src/test/java/domain/PlayerTest.java | 8 ++++- src/test/java/domain/PlayersTest.java | 10 ++++-- .../java/domain/ProfitCalculatorTest.java | 5 +++ src/test/java/domain/ScoreCalculatorTest.java | 5 ++- 38 files changed, 101 insertions(+), 161 deletions(-) delete mode 100644 src/main/java/domain/FinalResult.java delete mode 100644 src/main/java/domain/ResultType.java delete mode 100644 src/main/java/domain/TotalFinalResult.java rename src/main/java/domain/{ => card}/Card.java (96%) rename src/main/java/domain/{ => card}/CardNumber.java (96%) rename src/main/java/domain/{ => card}/CardShape.java (93%) rename src/main/java/domain/{ => card}/Deck.java (98%) rename src/main/java/domain/{ => hand}/Hand.java (92%) rename src/main/java/domain/{ => hand}/Score.java (88%) rename src/main/java/domain/{ => hand}/ScoreCalculator.java (93%) rename src/main/java/domain/{ => participant}/BettingMoney.java (94%) rename src/main/java/domain/{ => participant}/Dealer.java (87%) rename src/main/java/domain/{ => participant}/GameParticipants.java (95%) rename src/main/java/domain/{ => participant}/Name.java (97%) rename src/main/java/domain/{ => participant}/Participant.java (88%) rename src/main/java/domain/{ => participant}/Player.java (81%) rename src/main/java/domain/{ => participant}/PlayerCreationInfo.java (95%) rename src/main/java/domain/{ => participant}/Players.java (94%) delete mode 100644 src/main/java/dto/DealerFinalResultDto.java delete mode 100644 src/main/java/dto/TotalFinalResultsDto.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 05a5d2fb85c..99f9d598571 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,12 +1,12 @@ package controller; import domain.BlackjackGame; -import domain.BettingMoney; -import domain.Dealer; -import domain.Name; -import domain.Player; -import domain.PlayerCreationInfo; -import domain.Players; +import domain.participant.BettingMoney; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Player; +import domain.participant.PlayerCreationInfo; +import domain.participant.Players; import domain.ProfitCalculator; import dto.PlayerDto; import dto.PlayersDto; @@ -50,9 +50,9 @@ private void playGame(BlackjackGame blackjackGame) { private void printGameResult(BlackjackGame blackjackGame) { Dealer dealer = blackjackGame.getDealer(); Players players = blackjackGame.getPlayers(); - PlayersDto playersDto = PlayersDto.from(players); + PlayersDto afterPlayersDto = PlayersDto.from(players); - printCardResults(ResultDto.from(dealer), playersDto); + printCardResults(ResultDto.from(dealer), afterPlayersDto); printProfitResults(players, dealer); } @@ -86,8 +86,8 @@ private void addDealerCards(BlackjackGame blackjackGame) { } } - private void printCardResults(ResultDto resultDto, PlayersDto playersDto) { - OutputView.printCardResult(resultDto, playersDto); + private void printCardResults(ResultDto resultDto, PlayersDto afterPlayersDto) { + OutputView.printCardResult(resultDto, afterPlayersDto); } private void printProfitResults(Players players, Dealer dealer) { diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index a0f14045709..3df439b7d58 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -1,5 +1,10 @@ package domain; +import domain.card.Card; +import domain.card.Deck; +import domain.hand.Hand; +import domain.participant.*; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/domain/FinalResult.java b/src/main/java/domain/FinalResult.java deleted file mode 100644 index 87dfcc208a9..00000000000 --- a/src/main/java/domain/FinalResult.java +++ /dev/null @@ -1,31 +0,0 @@ -package domain; - -public class FinalResult { - private final Name name; - private final ResultType resultType; - - private FinalResult(Name name, ResultType resultType) { - this.name = name; - this.resultType = resultType; - } - - public static FinalResult from(Name name, ResultType resultType) { - return new FinalResult(name, resultType); - } - - public Name getName() { - return name; - } - - public ResultType getResultType() { - return resultType; - } - - public String getNameText() { - return name.getName(); - } - - public String getResultText() { - return resultType.getType(); - } -} diff --git a/src/main/java/domain/ProfitCalculator.java b/src/main/java/domain/ProfitCalculator.java index afd3c50e20a..a0219d891d6 100644 --- a/src/main/java/domain/ProfitCalculator.java +++ b/src/main/java/domain/ProfitCalculator.java @@ -1,5 +1,9 @@ package domain; +import domain.participant.Dealer; +import domain.participant.Player; +import domain.participant.Players; + public class ProfitCalculator { private static final double BLACKJACK_PROFIT_RATE = 1.5; diff --git a/src/main/java/domain/ResultType.java b/src/main/java/domain/ResultType.java deleted file mode 100644 index fbc2e701327..00000000000 --- a/src/main/java/domain/ResultType.java +++ /dev/null @@ -1,17 +0,0 @@ -package domain; - -public enum ResultType { - WIN("์Šน"), - DRAW("๋ฌด"), - LOSE("ํŒจ"); - - private final String type; - - ResultType(String type) { - this.type = type; - } - - public String getType() { - return type; - } -} diff --git a/src/main/java/domain/TotalFinalResult.java b/src/main/java/domain/TotalFinalResult.java deleted file mode 100644 index 2862e0caa43..00000000000 --- a/src/main/java/domain/TotalFinalResult.java +++ /dev/null @@ -1,19 +0,0 @@ -package domain; - -import java.util.List; - -public class TotalFinalResult { - private final List totalResult; - - private TotalFinalResult(List totalResult) { - this.totalResult = totalResult; - } - - public static TotalFinalResult from(List totalResult) { - return new TotalFinalResult(totalResult); - } - - public List getTotalResult() { - return totalResult; - } -} diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/card/Card.java similarity index 96% rename from src/main/java/domain/Card.java rename to src/main/java/domain/card/Card.java index 75ceb65f3c8..e01e18088ff 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public class Card { private final CardNumber cardNumber; diff --git a/src/main/java/domain/CardNumber.java b/src/main/java/domain/card/CardNumber.java similarity index 96% rename from src/main/java/domain/CardNumber.java rename to src/main/java/domain/card/CardNumber.java index f03d4561b06..d46c7b0a078 100644 --- a/src/main/java/domain/CardNumber.java +++ b/src/main/java/domain/card/CardNumber.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum CardNumber { ACE("A", 1), diff --git a/src/main/java/domain/CardShape.java b/src/main/java/domain/card/CardShape.java similarity index 93% rename from src/main/java/domain/CardShape.java rename to src/main/java/domain/card/CardShape.java index 98a12af1f05..63ab0d87bab 100644 --- a/src/main/java/domain/CardShape.java +++ b/src/main/java/domain/card/CardShape.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum CardShape { HEART("ํ•˜ํŠธ"), diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/card/Deck.java similarity index 98% rename from src/main/java/domain/Deck.java rename to src/main/java/domain/card/Deck.java index 94b144384aa..4d36f8cde1b 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/domain/Hand.java b/src/main/java/domain/hand/Hand.java similarity index 92% rename from src/main/java/domain/Hand.java rename to src/main/java/domain/hand/Hand.java index 06600193f47..da8164476bc 100644 --- a/src/main/java/domain/Hand.java +++ b/src/main/java/domain/hand/Hand.java @@ -1,4 +1,6 @@ -package domain; +package domain.hand; + +import domain.card.Card; import java.util.List; diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/hand/Score.java similarity index 88% rename from src/main/java/domain/Score.java rename to src/main/java/domain/hand/Score.java index 6737c751c29..9fa613baf4d 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/hand/Score.java @@ -1,4 +1,4 @@ -package domain; +package domain.hand; public record Score(int value) { private static final int BUST_LIMIT_SCORE = 21; diff --git a/src/main/java/domain/ScoreCalculator.java b/src/main/java/domain/hand/ScoreCalculator.java similarity index 93% rename from src/main/java/domain/ScoreCalculator.java rename to src/main/java/domain/hand/ScoreCalculator.java index db553277cab..8e88d3c3248 100644 --- a/src/main/java/domain/ScoreCalculator.java +++ b/src/main/java/domain/hand/ScoreCalculator.java @@ -1,4 +1,7 @@ -package domain; +package domain.hand; + +import domain.card.Card; +import domain.card.CardNumber; import java.util.List; diff --git a/src/main/java/domain/BettingMoney.java b/src/main/java/domain/participant/BettingMoney.java similarity index 94% rename from src/main/java/domain/BettingMoney.java rename to src/main/java/domain/participant/BettingMoney.java index 32127ee7b72..e30e8d76418 100644 --- a/src/main/java/domain/BettingMoney.java +++ b/src/main/java/domain/participant/BettingMoney.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; public class BettingMoney { private final int money; diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/participant/Dealer.java similarity index 87% rename from src/main/java/domain/Dealer.java rename to src/main/java/domain/participant/Dealer.java index 6665a387d2a..92f2303de4d 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,4 +1,6 @@ -package domain; +package domain.participant; + +import domain.hand.Hand; public class Dealer extends Participant { private static final int DEALER_CARD_SUM_THRESHOLD = 16; diff --git a/src/main/java/domain/GameParticipants.java b/src/main/java/domain/participant/GameParticipants.java similarity index 95% rename from src/main/java/domain/GameParticipants.java rename to src/main/java/domain/participant/GameParticipants.java index 18ec446d430..41e16656933 100644 --- a/src/main/java/domain/GameParticipants.java +++ b/src/main/java/domain/participant/GameParticipants.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; public class GameParticipants { private final Dealer dealer; diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/participant/Name.java similarity index 97% rename from src/main/java/domain/Name.java rename to src/main/java/domain/participant/Name.java index 07408b954dc..11c484f4110 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; public class Name { private static final int NAME_LIMIT_LENGTH = 20; diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/participant/Participant.java similarity index 88% rename from src/main/java/domain/Participant.java rename to src/main/java/domain/participant/Participant.java index 1d73e388d14..2b5c24d8931 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,4 +1,7 @@ -package domain; +package domain.participant; + +import domain.hand.Hand; +import domain.card.Card; import java.util.List; diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/participant/Player.java similarity index 81% rename from src/main/java/domain/Player.java rename to src/main/java/domain/participant/Player.java index bfce5e80aae..b22093e8a43 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -1,10 +1,12 @@ -package domain; +package domain.participant; +import domain.hand.Hand; + public class Player extends Participant { private final Name name; private final BettingMoney bettingMoney; - private Player(Name name, Hand hand ,BettingMoney bettingMoney) { + private Player(Name name, Hand hand , BettingMoney bettingMoney) { super(hand); this.name = name; this.bettingMoney = bettingMoney; diff --git a/src/main/java/domain/PlayerCreationInfo.java b/src/main/java/domain/participant/PlayerCreationInfo.java similarity index 95% rename from src/main/java/domain/PlayerCreationInfo.java rename to src/main/java/domain/participant/PlayerCreationInfo.java index b1aca84ce7b..bf59436e789 100644 --- a/src/main/java/domain/PlayerCreationInfo.java +++ b/src/main/java/domain/participant/PlayerCreationInfo.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; public class PlayerCreationInfo { private final Name name; diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/participant/Players.java similarity index 94% rename from src/main/java/domain/Players.java rename to src/main/java/domain/participant/Players.java index 3efb19c5cdf..6cc17d6f020 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/participant/Players.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import java.util.List; diff --git a/src/main/java/dto/DealerFinalResultDto.java b/src/main/java/dto/DealerFinalResultDto.java deleted file mode 100644 index 80dc466c433..00000000000 --- a/src/main/java/dto/DealerFinalResultDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package dto; - -import domain.ResultType; -import domain.TotalFinalResult; - -public record DealerFinalResultDto( - String result -) { - public static DealerFinalResultDto from(TotalFinalResult totalFinalResult) { - return new DealerFinalResultDto(checkDrawCount(countResult(totalFinalResult, ResultType.LOSE), - countResult(totalFinalResult, ResultType.DRAW), - countResult(totalFinalResult, ResultType.WIN))); - } - - private static int countResult(TotalFinalResult totalFinalResult, ResultType resultType) { - return (int) totalFinalResult.getTotalResult().stream() - .filter(finalResult -> finalResult.getResultType().equals(resultType)) - .count(); - } - - private static String checkDrawCount(int winCount, int drawCount, int loseCount) { - if (drawCount > 0) { - return String.format("๋”œ๋Ÿฌ: %d์Šน %d๋ฌด %dํŒจ%n", winCount, drawCount, loseCount); - } - return String.format("๋”œ๋Ÿฌ: %d์Šน %dํŒจ%n", winCount, loseCount); - } -} diff --git a/src/main/java/dto/PlayerDto.java b/src/main/java/dto/PlayerDto.java index 466c62c1a98..d83b17be39a 100644 --- a/src/main/java/dto/PlayerDto.java +++ b/src/main/java/dto/PlayerDto.java @@ -1,6 +1,6 @@ package dto; -import domain.Player; +import domain.participant.Player; public record PlayerDto( String name, diff --git a/src/main/java/dto/PlayersDto.java b/src/main/java/dto/PlayersDto.java index c62a3e5269e..5b468210524 100644 --- a/src/main/java/dto/PlayersDto.java +++ b/src/main/java/dto/PlayersDto.java @@ -1,6 +1,6 @@ package dto; -import domain.Players; +import domain.participant.Players; import java.util.List; diff --git a/src/main/java/dto/ResultDto.java b/src/main/java/dto/ResultDto.java index 84df7101270..b7184b1f65e 100644 --- a/src/main/java/dto/ResultDto.java +++ b/src/main/java/dto/ResultDto.java @@ -1,8 +1,8 @@ package dto; -import domain.Card; -import domain.Dealer; -import domain.Participant; +import domain.card.Card; +import domain.participant.Dealer; +import domain.participant.Participant; import java.util.List; diff --git a/src/main/java/dto/TotalFinalResultsDto.java b/src/main/java/dto/TotalFinalResultsDto.java deleted file mode 100644 index 0ad8bcf1a9d..00000000000 --- a/src/main/java/dto/TotalFinalResultsDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package dto; - -import domain.FinalResult; -import domain.TotalFinalResult; - -import java.util.ArrayList; -import java.util.List; - -public record TotalFinalResultsDto( - List totalResults -) { - public static TotalFinalResultsDto from(TotalFinalResult totalFinalResult) { - List finalResults = totalFinalResult.getTotalResult(); - List totalResults = new ArrayList<>(); - for (FinalResult finalResult : finalResults) { - totalResults.add(String.format("%s: %s%n", - finalResult.getNameText(), - finalResult.getResultText())); - } - - return new TotalFinalResultsDto(totalResults); - } -} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 434bb78165a..090d3d00592 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,11 +1,8 @@ package view; -import dto.DealerFinalResultDto; import dto.PlayerDto; import dto.PlayersDto; import dto.ResultDto; -import dto.TotalFinalResultsDto; - import java.util.List; import java.util.stream.Collectors; diff --git a/src/test/java/domain/BettingMoneyTest.java b/src/test/java/domain/BettingMoneyTest.java index b8526e4bf4f..ed9429855c6 100644 --- a/src/test/java/domain/BettingMoneyTest.java +++ b/src/test/java/domain/BettingMoneyTest.java @@ -1,5 +1,6 @@ package domain; +import domain.participant.BettingMoney; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/domain/BlackjackGameTest.java b/src/test/java/domain/BlackjackGameTest.java index 09467ac3437..9365c01cb2d 100644 --- a/src/test/java/domain/BlackjackGameTest.java +++ b/src/test/java/domain/BlackjackGameTest.java @@ -2,6 +2,12 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; + +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.card.Deck; +import domain.participant.*; import org.junit.jupiter.api.Test; class BlackjackGameTest { @@ -22,7 +28,7 @@ class BlackjackGameTest { assertThat(players.getPlayers()).hasSize(2); for (Player player : players.getPlayers()) { - assertThat(player.getHand().getCards()).hasSize(2); + assertThat(player.getHandCards()).hasSize(2); } } @@ -43,10 +49,10 @@ class BlackjackGameTest { BlackjackGame blackjackGame = BlackjackGame.start(playerCreationInfos, deck); Player player = blackjackGame.getPlayersValue().getFirst(); - int before = player.getHand().getCards().size(); + int before = player.getHandCards().size(); blackjackGame.addPlayerCard(player); - assertThat(player.getHand().getCards()).hasSize(before + 1); + assertThat(player.getHandCards()).hasSize(before + 1); } @Test diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index 728dde56471..939fa67d245 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -4,7 +4,12 @@ import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.DisplayName; + +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.Hand; +import domain.participant.Dealer; import org.junit.jupiter.api.Test; class DealerTest { diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index 95bef2ba378..500470470a2 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -1,6 +1,6 @@ package domain; -import org.junit.jupiter.api.DisplayName; +import domain.card.Deck; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/domain/HandTest.java b/src/test/java/domain/HandTest.java index dd0a3132aa1..5bfdebaaa24 100644 --- a/src/test/java/domain/HandTest.java +++ b/src/test/java/domain/HandTest.java @@ -1,5 +1,9 @@ package domain; +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.Hand; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index dd4aa27a231..5df12fb33c2 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; -import org.junit.jupiter.api.DisplayName; +import domain.participant.Name; import org.junit.jupiter.api.Test; class NameTest { diff --git a/src/test/java/domain/PlayerCreationInfoTest.java b/src/test/java/domain/PlayerCreationInfoTest.java index e1f0694a525..818273e514e 100644 --- a/src/test/java/domain/PlayerCreationInfoTest.java +++ b/src/test/java/domain/PlayerCreationInfoTest.java @@ -1,5 +1,8 @@ package domain; +import domain.participant.BettingMoney; +import domain.participant.Name; +import domain.participant.PlayerCreationInfo; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index 2d6c59b3f62..5904c540860 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -5,7 +5,13 @@ import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.DisplayName; +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.Hand; +import domain.participant.BettingMoney; +import domain.participant.Name; +import domain.participant.Player; import org.junit.jupiter.api.Test; class PlayerTest { diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index 553b0b7d33a..2014ef7c739 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -1,12 +1,18 @@ package domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.DisplayName; +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.Hand; +import domain.participant.BettingMoney; +import domain.participant.Name; +import domain.participant.Player; +import domain.participant.Players; import org.junit.jupiter.api.Test; class PlayersTest { diff --git a/src/test/java/domain/ProfitCalculatorTest.java b/src/test/java/domain/ProfitCalculatorTest.java index f9baeb103fe..1ef6e3349cd 100644 --- a/src/test/java/domain/ProfitCalculatorTest.java +++ b/src/test/java/domain/ProfitCalculatorTest.java @@ -1,5 +1,10 @@ package domain; +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.Hand; +import domain.participant.*; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/domain/ScoreCalculatorTest.java b/src/test/java/domain/ScoreCalculatorTest.java index 49d057b6982..75bb1c98fed 100644 --- a/src/test/java/domain/ScoreCalculatorTest.java +++ b/src/test/java/domain/ScoreCalculatorTest.java @@ -1,6 +1,9 @@ package domain; -import org.junit.jupiter.api.DisplayName; +import domain.card.Card; +import domain.card.CardNumber; +import domain.card.CardShape; +import domain.hand.ScoreCalculator; import org.junit.jupiter.api.Test; import java.util.List; From fa93618649bb70dd9e94b47124bfae37585a33a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=ED=98=B8=EA=B2=BD?= Date: Sun, 15 Mar 2026 21:35:35 +0900 Subject: [PATCH 86/86] =?UTF-8?q?docs:=20README=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 43ef453f1ce..21afe05dff0 100644 --- a/README.md +++ b/README.md @@ -23,15 +23,21 @@ pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ 1) ๋”œ๋Ÿฌ์™€ ๊ฐ ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ˆ˜๋ น ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 2) ๋”œ๋Ÿฌ ์นด๋“œ์˜ ํ•ฉ์ด 16์ดํ•˜์ธ ๊ฒฝ์šฐ, ์นด๋“œ ์ˆ˜๋ น ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 3) ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜๋ นํ•œ ์นด๋“œ์™€ ์นด๋“œ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. -4) ์ตœ์ข… ์ŠนํŒจ ์—ฌ๋ถ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. +4) ์ตœ์ข… ์ˆ˜์ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ### โ–ซ ์‹คํ–‰ ์˜ˆ์‹œ ```plaintext ๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ) pobi,jason +pobi์˜ ๋ฐฐํŒ… ๊ธˆ์•ก์€? +10000 + +jason์˜ ๋ฐฐํŒ… ๊ธˆ์•ก์€? +20000 + ๋”œ๋Ÿฌ์™€ pobi, jason์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. -๋”œ๋Ÿฌ์นด๋“œ: 3๋‹ค์ด์•„๋ชฌ๋“œ +๋”œ๋Ÿฌ: 3๋‹ค์ด์•„๋ชฌ๋“œ pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ @@ -40,20 +46,21 @@ y pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ pobi๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) n -jason๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) +pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ +jason์€ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n) n jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ ๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. -๋”œ๋Ÿฌ์นด๋“œ: 3๋‹ค์ด์•„๋ชฌ๋“œ, 9ํด๋กœ๋ฒ„, 8๋‹ค์ด์•„๋ชฌ๋“œ - ๊ฒฐ๊ณผ: 20 +๋”œ๋Ÿฌ ์นด๋“œ: 3๋‹ค์ด์•„๋ชฌ๋“œ, 9ํด๋กœ๋ฒ„, 8๋‹ค์ด์•„๋ชฌ๋“œ - ๊ฒฐ๊ณผ: 20 pobi์นด๋“œ: 2ํ•˜ํŠธ, 8์ŠคํŽ˜์ด๋“œ, Aํด๋กœ๋ฒ„ - ๊ฒฐ๊ณผ: 21 jason์นด๋“œ: 7ํด๋กœ๋ฒ„, K์ŠคํŽ˜์ด๋“œ - ๊ฒฐ๊ณผ: 17 -## ์ตœ์ข… ์ŠนํŒจ -๋”œ๋Ÿฌ: 1์Šน 1ํŒจ -pobi: ์Šน -jason: ํŒจ +## ์ตœ์ข… ์ˆ˜์ต +๋”œ๋Ÿฌ: 10000 +pobi: 10000 +jason: -20000 ``` --- @@ -68,4 +75,7 @@ jason: ํŒจ 7) ๋ฝ‘ํžŒ ์นด๋“œ ์ œ์™ธํ•˜๋Š” ๊ธฐ๋Šฅ 8) ์นด๋“œ ๋ฑ ๋งŒ๋“ค์–ด์„œ ์„ž๊ธฐ 9) ์ŠนํŒจ ์—ฌ๋ถ€ ๊ณ„์‚ฐ๊ธฐ๋Šฅ -10) ๋”œ๋Ÿฌ์˜ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ \ No newline at end of file +10) ๋”œ๋Ÿฌ์˜ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ +11) ๋ฐฐํŒ… ๊ธˆ์•ก์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ +12) ๋ธ”๋ž™์žญ ์—ฌ๋ถ€ ํŒ์ •๊ธฐ๋Šฅ +13) ์ตœ์ข… ์ˆ˜์ต ๊ณ„์‚ฐ ๊ธฐ๋Šฅ \ No newline at end of file