Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
40f9388
feat(Rule): ๋ธ”๋ž™์žญ๊ทœ์น™์— ๋Œ€ํ•œ Rule ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ๋ฐ ์ƒ์„ฑ
Mar 4, 2026
7038a8f
test(rule): ๋ธ”๋ž™์žญ๊ทœ์น™์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 5, 2026
9f743a8
feat(domain): ๋ธ”๋ž™์žญ ๊ด€๋ จ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ƒ์„ฑ
Mar 5, 2026
b6b2ac6
feat(config): ์•ฑ ๋ ˆ์ด์–ด ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ
Mar 5, 2026
5445549
refactor(Test): ๋ธ”๋ž™์  ํ…Œ์ŠคํŠธ ํŽ˜ํ‚ค์ง€ ์ด๋™
Mar 5, 2026
51bda21
feat: ๋ธ”๋ž™์žญ ๋žœ๋ค ์นด๋“œ ๋ฐฐ์ • ๋กœ์ง ๊ตฌํ˜„
Mar 5, 2026
36cc427
docs(README.md): ๋ธ”๋ž™์žญ ๊ฒŒ์ž„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ช…์„ธ์„œ ์ž‘์„ฑ
Mar 5, 2026
9c4d316
feat(Service): ๋”œ๋Ÿฌ/ํ”Œ๋ ˆ์ด์–ด hit&stand ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Mar 5, 2026
9c90fdd
feat(Service): ๋”œ๋Ÿฌ/ํ”Œ๋ ˆ์ด์–ด ๊ฒฐ๊ณผ ์ถœ๋ ฅ
Mar 5, 2026
2d76139
chore: import๋ฌธ ์ตœ์ ํ™”
Mar 6, 2026
7c456f2
feat: ๋ธ”๋ž™์žญ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Mar 6, 2026
0dffe2e
test(BlackJackRule): ๋ธ”๋ž™์žญ ๊ฒŒ์ž„ ๊ทœ์น™ ํด๋ž˜์Šค, score ๊ณ„์‚ฐ ๋กœ์ง ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Mar 6, 2026
4232f37
fix(Result): ๋ˆ„๋ฝ๋œ ์ŠนํŒจ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค ์ถ”๊ฐ€
Mar 6, 2026
919643b
refactor:
Mar 6, 2026
16dd07a
test(Player): ํ”Œ๋ ˆ์ด์–ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 6, 2026
61e37fa
test(Hand): ํ•ธ๋“œ, ์นด๋“œ์ ์ˆ˜ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 6, 2026
c4ac74a
test(Deck): ๋ฑ, ์นด๋“œ ๋ฐœ๊ธ‰ ํ…Œ์ŠคํŠธ
Mar 6, 2026
f3ecebf
test(Dealer): ๋”œ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 6, 2026
de5db9e
test(Service): ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 6, 2026
36eda30
test(rule): ๊ทœ์น™ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 6, 2026
966d2a8
refactor(Players): BlackjackGame.players๋ฅผ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€๊ฒฝ
Mar 9, 2026
08ee405
refactor(OutputView): ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ •๋ฆฌ
Mar 9, 2026
c1601e1
feat(InputView): Hit ์—ฌ๋ถ€ ์ž…๋ ฅ์— ๋Œ€ํ•ด, ์ž˜๋ชป๋œ ์ž…๋ ฅ์€ ์žฌ์ž…๋ ฅ ๋ฐ›๋„๋ก ํ•จ
Mar 9, 2026
55f8cda
refactor(Card): Number ์—ด๊ฑฐํ˜•์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถ„๋ฆฌ
Mar 9, 2026
5bcf8f8
feat(Controller): ์ค‘๋ณต๋œ ์ด๋ฆ„ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์žฌ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
Mar 9, 2026
34f1527
refactor(GameResult): GameResult ํด๋ž˜์Šค๋ช… MatchResult๋กœ ๋ณ€๊ฒฝ
Mar 9, 2026
2589ab0
refactor(DefaultBlackjackRuleTest): ๋ถˆํ•„์š”ํ•œ ํ•„๋“œ ์ œ๊ฑฐ
Mar 9, 2026
e907205
refactor(DefaultBlackjackRuleTest): @ParameterizedTest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฐ„์†Œํ™”
Mar 9, 2026
95e3e59
refactor(Service, Players): ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
Mar 10, 2026
33dbf99
refactor(InputView): ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
Mar 10, 2026
7c155aa
refactor(AppConfig): ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ํด๋ž˜์Šค ๊ฐ„์†Œํ™”
Mar 10, 2026
afc7369
refactor(DefaultBlackjackRule): ๋ธ”๋ž™์žญ ์ƒ์ˆ˜ ์ ‘๊ทผ ์ œํ•œ์ž ๋ณ€๊ฒฝ
Mar 10, 2026
8462cd9
refactor: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
Mar 10, 2026
68c8912
refactor(Card): red ํ•„๋“œ ๋ช… ๋ณ€๊ฒฝ
Mar 10, 2026
cd972c9
refactor(Number): Score ํ•„๋“œ ์ž๋ฃŒํ˜• Set์œผ๋กœ ๋ณ€๊ฒฝ
Mar 10, 2026
d6500d3
refactor(Deck): cards Set ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€๊ฒฝ
Mar 10, 2026
a72b9f3
refactor(Deck): cards Set ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€๊ฒฝ
Mar 10, 2026
881c109
refactor(MatchResult): countBy ์ œ๊ฑฐ ๋ฐ ๋”œ๋Ÿฌ ์Šน/ํŒจ/๋ฌด ์นด์šดํŠธ๋ฅผ ์ƒ์„ฑ์ž๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •
Mar 10, 2026
37fc6b8
Merge remote-tracking branch 'origin/realtake' into realtake
Mar 10, 2026
2ed59cc
refactor(Deck): draw ์—ญํ•  ๋ถ„๋ฆฌ
Mar 11, 2026
ccbf2e7
refactor(BlackjackGame, BlackJackService): ์ฑ…์ž„ ์ด๋™ ๋ฐ ํŒจํ‚ค์ง€๋ช… ๋ณ€๊ฒฝ
Mar 11, 2026
9fda00a
chore: ํŒจํ‚ค์ง€๋ช… ๋ณ€๊ฒฝ
Mar 11, 2026
69f2bc2
refactor: 2depth ์ปจ๋ฒค์…˜ ์ˆ˜์ •
Mar 11, 2026
f9e30ff
refactor: isBust ๋ฉ”์†Œ๋“œ ๋ช…์œผ๋กœ ๋ณ€๊ฒฝ
Mar 11, 2026
29c2b02
refactor: equalsIgnoreCase ์œ„์น˜ ๋ณ€๊ฒฝ
Mar 11, 2026
49b176b
refactor: Participant playrer/dealer ๊ณตํ†ต๋กœ์ง ๋ถ„๋ฆฌ
Mar 12, 2026
62e43c5
feat: ํ”Œ๋ ˆ์ด์–ด ๋ฐฐํŒ… ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Mar 12, 2026
445c95e
test: BlackjackGameTest ์ถ”๊ฐ€, DefaultBlackjackRuleTest ์ผ€์ด์Šค ์ถ”๊ฐ€
Mar 13, 2026
34c8f47
refactor: ๋ถˆํ•„์š”ํ•ด์ง„ DTO ๋ฐ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Mar 13, 2026
1a4fcf3
refactor: Rule ๋กœ์ง ๋„๋ฉ”์ธ๋กœ์ง์œผ๋กœ ์ด๋™
Mar 13, 2026
b5f2d3c
Merge remote-tracking branch 'upstream/realtake' into step2
Mar 13, 2026
9cee12a
refactor: do-while๋ฌธ์œผ๋กœ ๊ต์ฒด
Mar 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์„ ๋“ฑ๋กํ•œ๋‹ค.
- ํ”Œ๋ ˆ์ด์–ด๋Š” ๋ฐฐํŒ… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•œ๋‹ค.
- ์ฐธ์—ฌ์ž(ํ”Œ๋ ˆ์ด์–ด + ๋”œ๋Ÿฌ)์—๊ฒŒ ๊ฐ๊ฐ 2์žฅ์˜ ์นด๋“œ๋ฅผ ๋žœ๋ค์œผ๋กœ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
- ๋”œ๋Ÿฌ ์นด๋“œ๋Š” ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.
- ๊ฐ ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ๋Š” ๋ชจ๋‘(2์žฅ) ์ถœ๋ ฅํ•œ๋‹ค.
Expand All @@ -24,10 +25,11 @@
- ์กฐ๊ฑด: ์ถœ๋ ฅ ์ˆœ์„œ๋Š” ๋”œ๋Ÿฌ ๋จผ์ € ์ถœ๋ ฅํ•˜๋ฉฐ, ์ž…๋ ฅ๋ฐ›์€ ํ”Œ๋ ˆ์ด์–ด ์ˆœ์„œ๋กœ ์ด์–ด ์ถœ๋ ฅํ•œ๋‹ค.

- ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- ์ตœ์ข… ์ŠนํŒจ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- ๋”œ๋Ÿฌ๋Š” ์ŠนํŒจ์ „์ ์„ ์ถœ๋ ฅํ•œ๋‹ค. (์˜ˆ: ๋”œ๋Ÿฌ: 1์Šน 1ํŒจ)
- ํ”Œ๋ ˆ์ด์–ด๋Š” ์ŠนํŒจ ์—ฌ๋ถ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. (์˜ˆ: pobi: ์Šน)
- ์กฐ๊ฑด: ์ถœ๋ ฅ ์ˆœ์„œ๋Š” ๋”œ๋Ÿฌ ๋จผ์ € ์ถœ๋ ฅํ•˜๋ฉฐ, ์ž…๋ ฅ๋ฐ›์€ ํ”Œ๋ ˆ์ด์–ด ์ˆœ์„œ๋กœ ์ด์–ด ์ถœ๋ ฅํ•œ๋‹ค.
- ๋”œ๋Ÿฌ์˜ ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•œ๋‹ค.
- ๊ฐ ํ”Œ๋ ˆ์ด์–ด์˜ ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•œ๋‹ค.

## ๋ธ”๋ž™์žญ ์ƒ์„ธ ๊ทœ์น™
- ํ”Œ๋ ˆ์ด์–ด๊ฐ€ Bust์ธ ๊ฒฝ์šฐ์—๋Š” ์ž๋™ ํŒจ๋ฐฐ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ด๋•Œ, ๋”œ๋Ÿฌ์˜ ์นด๋“œ์ƒํƒœ์— ์˜์กด๋˜์ง€ ์•Š๊ณ , ์ž๋™ ํŒจ๋ฐฐํ•œ๋‹ค.
- ๋”œ๋Ÿฌ๊ฐ€ ๋ฒ„์ŠคํŠธ๋œ ๊ฒฝ์šฐ ์‚ด์•„์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๋Š” ๋ชจ๋‘ ์Šน๋ฆฌํ•œ๋‹ค.
- ๋ธ”๋ž™์žญ์€ 1.5๋ฐฐ์˜ ์ˆ˜์ต๋ฅ ๋กœ ์Šน๋ฆฌํ•œ๋‹ค.
- ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ ๋ฌด์Šน๋ถ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
- ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ๋ฒ„์ŠคํŠธ๋œ ๊ฒฝ์šฐ ๋”œ๋Ÿฌ ์Šน๋ฆฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
6 changes: 3 additions & 3 deletions src/main/java/team/blackjack/Application.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package team.blackjack;

