From 7edc8508022264712b38f51515adafe21c7d4f3d Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 26 Aug 2024 17:45:05 +0900 Subject: [PATCH 01/36] =?UTF-8?q?feat:=20=EC=9D=B5=EB=AA=85=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EB=9E=8C=EB=8B=A4=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/MoveStrategy.java | 1 + src/test/java/nextstep/fp/CarTest.java | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/nextstep/fp/MoveStrategy.java b/src/main/java/nextstep/fp/MoveStrategy.java index 1bd8c23c..ac8fbd27 100644 --- a/src/main/java/nextstep/fp/MoveStrategy.java +++ b/src/main/java/nextstep/fp/MoveStrategy.java @@ -1,5 +1,6 @@ package nextstep.fp; +@FunctionalInterface public interface MoveStrategy { boolean isMovable(); } diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java index 1ab1106f..a6b788ed 100644 --- a/src/test/java/nextstep/fp/CarTest.java +++ b/src/test/java/nextstep/fp/CarTest.java @@ -1,5 +1,6 @@ package nextstep.fp; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -28,4 +29,23 @@ public boolean isMovable() { }); assertThat(actual).isEqualTo(new Car("pobi", 0)); } + + @DisplayName("자동차 이동 테스트 (람다 버전)") + @Test + void 이동_람다() { + Car car = new Car("pobi", 0); + Car actual = car.move(() -> true); + + assertThat(actual).isEqualTo(new Car("pobi", 1)); + } + + @DisplayName("자동차 정지 테스트 (람다 버전)") + @Test + void 정지_람다() { + Car car = new Car("pobi", 0); + Car actual = car.move(() -> false); + + assertThat(actual).isEqualTo(new Car("pobi", 0)); + } + } From 551a14d645742c13cdf9fb61dd809e5f9b69a35a Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 26 Aug 2024 17:56:26 +0900 Subject: [PATCH 02/36] =?UTF-8?q?feat:=20=EB=9E=8C=EB=8B=A4=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=B4=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/Lambda.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index bd68fe1c..ab66f44b 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -53,4 +53,10 @@ public static int sumAllOverThree(List numbers) { } return total; } + + public static int sumAllLamdba(List numbers) { + return numbers.stream() + .mapToInt(Integer::intValue) + .sum(); + } } From 03161ea10eb4368efb828e59ed88f7b008e83af0 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 28 Aug 2024 10:53:50 +0900 Subject: [PATCH 03/36] =?UTF-8?q?feat:=20=EB=9E=8C=EB=8B=A4=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EA=B8=B0=EB=8A=A5=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/nextstep/fp/Lambda.java | 8 +++++++ src/main/java/nextstep/fp/SumStrategy.java | 6 +++++ src/test/java/nextstep/fp/LambdaTest.java | 26 ++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/main/java/nextstep/fp/SumStrategy.java diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index ab66f44b..f4520189 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -59,4 +59,12 @@ public static int sumAllLamdba(List numbers) { .mapToInt(Integer::intValue) .sum(); } + + public static int sumLamdba(SumStrategy sumStrategy, List numbers) { + return numbers.stream() + .filter(sumStrategy::isCondition) + .mapToInt(Integer::intValue) + .sum(); + } + } diff --git a/src/main/java/nextstep/fp/SumStrategy.java b/src/main/java/nextstep/fp/SumStrategy.java new file mode 100644 index 00000000..2f2b8ed6 --- /dev/null +++ b/src/main/java/nextstep/fp/SumStrategy.java @@ -0,0 +1,6 @@ +package nextstep.fp; + +@FunctionalInterface +public interface SumStrategy { + boolean isCondition(int confidence); +} diff --git a/src/test/java/nextstep/fp/LambdaTest.java b/src/test/java/nextstep/fp/LambdaTest.java index f240ac65..79a8d557 100644 --- a/src/test/java/nextstep/fp/LambdaTest.java +++ b/src/test/java/nextstep/fp/LambdaTest.java @@ -1,11 +1,13 @@ package nextstep.fp; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; +import static org.assertj.core.api.Assertions.as; import static org.assertj.core.api.Assertions.assertThat; public class LambdaTest { @@ -48,4 +50,28 @@ public void sumAllOverThree() throws Exception { int sum = Lambda.sumAllOverThree(numbers); assertThat(sum).isEqualTo(15); } + + + @DisplayName("모두 더하기 Lamdba") + @Test + void sumAllLamdba() { + int sum = Lambda.sumAllLamdba(numbers); + assertThat(sum).isEqualTo(21); + } + + @DisplayName("짝수만 모두 더하기 Lamdba") + @Test + void sumEvenLamdba() { + int sum = Lambda.sumLamdba((confidence) -> confidence % 2 == 0, numbers); + assertThat(sum).isEqualTo(12); + } + + @DisplayName("3이상의 수만 모두 더하기 Lamdba") + @Test + void sumAllOverThreeLamdba() { + int sum = Lambda.sumLamdba((confidence) -> confidence > 3, numbers); + assertThat(sum).isEqualTo(15); + } + + } From f358e306521bffa477cdc6f5009c58839df94f27 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 28 Aug 2024 11:29:27 +0900 Subject: [PATCH 04/36] =?UTF-8?q?numbers=20=EC=9A=94=EC=86=8C=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20sum=EC=9D=84=20=EA=B5=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/nextstep/fp/MapStrategy.java | 5 +++ src/main/java/nextstep/fp/StreamStudy.java | 20 ++++++++++ src/main/java/nextstep/fp/SumAllStrategy.java | 6 +++ src/main/java/nextstep/fp/WordStrategy.java | 6 +++ src/test/java/nextstep/fp/LambdaTest.java | 1 - .../java/nextstep/fp/StreamStudyTest.java | 37 +++++++++++++++++++ 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/nextstep/fp/MapStrategy.java create mode 100644 src/main/java/nextstep/fp/SumAllStrategy.java create mode 100644 src/main/java/nextstep/fp/WordStrategy.java diff --git a/src/main/java/nextstep/fp/MapStrategy.java b/src/main/java/nextstep/fp/MapStrategy.java new file mode 100644 index 00000000..87cff71c --- /dev/null +++ b/src/main/java/nextstep/fp/MapStrategy.java @@ -0,0 +1,5 @@ +package nextstep.fp; + +public interface MapStrategy { + int confidence(int x); +} diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b446983a..f860682e 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -22,6 +22,17 @@ public static long countWords() throws IOException { return count; } + public static long countWordsFilter(WordStrategy wordStrategy) throws IOException { + String contents = new String(Files.readAllBytes(Paths + .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); + List words = Arrays.asList(contents.split("[\\P{L}]+")); + + return words.stream() + .mapToLong(String::length) + .filter(wordStrategy::confidence) + .count(); + } + public static void printLongestWordTop100() throws IOException { String contents = new String(Files.readAllBytes(Paths .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); @@ -34,10 +45,19 @@ public static List doubleNumbers(List numbers) { return numbers.stream().map(x -> 2 * x).collect(Collectors.toList()); } + public static List doubleNumbersStrategy(List numbers, MapStrategy mapStrategy) { + return numbers.stream().map(mapStrategy::confidence).collect(Collectors.toList()); + } + public static long sumAll(List numbers) { return numbers.stream().reduce(0, (x, y) -> x + y); } + public static long sumAllStrategy(List numbers, SumAllStrategy sumAllStrategy) { + // reduce의 첫번째 요소 identify: 0부터 누적하겠다는 의미 + return numbers.stream().reduce(0, sumAllStrategy::confidence); + } + public static long sumOverThreeAndDouble(List numbers) { return 0; } diff --git a/src/main/java/nextstep/fp/SumAllStrategy.java b/src/main/java/nextstep/fp/SumAllStrategy.java new file mode 100644 index 00000000..6975e00a --- /dev/null +++ b/src/main/java/nextstep/fp/SumAllStrategy.java @@ -0,0 +1,6 @@ +package nextstep.fp; + +@FunctionalInterface +public interface SumAllStrategy { + int confidence(int x, int y); +} diff --git a/src/main/java/nextstep/fp/WordStrategy.java b/src/main/java/nextstep/fp/WordStrategy.java new file mode 100644 index 00000000..cb9ba3ba --- /dev/null +++ b/src/main/java/nextstep/fp/WordStrategy.java @@ -0,0 +1,6 @@ +package nextstep.fp; + +@FunctionalInterface +public interface WordStrategy { + boolean confidence(long length); +} diff --git a/src/test/java/nextstep/fp/LambdaTest.java b/src/test/java/nextstep/fp/LambdaTest.java index 79a8d557..2a453d6c 100644 --- a/src/test/java/nextstep/fp/LambdaTest.java +++ b/src/test/java/nextstep/fp/LambdaTest.java @@ -73,5 +73,4 @@ void sumAllOverThreeLamdba() { assertThat(sum).isEqualTo(15); } - } diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java index 2962521a..fb470b87 100644 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ b/src/test/java/nextstep/fp/StreamStudyTest.java @@ -1,6 +1,7 @@ package nextstep.fp; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -22,6 +23,13 @@ public void countWords() throws Exception { System.out.println("result : " + result); } + @DisplayName("stream, filter를 사용하여 글자의 개수를 새는 기능") + @Test + void countWordStreamFilter() throws Exception { + long result = StreamStudy.countWordsFilter((length) -> length > 12); + System.out.println("result : " + result); + } + @Test public void printLongestWordTop100() throws Exception { StreamStudy.printLongestWordTop100(); @@ -33,16 +41,45 @@ public void map() throws Exception { doubleNumbers.forEach(System.out::println); } + @DisplayName("numbers 배열 안에 있는 요소들을 2배로 만드는 기능") + @Test + public void mapStrategy() throws Exception { + List doubleNumbers = StreamStudy.doubleNumbersStrategy(numbers, (x) -> x * 2); + List compareNumbers = Arrays.asList(2, 4, 6, 8, 10, 12); + assertThat(doubleNumbers).isEqualTo(compareNumbers); + System.out.println(doubleNumbers); + } + + @Test public void sumAll() throws Exception { long sum = StreamStudy.sumAll(numbers); assertThat(sum).isEqualTo(21); } + @Test + @DisplayName("numbers 요소들의 sum을 구하는 기능 Strategy") + void sumAllStrategy() { + long sum = StreamStudy.sumAllStrategy(numbers, (x, y) -> x + y); + assertThat(sum).isEqualTo(21); + } + + @Test + @DisplayName("numbers 요소들의 sum을 구하는 기능 reduce 테스트") + void sumAllReduce() { + long sum = numbers.stream() + .peek(System.out::println) + .reduce(10, (x, y) -> x + y); + + assertThat(sum).isEqualTo(31); + } + @Test public void sumOverThreeAndDouble() throws Exception { numbers = Arrays.asList(3, 1, 6, 2, 4, 8); long sum = StreamStudy.sumOverThreeAndDouble(numbers); assertThat(sum).isEqualTo(36); } + + } From a5978f2d219842445aff3be7421da9820569ed20 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 28 Aug 2024 13:36:27 +0900 Subject: [PATCH 05/36] =?UTF-8?q?feat:=20=EB=B0=B0=EC=97=B4=20=EC=9A=94?= =?UTF-8?q?=EC=86=8C=EC=97=90=20=EB=8B=B4=EA=B8=B4=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=A4=91=203=EB=B3=B4=EB=8B=A4=20?= =?UTF-8?q?=ED=81=B0=20=EC=88=AB=EC=9E=90=EB=A5=BC=202=EB=B0=B0=20?= =?UTF-8?q?=ED=95=9C=20=ED=9B=84=20=EB=AA=A8=EB=93=A0=20=EA=B0=92=EC=9D=98?= =?UTF-8?q?=20=ED=95=A9=EC=9D=84=20=EA=B5=AC=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/nextstep/fp/MapStrategy.java | 5 ----- src/main/java/nextstep/fp/StreamStudy.java | 20 +++++++++++++------ src/main/java/nextstep/fp/SumAllStrategy.java | 6 ------ .../java/nextstep/fp/StreamStudyTest.java | 7 ++++--- 4 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/nextstep/fp/MapStrategy.java delete mode 100644 src/main/java/nextstep/fp/SumAllStrategy.java diff --git a/src/main/java/nextstep/fp/MapStrategy.java b/src/main/java/nextstep/fp/MapStrategy.java deleted file mode 100644 index 87cff71c..00000000 --- a/src/main/java/nextstep/fp/MapStrategy.java +++ /dev/null @@ -1,5 +0,0 @@ -package nextstep.fp; - -public interface MapStrategy { - int confidence(int x); -} diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index f860682e..190b82f3 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -45,20 +45,28 @@ public static List doubleNumbers(List numbers) { return numbers.stream().map(x -> 2 * x).collect(Collectors.toList()); } - public static List doubleNumbersStrategy(List numbers, MapStrategy mapStrategy) { - return numbers.stream().map(mapStrategy::confidence).collect(Collectors.toList()); + public static List doubleNumbersRefactor(List numbers) { + return numbers.stream().map(StreamStudy::multipleNumber).collect(Collectors.toList()); } public static long sumAll(List numbers) { return numbers.stream().reduce(0, (x, y) -> x + y); } - public static long sumAllStrategy(List numbers, SumAllStrategy sumAllStrategy) { + public static long sumAllRefactor(List numbers) { // reduce의 첫번째 요소 identify: 0부터 누적하겠다는 의미 - return numbers.stream().reduce(0, sumAllStrategy::confidence); + return numbers.stream().reduce(0, Integer::sum); } - public static long sumOverThreeAndDouble(List numbers) { - return 0; + public static long sumOverThreeAndDouble(List numbers, SumStrategy sumStrategy) { + return numbers.stream() + .filter(sumStrategy::isCondition) + .mapToInt(StreamStudy::multipleNumber) + .reduce(0, Integer::sum); } + + private static int multipleNumber(int x) { + return x * 2; + } + } \ No newline at end of file diff --git a/src/main/java/nextstep/fp/SumAllStrategy.java b/src/main/java/nextstep/fp/SumAllStrategy.java deleted file mode 100644 index 6975e00a..00000000 --- a/src/main/java/nextstep/fp/SumAllStrategy.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.fp; - -@FunctionalInterface -public interface SumAllStrategy { - int confidence(int x, int y); -} diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java index fb470b87..023f5635 100644 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ b/src/test/java/nextstep/fp/StreamStudyTest.java @@ -44,7 +44,7 @@ public void map() throws Exception { @DisplayName("numbers 배열 안에 있는 요소들을 2배로 만드는 기능") @Test public void mapStrategy() throws Exception { - List doubleNumbers = StreamStudy.doubleNumbersStrategy(numbers, (x) -> x * 2); + List doubleNumbers = StreamStudy.doubleNumbersRefactor(numbers); List compareNumbers = Arrays.asList(2, 4, 6, 8, 10, 12); assertThat(doubleNumbers).isEqualTo(compareNumbers); System.out.println(doubleNumbers); @@ -60,7 +60,7 @@ public void sumAll() throws Exception { @Test @DisplayName("numbers 요소들의 sum을 구하는 기능 Strategy") void sumAllStrategy() { - long sum = StreamStudy.sumAllStrategy(numbers, (x, y) -> x + y); + long sum = StreamStudy.sumAllRefactor(numbers); assertThat(sum).isEqualTo(21); } @@ -75,9 +75,10 @@ void sumAllReduce() { } @Test + @DisplayName("List에 담긴 모든 숫자 중 3보다 큰 숫자를 2배 한 후 모든 값의 합을 구하는 기능") public void sumOverThreeAndDouble() throws Exception { numbers = Arrays.asList(3, 1, 6, 2, 4, 8); - long sum = StreamStudy.sumOverThreeAndDouble(numbers); + long sum = StreamStudy.sumOverThreeAndDouble(numbers, (x) -> x > 3); assertThat(sum).isEqualTo(36); } From b7def54653c46ef7a95a3019ee7d845910c137f9 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 28 Aug 2024 13:59:33 +0900 Subject: [PATCH 06/36] =?UTF-8?q?feat:=20printLongestWordTop100()=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 --- STREAM_README.md | 5 +++++ src/main/java/nextstep/fp/StreamStudy.java | 21 ++++++++++++++++++- .../java/nextstep/fp/WordTop100Strategy.java | 7 +++++++ .../java/nextstep/fp/StreamStudyTest.java | 2 +- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 STREAM_README.md create mode 100644 src/main/java/nextstep/fp/WordTop100Strategy.java diff --git a/STREAM_README.md b/STREAM_README.md new file mode 100644 index 00000000..73a373f7 --- /dev/null +++ b/STREAM_README.md @@ -0,0 +1,5 @@ +1. 단어의 길이가 12자를 초과하는 단어를 추출한다. +2. 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다. +3. 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다. +4. 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다. + diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index 190b82f3..fc607860 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -6,6 +6,7 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class StreamStudy { @@ -33,12 +34,30 @@ public static long countWordsFilter(WordStrategy wordStrategy) throws IOExceptio .count(); } - public static void printLongestWordTop100() throws IOException { + + /** + * 1. 단어의 길이가 12자를 초과하는 단어를 추출한다. + * 2. 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다. + * 3. 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다. + * 4. 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다. + */ + public static void printLongestWordTop100(WordTop100Strategy wordTop100Strategy) throws IOException { String contents = new String(Files.readAllBytes(Paths .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); // TODO 이 부분에 구현한다. + AtomicInteger count = new AtomicInteger(1); + + words.stream() + .distinct() + .filter(wordTop100Strategy::confidence) + .sorted() + .map(String::toLowerCase) + .limit(100) + .forEach(item -> { + System.out.println(count.getAndIncrement() + " : " + item); + }); } public static List doubleNumbers(List numbers) { diff --git a/src/main/java/nextstep/fp/WordTop100Strategy.java b/src/main/java/nextstep/fp/WordTop100Strategy.java new file mode 100644 index 00000000..ad09f7ab --- /dev/null +++ b/src/main/java/nextstep/fp/WordTop100Strategy.java @@ -0,0 +1,7 @@ +package nextstep.fp; + + +@FunctionalInterface +public interface WordTop100Strategy { + boolean confidence(String word); +} diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java index 023f5635..6ceb3fd7 100644 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ b/src/test/java/nextstep/fp/StreamStudyTest.java @@ -32,7 +32,7 @@ void countWordStreamFilter() throws Exception { @Test public void printLongestWordTop100() throws Exception { - StreamStudy.printLongestWordTop100(); + StreamStudy.printLongestWordTop100((word) -> word.length() > 12); } @Test From 6ac23fede18ca34c7f8c80e8a168731fc8376886 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 28 Aug 2024 14:52:39 +0900 Subject: [PATCH 07/36] =?UTF-8?q?feat:=20Optional=EC=9D=84=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=2030=EC=82=B4=20=EC=9D=B4=EC=83=81=2045=20?= =?UTF-8?q?=EC=9D=B4=ED=95=98=EC=9D=98=20=EC=9C=A0=EC=A0=80=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=A0=20=EA=B2=BD=EC=9A=B0=20true?= =?UTF-8?q?=EB=A5=BC=20=EB=A6=AC=ED=84=B4=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/nextstep/optional/User.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index 9614c2f4..fb4dfe34 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -1,5 +1,8 @@ package nextstep.optional; +import javax.swing.text.html.Option; +import java.util.Optional; + public class User { private String name; private Integer age; @@ -33,7 +36,19 @@ public static boolean ageIsInRange1(User user) { } public static boolean ageIsInRange2(User user) { - return false; + return Optional.ofNullable(user) + .filter(User::isNotNullAge) + .isPresent(); + } + + private static boolean isNotNullAge(User user) { + return Optional.ofNullable(user.getAge()) + .filter(User::isAgeRange) + .isPresent(); + } + + private static boolean isAgeRange(int age) { + return age >= 30 && age <= 45; } @Override From 77cf9d8b01d893da90b8166fd79dbc0f85e9e527 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Sun, 1 Sep 2024 23:17:36 +0900 Subject: [PATCH 08/36] =?UTF-8?q?feat:=20getUser()=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20stream=EA=B3=BC=20Optional=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EA=B8=B0=EB=8A=A5=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/nextstep/optional/User.java | 1 + src/main/java/nextstep/optional/Users.java | 9 +++++++++ src/test/java/nextstep/optional/UsersTest.java | 15 +++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index fb4dfe34..0896d2d6 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -81,4 +81,5 @@ public boolean equals(Object obj) { return false; return true; } + } diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java index 6293040d..25793dea 100644 --- a/src/main/java/nextstep/optional/Users.java +++ b/src/main/java/nextstep/optional/Users.java @@ -20,4 +20,13 @@ User getUser(String name) { } return DEFAULT_USER; } + + User getUserToStream(String userName) { + return users.stream() + .filter(user -> user.matchName(userName)) + .findFirst() + .orElse(DEFAULT_USER); + } + + } diff --git a/src/test/java/nextstep/optional/UsersTest.java b/src/test/java/nextstep/optional/UsersTest.java index ec0f7329..0134afb2 100644 --- a/src/test/java/nextstep/optional/UsersTest.java +++ b/src/test/java/nextstep/optional/UsersTest.java @@ -1,5 +1,6 @@ package nextstep.optional; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -18,4 +19,18 @@ public void getDefaultUser() { Users users = new Users(); assertThat(users.getUser("codesquard")).isEqualTo(Users.DEFAULT_USER); } + + @DisplayName("getUser 스트림 테스트") + @Test + void getUserToStream() { + Users users = new Users(); + assertThat(users.getUserToStream("crong")).isEqualTo(new User("crong", 35)); + } + + @DisplayName("getDefaultUser 스트림 테스트") + @Test + void getDefaultUserToStream() { + Users users = new Users(); + assertThat(users.getUserToStream("codesquard")).isEqualTo(Users.DEFAULT_USER); + } } From 9ae4570b397abb0e87942bfaad236fe097db2f4b Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Sun, 1 Sep 2024 23:25:47 +0900 Subject: [PATCH 09/36] =?UTF-8?q?feat:=20Expression=EC=9D=98=20of=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20stream=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=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/nextstep/optional/Expression.java | 11 +++++++++++ src/test/java/nextstep/optional/ExpressionTest.java | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java index 1c98cd6a..db09e3c5 100644 --- a/src/main/java/nextstep/optional/Expression.java +++ b/src/main/java/nextstep/optional/Expression.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Arrays; + enum Expression { PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); @@ -22,4 +24,13 @@ static Expression of(String expression) { throw new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)); } + + + static Expression ofToStream(String expression) { + return Arrays.stream(Expression.values()) + .filter(exp -> Expression.matchExpression(exp, expression)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression))); + } + } diff --git a/src/test/java/nextstep/optional/ExpressionTest.java b/src/test/java/nextstep/optional/ExpressionTest.java index 32356261..f8b8b852 100644 --- a/src/test/java/nextstep/optional/ExpressionTest.java +++ b/src/test/java/nextstep/optional/ExpressionTest.java @@ -1,5 +1,6 @@ package nextstep.optional; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -12,6 +13,12 @@ public void of() { assertThat(Expression.PLUS == Expression.of("+")).isTrue(); } + @DisplayName("of()메소드를 스트림으로 기능 구현") + @Test + void ofToStream() { + assertThat(Expression.PLUS == Expression.ofToStream("+")).isTrue(); + } + @Test public void notValidExpression() { assertThatIllegalArgumentException() From 9c1975c99605b927d40807c0142fed4962140c01 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 2 Sep 2024 18:01:03 +0900 Subject: [PATCH 10/36] =?UTF-8?q?feat:=20computerStore=20getVersion()=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/nextstep/optional/ComputerStore.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 2695c967..6368d460 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -3,6 +3,8 @@ import nextstep.optional.Computer.Soundcard; import nextstep.optional.Computer.USB; +import java.util.Optional; + public class ComputerStore { public static final String UNKNOWN_VERSION = "UNKNOWN"; @@ -21,6 +23,14 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - return null; + Optional optional = Optional.ofNullable(computer); + return optional.stream() + .map(Computer::getSoundcard) + .filter(item -> item != null) + .map(Soundcard::getUsb) + .filter(item -> item != null) + .map(USB::getVersion) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("잘 못된 데이터입니다.")); } } From 5971d91bea8395a756f636053af3ea3b7c366401 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 11:10:59 +0900 Subject: [PATCH 11/36] =?UTF-8?q?feat:=20getVersionOptional=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/nextstep/optional/ComputerStore.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 6368d460..46e783c4 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -23,14 +23,12 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - Optional optional = Optional.ofNullable(computer); - return optional.stream() + return Optional.ofNullable(computer) .map(Computer::getSoundcard) .filter(item -> item != null) .map(Soundcard::getUsb) .filter(item -> item != null) .map(USB::getVersion) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("잘 못된 데이터입니다.")); + .orElse(ComputerStore.UNKNOWN_VERSION); } } From 6c7330b02ae733ff2995547ef8d809edada96be0 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 11:13:40 +0900 Subject: [PATCH 12/36] =?UTF-8?q?fix:=20=EB=AA=A8=EB=91=90=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/Car.java | 35 ------- src/main/java/nextstep/fp/Lambda.java | 70 -------------- src/main/java/nextstep/fp/MoveStrategy.java | 6 -- src/main/java/nextstep/fp/StreamStudy.java | 91 ------------------- src/main/java/nextstep/fp/SumStrategy.java | 6 -- src/main/java/nextstep/fp/WordStrategy.java | 6 -- .../java/nextstep/fp/WordTop100Strategy.java | 7 -- src/main/java/nextstep/optional/Computer.java | 39 -------- .../java/nextstep/optional/ComputerStore.java | 34 ------- .../java/nextstep/optional/Expression.java | 36 -------- src/main/java/nextstep/optional/User.java | 85 ----------------- src/main/java/nextstep/optional/Users.java | 32 ------- src/test/java/nextstep/fp/CarTest.java | 51 ----------- src/test/java/nextstep/fp/LambdaTest.java | 76 ---------------- .../java/nextstep/fp/StreamStudyTest.java | 86 ------------------ .../nextstep/optional/ComputerStoreTest.java | 59 ------------ .../nextstep/optional/ExpressionTest.java | 29 ------ src/test/java/nextstep/optional/UserTest.java | 27 ------ .../java/nextstep/optional/UsersTest.java | 36 -------- 19 files changed, 811 deletions(-) delete mode 100644 src/main/java/nextstep/fp/Car.java delete mode 100644 src/main/java/nextstep/fp/Lambda.java delete mode 100644 src/main/java/nextstep/fp/MoveStrategy.java delete mode 100644 src/main/java/nextstep/fp/StreamStudy.java delete mode 100644 src/main/java/nextstep/fp/SumStrategy.java delete mode 100644 src/main/java/nextstep/fp/WordStrategy.java delete mode 100644 src/main/java/nextstep/fp/WordTop100Strategy.java delete mode 100644 src/main/java/nextstep/optional/Computer.java delete mode 100644 src/main/java/nextstep/optional/ComputerStore.java delete mode 100644 src/main/java/nextstep/optional/Expression.java delete mode 100644 src/main/java/nextstep/optional/User.java delete mode 100644 src/main/java/nextstep/optional/Users.java delete mode 100644 src/test/java/nextstep/fp/CarTest.java delete mode 100644 src/test/java/nextstep/fp/LambdaTest.java delete mode 100644 src/test/java/nextstep/fp/StreamStudyTest.java delete mode 100644 src/test/java/nextstep/optional/ComputerStoreTest.java delete mode 100644 src/test/java/nextstep/optional/ExpressionTest.java delete mode 100644 src/test/java/nextstep/optional/UserTest.java delete mode 100644 src/test/java/nextstep/optional/UsersTest.java diff --git a/src/main/java/nextstep/fp/Car.java b/src/main/java/nextstep/fp/Car.java deleted file mode 100644 index 2146c112..00000000 --- a/src/main/java/nextstep/fp/Car.java +++ /dev/null @@ -1,35 +0,0 @@ -package nextstep.fp; - -import java.util.Objects; - -public class Car { - private final String name; - private final int position; - - public Car(String name, int position) { - this.name = name; - this.position = position; - } - - public Car move(MoveStrategy moveStrategy) { - if (moveStrategy.isMovable()) { - return new Car(name, position + 1); - } - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Car car = (Car) o; - return position == car.position && - Objects.equals(name, car.name); - } - - @Override - public int hashCode() { - - return Objects.hash(name, position); - } -} diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java deleted file mode 100644 index f4520189..00000000 --- a/src/main/java/nextstep/fp/Lambda.java +++ /dev/null @@ -1,70 +0,0 @@ -package nextstep.fp; - -import java.util.List; - -public class Lambda { - public static void printAllOld(List numbers) { - System.out.println("printAllOld"); - - for (int number : numbers) { - System.out.println(number); - } - } - - public static void printAllLambda(List numbers) { - System.out.println("printAllLambda"); - - numbers.forEach(System.out::println); - } - - public static void runThread() { - new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Hello from thread"); - } - }).start(); - } - - public static int sumAll(List numbers) { - int total = 0; - for (int number : numbers) { - total += number; - } - return total; - } - - public static int sumAllEven(List numbers) { - int total = 0; - for (int number : numbers) { - if (number % 2 == 0) { - total += number; - } - } - return total; - } - - public static int sumAllOverThree(List numbers) { - int total = 0; - for (int number : numbers) { - if (number > 3) { - total += number; - } - } - return total; - } - - public static int sumAllLamdba(List numbers) { - return numbers.stream() - .mapToInt(Integer::intValue) - .sum(); - } - - public static int sumLamdba(SumStrategy sumStrategy, List numbers) { - return numbers.stream() - .filter(sumStrategy::isCondition) - .mapToInt(Integer::intValue) - .sum(); - } - -} diff --git a/src/main/java/nextstep/fp/MoveStrategy.java b/src/main/java/nextstep/fp/MoveStrategy.java deleted file mode 100644 index ac8fbd27..00000000 --- a/src/main/java/nextstep/fp/MoveStrategy.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.fp; - -@FunctionalInterface -public interface MoveStrategy { - boolean isMovable(); -} diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java deleted file mode 100644 index fc607860..00000000 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ /dev/null @@ -1,91 +0,0 @@ -package nextstep.fp; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -public class StreamStudy { - - public static long countWords() throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - - long count = 0; - for (String w : words) { - if (w.length() > 12) count++; - } - return count; - } - - public static long countWordsFilter(WordStrategy wordStrategy) throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - - return words.stream() - .mapToLong(String::length) - .filter(wordStrategy::confidence) - .count(); - } - - - /** - * 1. 단어의 길이가 12자를 초과하는 단어를 추출한다. - * 2. 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다. - * 3. 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다. - * 4. 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다. - */ - public static void printLongestWordTop100(WordTop100Strategy wordTop100Strategy) throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - - // TODO 이 부분에 구현한다. - AtomicInteger count = new AtomicInteger(1); - - words.stream() - .distinct() - .filter(wordTop100Strategy::confidence) - .sorted() - .map(String::toLowerCase) - .limit(100) - .forEach(item -> { - System.out.println(count.getAndIncrement() + " : " + item); - }); - } - - public static List doubleNumbers(List numbers) { - return numbers.stream().map(x -> 2 * x).collect(Collectors.toList()); - } - - public static List doubleNumbersRefactor(List numbers) { - return numbers.stream().map(StreamStudy::multipleNumber).collect(Collectors.toList()); - } - - public static long sumAll(List numbers) { - return numbers.stream().reduce(0, (x, y) -> x + y); - } - - public static long sumAllRefactor(List numbers) { - // reduce의 첫번째 요소 identify: 0부터 누적하겠다는 의미 - return numbers.stream().reduce(0, Integer::sum); - } - - public static long sumOverThreeAndDouble(List numbers, SumStrategy sumStrategy) { - return numbers.stream() - .filter(sumStrategy::isCondition) - .mapToInt(StreamStudy::multipleNumber) - .reduce(0, Integer::sum); - } - - private static int multipleNumber(int x) { - return x * 2; - } - -} \ No newline at end of file diff --git a/src/main/java/nextstep/fp/SumStrategy.java b/src/main/java/nextstep/fp/SumStrategy.java deleted file mode 100644 index 2f2b8ed6..00000000 --- a/src/main/java/nextstep/fp/SumStrategy.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.fp; - -@FunctionalInterface -public interface SumStrategy { - boolean isCondition(int confidence); -} diff --git a/src/main/java/nextstep/fp/WordStrategy.java b/src/main/java/nextstep/fp/WordStrategy.java deleted file mode 100644 index cb9ba3ba..00000000 --- a/src/main/java/nextstep/fp/WordStrategy.java +++ /dev/null @@ -1,6 +0,0 @@ -package nextstep.fp; - -@FunctionalInterface -public interface WordStrategy { - boolean confidence(long length); -} diff --git a/src/main/java/nextstep/fp/WordTop100Strategy.java b/src/main/java/nextstep/fp/WordTop100Strategy.java deleted file mode 100644 index ad09f7ab..00000000 --- a/src/main/java/nextstep/fp/WordTop100Strategy.java +++ /dev/null @@ -1,7 +0,0 @@ -package nextstep.fp; - - -@FunctionalInterface -public interface WordTop100Strategy { - boolean confidence(String word); -} diff --git a/src/main/java/nextstep/optional/Computer.java b/src/main/java/nextstep/optional/Computer.java deleted file mode 100644 index cc0af4d7..00000000 --- a/src/main/java/nextstep/optional/Computer.java +++ /dev/null @@ -1,39 +0,0 @@ -package nextstep.optional; - -public class Computer { - private Soundcard soundcard; - - public Computer(Soundcard soundcard) { - this.soundcard = soundcard; - } - - public Soundcard getSoundcard() { - return soundcard; - } - - public static class Soundcard { - private USB usb; - - public Soundcard(USB usb) { - super(); - this.usb = usb; - } - - public USB getUsb() { - return usb; - } - } - - public static class USB { - private String version; - - public USB(String version) { - super(); - this.version = version; - } - - public String getVersion() { - return this.version; - } - } -} diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java deleted file mode 100644 index 46e783c4..00000000 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ /dev/null @@ -1,34 +0,0 @@ -package nextstep.optional; - -import nextstep.optional.Computer.Soundcard; -import nextstep.optional.Computer.USB; - -import java.util.Optional; - -public class ComputerStore { - public static final String UNKNOWN_VERSION = "UNKNOWN"; - - public static String getVersion(Computer computer) { - String version = UNKNOWN_VERSION; - if (computer != null) { - Soundcard soundcard = computer.getSoundcard(); - if (soundcard != null) { - USB usb = soundcard.getUsb(); - if (usb != null) { - version = usb.getVersion(); - } - } - } - return version; - } - - public static String getVersionOptional(Computer computer) { - return Optional.ofNullable(computer) - .map(Computer::getSoundcard) - .filter(item -> item != null) - .map(Soundcard::getUsb) - .filter(item -> item != null) - .map(USB::getVersion) - .orElse(ComputerStore.UNKNOWN_VERSION); - } -} diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java deleted file mode 100644 index db09e3c5..00000000 --- a/src/main/java/nextstep/optional/Expression.java +++ /dev/null @@ -1,36 +0,0 @@ -package nextstep.optional; - -import java.util.Arrays; - -enum Expression { - PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); - - private String expression; - - Expression(String expression) { - this.expression = expression; - } - - private static boolean matchExpression(Expression e, String expression) { - return expression.equals(e.expression); - } - - static Expression of(String expression) { - for (Expression v : values()) { - if (matchExpression(v, expression)) { - return v; - } - } - - throw new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)); - } - - - static Expression ofToStream(String expression) { - return Arrays.stream(Expression.values()) - .filter(exp -> Expression.matchExpression(exp, expression)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression))); - } - -} diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java deleted file mode 100644 index 0896d2d6..00000000 --- a/src/main/java/nextstep/optional/User.java +++ /dev/null @@ -1,85 +0,0 @@ -package nextstep.optional; - -import javax.swing.text.html.Option; -import java.util.Optional; - -public class User { - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public Integer getAge() { - return age; - } - - public boolean matchName(String name) { - return this.name.equals(name); - } - - public static boolean ageIsInRange1(User user) { - boolean isInRange = false; - - if (user != null && user.getAge() != null - && (user.getAge() >= 30 - && user.getAge() <= 45)) { - isInRange = true; - } - return isInRange; - } - - public static boolean ageIsInRange2(User user) { - return Optional.ofNullable(user) - .filter(User::isNotNullAge) - .isPresent(); - } - - private static boolean isNotNullAge(User user) { - return Optional.ofNullable(user.getAge()) - .filter(User::isAgeRange) - .isPresent(); - } - - private static boolean isAgeRange(int age) { - return age >= 30 && age <= 45; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((age == null) ? 0 : age.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - User other = (User) obj; - if (age == null) { - if (other.age != null) - return false; - } else if (!age.equals(other.age)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - -} diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java deleted file mode 100644 index 25793dea..00000000 --- a/src/main/java/nextstep/optional/Users.java +++ /dev/null @@ -1,32 +0,0 @@ -package nextstep.optional; - -import java.util.Arrays; -import java.util.List; - -public class Users { - static final User DEFAULT_USER = new User("codesquad", 100); - - List users = Arrays.asList( - new User("crong", 35), - new User("pobi", 30), - new User("jk", 40), - new User("honux", 45)); - - User getUser(String name) { - for (User user : users) { - if (user.matchName(name)) { - return user; - } - } - return DEFAULT_USER; - } - - User getUserToStream(String userName) { - return users.stream() - .filter(user -> user.matchName(userName)) - .findFirst() - .orElse(DEFAULT_USER); - } - - -} diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java deleted file mode 100644 index a6b788ed..00000000 --- a/src/test/java/nextstep/fp/CarTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CarTest { - @Test - public void 이동() { - Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return true; - } - }); - assertThat(actual).isEqualTo(new Car("pobi", 1)); - } - - @Test - public void 정지() { - Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return false; - } - }); - assertThat(actual).isEqualTo(new Car("pobi", 0)); - } - - @DisplayName("자동차 이동 테스트 (람다 버전)") - @Test - void 이동_람다() { - Car car = new Car("pobi", 0); - Car actual = car.move(() -> true); - - assertThat(actual).isEqualTo(new Car("pobi", 1)); - } - - @DisplayName("자동차 정지 테스트 (람다 버전)") - @Test - void 정지_람다() { - Car car = new Car("pobi", 0); - Car actual = car.move(() -> false); - - assertThat(actual).isEqualTo(new Car("pobi", 0)); - } - -} diff --git a/src/test/java/nextstep/fp/LambdaTest.java b/src/test/java/nextstep/fp/LambdaTest.java deleted file mode 100644 index 2a453d6c..00000000 --- a/src/test/java/nextstep/fp/LambdaTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.as; -import static org.assertj.core.api.Assertions.assertThat; - -public class LambdaTest { - private List numbers; - - @BeforeEach - public void setup() { - numbers = Arrays.asList(1, 2, 3, 4, 5, 6); - } - - @Test - public void printAllOld() throws Exception { - Lambda.printAllOld(numbers); - } - - @Test - public void printAllLambda() throws Exception { - Lambda.printAllLambda(numbers); - } - - @Test - public void runThread() throws Exception { - Lambda.runThread(); - } - - @Test - public void sumAll() throws Exception { - int sum = Lambda.sumAll(numbers); - assertThat(sum).isEqualTo(21); - } - - @Test - public void sumAllEven() throws Exception { - int sum = Lambda.sumAllEven(numbers); - assertThat(sum).isEqualTo(12); - } - - @Test - public void sumAllOverThree() throws Exception { - int sum = Lambda.sumAllOverThree(numbers); - assertThat(sum).isEqualTo(15); - } - - - @DisplayName("모두 더하기 Lamdba") - @Test - void sumAllLamdba() { - int sum = Lambda.sumAllLamdba(numbers); - assertThat(sum).isEqualTo(21); - } - - @DisplayName("짝수만 모두 더하기 Lamdba") - @Test - void sumEvenLamdba() { - int sum = Lambda.sumLamdba((confidence) -> confidence % 2 == 0, numbers); - assertThat(sum).isEqualTo(12); - } - - @DisplayName("3이상의 수만 모두 더하기 Lamdba") - @Test - void sumAllOverThreeLamdba() { - int sum = Lambda.sumLamdba((confidence) -> confidence > 3, numbers); - assertThat(sum).isEqualTo(15); - } - -} diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java deleted file mode 100644 index 6ceb3fd7..00000000 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StreamStudyTest { - private List numbers; - - @BeforeEach - public void setup() { - numbers = Arrays.asList(1, 2, 3, 4, 5, 6); - } - - @Test - public void countWords() throws Exception { - long result = StreamStudy.countWords(); - System.out.println("result : " + result); - } - - @DisplayName("stream, filter를 사용하여 글자의 개수를 새는 기능") - @Test - void countWordStreamFilter() throws Exception { - long result = StreamStudy.countWordsFilter((length) -> length > 12); - System.out.println("result : " + result); - } - - @Test - public void printLongestWordTop100() throws Exception { - StreamStudy.printLongestWordTop100((word) -> word.length() > 12); - } - - @Test - public void map() throws Exception { - List doubleNumbers = StreamStudy.doubleNumbers(numbers); - doubleNumbers.forEach(System.out::println); - } - - @DisplayName("numbers 배열 안에 있는 요소들을 2배로 만드는 기능") - @Test - public void mapStrategy() throws Exception { - List doubleNumbers = StreamStudy.doubleNumbersRefactor(numbers); - List compareNumbers = Arrays.asList(2, 4, 6, 8, 10, 12); - assertThat(doubleNumbers).isEqualTo(compareNumbers); - System.out.println(doubleNumbers); - } - - - @Test - public void sumAll() throws Exception { - long sum = StreamStudy.sumAll(numbers); - assertThat(sum).isEqualTo(21); - } - - @Test - @DisplayName("numbers 요소들의 sum을 구하는 기능 Strategy") - void sumAllStrategy() { - long sum = StreamStudy.sumAllRefactor(numbers); - assertThat(sum).isEqualTo(21); - } - - @Test - @DisplayName("numbers 요소들의 sum을 구하는 기능 reduce 테스트") - void sumAllReduce() { - long sum = numbers.stream() - .peek(System.out::println) - .reduce(10, (x, y) -> x + y); - - assertThat(sum).isEqualTo(31); - } - - @Test - @DisplayName("List에 담긴 모든 숫자 중 3보다 큰 숫자를 2배 한 후 모든 값의 합을 구하는 기능") - public void sumOverThreeAndDouble() throws Exception { - numbers = Arrays.asList(3, 1, 6, 2, 4, 8); - long sum = StreamStudy.sumOverThreeAndDouble(numbers, (x) -> x > 3); - assertThat(sum).isEqualTo(36); - } - - -} diff --git a/src/test/java/nextstep/optional/ComputerStoreTest.java b/src/test/java/nextstep/optional/ComputerStoreTest.java deleted file mode 100644 index b576253a..00000000 --- a/src/test/java/nextstep/optional/ComputerStoreTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package nextstep.optional; - -import nextstep.optional.Computer.Soundcard; -import nextstep.optional.Computer.USB; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ComputerStoreTest { - @Test - public void getVersion() { - String version = "pobi's usb"; - Soundcard soundcard = new Soundcard(new USB(version)); - Computer computer = new Computer(soundcard); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(version); - } - - @Test - public void getVersionWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersion(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionWhenSoundcardIsNull() throws Exception { - Computer computer = new Computer(null); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionWhenUSBIsNull() throws Exception { - Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptional() { - String version = "pobi's usb"; - Soundcard soundcard = new Soundcard(new USB(version)); - Computer computer = new Computer(soundcard); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(version); - } - - @Test - public void getVersionOptionalWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersionOptional(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptionalWhenSoundcardIsNull() throws Exception { - Computer computer = new Computer(null); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptionalWhenUSBIsNull() throws Exception { - Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } -} diff --git a/src/test/java/nextstep/optional/ExpressionTest.java b/src/test/java/nextstep/optional/ExpressionTest.java deleted file mode 100644 index f8b8b852..00000000 --- a/src/test/java/nextstep/optional/ExpressionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; - - -public class ExpressionTest { - @Test - public void of() { - assertThat(Expression.PLUS == Expression.of("+")).isTrue(); - } - - @DisplayName("of()메소드를 스트림으로 기능 구현") - @Test - void ofToStream() { - assertThat(Expression.PLUS == Expression.ofToStream("+")).isTrue(); - } - - @Test - public void notValidExpression() { - assertThatIllegalArgumentException() - .isThrownBy(() -> { - Expression.of("&"); - }); - } -} diff --git a/src/test/java/nextstep/optional/UserTest.java b/src/test/java/nextstep/optional/UserTest.java deleted file mode 100644 index bfc6af49..00000000 --- a/src/test/java/nextstep/optional/UserTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.Test; - -import static nextstep.optional.User.ageIsInRange1; -import static nextstep.optional.User.ageIsInRange2; -import static org.assertj.core.api.Assertions.assertThat; - -public class UserTest { - @Test - public void whenFiltersWithoutOptional_thenCorrect() { - assertThat(ageIsInRange1(new User("crong", 35))).isTrue(); - assertThat(ageIsInRange1(new User("crong", 48))).isFalse(); - assertThat(ageIsInRange1(new User("crong", null))).isFalse(); - assertThat(ageIsInRange1(new User("crong", 29))).isFalse(); - assertThat(ageIsInRange1(null)).isFalse(); - } - - @Test - public void whenFiltersWithOptional_thenCorrect() { - assertThat(ageIsInRange2(new User("crong", 35))).isTrue(); - assertThat(ageIsInRange2(new User("crong", 48))).isFalse(); - assertThat(ageIsInRange2(new User("crong", null))).isFalse(); - assertThat(ageIsInRange2(new User("crong", 29))).isFalse(); - assertThat(ageIsInRange2(null)).isFalse(); - } -} diff --git a/src/test/java/nextstep/optional/UsersTest.java b/src/test/java/nextstep/optional/UsersTest.java deleted file mode 100644 index 0134afb2..00000000 --- a/src/test/java/nextstep/optional/UsersTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UsersTest { - - @Test - public void getUser() { - Users users = new Users(); - assertThat(users.getUser("crong")).isEqualTo(new User("crong", 35)); - } - - - @Test - public void getDefaultUser() { - Users users = new Users(); - assertThat(users.getUser("codesquard")).isEqualTo(Users.DEFAULT_USER); - } - - @DisplayName("getUser 스트림 테스트") - @Test - void getUserToStream() { - Users users = new Users(); - assertThat(users.getUserToStream("crong")).isEqualTo(new User("crong", 35)); - } - - @DisplayName("getDefaultUser 스트림 테스트") - @Test - void getDefaultUserToStream() { - Users users = new Users(); - assertThat(users.getUserToStream("codesquard")).isEqualTo(Users.DEFAULT_USER); - } -} From 28121493d4b91730b16be355e40b4f7b5dfb125e Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 17:12:41 +0900 Subject: [PATCH 13/36] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BACKJAC_README.md | 39 +++++++++ src/main/java/nextstep/blackjac/Main.java | 4 + .../java/nextstep/blackjac/domain/Card.java | 47 ++++++++++ .../nextstep/blackjac/domain/CardDeck.java | 51 +++++++++++ .../nextstep/blackjac/domain/CloverCard.java | 12 +++ .../java/nextstep/blackjac/domain/Deck.java | 46 ++++++++++ .../nextstep/blackjac/domain/DiamondCard.java | 12 +++ .../nextstep/blackjac/domain/HeartCard.java | 12 +++ .../nextstep/blackjac/domain/SpadeCard.java | 17 ++++ .../blackjacTest/deckTest/CardTest.java | 86 +++++++++++++++++++ 10 files changed, 326 insertions(+) create mode 100644 BACKJAC_README.md create mode 100644 src/main/java/nextstep/blackjac/Main.java create mode 100644 src/main/java/nextstep/blackjac/domain/Card.java create mode 100644 src/main/java/nextstep/blackjac/domain/CardDeck.java create mode 100644 src/main/java/nextstep/blackjac/domain/CloverCard.java create mode 100644 src/main/java/nextstep/blackjac/domain/Deck.java create mode 100644 src/main/java/nextstep/blackjac/domain/DiamondCard.java create mode 100644 src/main/java/nextstep/blackjac/domain/HeartCard.java create mode 100644 src/main/java/nextstep/blackjac/domain/SpadeCard.java create mode 100644 src/test/java/nextstep/blackjacTest/deckTest/CardTest.java diff --git a/BACKJAC_README.md b/BACKJAC_README.md new file mode 100644 index 00000000..635d00a4 --- /dev/null +++ b/BACKJAC_README.md @@ -0,0 +1,39 @@ +블랙잭 게임을 변형한 프로그램을 구현한다. + +블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +- 카드 덱 +♠♥♦♣ 네 수트(문양) +A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이저 카드 = 52장 + 조커 2장 = 54장 + +- Deck +1. spadeCard = 13장 + 조커 1장 + - cardlist +2. heartCard = 13장 + 조커 1장 + - cardlist +3. diamondCard = 13장 + - cardlist +4. cloverCard = 13장 + - cardlist + +- 셔플기능 + + +- player +1. UserA +2. UserB +3. dealer + + +1. 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. +2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [] +3. 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. +4. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. +5. 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. +6. 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +7. 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. + + + + + diff --git a/src/main/java/nextstep/blackjac/Main.java b/src/main/java/nextstep/blackjac/Main.java new file mode 100644 index 00000000..49261ebc --- /dev/null +++ b/src/main/java/nextstep/blackjac/Main.java @@ -0,0 +1,4 @@ +package nextstep.blackjac; + +public class Main { +} diff --git a/src/main/java/nextstep/blackjac/domain/Card.java b/src/main/java/nextstep/blackjac/domain/Card.java new file mode 100644 index 00000000..bc36a8e1 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/Card.java @@ -0,0 +1,47 @@ +package nextstep.blackjac.domain; + +import java.util.Objects; + +public class Card { + private String cardName; + private String cardShape; + private int cardNumber; + + public Card(String cardName, String cardShape, int cardNumber) { + this.cardName = cardName; + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + public Card(String cardName, String cardShape) { + this.cardName = cardName; + this.cardShape = cardShape; + } + + public Card(String cardShape, int cardNumber) { + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return cardNumber == card.cardNumber && Objects.equals(cardName, card.cardName) && Objects.equals(cardShape, card.cardShape); + } + + @Override + public int hashCode() { + return Objects.hash(cardName, cardShape, cardNumber); + } + + @Override + public String toString() { + return "Card{" + + "cardPosition='" + cardName + '\'' + + ", cardShape='" + cardShape + '\'' + + ", cardNumber=" + cardNumber + + '}'; + } +} diff --git a/src/main/java/nextstep/blackjac/domain/CardDeck.java b/src/main/java/nextstep/blackjac/domain/CardDeck.java new file mode 100644 index 00000000..6d11c9fe --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/CardDeck.java @@ -0,0 +1,51 @@ +package nextstep.blackjac.domain; + + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CardDeck { + private SpadeCard spadeCardDeck; + private HeartCard heartCardDeck; + private DiamondCard diamondCardDeck; + private CloverCard cloverCardDeck; + + public CardDeck() { + spadeCardDeck = new SpadeCard("spade"); + heartCardDeck = new HeartCard("heart"); + diamondCardDeck = new DiamondCard("diamond"); + cloverCardDeck = new CloverCard("clover"); + } + + public List shuffle() { + List cardDeck = concat(); + Collections.shuffle(cardDeck); + + return cardDeck; + } + + private List concat() { + cardShuffle(); + List shuffleSpadeCardDeck = spadeCardDeck.getCardList(); + List shuffleHeartCardDeck = heartCardDeck.getCardList(); + List shuffleDiamondCardDeck = diamondCardDeck.getCardList(); + List shuffleCloverCardDeck = cloverCardDeck.getCardList(); + + return Stream.of(shuffleSpadeCardDeck, shuffleHeartCardDeck, shuffleDiamondCardDeck, shuffleCloverCardDeck) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + private void cardShuffle() { + spadeCardDeck.shuffle(); + heartCardDeck.shuffle(); + diamondCardDeck.shuffle(); + cloverCardDeck.shuffle(); + } + + +} diff --git a/src/main/java/nextstep/blackjac/domain/CloverCard.java b/src/main/java/nextstep/blackjac/domain/CloverCard.java new file mode 100644 index 00000000..85f64b47 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/CloverCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.domain; + +public class CloverCard extends Deck { + public CloverCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + + } +} diff --git a/src/main/java/nextstep/blackjac/domain/Deck.java b/src/main/java/nextstep/blackjac/domain/Deck.java new file mode 100644 index 00000000..b55e2b9d --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/Deck.java @@ -0,0 +1,46 @@ +package nextstep.blackjac.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public abstract class Deck { + protected List cardList; + protected int cardCount = 13; + protected String cardShape; + + protected Deck(String cardShape) { + this.cardShape = cardShape; + cardList = new ArrayList<>(); + init(); + addJoker(); + } + + void init() { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + + void shuffle() { + Collections.shuffle(getCardList()); + } + + abstract void addJoker(); + + public List getCardList() { + return cardList; + } + +} diff --git a/src/main/java/nextstep/blackjac/domain/DiamondCard.java b/src/main/java/nextstep/blackjac/domain/DiamondCard.java new file mode 100644 index 00000000..e9336ce4 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/DiamondCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.domain; + +public class DiamondCard extends Deck { + public DiamondCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + + } +} diff --git a/src/main/java/nextstep/blackjac/domain/HeartCard.java b/src/main/java/nextstep/blackjac/domain/HeartCard.java new file mode 100644 index 00000000..55a545e4 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/HeartCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.domain; + +public class HeartCard extends Deck { + public HeartCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + cardList.add(new Card("Joker", cardShape, 10)); + } +} diff --git a/src/main/java/nextstep/blackjac/domain/SpadeCard.java b/src/main/java/nextstep/blackjac/domain/SpadeCard.java new file mode 100644 index 00000000..b3ed0d9c --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/SpadeCard.java @@ -0,0 +1,17 @@ +package nextstep.blackjac.domain; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class SpadeCard extends Deck { + public SpadeCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + cardList.add(new Card("Joker", cardShape, 10)); + } + +} diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java new file mode 100644 index 00000000..e9ac4177 --- /dev/null +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -0,0 +1,86 @@ +package nextstep.blackjacTest.deckTest; + +import nextstep.blackjac.domain.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class CardTest { + private Deck deck; + private List cardList = new ArrayList<>(); + + + @DisplayName("스페이드 카드 초기화 기능 테스트") + @Test + void spadeCardInit() { + final String cardShape = "spade"; + deck = new SpadeCard(cardShape); + initCardList(cardShape); + cardList.add(new Card("Joker", cardShape, 10)); + + assertThat(deck.getCardList()).isEqualTo(cardList); + } + + @DisplayName("클로버 카드 초기화 기능 테스트") + @Test + void cloverCardInit() { + final String cardShape = "clover"; + deck = new CloverCard(cardShape); + initCardList(cardShape); + + assertThat(deck.getCardList()).isEqualTo(cardList); + } + + @DisplayName("하트 카드 초기화 기능 테스트") + @Test + void heartCardInit() { + final String cardShape = "heart"; + deck = new HeartCard(cardShape); + initCardList(cardShape); + cardList.add(new Card("Joker", cardShape, 10)); + + assertThat(deck.getCardList()).isEqualTo(cardList); + } + + @DisplayName("다이아몬드 카드 초기화 기능 테스트") + @Test + void diamondCardInit() { + final String cardShape = "diamond"; + deck = new DiamondCard(cardShape); + initCardList(cardShape); + + assertThat(deck.getCardList()).isEqualTo(cardList); + } + + @DisplayName("카드 셔플 기능 테스트") + @Test + void shuffle() { + CardDeck cardDeck = new CardDeck(); + List cards = cardDeck.shuffle(); + assertThat(cards.size()).isEqualTo(54); + System.out.println(cards); + } + + private void initCardList(String cardShape) { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + +} From 278367d0294164ba0c61aa87f01294cdb50dd540 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 17:50:29 +0900 Subject: [PATCH 14/36] =?UTF-8?q?feat:=20user=20=EA=B8=B0=EB=8A=A5=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 --- BACKJAC_README.md | 12 ++++--- .../java/nextstep/blackjac/domain/User.java | 34 +++++++++++++++++++ .../java/nextstep/blackjac/domain/Users.java | 17 ++++++++++ .../blackjacTest/deckTest/CardTest.java | 4 --- .../blackjacTest/deckTest/UserTest.java | 24 +++++++++++++ 5 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/domain/User.java create mode 100644 src/main/java/nextstep/blackjac/domain/Users.java create mode 100644 src/test/java/nextstep/blackjacTest/deckTest/UserTest.java diff --git a/BACKJAC_README.md b/BACKJAC_README.md index 635d00a4..52fd9274 100644 --- a/BACKJAC_README.md +++ b/BACKJAC_README.md @@ -7,16 +7,16 @@ A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이저 카드 = 52장 + 조커 2장 = 54장 - Deck -1. spadeCard = 13장 + 조커 1장 +1. spadeCard = 13장 + 조커 1장 [v] - cardlist -2. heartCard = 13장 + 조커 1장 +2. heartCard = 13장 + 조커 1장 [v] - cardlist -3. diamondCard = 13장 +3. diamondCard = 13장 [v] - cardlist -4. cloverCard = 13장 +4. cloverCard = 13장 [v] - cardlist -- 셔플기능 +- 셔플기능 [v] - player @@ -24,6 +24,8 @@ A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이 2. UserB 3. dealer +- 10000 -> 1칩이라고 가정 + 1. 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. 2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [] diff --git a/src/main/java/nextstep/blackjac/domain/User.java b/src/main/java/nextstep/blackjac/domain/User.java new file mode 100644 index 00000000..a954caca --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/User.java @@ -0,0 +1,34 @@ +package nextstep.blackjac.domain; + +import java.util.Objects; + +public class User { + private String name; + private int money; + + public User(String name, int money) { + this.name = name; + this.money = money; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return money == user.money && Objects.equals(name, user.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, money); + } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", money=" + money + + '}'; + } +} diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java new file mode 100644 index 00000000..b8a2d140 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -0,0 +1,17 @@ +package nextstep.blackjac.domain; + +import java.util.Arrays; + +public class Users { + private static final String REGEX = ","; + + public Users(String userNames) { + Arrays.stream(userNames.split(REGEX)) + .map(User::new); + + + + + + } +} diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java index e9ac4177..8d2ecb2f 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -1,12 +1,9 @@ package nextstep.blackjacTest.deckTest; import nextstep.blackjac.domain.*; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -15,7 +12,6 @@ public class CardTest { private Deck deck; private List cardList = new ArrayList<>(); - @DisplayName("스페이드 카드 초기화 기능 테스트") @Test void spadeCardInit() { diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java new file mode 100644 index 00000000..4df20bb9 --- /dev/null +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -0,0 +1,24 @@ +package nextstep.blackjacTest.deckTest; + +import nextstep.blackjac.domain.Users; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class UserTest { + + @DisplayName("유저 생성하기") + @Test + void spadeCardInit() { + final String userNames = "pobi,jason"; + + Users users = new Users(userNames); + + + + } + + + +} From 5b0c22a79ea16b0b0fe4a86557de3d018d47d313 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 21:28:03 +0900 Subject: [PATCH 15/36] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=20=EB=AA=A8?= =?UTF-8?q?=EC=96=91=20Null=20=EC=B2=B4=ED=81=AC=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/nextstep/blackjac/domain/Deck.java | 8 +++----- .../nextstep/blackjac/domain/DiamondCard.java | 2 ++ .../java/nextstep/blackjac/domain/Users.java | 4 ---- .../nextstep/blackjacTest/deckTest/CardTest.java | 16 ++++++++++++++++ 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/nextstep/blackjac/domain/Deck.java b/src/main/java/nextstep/blackjac/domain/Deck.java index b55e2b9d..275c8394 100644 --- a/src/main/java/nextstep/blackjac/domain/Deck.java +++ b/src/main/java/nextstep/blackjac/domain/Deck.java @@ -1,9 +1,6 @@ package nextstep.blackjac.domain; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; public abstract class Deck { protected List cardList; @@ -11,7 +8,8 @@ public abstract class Deck { protected String cardShape; protected Deck(String cardShape) { - this.cardShape = cardShape; + this.cardShape = Optional.ofNullable(cardShape) + .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); cardList = new ArrayList<>(); init(); addJoker(); diff --git a/src/main/java/nextstep/blackjac/domain/DiamondCard.java b/src/main/java/nextstep/blackjac/domain/DiamondCard.java index e9336ce4..d6879e6d 100644 --- a/src/main/java/nextstep/blackjac/domain/DiamondCard.java +++ b/src/main/java/nextstep/blackjac/domain/DiamondCard.java @@ -1,5 +1,7 @@ package nextstep.blackjac.domain; +import java.util.Optional; + public class DiamondCard extends Deck { public DiamondCard(String cardShape) { super(cardShape); diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index b8a2d140..e547c928 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -6,10 +6,6 @@ public class Users { private static final String REGEX = ","; public Users(String userNames) { - Arrays.stream(userNames.split(REGEX)) - .map(User::new); - - diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java index 8d2ecb2f..3d296010 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -7,6 +7,7 @@ import java.util.List; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class CardTest { private Deck deck; @@ -31,6 +32,11 @@ void cloverCardInit() { initCardList(cardShape); assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new CloverCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); } @DisplayName("하트 카드 초기화 기능 테스트") @@ -42,6 +48,11 @@ void heartCardInit() { cardList.add(new Card("Joker", cardShape, 10)); assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new HeartCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); } @DisplayName("다이아몬드 카드 초기화 기능 테스트") @@ -52,6 +63,11 @@ void diamondCardInit() { initCardList(cardShape); assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new DiamondCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); } @DisplayName("카드 셔플 기능 테스트") From af14f64b018716c2095ddca1cc062e49907fe4e3 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 4 Sep 2024 21:58:23 +0900 Subject: [PATCH 16/36] =?UTF-8?q?feat:=20User=20=EA=B8=B0=EB=8A=A5=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 --- .../java/nextstep/blackjac/domain/User.java | 26 ++++++++++++++++--- .../nextstep/blackjac/domain/UserRole.java | 22 ++++++++++++++++ .../java/nextstep/blackjac/domain/Users.java | 8 +++++- src/main/resources/VIPLIST | 3 +++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/domain/UserRole.java create mode 100644 src/main/resources/VIPLIST diff --git a/src/main/java/nextstep/blackjac/domain/User.java b/src/main/java/nextstep/blackjac/domain/User.java index a954caca..87734b17 100644 --- a/src/main/java/nextstep/blackjac/domain/User.java +++ b/src/main/java/nextstep/blackjac/domain/User.java @@ -1,34 +1,52 @@ package nextstep.blackjac.domain; +import java.io.IOException; import java.util.Objects; public class User { private String name; private int money; + private int hasChip = 1; + private UserRole userRole; - public User(String name, int money) { + public User() {} + + public User(String name) { + this.name = name; + } + + public User(String name, int money, int hasChip) throws IOException { this.name = name; this.money = money; + this.hasChip = hasChip; + this.userRole = UserRole.getRole(name); + } + + public User name(String name) { + this.name = name; + return this; } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; - return money == user.money && Objects.equals(name, user.name); + return money == user.money && hasChip == user.hasChip && Objects.equals(name, user.name); } @Override public int hashCode() { - return Objects.hash(name, money); + return Objects.hash(name, money, hasChip); } - @Override public String toString() { return "User{" + "name='" + name + '\'' + ", money=" + money + + ", hasChip=" + hasChip + '}'; } } diff --git a/src/main/java/nextstep/blackjac/domain/UserRole.java b/src/main/java/nextstep/blackjac/domain/UserRole.java new file mode 100644 index 00000000..9d138fdf --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/UserRole.java @@ -0,0 +1,22 @@ +package nextstep.blackjac.domain; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +public enum UserRole { + USER, VIP; + + public static UserRole getRole(String userName) throws IOException { + String contents = new String(Files.readAllBytes(Paths + .get("src/main/resources/VIPLIST")), StandardCharsets.UTF_8); + + if (contents.contains(userName)) { + return UserRole.VIP; + } + return UserRole.USER; + } + +} diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index e547c928..a1f783bd 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -1,13 +1,19 @@ package nextstep.blackjac.domain; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; public class Users { private static final String REGEX = ","; + private List users; public Users(String userNames) { + } + public Users(int money) { + } - } } diff --git a/src/main/resources/VIPLIST b/src/main/resources/VIPLIST new file mode 100644 index 00000000..af85d9b0 --- /dev/null +++ b/src/main/resources/VIPLIST @@ -0,0 +1,3 @@ +KIM +YOUNG +KANG \ No newline at end of file From c7b9f638646a0b40ade524b36873e21f6e82be6f Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Thu, 5 Sep 2024 17:21:47 +0900 Subject: [PATCH 17/36] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=A4=91=20=EA=B3=B5=EB=B0=B1=20=EB=B0=8F=20null?= =?UTF-8?q?=20=ED=97=88=EC=9A=A9=20=EA=B8=88=EC=A7=80=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/domain/User.java | 11 ++++---- .../java/nextstep/blackjac/domain/Users.java | 27 ++++++++++++++++--- .../java/nextstep/blackjac/utils/Utils.java | 18 +++++++++++++ .../blackjacTest/deckTest/UserTest.java | 22 +++++++++++++-- 4 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/utils/Utils.java diff --git a/src/main/java/nextstep/blackjac/domain/User.java b/src/main/java/nextstep/blackjac/domain/User.java index 87734b17..f7161d23 100644 --- a/src/main/java/nextstep/blackjac/domain/User.java +++ b/src/main/java/nextstep/blackjac/domain/User.java @@ -15,20 +15,19 @@ public User(String name) { this.name = name; } - public User(String name, int money, int hasChip) throws IOException { + public User(String name, int money) throws IOException { this.name = name; this.money = money; - this.hasChip = hasChip; this.userRole = UserRole.getRole(name); } - public User name(String name) { + public User(String name, int money, int hasChip) throws IOException { this.name = name; - return this; + this.money = money; + this.hasChip = hasChip; + this.userRole = UserRole.getRole(name); } - - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index a1f783bd..2f72ce0e 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -1,18 +1,39 @@ package nextstep.blackjac.domain; +import nextstep.blackjac.utils.Utils; + +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Users { - private static final String REGEX = ","; private List users; + private static final int CHIP_PRICE = 10000; + + public Users(String userNames, int money, int wantChip) { + int giveChip = givenChip(money, wantChip); + if (giveChip < 0) { + throw new IllegalArgumentException("가진 돈 보다 원하는 chip의 갯수가 많습니다."); + } + + } - public Users(String userNames) { + public Users(String userNames, int money) { + Utils.splitName(userNames) + .stream() + .map(String::length) + .filter(item -> item < 0) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("구성 인원이 맞지 않습니다.")); } - public Users(int money) { + private int givenChip(int money, int wantChip) { + return IntStream.rangeClosed(0, wantChip) + .boxed() + .reduce(0, (a, b) -> money - (b * money)); } diff --git a/src/main/java/nextstep/blackjac/utils/Utils.java b/src/main/java/nextstep/blackjac/utils/Utils.java new file mode 100644 index 00000000..2a146449 --- /dev/null +++ b/src/main/java/nextstep/blackjac/utils/Utils.java @@ -0,0 +1,18 @@ +package nextstep.blackjac.utils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Utils { + private static final String REGEX = ","; + public static List splitName(String names) { + return Arrays.stream(names.split(REGEX)) + .filter(item -> !item.isEmpty()) + .collect(Collectors.toList()); + } + + + + +} diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index 4df20bb9..a52e0c2e 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -1,22 +1,40 @@ package nextstep.blackjacTest.deckTest; +import nextstep.blackjac.domain.CloverCard; import nextstep.blackjac.domain.Users; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class UserTest { @DisplayName("유저 생성하기") @Test - void spadeCardInit() { + void createUser() { final String userNames = "pobi,jason"; + final int money = 10000; - Users users = new Users(userNames); + // Users users = new Users(userNames, money); + } + + @DisplayName("유저 돈 chip으로 교환하는 기능 테스트") + @Test + void moenyToChip() { + final String userNames = "pobi,jason"; + final int money = 10000; + int wantChip = 1; + new Users(userNames, money, wantChip); + wantChip = 0; + new Users(userNames, money, wantChip); + assertThatThrownBy(() -> { + new Users(userNames, money, 2); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("가진 돈 보다 원하는 chip의 갯수가 많습니다."); } From bba7c5e49b7214017033c687bbd3dc1c0cdac9c8 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Thu, 5 Sep 2024 17:59:43 +0900 Subject: [PATCH 18/36] =?UTF-8?q?fix:=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=A4=91=20=EA=B3=B5=EB=B0=B1=20=EB=B0=8F=20null?= =?UTF-8?q?=20=ED=97=88=EC=9A=A9=20=EA=B8=88=EC=A7=80=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/domain/Users.java | 23 +++++++++++++------ .../java/nextstep/blackjac/utils/Utils.java | 13 ++++++++++- .../blackjacTest/deckTest/UserTest.java | 21 +++++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index 2f72ce0e..6ba59411 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; public class Users { private List users; @@ -21,13 +22,21 @@ public Users(String userNames, int money, int wantChip) { } - public Users(String userNames, int money) { - Utils.splitName(userNames) - .stream() - .map(String::length) - .filter(item -> item < 0) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("구성 인원이 맞지 않습니다.")); + public Users(String userNames, List money) { + List users = Utils.splitName(userNames); + userCount(users); + money = (List) Utils.notNullable(money); + + + Stream.of(users, money) + .peek(item -> System.out.println(item)); + } + + private void userCount(List users) { + long userCount = users.size(); + if (userCount < 2 || userCount > 8) { + throw new IllegalArgumentException("인원 수가 너무 적거나 많습니다."); + } } private int givenChip(int money, int wantChip) { diff --git a/src/main/java/nextstep/blackjac/utils/Utils.java b/src/main/java/nextstep/blackjac/utils/Utils.java index 2a146449..e1b50f84 100644 --- a/src/main/java/nextstep/blackjac/utils/Utils.java +++ b/src/main/java/nextstep/blackjac/utils/Utils.java @@ -2,16 +2,27 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class Utils { private static final String REGEX = ","; public static List splitName(String names) { + names = (String) notNullable(names); return Arrays.stream(names.split(REGEX)) - .filter(item -> !item.isEmpty()) + .filter(Utils::isEmpty) .collect(Collectors.toList()); } + public static Object notNullable(Object object) { + return Optional.ofNullable(object) + .orElseThrow(() -> new IllegalArgumentException("잘 못된 값입니다.")); + } + + private static boolean isEmpty(String name) { + return !name.isEmpty(); + } + diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index a52e0c2e..039384ae 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -2,9 +2,14 @@ import nextstep.blackjac.domain.CloverCard; import nextstep.blackjac.domain.Users; +import nextstep.blackjac.utils.Utils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @@ -37,6 +42,22 @@ void moenyToChip() { .hasMessageContaining("가진 돈 보다 원하는 chip의 갯수가 많습니다."); } + @DisplayName("유저 이름 중 공백 및 null 허용 금지 기능 테스트") + @Test + void userName() { + + + + + + assertThatThrownBy(() -> { + new Users(null, null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("잘 못된 값입니다."); + + + } + } From 136a073d001add9fa4152b75d3d8a3e5727f37be Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Thu, 5 Sep 2024 23:29:27 +0900 Subject: [PATCH 19/36] =?UTF-8?q?fix:=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B0=84=20=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/nextstep/blackjac/utils/Utils.java | 2 ++ .../java/nextstep/blackjacTest/deckTest/UserTest.java | 10 +--------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/nextstep/blackjac/utils/Utils.java b/src/main/java/nextstep/blackjac/utils/Utils.java index e1b50f84..832024d1 100644 --- a/src/main/java/nextstep/blackjac/utils/Utils.java +++ b/src/main/java/nextstep/blackjac/utils/Utils.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -15,6 +16,7 @@ public static List splitName(String names) { } public static Object notNullable(Object object) { + return Optional.ofNullable(object) .orElseThrow(() -> new IllegalArgumentException("잘 못된 값입니다.")); } diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index 039384ae..bd814736 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @@ -45,19 +46,10 @@ void moenyToChip() { @DisplayName("유저 이름 중 공백 및 null 허용 금지 기능 테스트") @Test void userName() { - - - - - assertThatThrownBy(() -> { new Users(null, null); }).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("잘 못된 값입니다."); - - } - - } From adf2ec48aa5b464c17aff61755be99fd2d7640df Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Fri, 6 Sep 2024 13:30:56 +0900 Subject: [PATCH 20/36] =?UTF-8?q?fix:=20user=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjac/domain/Condition.java | 6 ++ .../java/nextstep/blackjac/domain/User.java | 10 +-- .../nextstep/blackjac/domain/UserRole.java | 14 ++-- .../java/nextstep/blackjac/domain/Users.java | 42 +++++++----- .../java/nextstep/blackjac/utils/Utils.java | 11 ++- .../blackjacTest/deckTest/UserTest.java | 68 +++++++++++-------- 6 files changed, 89 insertions(+), 62 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/domain/Condition.java diff --git a/src/main/java/nextstep/blackjac/domain/Condition.java b/src/main/java/nextstep/blackjac/domain/Condition.java new file mode 100644 index 00000000..663e2014 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/Condition.java @@ -0,0 +1,6 @@ +package nextstep.blackjac.domain; + +@FunctionalInterface +public interface Condition { + boolean condition(int x); +} diff --git a/src/main/java/nextstep/blackjac/domain/User.java b/src/main/java/nextstep/blackjac/domain/User.java index f7161d23..50a06942 100644 --- a/src/main/java/nextstep/blackjac/domain/User.java +++ b/src/main/java/nextstep/blackjac/domain/User.java @@ -1,6 +1,8 @@ package nextstep.blackjac.domain; import java.io.IOException; +import java.io.Serializable; +import java.util.List; import java.util.Objects; public class User { @@ -15,17 +17,15 @@ public User(String name) { this.name = name; } - public User(String name, int money) throws IOException { + public User(String name, int money) { this.name = name; this.money = money; this.userRole = UserRole.getRole(name); } - public User(String name, int money, int hasChip) throws IOException { - this.name = name; - this.money = money; + public User hasChip(int hasChip) { this.hasChip = hasChip; - this.userRole = UserRole.getRole(name); + return this; } @Override diff --git a/src/main/java/nextstep/blackjac/domain/UserRole.java b/src/main/java/nextstep/blackjac/domain/UserRole.java index 9d138fdf..22a63d1b 100644 --- a/src/main/java/nextstep/blackjac/domain/UserRole.java +++ b/src/main/java/nextstep/blackjac/domain/UserRole.java @@ -9,12 +9,16 @@ public enum UserRole { USER, VIP; - public static UserRole getRole(String userName) throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/VIPLIST")), StandardCharsets.UTF_8); + public static UserRole getRole(String userName) { + try { + String contents = new String(Files.readAllBytes(Paths + .get("src/main/resources/VIPLIST")), StandardCharsets.UTF_8); - if (contents.contains(userName)) { - return UserRole.VIP; + if (contents.contains(userName)) { + return UserRole.VIP; + } + } catch (IOException e) { + System.out.println(e.getMessage()); } return UserRole.USER; } diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index 6ba59411..ba2f462b 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -3,9 +3,8 @@ import nextstep.blackjac.utils.Utils; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -14,25 +13,36 @@ public class Users { private List users; private static final int CHIP_PRICE = 10000; - public Users(String userNames, int money, int wantChip) { - int giveChip = givenChip(money, wantChip); - if (giveChip < 0) { - throw new IllegalArgumentException("가진 돈 보다 원하는 chip의 갯수가 많습니다."); - } + public Users(String userNames, List money) throws IOException { + List splitName = Utils.splitName(userNames); + checkUserCount(splitName); + checkMoney(money, (x) -> x <= 0); + + Map result = IntStream.range(0, Math.min(splitName.size(), money.size())) + .boxed() + .collect(Collectors.toMap(splitName::get, money::get)); + createUser(result); } - public Users(String userNames, List money) { - List users = Utils.splitName(userNames); - userCount(users); - money = (List) Utils.notNullable(money); + private void createUser(Map userAndMoney) throws IOException { + users = userAndMoney.entrySet() + .stream() + .map(entry -> new User(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + } + private void checkMoney(List money, Condition condition) { + long count = money.stream() + .filter(condition::condition) + .count(); - Stream.of(users, money) - .peek(item -> System.out.println(item)); + if (count > 0) { + throw new IllegalArgumentException("배팅 금액이 잘 못 되었습니다."); + } } - private void userCount(List users) { + private void checkUserCount(List users) { long userCount = users.size(); if (userCount < 2 || userCount > 8) { throw new IllegalArgumentException("인원 수가 너무 적거나 많습니다."); @@ -44,6 +54,4 @@ private int givenChip(int money, int wantChip) { .boxed() .reduce(0, (a, b) -> money - (b * money)); } - - } diff --git a/src/main/java/nextstep/blackjac/utils/Utils.java b/src/main/java/nextstep/blackjac/utils/Utils.java index 832024d1..5118bc7f 100644 --- a/src/main/java/nextstep/blackjac/utils/Utils.java +++ b/src/main/java/nextstep/blackjac/utils/Utils.java @@ -9,17 +9,14 @@ public class Utils { private static final String REGEX = ","; public static List splitName(String names) { - names = (String) notNullable(names); - return Arrays.stream(names.split(REGEX)) + String optName = Optional.ofNullable(names) + .orElseThrow(() -> new NullPointerException("이름이 정의되지않았습니다.")); + + return Arrays.stream(optName.split(REGEX)) .filter(Utils::isEmpty) .collect(Collectors.toList()); } - public static Object notNullable(Object object) { - - return Optional.ofNullable(object) - .orElseThrow(() -> new IllegalArgumentException("잘 못된 값입니다.")); - } private static boolean isEmpty(String name) { return !name.isEmpty(); diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index bd814736..2f107fe8 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -1,55 +1,67 @@ package nextstep.blackjacTest.deckTest; -import nextstep.blackjac.domain.CloverCard; import nextstep.blackjac.domain.Users; -import nextstep.blackjac.utils.Utils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class UserTest { - @DisplayName("유저 생성하기") + private final String names = "pobi,jason"; + private List money; + + @DisplayName("유저 돈이 없거나 음수일때 기능 테스트") @Test - void createUser() { - final String userNames = "pobi,jason"; - final int money = 10000; + void noHasMoney() { + final int pobiMoney = 0; + final int pobiJason = 10000; - // Users users = new Users(userNames, money); + assertThatThrownBy(() -> { + money = Arrays.asList(pobiMoney, pobiJason); + new Users(names, money); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("배팅 금액이 잘 못 되었습니다."); } - @DisplayName("유저 돈 chip으로 교환하는 기능 테스트") + + @DisplayName("유저 이름이 null일 경우 기능 테스트") @Test - void moenyToChip() { - final String userNames = "pobi,jason"; - final int money = 10000; + void userNameIsNull() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); - int wantChip = 1; - new Users(userNames, money, wantChip); + assertThatThrownBy(() -> { + new Users(null, money); + }).isInstanceOf(NullPointerException.class) + .hasMessageContaining("이름이 정의되지않았습니다."); + } - wantChip = 0; - new Users(userNames, money, wantChip); + @DisplayName("유저 이름이 공백일 경우 기능 테스트") + @Test + void userNameIsEmpty() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); assertThatThrownBy(() -> { - new Users(userNames, money, 2); + new Users("", money); }).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("가진 돈 보다 원하는 chip의 갯수가 많습니다."); + .hasMessageContaining("인원 수가 너무 적거나 많습니다."); } - @DisplayName("유저 이름 중 공백 및 null 허용 금지 기능 테스트") + @DisplayName("유저 생성 테스트") @Test - void userName() { - assertThatThrownBy(() -> { - new Users(null, null); - }).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("잘 못된 값입니다."); + void createUserTest() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); + + Users users = new Users(names, money); } + + } From 2e2e501006609cb2fdd8c857d4caf49f5cebdeda Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Fri, 6 Sep 2024 15:50:38 +0900 Subject: [PATCH 21/36] =?UTF-8?q?fix:=20deck=20=EC=9E=90=EB=A3=8C=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BACKJAC_README.md | 3 +-- .../nextstep/blackjac/domain/CardDeck.java | 16 ++++++------ .../java/nextstep/blackjac/domain/Users.java | 25 +++++++++++-------- .../blackjacTest/deckTest/UserTest.java | 6 ++++- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/BACKJAC_README.md b/BACKJAC_README.md index 52fd9274..7b46d3f2 100644 --- a/BACKJAC_README.md +++ b/BACKJAC_README.md @@ -26,9 +26,8 @@ A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이 - 10000 -> 1칩이라고 가정 - 1. 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. -2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [] +2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [v] 3. 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 4. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. 5. 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. diff --git a/src/main/java/nextstep/blackjac/domain/CardDeck.java b/src/main/java/nextstep/blackjac/domain/CardDeck.java index 6d11c9fe..cd96e88a 100644 --- a/src/main/java/nextstep/blackjac/domain/CardDeck.java +++ b/src/main/java/nextstep/blackjac/domain/CardDeck.java @@ -1,10 +1,7 @@ package nextstep.blackjac.domain; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -21,11 +18,10 @@ public CardDeck() { cloverCardDeck = new CloverCard("clover"); } - public List shuffle() { + public Stack shuffle() { List cardDeck = concat(); Collections.shuffle(cardDeck); - - return cardDeck; + return createDeck(cardDeck); } private List concat() { @@ -47,5 +43,9 @@ private void cardShuffle() { cloverCardDeck.shuffle(); } - + private Stack createDeck(List shuffleCard) { + Stack cardDeck = new Stack<>(); + cardDeck.addAll(shuffleCard); + return cardDeck; + } } diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/domain/Users.java index ba2f462b..c6d4593b 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/domain/Users.java @@ -2,30 +2,23 @@ import nextstep.blackjac.utils.Utils; -import java.io.IOException; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; -import java.util.stream.Stream; public class Users { private List users; private static final int CHIP_PRICE = 10000; - public Users(String userNames, List money) throws IOException { + public Users(String userNames, List money) { List splitName = Utils.splitName(userNames); checkUserCount(splitName); - checkMoney(money, (x) -> x <= 0); - - Map result = IntStream.range(0, Math.min(splitName.size(), money.size())) - .boxed() - .collect(Collectors.toMap(splitName::get, money::get)); - + checkMoney(money, (hasMoney) -> hasMoney <= 0); + Map result = groupUserNameMoney(splitName, money); createUser(result); } - private void createUser(Map userAndMoney) throws IOException { + private void createUser(Map userAndMoney) { users = userAndMoney.entrySet() .stream() .map(entry -> new User(entry.getKey(), entry.getValue())) @@ -49,9 +42,19 @@ private void checkUserCount(List users) { } } + private Map groupUserNameMoney(List splitName, List money) { + return IntStream.range(0, Math.min(splitName.size(), money.size())) + .boxed() + .collect(Collectors.toMap(splitName::get, money::get)); + } + private int givenChip(int money, int wantChip) { return IntStream.rangeClosed(0, wantChip) .boxed() .reduce(0, (a, b) -> money - (b * money)); } + + public List getUsers() { + return users; + } } diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index 2f107fe8..45f1bf90 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -1,10 +1,13 @@ package nextstep.blackjacTest.deckTest; +import nextstep.blackjac.domain.User; import nextstep.blackjac.domain.Users; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class UserTest { @@ -60,8 +63,9 @@ void createUserTest() { money = Arrays.asList(pobiMoney, pobiJason); Users users = new Users(names, money); + List userList = users.getUsers(); + assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000))); } - } From ae74d8b63204439bc008561e83a8ff6064926f41 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Fri, 6 Sep 2024 16:54:20 +0900 Subject: [PATCH 22/36] =?UTF-8?q?feat:=20dealer=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/card/Card.java | 88 +++++++++++++++++++ .../blackjac/{domain => card}/CardDeck.java | 2 +- .../blackjac/{domain => card}/CloverCard.java | 4 +- .../{domain => card}/DiamondCard.java | 6 +- .../blackjac/{domain => card}/HeartCard.java | 4 +- .../blackjac/{domain => card}/SpadeCard.java | 8 +- .../java/nextstep/blackjac/domain/Card.java | 47 ---------- .../java/nextstep/blackjac/domain/Deck.java | 44 ---------- .../java/nextstep/blackjac/domain/User.java | 51 ----------- .../java/nextstep/blackjac/user/Chip.java | 14 +++ .../java/nextstep/blackjac/user/Dealer.java | 10 +++ .../java/nextstep/blackjac/user/User.java | 47 ++++++++++ .../blackjac/{domain => user}/UserRole.java | 23 +++-- .../blackjac/{domain => user}/Users.java | 3 +- .../blackjacTest/deckTest/CardTest.java | 4 +- .../blackjacTest/deckTest/UserTest.java | 13 ++- 16 files changed, 197 insertions(+), 171 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/card/Card.java rename src/main/java/nextstep/blackjac/{domain => card}/CardDeck.java (97%) rename src/main/java/nextstep/blackjac/{domain => card}/CloverCard.java (61%) rename src/main/java/nextstep/blackjac/{domain => card}/DiamondCard.java (54%) rename src/main/java/nextstep/blackjac/{domain => card}/HeartCard.java (70%) rename src/main/java/nextstep/blackjac/{domain => card}/SpadeCard.java (53%) delete mode 100644 src/main/java/nextstep/blackjac/domain/Card.java delete mode 100644 src/main/java/nextstep/blackjac/domain/Deck.java delete mode 100644 src/main/java/nextstep/blackjac/domain/User.java create mode 100644 src/main/java/nextstep/blackjac/user/Chip.java create mode 100644 src/main/java/nextstep/blackjac/user/Dealer.java create mode 100644 src/main/java/nextstep/blackjac/user/User.java rename src/main/java/nextstep/blackjac/{domain => user}/UserRole.java (53%) rename src/main/java/nextstep/blackjac/{domain => user}/Users.java (96%) diff --git a/src/main/java/nextstep/blackjac/card/Card.java b/src/main/java/nextstep/blackjac/card/Card.java new file mode 100644 index 00000000..3069d937 --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/Card.java @@ -0,0 +1,88 @@ +package nextstep.blackjac.card; + +import java.util.*; + +public class Card { + private String cardName; + private String cardShape; + private int cardNumber; + + public Card(String cardName, String cardShape, int cardNumber) { + this.cardName = cardName; + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + public Card(String cardName, String cardShape) { + this.cardName = cardName; + this.cardShape = cardShape; + } + + public Card(String cardShape, int cardNumber) { + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return cardNumber == card.cardNumber && Objects.equals(cardName, card.cardName) && Objects.equals(cardShape, card.cardShape); + } + + @Override + public int hashCode() { + return Objects.hash(cardName, cardShape, cardNumber); + } + + @Override + public String toString() { + return "Card{" + + "cardPosition='" + cardName + '\'' + + ", cardShape='" + cardShape + '\'' + + ", cardNumber=" + cardNumber + + '}'; + } + + public abstract static class Deck { + protected List cardList; + protected int cardCount = 13; + protected String cardShape; + + protected Deck(String cardShape) { + this.cardShape = Optional.ofNullable(cardShape) + .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); + cardList = new ArrayList<>(); + init(); + addJoker(); + } + + void init() { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + + void shuffle() { + Collections.shuffle(getCardList()); + } + + abstract void addJoker(); + + public List getCardList() { + return cardList; + } + + } +} diff --git a/src/main/java/nextstep/blackjac/domain/CardDeck.java b/src/main/java/nextstep/blackjac/card/CardDeck.java similarity index 97% rename from src/main/java/nextstep/blackjac/domain/CardDeck.java rename to src/main/java/nextstep/blackjac/card/CardDeck.java index cd96e88a..9677b5ed 100644 --- a/src/main/java/nextstep/blackjac/domain/CardDeck.java +++ b/src/main/java/nextstep/blackjac/card/CardDeck.java @@ -1,4 +1,4 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.card; import java.util.*; diff --git a/src/main/java/nextstep/blackjac/domain/CloverCard.java b/src/main/java/nextstep/blackjac/card/CloverCard.java similarity index 61% rename from src/main/java/nextstep/blackjac/domain/CloverCard.java rename to src/main/java/nextstep/blackjac/card/CloverCard.java index 85f64b47..bcd195bf 100644 --- a/src/main/java/nextstep/blackjac/domain/CloverCard.java +++ b/src/main/java/nextstep/blackjac/card/CloverCard.java @@ -1,6 +1,6 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.card; -public class CloverCard extends Deck { +public class CloverCard extends Card.Deck { public CloverCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/domain/DiamondCard.java b/src/main/java/nextstep/blackjac/card/DiamondCard.java similarity index 54% rename from src/main/java/nextstep/blackjac/domain/DiamondCard.java rename to src/main/java/nextstep/blackjac/card/DiamondCard.java index d6879e6d..ea18ff13 100644 --- a/src/main/java/nextstep/blackjac/domain/DiamondCard.java +++ b/src/main/java/nextstep/blackjac/card/DiamondCard.java @@ -1,8 +1,6 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.card; -import java.util.Optional; - -public class DiamondCard extends Deck { +public class DiamondCard extends Card.Deck { public DiamondCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/domain/HeartCard.java b/src/main/java/nextstep/blackjac/card/HeartCard.java similarity index 70% rename from src/main/java/nextstep/blackjac/domain/HeartCard.java rename to src/main/java/nextstep/blackjac/card/HeartCard.java index 55a545e4..d28b5a8e 100644 --- a/src/main/java/nextstep/blackjac/domain/HeartCard.java +++ b/src/main/java/nextstep/blackjac/card/HeartCard.java @@ -1,6 +1,6 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.card; -public class HeartCard extends Deck { +public class HeartCard extends Card.Deck { public HeartCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/domain/SpadeCard.java b/src/main/java/nextstep/blackjac/card/SpadeCard.java similarity index 53% rename from src/main/java/nextstep/blackjac/domain/SpadeCard.java rename to src/main/java/nextstep/blackjac/card/SpadeCard.java index b3ed0d9c..8e635543 100644 --- a/src/main/java/nextstep/blackjac/domain/SpadeCard.java +++ b/src/main/java/nextstep/blackjac/card/SpadeCard.java @@ -1,10 +1,6 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.card; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpadeCard extends Deck { +public class SpadeCard extends Card.Deck { public SpadeCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/domain/Card.java b/src/main/java/nextstep/blackjac/domain/Card.java deleted file mode 100644 index bc36a8e1..00000000 --- a/src/main/java/nextstep/blackjac/domain/Card.java +++ /dev/null @@ -1,47 +0,0 @@ -package nextstep.blackjac.domain; - -import java.util.Objects; - -public class Card { - private String cardName; - private String cardShape; - private int cardNumber; - - public Card(String cardName, String cardShape, int cardNumber) { - this.cardName = cardName; - this.cardShape = cardShape; - this.cardNumber = cardNumber; - } - - public Card(String cardName, String cardShape) { - this.cardName = cardName; - this.cardShape = cardShape; - } - - public Card(String cardShape, int cardNumber) { - this.cardShape = cardShape; - this.cardNumber = cardNumber; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Card card = (Card) o; - return cardNumber == card.cardNumber && Objects.equals(cardName, card.cardName) && Objects.equals(cardShape, card.cardShape); - } - - @Override - public int hashCode() { - return Objects.hash(cardName, cardShape, cardNumber); - } - - @Override - public String toString() { - return "Card{" + - "cardPosition='" + cardName + '\'' + - ", cardShape='" + cardShape + '\'' + - ", cardNumber=" + cardNumber + - '}'; - } -} diff --git a/src/main/java/nextstep/blackjac/domain/Deck.java b/src/main/java/nextstep/blackjac/domain/Deck.java deleted file mode 100644 index 275c8394..00000000 --- a/src/main/java/nextstep/blackjac/domain/Deck.java +++ /dev/null @@ -1,44 +0,0 @@ -package nextstep.blackjac.domain; - -import java.util.*; - -public abstract class Deck { - protected List cardList; - protected int cardCount = 13; - protected String cardShape; - - protected Deck(String cardShape) { - this.cardShape = Optional.ofNullable(cardShape) - .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); - cardList = new ArrayList<>(); - init(); - addJoker(); - } - - void init() { - cardList.add(new Card("A", cardShape, 1)); - cardList.add(new Card("2", cardShape, 2)); - cardList.add(new Card("3", cardShape, 3)); - cardList.add(new Card("4", cardShape, 4)); - cardList.add(new Card("5", cardShape, 5)); - cardList.add(new Card("6", cardShape, 6)); - cardList.add(new Card("7", cardShape, 7)); - cardList.add(new Card("8", cardShape, 8)); - cardList.add(new Card("9", cardShape, 9)); - cardList.add(new Card("10", cardShape, 10)); - cardList.add(new Card("Jack", cardShape, 10)); - cardList.add(new Card("Queen", cardShape, 10)); - cardList.add(new Card("King", cardShape, 10)); - } - - void shuffle() { - Collections.shuffle(getCardList()); - } - - abstract void addJoker(); - - public List getCardList() { - return cardList; - } - -} diff --git a/src/main/java/nextstep/blackjac/domain/User.java b/src/main/java/nextstep/blackjac/domain/User.java deleted file mode 100644 index 50a06942..00000000 --- a/src/main/java/nextstep/blackjac/domain/User.java +++ /dev/null @@ -1,51 +0,0 @@ -package nextstep.blackjac.domain; - -import java.io.IOException; -import java.io.Serializable; -import java.util.List; -import java.util.Objects; - -public class User { - private String name; - private int money; - private int hasChip = 1; - private UserRole userRole; - - public User() {} - - public User(String name) { - this.name = name; - } - - public User(String name, int money) { - this.name = name; - this.money = money; - this.userRole = UserRole.getRole(name); - } - - public User hasChip(int hasChip) { - this.hasChip = hasChip; - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return money == user.money && hasChip == user.hasChip && Objects.equals(name, user.name); - } - - @Override - public int hashCode() { - return Objects.hash(name, money, hasChip); - } - @Override - public String toString() { - return "User{" + - "name='" + name + '\'' + - ", money=" + money + - ", hasChip=" + hasChip + - '}'; - } -} diff --git a/src/main/java/nextstep/blackjac/user/Chip.java b/src/main/java/nextstep/blackjac/user/Chip.java new file mode 100644 index 00000000..30452500 --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/Chip.java @@ -0,0 +1,14 @@ +package nextstep.blackjac.user; + +public class Chip { + private int chip; + + public Chip(int chip) { + this.chip = chip; + } + public Chip chip(int chip) { + this.chip = chip; + return this; + } + +} diff --git a/src/main/java/nextstep/blackjac/user/Dealer.java b/src/main/java/nextstep/blackjac/user/Dealer.java new file mode 100644 index 00000000..b000e00c --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/Dealer.java @@ -0,0 +1,10 @@ +package nextstep.blackjac.user; + +public class Dealer extends User { + private static final String name = "Dealer"; + + public Dealer() { + super(name, UserRole.DEALER); + } + +} diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java new file mode 100644 index 00000000..526f3d90 --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -0,0 +1,47 @@ +package nextstep.blackjac.user; + +import java.util.Objects; + +public class User { + private String name; + private int money; + private Chip chip; + private UserRole userRole; + + public User() {} + + public User(String name, UserRole userRole) { + this.name = name; + this.userRole = userRole; + } + + public User(String name, int money) { + this.name = name; + this.money = money; + this.userRole = UserRole.getRole(name); + } + + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + User user = (User) object; + return money == user.money && Objects.equals(name, user.name) && Objects.equals(chip, user.chip) && userRole == user.userRole; + } + + @Override + public int hashCode() { + return Objects.hash(name, money, chip, userRole); + } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", money=" + money + + ", chip=" + chip + + ", userRole=" + userRole + + '}'; + } +} diff --git a/src/main/java/nextstep/blackjac/domain/UserRole.java b/src/main/java/nextstep/blackjac/user/UserRole.java similarity index 53% rename from src/main/java/nextstep/blackjac/domain/UserRole.java rename to src/main/java/nextstep/blackjac/user/UserRole.java index 22a63d1b..a6c06d87 100644 --- a/src/main/java/nextstep/blackjac/domain/UserRole.java +++ b/src/main/java/nextstep/blackjac/user/UserRole.java @@ -1,26 +1,31 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.user; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.List; +import java.util.Arrays; public enum UserRole { - USER, VIP; + USER, VIP, DEALER; public static UserRole getRole(String userName) { + String content = readVipFileList(); + if (content.contains(userName)) { + return UserRole.VIP; + } + return UserRole.USER; + } + + private static String readVipFileList() { + String content = null; try { - String contents = new String(Files.readAllBytes(Paths + content = new String(Files.readAllBytes(Paths .get("src/main/resources/VIPLIST")), StandardCharsets.UTF_8); - - if (contents.contains(userName)) { - return UserRole.VIP; - } } catch (IOException e) { System.out.println(e.getMessage()); } - return UserRole.USER; + return content; } } diff --git a/src/main/java/nextstep/blackjac/domain/Users.java b/src/main/java/nextstep/blackjac/user/Users.java similarity index 96% rename from src/main/java/nextstep/blackjac/domain/Users.java rename to src/main/java/nextstep/blackjac/user/Users.java index c6d4593b..c0753a83 100644 --- a/src/main/java/nextstep/blackjac/domain/Users.java +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -1,5 +1,6 @@ -package nextstep.blackjac.domain; +package nextstep.blackjac.user; +import nextstep.blackjac.domain.Condition; import nextstep.blackjac.utils.Utils; import java.util.*; diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java index 3d296010..338ce10b 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -1,6 +1,6 @@ package nextstep.blackjacTest.deckTest; -import nextstep.blackjac.domain.*; +import nextstep.blackjac.card.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -10,7 +10,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class CardTest { - private Deck deck; + private Card.Deck deck; private List cardList = new ArrayList<>(); @DisplayName("스페이드 카드 초기화 기능 테스트") diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index 45f1bf90..c10e2fa1 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -1,7 +1,9 @@ package nextstep.blackjacTest.deckTest; -import nextstep.blackjac.domain.User; -import nextstep.blackjac.domain.Users; +import nextstep.blackjac.user.Dealer; +import nextstep.blackjac.user.User; +import nextstep.blackjac.user.UserRole; +import nextstep.blackjac.user.Users; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -67,5 +69,12 @@ void createUserTest() { assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000))); } + @DisplayName("딜러 생성 테스트") + @Test + void createDealer() { + Dealer dealer = new Dealer(); + assertThat(dealer).isEqualTo(new Dealer()); + } + } From aa921b36b154eedf4f7e38c94c9a0796b39ab21c Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Fri, 6 Sep 2024 17:41:31 +0900 Subject: [PATCH 23/36] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=202=EC=9E=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BACKJAC_README.md | 10 ++++------ .../java/nextstep/blackjac/card/CardDeck.java | 11 ++++++++--- src/main/java/nextstep/blackjac/user/Dealer.java | 2 ++ src/main/java/nextstep/blackjac/user/Users.java | 1 + .../nextstep/blackjacTest/deckTest/CardTest.java | 16 +++++++++++++++- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/BACKJAC_README.md b/BACKJAC_README.md index 7b46d3f2..e738a2fc 100644 --- a/BACKJAC_README.md +++ b/BACKJAC_README.md @@ -18,18 +18,17 @@ A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이 - 셔플기능 [v] - - player -1. UserA -2. UserB -3. dealer +1. UserA [v] +2. UserB [v] +3. dealer [v] - 10000 -> 1칩이라고 가정 1. 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. 2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [v] 3. 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. -4. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. +4. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. 5. 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. 6. 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. 7. 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. @@ -37,4 +36,3 @@ A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이 - diff --git a/src/main/java/nextstep/blackjac/card/CardDeck.java b/src/main/java/nextstep/blackjac/card/CardDeck.java index 9677b5ed..6a777a6b 100644 --- a/src/main/java/nextstep/blackjac/card/CardDeck.java +++ b/src/main/java/nextstep/blackjac/card/CardDeck.java @@ -10,6 +10,7 @@ public class CardDeck { private HeartCard heartCardDeck; private DiamondCard diamondCardDeck; private CloverCard cloverCardDeck; + private Stack cardDeck; public CardDeck() { spadeCardDeck = new SpadeCard("spade"); @@ -18,10 +19,10 @@ public CardDeck() { cloverCardDeck = new CloverCard("clover"); } - public Stack shuffle() { + public void shuffle() { List cardDeck = concat(); Collections.shuffle(cardDeck); - return createDeck(cardDeck); + cardDeck = createDeck(cardDeck); } private List concat() { @@ -44,8 +45,12 @@ private void cardShuffle() { } private Stack createDeck(List shuffleCard) { - Stack cardDeck = new Stack<>(); + cardDeck = new Stack(); cardDeck.addAll(shuffleCard); return cardDeck; } + + public Stack getCardDeck() { + return cardDeck; + } } diff --git a/src/main/java/nextstep/blackjac/user/Dealer.java b/src/main/java/nextstep/blackjac/user/Dealer.java index b000e00c..04da038b 100644 --- a/src/main/java/nextstep/blackjac/user/Dealer.java +++ b/src/main/java/nextstep/blackjac/user/Dealer.java @@ -7,4 +7,6 @@ public Dealer() { super(name, UserRole.DEALER); } + + } diff --git a/src/main/java/nextstep/blackjac/user/Users.java b/src/main/java/nextstep/blackjac/user/Users.java index c0753a83..90054dc3 100644 --- a/src/main/java/nextstep/blackjac/user/Users.java +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -24,6 +24,7 @@ private void createUser(Map userAndMoney) { .stream() .map(entry -> new User(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); + users.add(new Dealer()); } private void checkMoney(List money, Condition condition) { diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java index 338ce10b..9dc24d10 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; +import java.util.Stack; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @@ -74,11 +75,24 @@ void diamondCardInit() { @Test void shuffle() { CardDeck cardDeck = new CardDeck(); - List cards = cardDeck.shuffle(); + cardDeck.shuffle(); + Stack cards = cardDeck.getCardDeck(); assertThat(cards.size()).isEqualTo(54); System.out.println(cards); } + @DisplayName("카드 2장 받는 기능 테스트") + @Test + void getCard() { + CardDeck cardDeck = new CardDeck(); + cardDeck.shuffle(); + Stack cards = cardDeck.getCardDeck(); + Card firstCard = cards.pop(); + Card secondCard = cards.pop(); + System.out.println(firstCard); + System.out.println(secondCard); + } + private void initCardList(String cardShape) { cardList.add(new Card("A", cardShape, 1)); cardList.add(new Card("2", cardShape, 2)); From 34d0c524a48bf4d289da62ce7aef47d3be2b239b Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Fri, 6 Sep 2024 17:47:43 +0900 Subject: [PATCH 24/36] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=202=EC=9E=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjac/user/Dealer.java | 2 -- src/test/java/nextstep/blackjacTest/deckTest/UserTest.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/nextstep/blackjac/user/Dealer.java b/src/main/java/nextstep/blackjac/user/Dealer.java index 04da038b..b000e00c 100644 --- a/src/main/java/nextstep/blackjac/user/Dealer.java +++ b/src/main/java/nextstep/blackjac/user/Dealer.java @@ -7,6 +7,4 @@ public Dealer() { super(name, UserRole.DEALER); } - - } diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index c10e2fa1..b7b9bef7 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -66,7 +66,7 @@ void createUserTest() { Users users = new Users(names, money); List userList = users.getUsers(); - assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000))); + assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000), new Dealer())); } @DisplayName("딜러 생성 테스트") From 97365ecc33cc30b2e971cd1642d4c02951f8bd69 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 09:28:44 +0900 Subject: [PATCH 25/36] =?UTF-8?q?fix:=20Deck=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/card/Card.java | 41 ----------------- .../nextstep/blackjac/card/CloverCard.java | 2 +- .../java/nextstep/blackjac/card/Deck.java | 45 +++++++++++++++++++ .../nextstep/blackjac/card/DiamondCard.java | 2 +- .../nextstep/blackjac/card/HeartCard.java | 2 +- .../nextstep/blackjac/card/SpadeCard.java | 2 +- .../blackjacTest/deckTest/CardTest.java | 2 +- 7 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/card/Deck.java diff --git a/src/main/java/nextstep/blackjac/card/Card.java b/src/main/java/nextstep/blackjac/card/Card.java index 3069d937..56b919e7 100644 --- a/src/main/java/nextstep/blackjac/card/Card.java +++ b/src/main/java/nextstep/blackjac/card/Card.java @@ -44,45 +44,4 @@ public String toString() { ", cardNumber=" + cardNumber + '}'; } - - public abstract static class Deck { - protected List cardList; - protected int cardCount = 13; - protected String cardShape; - - protected Deck(String cardShape) { - this.cardShape = Optional.ofNullable(cardShape) - .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); - cardList = new ArrayList<>(); - init(); - addJoker(); - } - - void init() { - cardList.add(new Card("A", cardShape, 1)); - cardList.add(new Card("2", cardShape, 2)); - cardList.add(new Card("3", cardShape, 3)); - cardList.add(new Card("4", cardShape, 4)); - cardList.add(new Card("5", cardShape, 5)); - cardList.add(new Card("6", cardShape, 6)); - cardList.add(new Card("7", cardShape, 7)); - cardList.add(new Card("8", cardShape, 8)); - cardList.add(new Card("9", cardShape, 9)); - cardList.add(new Card("10", cardShape, 10)); - cardList.add(new Card("Jack", cardShape, 10)); - cardList.add(new Card("Queen", cardShape, 10)); - cardList.add(new Card("King", cardShape, 10)); - } - - void shuffle() { - Collections.shuffle(getCardList()); - } - - abstract void addJoker(); - - public List getCardList() { - return cardList; - } - - } } diff --git a/src/main/java/nextstep/blackjac/card/CloverCard.java b/src/main/java/nextstep/blackjac/card/CloverCard.java index bcd195bf..147e6ab4 100644 --- a/src/main/java/nextstep/blackjac/card/CloverCard.java +++ b/src/main/java/nextstep/blackjac/card/CloverCard.java @@ -1,6 +1,6 @@ package nextstep.blackjac.card; -public class CloverCard extends Card.Deck { +public class CloverCard extends Deck { public CloverCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/card/Deck.java b/src/main/java/nextstep/blackjac/card/Deck.java new file mode 100644 index 00000000..7d025c05 --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/Deck.java @@ -0,0 +1,45 @@ +package nextstep.blackjac.card; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public abstract class Deck { + + protected List cardList; + protected int cardCount = 13; + protected String cardShape; + + protected Deck(String cardShape) { + this.cardShape = Optional.ofNullable(cardShape) + .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); + cardList = new ArrayList<>(); + init(); + addJoker(); + } + + void init() { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + + void shuffle() { + Collections.shuffle(getCardList()); + } + abstract void addJoker(); + public List getCardList() { + return cardList; + } +} diff --git a/src/main/java/nextstep/blackjac/card/DiamondCard.java b/src/main/java/nextstep/blackjac/card/DiamondCard.java index ea18ff13..9dde8fa3 100644 --- a/src/main/java/nextstep/blackjac/card/DiamondCard.java +++ b/src/main/java/nextstep/blackjac/card/DiamondCard.java @@ -1,6 +1,6 @@ package nextstep.blackjac.card; -public class DiamondCard extends Card.Deck { +public class DiamondCard extends Deck { public DiamondCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/card/HeartCard.java b/src/main/java/nextstep/blackjac/card/HeartCard.java index d28b5a8e..45ebedbe 100644 --- a/src/main/java/nextstep/blackjac/card/HeartCard.java +++ b/src/main/java/nextstep/blackjac/card/HeartCard.java @@ -1,6 +1,6 @@ package nextstep.blackjac.card; -public class HeartCard extends Card.Deck { +public class HeartCard extends Deck { public HeartCard(String cardShape) { super(cardShape); } diff --git a/src/main/java/nextstep/blackjac/card/SpadeCard.java b/src/main/java/nextstep/blackjac/card/SpadeCard.java index 8e635543..3518886b 100644 --- a/src/main/java/nextstep/blackjac/card/SpadeCard.java +++ b/src/main/java/nextstep/blackjac/card/SpadeCard.java @@ -1,6 +1,6 @@ package nextstep.blackjac.card; -public class SpadeCard extends Card.Deck { +public class SpadeCard extends Deck { public SpadeCard(String cardShape) { super(cardShape); } diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java index 9dc24d10..f7850092 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class CardTest { - private Card.Deck deck; + private Deck deck; private List cardList = new ArrayList<>(); @DisplayName("스페이드 카드 초기화 기능 테스트") From 4d5099c9b51036fc3bad920fd2a200060c1db203 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 17:36:58 +0900 Subject: [PATCH 26/36] =?UTF-8?q?feat:=20MVC=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjac/Main.java | 9 +++ .../java/nextstep/blackjac/card/Card.java | 6 +- .../blackjac/controller/UserController.java | 46 +++++++++++++ .../java/nextstep/blackjac/user/User.java | 13 ++++ .../java/nextstep/blackjac/user/Users.java | 8 +++ .../nextstep/blackjac/view/BlackJacView.java | 67 +++++++++++++++++++ 6 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 src/main/java/nextstep/blackjac/controller/UserController.java create mode 100644 src/main/java/nextstep/blackjac/view/BlackJacView.java diff --git a/src/main/java/nextstep/blackjac/Main.java b/src/main/java/nextstep/blackjac/Main.java index 49261ebc..3a53dce9 100644 --- a/src/main/java/nextstep/blackjac/Main.java +++ b/src/main/java/nextstep/blackjac/Main.java @@ -1,4 +1,13 @@ package nextstep.blackjac; +import nextstep.blackjac.controller.UserController; +import nextstep.blackjac.view.BlackJacView; + public class Main { + private static UserController userController = new UserController(); + + public static void main(String[] args) { + userController.play(); + } + } diff --git a/src/main/java/nextstep/blackjac/card/Card.java b/src/main/java/nextstep/blackjac/card/Card.java index 56b919e7..6bde6e6e 100644 --- a/src/main/java/nextstep/blackjac/card/Card.java +++ b/src/main/java/nextstep/blackjac/card/Card.java @@ -38,10 +38,6 @@ public int hashCode() { @Override public String toString() { - return "Card{" + - "cardPosition='" + cardName + '\'' + - ", cardShape='" + cardShape + '\'' + - ", cardNumber=" + cardNumber + - '}'; + return cardNumber + cardShape; } } diff --git a/src/main/java/nextstep/blackjac/controller/UserController.java b/src/main/java/nextstep/blackjac/controller/UserController.java new file mode 100644 index 00000000..ba360cdf --- /dev/null +++ b/src/main/java/nextstep/blackjac/controller/UserController.java @@ -0,0 +1,46 @@ +package nextstep.blackjac.controller; + +import nextstep.blackjac.card.Card; +import nextstep.blackjac.card.CardDeck; +import nextstep.blackjac.user.User; +import nextstep.blackjac.user.Users; +import nextstep.blackjac.utils.Utils; +import nextstep.blackjac.view.BlackJacView; + +import java.util.List; +import java.util.Stack; + +public class UserController { + + private BlackJacView blackJacView = new BlackJacView(); + private CardDeck cardDeck = new CardDeck(); + private Users users; + private Stack shuffleCardDeck; + + + public void play() { + while (true) { + String names = blackJacView.joinPeople(); + List userNames = Utils.splitName(names); + List money = blackJacView.batting(userNames); + users = new Users(names, money); + List userList = users.getUsers(); + + cardDeck.shuffle(); + shuffleCardDeck = cardDeck.getCardDeck(); + + users.givenCards(shuffleCardDeck); + blackJacView.givenCard(names, userList); + + blackJacView.givenMoreCard(); + + + if (blackJacView.endGame()) { + break; + } + } + } + + + +} diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 526f3d90..7d42141f 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -1,5 +1,9 @@ package nextstep.blackjac.user; +import nextstep.blackjac.card.Card; + +import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class User { @@ -7,6 +11,7 @@ public class User { private int money; private Chip chip; private UserRole userRole; + private List givenCardList = new ArrayList<>(); public User() {} @@ -21,6 +26,14 @@ public User(String name, int money) { this.userRole = UserRole.getRole(name); } + public User givenCardList(Card card) { + givenCardList.add(card); + return this; + } + + public List getGivenCardList() { + return givenCardList; + } @Override public boolean equals(Object object) { diff --git a/src/main/java/nextstep/blackjac/user/Users.java b/src/main/java/nextstep/blackjac/user/Users.java index 90054dc3..e70c1120 100644 --- a/src/main/java/nextstep/blackjac/user/Users.java +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -1,5 +1,6 @@ package nextstep.blackjac.user; +import nextstep.blackjac.card.Card; import nextstep.blackjac.domain.Condition; import nextstep.blackjac.utils.Utils; @@ -50,6 +51,13 @@ private Map groupUserNameMoney(List splitName, List cardDeck) { + for (User user : users) { + user.givenCardList(cardDeck.pop()); + user.givenCardList(cardDeck.pop()); + } + } + private int givenChip(int money, int wantChip) { return IntStream.rangeClosed(0, wantChip) .boxed() diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java new file mode 100644 index 00000000..d3afd8a9 --- /dev/null +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -0,0 +1,67 @@ +package nextstep.blackjac.view; + +import nextstep.blackjac.Main; +import nextstep.blackjac.card.Card; +import nextstep.blackjac.card.CardDeck; +import nextstep.blackjac.user.Dealer; +import nextstep.blackjac.user.User; +import nextstep.blackjac.user.Users; +import nextstep.blackjac.utils.Utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.util.Stack; + +public class BlackJacView { + private Scanner input = new Scanner(System.in); + + public String joinPeople() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String userNames = input.nextLine(); + return userNames; + } + + public List batting(List userNames) { + List money = new ArrayList<>(); + for (String name : userNames) { + System.out.println(name + "의 배팅 금액은?"); + money.add(input.nextInt()); + } + + return money; + } + + public void givenCard(String userNames, List users) { + System.out.println("딜러," + userNames + "에게 각각 2장의 카드를 나누어 주었습니다."); + int count = 0; + String names[] = userNames.split(","); + + for (User user : users) { + if (user instanceof Dealer) { + System.out.println("딜러: " + user.getGivenCardList()); + } else { + System.out.println(names[count] + ": " + user.getGivenCardList()); + count++; + } + } + } + + public String givenMoreCard(List users) { + for (User user : users) { + System.out.println(name + "는 한장의 카드를 더 받겠습니까?"); + String moreCard = input.nextLine(); + System.out.println(name + "카드: " + cards); + } + + + return moreCard; + } + + public boolean endGame() { + System.out.println("게임을 종료하시겠습니까? (y,n)"); + String endGame = input.next(); + return endGame.equalsIgnoreCase("y"); + } + +} From aa8d9486ea82c45260662c0f83bf38927b85ba89 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 17:58:59 +0900 Subject: [PATCH 27/36] =?UTF-8?q?feat:=20=ED=95=9C=EC=9E=A5=EC=9D=98=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=8D=94=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?view=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/user/User.java | 7 +----- .../nextstep/blackjac/view/BlackJacView.java | 25 ++++++++----------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 7d42141f..4ead181b 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -50,11 +50,6 @@ public int hashCode() { @Override public String toString() { - return "User{" + - "name='" + name + '\'' + - ", money=" + money + - ", chip=" + chip + - ", userRole=" + userRole + - '}'; + return name; } } diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index d3afd8a9..ef995e64 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -34,28 +34,25 @@ public List batting(List userNames) { public void givenCard(String userNames, List users) { System.out.println("딜러," + userNames + "에게 각각 2장의 카드를 나누어 주었습니다."); - int count = 0; - String names[] = userNames.split(","); - for (User user : users) { - if (user instanceof Dealer) { - System.out.println("딜러: " + user.getGivenCardList()); - } else { - System.out.println(names[count] + ": " + user.getGivenCardList()); - count++; - } + getUserCardList(user); } } - public String givenMoreCard(List users) { + public User givenMoreCard(List users) { for (User user : users) { - System.out.println(name + "는 한장의 카드를 더 받겠습니까?"); + System.out.println(user + "는 한장의 카드를 더 받겠습니까?"); String moreCard = input.nextLine(); - System.out.println(name + "카드: " + cards); + if (moreCard.equalsIgnoreCase("y")) { + return user; + } } + return null; + } - - return moreCard; + public void getUserCardList(User user) { + List cards = user.getGivenCardList(); + System.out.println(user + ": " + cards); } public boolean endGame() { From 060488b78aa43c07c85ee67aa5a1390cbbe646d9 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 18:00:04 +0900 Subject: [PATCH 28/36] =?UTF-8?q?fix:=20UserController=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjac/controller/UserController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/blackjac/controller/UserController.java b/src/main/java/nextstep/blackjac/controller/UserController.java index ba360cdf..38b5dcac 100644 --- a/src/main/java/nextstep/blackjac/controller/UserController.java +++ b/src/main/java/nextstep/blackjac/controller/UserController.java @@ -32,7 +32,8 @@ public void play() { users.givenCards(shuffleCardDeck); blackJacView.givenCard(names, userList); - blackJacView.givenMoreCard(); + User user = blackJacView.givenMoreCard(userList); + if (blackJacView.endGame()) { From e9015a31f8d23868adc9c9f0c0801bc54c67e9e2 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 21:24:27 +0900 Subject: [PATCH 29/36] =?UTF-8?q?fix:=20users=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjac/controller/UserController.java | 7 ++-- .../java/nextstep/blackjac/user/Users.java | 35 +++++++++---------- .../nextstep/blackjac/view/BlackJacView.java | 7 ++-- .../blackjacTest/deckTest/UserTest.java | 10 ++++-- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/main/java/nextstep/blackjac/controller/UserController.java b/src/main/java/nextstep/blackjac/controller/UserController.java index 38b5dcac..1e7e2b6f 100644 --- a/src/main/java/nextstep/blackjac/controller/UserController.java +++ b/src/main/java/nextstep/blackjac/controller/UserController.java @@ -23,7 +23,7 @@ public void play() { String names = blackJacView.joinPeople(); List userNames = Utils.splitName(names); List money = blackJacView.batting(userNames); - users = new Users(names, money); + users = new Users(userNames, money); List userList = users.getUsers(); cardDeck.shuffle(); @@ -32,9 +32,8 @@ public void play() { users.givenCards(shuffleCardDeck); blackJacView.givenCard(names, userList); - User user = blackJacView.givenMoreCard(userList); - - + User user = blackJacView.givenMoreCard(userList, shuffleCardDeck); + blackJacView.getUserCardList(user); if (blackJacView.endGame()) { break; diff --git a/src/main/java/nextstep/blackjac/user/Users.java b/src/main/java/nextstep/blackjac/user/Users.java index e70c1120..f93de5b0 100644 --- a/src/main/java/nextstep/blackjac/user/Users.java +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -12,14 +12,24 @@ public class Users { private List users; private static final int CHIP_PRICE = 10000; - public Users(String userNames, List money) { - List splitName = Utils.splitName(userNames); - checkUserCount(splitName); + public Users(List names, List money) { + checkUserCount(names); checkMoney(money, (hasMoney) -> hasMoney <= 0); - Map result = groupUserNameMoney(splitName, money); + Map result = groupUserNameMoney(names, money); createUser(result); } + public List getUsers() { + return users; + } + + public void givenCards(Stack cardDeck) { + for (User user : users) { + user.givenCardList(cardDeck.pop()); + user.givenCardList(cardDeck.pop()); + } + } + private void createUser(Map userAndMoney) { users = userAndMoney.entrySet() .stream() @@ -45,17 +55,10 @@ private void checkUserCount(List users) { } } - private Map groupUserNameMoney(List splitName, List money) { - return IntStream.range(0, Math.min(splitName.size(), money.size())) + private Map groupUserNameMoney(List userName, List money) { + return IntStream.range(0, Math.min(userName.size(), money.size())) .boxed() - .collect(Collectors.toMap(splitName::get, money::get)); - } - - public void givenCards(Stack cardDeck) { - for (User user : users) { - user.givenCardList(cardDeck.pop()); - user.givenCardList(cardDeck.pop()); - } + .collect(Collectors.toMap(userName::get, money::get)); } private int givenChip(int money, int wantChip) { @@ -63,8 +66,4 @@ private int givenChip(int money, int wantChip) { .boxed() .reduce(0, (a, b) -> money - (b * money)); } - - public List getUsers() { - return users; - } } diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index ef995e64..c307c745 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -39,11 +39,14 @@ public void givenCard(String userNames, List users) { } } - public User givenMoreCard(List users) { + public User givenMoreCard(List users, Stack cardDeck) { for (User user : users) { System.out.println(user + "는 한장의 카드를 더 받겠습니까?"); - String moreCard = input.nextLine(); + String moreCard = input.next(); + List userCard = user.getGivenCardList(); + if (moreCard.equalsIgnoreCase("y")) { + userCard.add(cardDeck.pop()); return user; } } diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java index b7b9bef7..56a6f66d 100644 --- a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -4,6 +4,7 @@ import nextstep.blackjac.user.User; import nextstep.blackjac.user.UserRole; import nextstep.blackjac.user.Users; +import nextstep.blackjac.utils.Utils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -22,10 +23,11 @@ public class UserTest { void noHasMoney() { final int pobiMoney = 0; final int pobiJason = 10000; + List userName = Utils.splitName(names); assertThatThrownBy(() -> { money = Arrays.asList(pobiMoney, pobiJason); - new Users(names, money); + new Users(userName, money); }).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("배팅 금액이 잘 못 되었습니다."); } @@ -50,9 +52,10 @@ void userNameIsEmpty() { final int pobiMoney = 10000; final int pobiJason = 10000; money = Arrays.asList(pobiMoney, pobiJason); + List names = Arrays.asList("", ""); assertThatThrownBy(() -> { - new Users("", money); + new Users(names, money); }).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("인원 수가 너무 적거나 많습니다."); } @@ -63,8 +66,9 @@ void createUserTest() { final int pobiMoney = 10000; final int pobiJason = 10000; money = Arrays.asList(pobiMoney, pobiJason); + List userName = Utils.splitName(names); - Users users = new Users(names, money); + Users users = new Users(userName, money); List userList = users.getUsers(); assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000), new Dealer())); } From c09975381683460400bdaabdcfc0eab5186ff65a Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Mon, 9 Sep 2024 21:27:35 +0900 Subject: [PATCH 30/36] =?UTF-8?q?fix:=20users=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/nextstep/blackjac/user/User.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 4ead181b..8b96106a 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; public class User { private String name; @@ -21,7 +22,11 @@ public User(String name, UserRole userRole) { } public User(String name, int money) { - this.name = name; + this.name = Optional.ofNullable(name) + .orElseThrow(() -> new NullPointerException("이름이 비어 있거나 Null입니다.")); + if (money <= 0) { + throw new IllegalArgumentException("배팅 금액이 너무 작습니다."); + } this.money = money; this.userRole = UserRole.getRole(name); } From c8897a3b1339e05f8438016d38ba9ab341e6ffc1 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Tue, 10 Sep 2024 10:11:29 +0900 Subject: [PATCH 31/36] =?UTF-8?q?fix:=20view=20and=20controller=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=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/nextstep/blackjac/card/Card.java | 4 ++++ src/main/java/nextstep/blackjac/user/Dealer.java | 1 + src/main/java/nextstep/blackjac/user/User.java | 9 +++++++++ .../java/nextstep/blackjac/view/BlackJacView.java | 15 +++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/src/main/java/nextstep/blackjac/card/Card.java b/src/main/java/nextstep/blackjac/card/Card.java index 6bde6e6e..76182e6b 100644 --- a/src/main/java/nextstep/blackjac/card/Card.java +++ b/src/main/java/nextstep/blackjac/card/Card.java @@ -23,6 +23,10 @@ public Card(String cardShape, int cardNumber) { this.cardNumber = cardNumber; } + public int cardNumberTotal(Card card) { + return card.cardNumber; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/nextstep/blackjac/user/Dealer.java b/src/main/java/nextstep/blackjac/user/Dealer.java index b000e00c..0fc98b9d 100644 --- a/src/main/java/nextstep/blackjac/user/Dealer.java +++ b/src/main/java/nextstep/blackjac/user/Dealer.java @@ -2,6 +2,7 @@ public class Dealer extends User { private static final String name = "Dealer"; + public static final int AUTO_GIVEN_CARD = 16; public Dealer() { super(name, UserRole.DEALER); diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 8b96106a..7ce40470 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class User { private String name; @@ -40,6 +42,12 @@ public List getGivenCardList() { return givenCardList; } + public int cardNumberTotal() { + return givenCardList.stream() + .map(item -> item.cardNumberTotal(item)) + .reduce(0, Integer::sum); + } + @Override public boolean equals(Object object) { if (this == object) return true; @@ -57,4 +65,5 @@ public int hashCode() { public String toString() { return name; } + } diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index c307c745..0f638b9b 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -41,6 +41,11 @@ public void givenCard(String userNames, List users) { public User givenMoreCard(List users, Stack cardDeck) { for (User user : users) { + if (user instanceof Dealer) { + givenCardToDealer(user, cardDeck); + continue; + } + System.out.println(user + "는 한장의 카드를 더 받겠습니까?"); String moreCard = input.next(); List userCard = user.getGivenCardList(); @@ -64,4 +69,14 @@ public boolean endGame() { return endGame.equalsIgnoreCase("y"); } + public void givenCardToDealer(User user, Stack cardDeck) { + int total = user.cardNumberTotal(); + List userCards = user.getGivenCardList(); + + if (total <= Dealer.AUTO_GIVEN_CARD) { + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + userCards.add(cardDeck.pop()); + } + } + } From fc35162ccf00548d2a319f4d474cf701b31805aa Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Tue, 10 Sep 2024 17:50:51 +0900 Subject: [PATCH 32/36] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=EC=88=98?= =?UTF-8?q?=EC=9D=B5=20view=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjac/controller/UserController.java | 5 +-- .../java/nextstep/blackjac/user/User.java | 25 +++++++++++++- .../java/nextstep/blackjac/user/Users.java | 11 ------ .../nextstep/blackjac/view/BlackJacView.java | 34 +++++++++++++------ 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/main/java/nextstep/blackjac/controller/UserController.java b/src/main/java/nextstep/blackjac/controller/UserController.java index 1e7e2b6f..7805a157 100644 --- a/src/main/java/nextstep/blackjac/controller/UserController.java +++ b/src/main/java/nextstep/blackjac/controller/UserController.java @@ -23,6 +23,7 @@ public void play() { String names = blackJacView.joinPeople(); List userNames = Utils.splitName(names); List money = blackJacView.batting(userNames); + users = new Users(userNames, money); List userList = users.getUsers(); @@ -32,8 +33,8 @@ public void play() { users.givenCards(shuffleCardDeck); blackJacView.givenCard(names, userList); - User user = blackJacView.givenMoreCard(userList, shuffleCardDeck); - blackJacView.getUserCardList(user); + blackJacView.givenMoreCard(userList, shuffleCardDeck); + blackJacView.finalPayment(userList); if (blackJacView.endGame()) { break; diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 7ce40470..0ccd4043 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -48,6 +48,30 @@ public int cardNumberTotal() { .reduce(0, Integer::sum); } + public int compareCarNumber(User user) { + int myCardNumberTotal = this.cardNumberTotal(); + int targetCardNumberTotal = user.cardNumberTotal(); + + if (myCardNumberTotal > targetCardNumberTotal) { + return myCardNumberTotal; + } + + if (myCardNumberTotal == targetCardNumberTotal) { + return myCardNumberTotal; + } + + return targetCardNumberTotal; + } + + public User givenMoney(User user) { + if (user != null) { + this.money += user.money; + user.money = 0; + } + + return this; + } + @Override public boolean equals(Object object) { if (this == object) return true; @@ -65,5 +89,4 @@ public int hashCode() { public String toString() { return name; } - } diff --git a/src/main/java/nextstep/blackjac/user/Users.java b/src/main/java/nextstep/blackjac/user/Users.java index f93de5b0..c1d2070a 100644 --- a/src/main/java/nextstep/blackjac/user/Users.java +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -14,7 +14,6 @@ public class Users { public Users(List names, List money) { checkUserCount(names); - checkMoney(money, (hasMoney) -> hasMoney <= 0); Map result = groupUserNameMoney(names, money); createUser(result); } @@ -38,16 +37,6 @@ private void createUser(Map userAndMoney) { users.add(new Dealer()); } - private void checkMoney(List money, Condition condition) { - long count = money.stream() - .filter(condition::condition) - .count(); - - if (count > 0) { - throw new IllegalArgumentException("배팅 금액이 잘 못 되었습니다."); - } - } - private void checkUserCount(List users) { long userCount = users.size(); if (userCount < 2 || userCount > 8) { diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index 0f638b9b..3e40ad08 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -18,7 +18,7 @@ public class BlackJacView { public String joinPeople() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - String userNames = input.nextLine(); + String userNames = input.next(); return userNames; } @@ -27,6 +27,7 @@ public List batting(List userNames) { for (String name : userNames) { System.out.println(name + "의 배팅 금액은?"); money.add(input.nextInt()); + input.nextLine(); } return money; @@ -34,12 +35,10 @@ public List batting(List userNames) { public void givenCard(String userNames, List users) { System.out.println("딜러," + userNames + "에게 각각 2장의 카드를 나누어 주었습니다."); - for (User user : users) { - getUserCardList(user); - } + getUserCardList(users); } - public User givenMoreCard(List users, Stack cardDeck) { + public void givenMoreCard(List users, Stack cardDeck) { for (User user : users) { if (user instanceof Dealer) { givenCardToDealer(user, cardDeck); @@ -52,15 +51,19 @@ public User givenMoreCard(List users, Stack cardDeck) { if (moreCard.equalsIgnoreCase("y")) { userCard.add(cardDeck.pop()); - return user; } } - return null; + getUserCardList(users); } - public void getUserCardList(User user) { - List cards = user.getGivenCardList(); - System.out.println(user + ": " + cards); + public void getUserCardList(List users) { + for (User user : users) { + List cards = user.getGivenCardList(); + int result = user.cardNumberTotal(); + + System.out.println(user + ": " + cards + " 결과 - " + result); + } + } public boolean endGame() { @@ -79,4 +82,15 @@ public void givenCardToDealer(User user, Stack cardDeck) { } } + public void finalPayment(List users) { + System.out.println("## 최종수익"); + int result = 0; + for (User user : users) { + for (User target : users) { + result = user.compareCarNumber(target); + } + System.out.println(user + ": " + result); + } + } + } From a29f63aaac4ae984a6331e70bcf0959486f9cb97 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Tue, 10 Sep 2024 17:54:03 +0900 Subject: [PATCH 33/36] =?UTF-8?q?fix:=20=EC=B5=9C=EC=A2=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20view=20=EA=B8=B0=EB=8A=A5=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/nextstep/blackjac/user/User.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 0ccd4043..2136ffd5 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -53,14 +53,14 @@ public int compareCarNumber(User user) { int targetCardNumberTotal = user.cardNumberTotal(); if (myCardNumberTotal > targetCardNumberTotal) { - return myCardNumberTotal; + return this.money + user.money; } if (myCardNumberTotal == targetCardNumberTotal) { - return myCardNumberTotal; + return this.money; } - return targetCardNumberTotal; + return 0; } public User givenMoney(User user) { From 8471b598a3736d14d59a8d748b43f55d2da106f8 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 11 Sep 2024 00:01:21 +0900 Subject: [PATCH 34/36] =?UTF-8?q?fix:=20=EC=B5=9C=EC=A2=85=EC=88=98?= =?UTF-8?q?=EC=9D=B5=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/user/User.java | 28 +-------------- .../nextstep/blackjac/view/BlackJacView.java | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 2136ffd5..06030178 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -2,10 +2,7 @@ import nextstep.blackjac.card.Card; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -48,29 +45,6 @@ public int cardNumberTotal() { .reduce(0, Integer::sum); } - public int compareCarNumber(User user) { - int myCardNumberTotal = this.cardNumberTotal(); - int targetCardNumberTotal = user.cardNumberTotal(); - - if (myCardNumberTotal > targetCardNumberTotal) { - return this.money + user.money; - } - - if (myCardNumberTotal == targetCardNumberTotal) { - return this.money; - } - - return 0; - } - - public User givenMoney(User user) { - if (user != null) { - this.money += user.money; - user.money = 0; - } - - return this; - } @Override public boolean equals(Object object) { diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index 3e40ad08..88eae42b 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -1,5 +1,6 @@ package nextstep.blackjac.view; +import com.sun.org.apache.xml.internal.utils.res.XResourceBundle; import nextstep.blackjac.Main; import nextstep.blackjac.card.Card; import nextstep.blackjac.card.CardDeck; @@ -8,10 +9,8 @@ import nextstep.blackjac.user.Users; import nextstep.blackjac.utils.Utils; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.Stack; +import java.util.*; +import java.util.stream.Collectors; public class BlackJacView { private Scanner input = new Scanner(System.in); @@ -84,13 +83,26 @@ public void givenCardToDealer(User user, Stack cardDeck) { public void finalPayment(List users) { System.out.println("## 최종수익"); - int result = 0; - for (User user : users) { - for (User target : users) { - result = user.compareCarNumber(target); - } - System.out.println(user + ": " + result); - } + int lost = users.stream() + .map(User::cardNumberTotal) + .mapToInt(Integer::new) + .min() + .orElseThrow(NoSuchElementException::new); + + User user = users.stream() + .filter(item -> item.cardNumberTotal() == lost) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + + + + } + + public int compareCarNumber(List cardNumberTotals) { + return cardNumberTotals.stream() + .mapToInt(Integer::new) + .min() + .orElseThrow(NoSuchElementException::new); } } From da483fb13758585f5d41b1bd97f63077af079086 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Wed, 11 Sep 2024 17:24:58 +0900 Subject: [PATCH 35/36] =?UTF-8?q?fix:=20=EC=B5=9C=EC=A2=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20view=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjac/user/User.java | 3 +++ .../nextstep/blackjac/view/BlackJacView.java | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java index 06030178..2197cc29 100644 --- a/src/main/java/nextstep/blackjac/user/User.java +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -45,6 +45,9 @@ public int cardNumberTotal() { .reduce(0, Integer::sum); } + public int payment(User loseUser, int userCount) { + return this.money += (loseUser.money / (userCount - 1)); + } @Override public boolean equals(Object object) { diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index 88eae42b..965f113a 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -1,14 +1,8 @@ package nextstep.blackjac.view; -import com.sun.org.apache.xml.internal.utils.res.XResourceBundle; -import nextstep.blackjac.Main; import nextstep.blackjac.card.Card; -import nextstep.blackjac.card.CardDeck; import nextstep.blackjac.user.Dealer; import nextstep.blackjac.user.User; -import nextstep.blackjac.user.Users; -import nextstep.blackjac.utils.Utils; - import java.util.*; import java.util.stream.Collectors; @@ -85,15 +79,25 @@ public void finalPayment(List users) { System.out.println("## 최종수익"); int lost = users.stream() .map(User::cardNumberTotal) - .mapToInt(Integer::new) + .mapToInt(Integer::intValue) .min() .orElseThrow(NoSuchElementException::new); - User user = users.stream() + User loseUser = users.stream() .filter(item -> item.cardNumberTotal() == lost) .findFirst() .orElseThrow(IllegalArgumentException::new); + List winUsers = users. + stream() + .filter(item -> item.cardNumberTotal() != lost) + .collect(Collectors.toList()); + + winUsers.stream() + .map(item -> item.payment(loseUser, users.size())); + + + } From 1038cc8449acfb0c65c27f4bd033221d51342419 Mon Sep 17 00:00:00 2001 From: kimhyunso Date: Thu, 12 Sep 2024 10:51:57 +0900 Subject: [PATCH 36/36] =?UTF-8?q?fix:=EC=B5=9C=EC=A2=85=20=EC=88=98?= =?UTF-8?q?=EC=9D=B5=20view=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjac/view/BlackJacView.java | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java index 965f113a..56601eeb 100644 --- a/src/main/java/nextstep/blackjac/view/BlackJacView.java +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -77,34 +77,11 @@ public void givenCardToDealer(User user, Stack cardDeck) { public void finalPayment(List users) { System.out.println("## 최종수익"); - int lost = users.stream() - .map(User::cardNumberTotal) - .mapToInt(Integer::intValue) - .min() - .orElseThrow(NoSuchElementException::new); - - User loseUser = users.stream() - .filter(item -> item.cardNumberTotal() == lost) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - - List winUsers = users. - stream() - .filter(item -> item.cardNumberTotal() != lost) - .collect(Collectors.toList()); - - winUsers.stream() - .map(item -> item.payment(loseUser, users.size())); - - - - - } public int compareCarNumber(List cardNumberTotals) { return cardNumberTotals.stream() - .mapToInt(Integer::new) + .mapToInt(Integer::intValue) .min() .orElseThrow(NoSuchElementException::new); }