import team.blackjack.config.AppConfig;
import team.blackjack.controler.BlackJackController;
import team.blackjack.control.BlackJackController;

public class Application {
public static void main(String[] args) {
AppConfig appConfig = AppConfig.getInstance();
BlackJackController blackJackController = appConfig.blackJackController();
blackJackController.run();
BlackJackController controller = appConfig.blackJackController();
controller.run();
}
}
23 changes: 6 additions & 17 deletions src/main/java/team/blackjack/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,20 @@
package team.blackjack.config;

import team.blackjack.controler.BlackJackController;
import team.blackjack.control.BlackJackController;
import team.blackjack.service.BlackJackService;

public class AppConfig {
private static volatile AppConfig instance;
private static final AppConfig instance = new AppConfig();
private final BlackJackService blackJackService = new BlackJackService();
private final BlackJackController blackJackController = new BlackJackController(blackJackService);

private AppConfig() {
}
private AppConfig() {}

public static AppConfig getInstance() {
if (instance == null) {
synchronized (AppConfig.class) {
if (instance == null) {
instance = new AppConfig();
}
}
}

return instance;
}

public BlackJackService blackJackService() {
return new BlackJackService();
}

public BlackJackController blackJackController() {
return new BlackJackController(blackJackService());
return blackJackController;
}
}
116 changes: 116 additions & 0 deletions src/main/java/team/blackjack/control/BlackJackController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package team.blackjack.control;

import java.util.List;
import team.blackjack.service.dto.DrawResult;
import team.blackjack.service.dto.RevenueResult;
import team.blackjack.service.dto.ScoreResult;
import team.blackjack.service.BlackJackService;
import team.blackjack.view.InputView;
import team.blackjack.view.OutputView;

public class BlackJackController {
private final BlackJackService blackJackService;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์—๋ด์ด ์ƒ๊ฐํ•˜์‹œ๊ธฐ์— blackJackController์™€ blackJackService์˜ ๊ฐ๊ฐ ์—ญํ• ์ด ๋ฌด์—‡์ผ๊นŒ์š”?
ํ˜„์žฌ๋Š” ๋กœ์ง์ด Controller์— ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ค๊นŒ์š”?


public BlackJackController(BlackJackService blackJackService) {
this.blackJackService = blackJackService;
}

public void run() {
List<String> playerNames = readPlayerNames();
blackJackService.initGame(playerNames);
blackJackService.drawInitialCards();

readAllPlayerBattingMoneyRetry(blackJackService.getAllPlayerNames());

DrawResult drawResult = blackJackService.getDrawResult();
OutputView.printDrawResult(drawResult);

readPlayerHitDecision(blackJackService.getAllPlayerNames());

while (blackJackService.shouldDealerHit()) {
OutputView.printDealerHitMessage();
blackJackService.hitDealer();
}

ScoreResult scoreResult = blackJackService.calculateAllParticipantScore();
OutputView.printParticipantScoreResult(scoreResult);

RevenueResult revenueResult = blackJackService.getRevenueResult();
OutputView.printRevenueResult(revenueResult);
}

public void readAllPlayerBattingMoneyRetry(List<String> playerNames) {
playerNames.forEach(playerName -> {
int battingMoney = readPlayerBattingMoneyRetry(playerName);
blackJackService.batMoney(playerName, battingMoney);
});
}

private int readPlayerBattingMoneyRetry(String playerName) {
int battingMoney;

do {
battingMoney = readPlayerBattingMoney(playerName);
} while (battingMoney <= 0);

return battingMoney;
}

private int readPlayerBattingMoney(String playerName) {
int battingMoney = -1;
OutputView.printAskBettingMoney(playerName);
try {
battingMoney = InputView.readPlayerBattingMoney();
} catch (NumberFormatException e) {
OutputView.printWrongDecisionInputMessage();
}

return battingMoney;
}

private List<String> readPlayerNames(){
OutputView.printPlayerNameRequest();
List<String> playerNames = InputView.readPlayerNames();

while (hasDuplicatedName(playerNames)) {
OutputView.printDuplicatedNameMessage();
OutputView.printPlayerNameRequest();
playerNames = InputView.readPlayerNames();
}
return playerNames;
}

private boolean hasDuplicatedName(List<String> playerNames) {
return playerNames.size() != playerNames.stream().distinct().count();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ค‘๋ณต ํ™•์ธ์„ ์œ„ํ•ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?

}

private void readPlayerHitDecision(List<String> playerNames) {
playerNames.forEach(this::processPlayerHit);
}

private void processPlayerHit(String playerName) {
while (readPlayerHitDecision(playerName)) {
blackJackService.hitPlayer(playerName);
OutputView.printPlayerCards(playerName, blackJackService.findPlayerCardNamesByName(playerName));
}
}

private boolean readPlayerHitDecision(String playerName) {
final boolean isPlayerBust = blackJackService.isPlayerBust(playerName);

if (isPlayerBust) {
OutputView.printBustMessage();
return false;
}

OutputView.printAskDrawCard(playerName);
String hitYn = InputView.readHitDecision();

while (!"y".equalsIgnoreCase(hitYn) && !"n".equalsIgnoreCase(hitYn)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"y","n"์ด ๋ฐ˜๋ณต๋˜๋Š” ์ƒ์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฑด ์–ด๋– ์‹ค๊นŒ์š”?

OutputView.printWrongDecisionInputMessage();
hitYn = InputView.readHitDecision();
}

return "y".equalsIgnoreCase(hitYn);
}
}
83 changes: 0 additions & 83 deletions src/main/java/team/blackjack/controler/BlackJackController.java

This file was deleted.

Loading