From 86552081433184fb3090bf27b9da99f93abe9523 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Thu, 29 Apr 2021 01:03:34 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=ED=94=84=EB=A0=88=EC=9E=84=20=EC=9B=8C=ED=81=AC=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/2021-Java-Study-1.iml | 9 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + .idea/workspace.xml | 124 ++++++++++++++++++ image/img.jpg | Bin 0 -> 79320 bytes ...20\353\260\224\352\270\260\354\264\210.md" | 32 +++++ 6 files changed, 179 insertions(+) create mode 100644 .idea/2021-Java-Study-1.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 image/img.jpg create mode 100644 "\354\236\220\353\260\224\352\270\260\354\264\210.md" diff --git a/.idea/2021-Java-Study-1.iml b/.idea/2021-Java-Study-1.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/2021-Java-Study-1.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..b2e511f6 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..94c458c1 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1610777331766 + + + + + + + + + \ No newline at end of file diff --git a/image/img.jpg b/image/img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93b4d2b96bba9a98b50eb10bc0be91e4f4937a8d GIT binary patch literal 79320 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

Z3z4A$Fd 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%0AO7q>7 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 uo2?MnO`*E=c)Bi)Z`rY}q15BK+pJoz#K_g#0+ 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 자바 컬렉션 프레임 워크란 Java에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해 제공하는 것을 의미한다. + +![img](./image/img.jpg) + +|인터페이스|구현클래스|특징| +|----------|------|---| +|List|LinkedList
Stack
Vector
ArrayList
|순서가 있는 데이터 집합, 중복 허용| +|Set|HashSet
TreeSet
|순서유지 않는 데이터 집합,중복 허용x| +|Map|HashMap
TreeMap
HashTable
|Key-Value쌍의 데이터 집합으로 키는 중복x, 값은 중복 허용가능| + +### List 인터페이스 +LinkedList: 양방향 포인터 구조, 데이터 삽입/삭제 빈번시 유용, 검색은 ArrayList에 비해 비효율적
+Stack: 한 쪽 끝에서 자료를 넣고 뺄 수 있는 자료구조 +Vector: 동적 크기 배열, 배열과 마찬가지로 index로 배열에 접근 가능, 동기화 되어 있어 한번에 하나의 쓰레드만 벡터 메소드 호출 가능, 멀티 쓰레드 환경 아닌 경우에는 ArrayList를 사용 하는 것이 바람직 할 수 있음
+ArrayList: 단방향 포인터 구조, 데이터에 대한 index 가지며 조회 기능 성능 뛰어남, 데이터 삽입/삭제가 빈번할 경우 비효율적
+ +### Set 인터페이스 +HashSet: 순서 예측 불가능, 해시 알고리즘 사용한 가장 빠른 임의 접근 속도 가짐
+TreeSet: 이진 검색 트리 형태로 데이터 저장, 저장 순서 유지x
+ +### Map 인터페이스 +HashMap: 중복과 순서 허용x, Value에 Null 값 넣을 수 있음
+TreeMap: 키 값이 자연 순서 대로 오름차수 정렬 되어 Key-Value쌍으로 저장. 정렬되어 검색이 빠름
+HashTable: HashMap보다는 느리지만 동기화 지원, Value에 Null값 허용X + + + From 23a3ddf21ced775c762357232d8d6a05e13ac19f Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Thu, 29 Apr 2021 01:21:10 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat:=20Stream=20=ED=8A=B9=EC=A7=95=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 6 +- ...20\353\260\224\352\270\260\354\264\210.md" | 70 +++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 94c458c1..b22df78c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,8 @@ - - + + diff --git "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" index 5338a030..2e364884 100644 --- "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" +++ "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" @@ -29,4 +29,74 @@ TreeMap: 키 값이 자연 순서 대로 오름차수 정렬 되어 Key-Value쌍 HashTable: HashMap보다는 느리지만 동기화 지원, Value에 Null값 허용X +## Stream의 특징 정리 (map,filter,sorted,distinct,limit,foreach) +``` +ArrayList list = new ArrayList<>(Arrays.asList("Apple","Banana","Apple",Melon","Grape","Strawberry")); +``` + +### map +> 요소들을 특정조건에 해당하는 값으로 변환 +>
요소들을 대,소문자 변형 등 작업 시 사용 + +``` +list.stream().map(s->s.toUpperCase()); +list.stream().map(String::toUpperCase); +``` +이후 collect를 통해 결과를 리턴 받을 수 있다. forEach를 통해 바로 출력도 가능하다. +``` +System.out.println(list.stream().map(s->s.toUpperCase()).collect(Collectors.toList())); //[APPLE, BANANA, APPLE, MELON, GRAPE, STRAWBERRY] +``` +### filter +> 요소들을 조건에 따라 걸러내는 작업 +>
길이 제한, 특정문자 포함 등 작업 시 사용 + +``` +list.stream().filter(t->t.length()>5) +``` +요소 크기가 5보다 큰 것만 걸러내 준다. +``` +System.out.println(list.stream().filter(t->t.length()>5).collect(Collectors.toList())); //[Banana, Strawberry] +``` +### sorted +> 요소들을 정렬해주는 작업 +``` +list.stream().sorted() +``` +리스트의 요소를 정렬해준다. +``` +System.out.println(list.stream().sorted().collect(Collectors.toList())); //[Apple, Apple, Banana, Grape, Melon, Strawberry] +``` +### discinct +> 요소의 중복을 제거해주는 작업 +``` +list.stream().distinct() +``` +리스트의 중복을 제거해준다. +``` +list.stream().distinct().forEach(System.out.println); +// Apple +// Banana +// Melon +// Grape +// Strawberry +``` +### limit +> 어떤 스트림에서 일정 개수만큼 가져와 새로운 스트림을 리턴해주는 작업 +``` +list.stream.limit(3).forEach(System.out.println); +// Apple +// Banana +// Apple +``` +### foreach +> 요소들을 하나씩 출력하는 작업 +``` +list.stream.forEach(System.out.println); +// Apple +// Banana +// Apple +// Melon +// Grape +// Strawberry +``` From 3e7c230aa80fc74ddde95994eb8ba07f79cda054 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Thu, 29 Apr 2021 01:31:43 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20Collection=EA=B3=BC=20Stream?= =?UTF-8?q?=EC=9D=98=20foreach=20=EC=B0=A8=EC=9D=B4=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 2 +- ...20\353\260\224\352\270\260\354\264\210.md" | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b22df78c..add76cc9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -102,7 +102,7 @@ - + diff --git "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" index 2e364884..9b2a16cf 100644 --- "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" +++ "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" @@ -100,3 +100,39 @@ list.stream.forEach(System.out.println); // Strawberry ``` +## Collection.forEach와 Stream.forEach 차이 +### Stream 객체 사용 여부 +Collection.forEach의 경우에는 따로 객체를 생성하지 않고 메소드를 호출한다.
+반면에 Stream.forEach는 stream()으로 Stream 객체를 생성해야만 메소드를 호출할 수 있다. + +``` +list.forEach(System.out::println); +list.stream().forEach(Systmem.out::println); +``` + +### Parallel Stream +``` +public void print() { List nums = Arrays.asList(1, 2, 3, 4, 5); + System.out.println("Collection.forEach 출력 시작"); + nums.forEach(System.out::println); + System.out.println("Stream.forEach 출력 시작"); + nums.parallelStream().forEach(System.out::println); } +//Collection.forEach 출력 시작 +//1 +//2 +//3 +//4 +//5 +//Stream.forEach 출력 시작 +//3 +//4 +//1 +//5 +//2 + +출처: https://dundung.tistory.com/247 [DunDung] +``` +ParallelStream으로 생성한 스트림 객체는 여러 스레드에서 스트림을 실행하기에 실행순서가 예측 불가능한 반면 Collection.forEach는 일정한 순서를 보장한다. + + + From b0bccbe2b6619f8446e44cc52b46b4740d920f84 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Thu, 29 Apr 2021 01:32:16 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat:=20for=EB=AC=B8=EC=9D=84=20stream?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 3 +- ...20\353\260\224\352\270\260\354\264\210.md" | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index add76cc9..0999d2ad 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,6 @@ - diff --git "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" index 9b2a16cf..608bc7e7 100644 --- "a/\354\236\220\353\260\224\352\270\260\354\264\210.md" +++ "b/\354\236\220\353\260\224\352\270\260\354\264\210.md" @@ -134,5 +134,33 @@ public void print() { List nums = Arrays.asList(1, 2, 3, 4, 5); ``` ParallelStream으로 생성한 스트림 객체는 여러 스레드에서 스트림을 실행하기에 실행순서가 예측 불가능한 반면 Collection.forEach는 일정한 순서를 보장한다. +## for문을 stream으로 변환하는 법 +``` +List list1= Arrays.asList("a", "b", "c", "d", "e"); +List list2 = Arrays.asList("a", "b", "d"); + +//for문 사용해 같은 것만 List에 담으려면 + +List result1 = new ArrayList<>(); + for(String str1 : list1){ + for(String str2 : list2){ + if(str1.equals(str2)){ + result1.add(str1); + } + } + } + for(String str : result1){ + System.out.print(str); + } + +// stream 이용해 같은 것만 List에 담으려면 + List result2 = + list1.stream() + .filter(str -> list2.stream().anyMatch(Predicate.isEqual(str))) + .collect(Collectors.toList()); + + result2.stream().forEach(System.out::print); + +``` From 1949d37c1424b5336e3c26db9f3c19273faa3438 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Sun, 2 May 2021 18:38:00 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20git=20ignore=20=ED=8C=8C=EC=9D=BC?= =?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 --- .gitignore | 48 +++++++++++++++++++++++++++++++++++++++++++++ .idea/workspace.xml | 12 ++++++++---- 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b8f1a004 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +2021-Java-Study-1\ +# Created by .ignore support plugin (hsz.mobi) +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 0999d2ad..a1032a9b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,8 @@ - + + - + - From 0b1547d4da67672aa37ea075ca91a850d7d7390f Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Sun, 2 May 2021 21:46:25 +0900 Subject: [PATCH 06/14] =?UTF-8?q?docs:=20gitignore=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .idea/workspace.xml | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index b8f1a004..f1ad17c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -2021-Java-Study-1\ + # Created by .ignore support plugin (hsz.mobi) ### Java template # Compiled class file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a1032a9b..63d77038 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,7 +3,6 @@ - - - - - - From 9921187d9ec720aef87282951522e3a5af11b1b5 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Sun, 2 May 2021 21:53:12 +0900 Subject: [PATCH 07/14] feat: racingcar --- .idea/workspace.xml | 19 +++++- .../java/Application.java" | 8 +++ .../java/inpututils/InputView.java" | 21 +++++++ .../java/outpututils/OutputView.java" | 21 +++++++ .../java/racingcar/Car.java" | 25 ++++++++ .../java/racingcar/Cars.java" | 63 +++++++++++++++++++ .../java/utils/GameUtils.java" | 36 +++++++++++ .../java/utils/RandomUtils.java" | 24 +++++++ .../java/utils/SplitString.java" | 10 +++ .../wrapper/gradle-wrapper.properties" | 5 ++ 10 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 "racingcar\354\213\244\354\212\265/java/Application.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/inpututils/InputView.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/outpututils/OutputView.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/racingcar/Car.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/utils/RandomUtils.java" create mode 100644 "racingcar\354\213\244\354\212\265/java/utils/SplitString.java" create mode 100644 "racingcar\354\213\244\354\212\265/wrapper/gradle-wrapper.properties" diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 63d77038..bec9c478 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,9 +1,7 @@ - - - + + + + + + diff --git "a/racingcar\354\213\244\354\212\265/java/Application.java" "b/racingcar\354\213\244\354\212\265/java/Application.java" new file mode 100644 index 00000000..c9af397f --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/Application.java" @@ -0,0 +1,8 @@ +import utils.GameUtils; + +public class Application { + public static void main(String[] args) { + GameUtils gameUtils = new GameUtils(); + gameUtils.run(); + } +} diff --git "a/racingcar\354\213\244\354\212\265/java/inpututils/InputView.java" "b/racingcar\354\213\244\354\212\265/java/inpututils/InputView.java" new file mode 100644 index 00000000..734dca32 --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/inpututils/InputView.java" @@ -0,0 +1,21 @@ +package inpututils; + +import java.util.Scanner; + +public class InputView { + private static final Scanner SCANNER = new Scanner(System.in); + + public static String getCarName() { + System.out.print("경주 할 자동차 이름 : "); + return SCANNER.nextLine(); + } + + public static int getTryNumber() { + System.out.print("시도할 횟수 : "); + try { + return SCANNER.nextInt(); + } catch (NumberFormatException e) { + throw new NumberFormatException("[ERROR] 시도 횟수는 숫자여야 한다."); + } + } +} diff --git "a/racingcar\354\213\244\354\212\265/java/outpututils/OutputView.java" "b/racingcar\354\213\244\354\212\265/java/outpututils/OutputView.java" new file mode 100644 index 00000000..f59dffbb --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/outpututils/OutputView.java" @@ -0,0 +1,21 @@ +package outpututils; + +import java.util.ArrayList; + +public class OutputView { + private OutputView() { + } + public static void printCarName(String name) { + System.out.print(name + " : "); + } + + public static void printMove() { + System.out.print("-"); + } + + public static void printWinner(ArrayList winner) { + //TODO:마지막에 , 나오지 않도록 수정 필요 + winner.stream() + .forEach(w -> System.out.print(w + ",")); + } +} diff --git "a/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" "b/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" new file mode 100644 index 00000000..ffdd75df --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" @@ -0,0 +1,25 @@ +package racingcar; + +import utils.GameUtils; + +public class Car { + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public String getName(){ + return name; + } + + public int plusPosition(){ + return position++; + } + + public int getPosition() { + return position; + } + +} diff --git "a/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" new file mode 100644 index 00000000..d0377a70 --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" @@ -0,0 +1,63 @@ +package racingcar; + +import outpututils.OutputView; +import utils.RandomUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Cars { + private static List carList; + + private static final int START_NUMBER = 0; + private static final int END_NUMBER = 9; + + private static final int BOUNDARY_NUMBER = 4; + + private static ArrayList winner; + + public Cars(List carList) { + this.carList = carList; + } + + public static boolean isMove(int randomNumber) { + if (randomNumber >= BOUNDARY_NUMBER) { + return true; + } + return false; + } + + public static void playGame() { + for (int j = 0; j < carList.size(); j++) { + OutputView.printCarName(carList.get(j).getName()); + + if (isMove(RandomUtils.nextInt(START_NUMBER, END_NUMBER))) { + carList.get(j).plusPosition(); + } + for (int k = 0; k < carList.get(j).getPosition(); k++) { + OutputView.printMove(); + } + System.out.println(); + } + } + + public static int getMax() { + int max = carList.stream() + .mapToInt(Car::getPosition) + .max() + .getAsInt(); + return max; + } + + public static void setWinnerList(int max) { + winner = new ArrayList(); + carList.stream() + .filter(s-> s.getPosition()==max) + .filter(s-> winner.add(s.getName())) + .collect(Collectors.toList()); + } + public static ArrayList getWinnerList() { + return winner; + } + +} diff --git "a/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" new file mode 100644 index 00000000..dcd8acb9 --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" @@ -0,0 +1,36 @@ +package utils; + +import inpututils.InputView; +import outpututils.OutputView; +import racingcar.Car; +import racingcar.Cars; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class GameUtils { + + public static List makeCarList(String[] splitResult) { + return Arrays.stream(splitResult) + .map(Car::new) + .collect(Collectors.toList()); + } + + public static void run() { + String inputName = InputView.getCarName(); + int inputCount = InputView.getTryNumber(); + String[] splitResult = SplitString.splitString(inputName); + + Cars cars = new Cars(makeCarList(splitResult)); + + for (int i = 0; i < inputCount; i++) { + Cars.playGame(); + System.out.println(); + } + + Cars.setWinnerList(Cars.getMax()); + OutputView.printWinner(Cars.getWinnerList()); + + } +} diff --git "a/racingcar\354\213\244\354\212\265/java/utils/RandomUtils.java" "b/racingcar\354\213\244\354\212\265/java/utils/RandomUtils.java" new file mode 100644 index 00000000..020c8f40 --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/utils/RandomUtils.java" @@ -0,0 +1,24 @@ +package utils; + +import java.util.Random; + +public class RandomUtils { + private static final Random RANDOM = new Random(); + + private RandomUtils() { + } + + public static int nextInt(final int startInclusive, final int endInclusive) { + if (startInclusive > endInclusive) { + throw new IllegalArgumentException(); + } + if (startInclusive < 0) { + throw new IllegalArgumentException(); + } + + if (startInclusive == endInclusive) { + return startInclusive; + } + return RANDOM.nextInt(endInclusive - startInclusive + 1) + startInclusive; + } +} diff --git "a/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" "b/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" new file mode 100644 index 00000000..d91bb318 --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" @@ -0,0 +1,10 @@ +package utils; + +public class SplitString { + private SplitString() { + } + + public static String[] splitString(String input) { + return input.split(","); + } +} diff --git "a/racingcar\354\213\244\354\212\265/wrapper/gradle-wrapper.properties" "b/racingcar\354\213\244\354\212\265/wrapper/gradle-wrapper.properties" new file mode 100644 index 00000000..be52383e --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/wrapper/gradle-wrapper.properties" @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists From 1ba67c4239e1bac138db2a31521a6ed7a8067188 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 17:40:21 +0900 Subject: [PATCH 08/14] =?UTF-8?q?refactor:=20run=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 26 ++++++------------- .../java/Application.java" | 3 +-- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index bec9c478..041faea7 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,10 @@ - + + + + + - - - - - - @@ -103,6 +91,8 @@ + + diff --git "a/racingcar\354\213\244\354\212\265/java/Application.java" "b/racingcar\354\213\244\354\212\265/java/Application.java" index c9af397f..282cf995 100644 --- "a/racingcar\354\213\244\354\212\265/java/Application.java" +++ "b/racingcar\354\213\244\354\212\265/java/Application.java" @@ -2,7 +2,6 @@ public class Application { public static void main(String[] args) { - GameUtils gameUtils = new GameUtils(); - gameUtils.run(); + GameUtils.run(); } } From adc0553381ad69c5958eb10f221f64cf86b7c79b Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 17:44:26 +0900 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=84=A0=EC=96=B8=EC=88=9C=EC=84=9C=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 --- .idea/workspace.xml | 5 ++--- .../java/racingcar/Cars.java" | 11 +++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 041faea7..fe49a9c1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,7 @@ - - + diff --git "a/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" index d0377a70..5ff4b658 100644 --- "a/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" +++ "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" @@ -2,18 +2,16 @@ import outpututils.OutputView; import utils.RandomUtils; + import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Cars { - private static List carList; - private static final int START_NUMBER = 0; private static final int END_NUMBER = 9; - private static final int BOUNDARY_NUMBER = 4; - + private static List carList; private static ArrayList winner; public Cars(List carList) { @@ -52,10 +50,11 @@ public static int getMax() { public static void setWinnerList(int max) { winner = new ArrayList(); carList.stream() - .filter(s-> s.getPosition()==max) - .filter(s-> winner.add(s.getName())) + .filter(s -> s.getPosition() == max) + .filter(s -> winner.add(s.getName())) .collect(Collectors.toList()); } + public static ArrayList getWinnerList() { return winner; } From 860e5b46615aa21470f643582ae368f5a2ea3837 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 17:48:08 +0900 Subject: [PATCH 10/14] =?UTF-8?q?refactor:=20=EC=9E=98=EB=AA=BB=EB=90=9C?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=20=EC=A7=84=ED=96=89=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 4 ++-- "racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fe49a9c1..604ac532 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + diff --git "a/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" index dcd8acb9..fe55608f 100644 --- "a/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" +++ "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" @@ -25,7 +25,7 @@ public static void run() { Cars cars = new Cars(makeCarList(splitResult)); for (int i = 0; i < inputCount; i++) { - Cars.playGame(); + cars.playGame(); System.out.println(); } From 741700cb0a8d62cd3c407b401f91d9599e358970 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 17:58:03 +0900 Subject: [PATCH 11/14] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=20?= =?UTF-8?q?=EB=84=98=EB=B2=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 5 +++-- .../java/utils/SplitString.java" | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 604ac532..506fd3db 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,8 @@ - + + diff --git "a/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" "b/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" index d91bb318..5857afd3 100644 --- "a/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" +++ "b/racingcar\354\213\244\354\212\265/java/utils/SplitString.java" @@ -1,10 +1,11 @@ package utils; public class SplitString { + private static final String BOUNDARY_STRING= ","; private SplitString() { } public static String[] splitString(String input) { - return input.split(","); + return input.split(BOUNDARY_STRING); } } From d3a549de9ed7fc8c50af68b5efc432a2438340b9 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 20:40:23 +0900 Subject: [PATCH 12/14] =?UTF-8?q?feat:=20InputValidator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 10 ++++---- .../java/inpututils/InputValidator.java" | 23 +++++++++++++++++++ .../java/racingcar/Car.java" | 1 + 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 "racingcar\354\213\244\354\212\265/java/inpututils/InputValidator.java" diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 506fd3db..6b34e4df 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,9 @@ + - + + - @@ -92,7 +93,8 @@ - + + diff --git "a/racingcar\354\213\244\354\212\265/java/inpututils/InputValidator.java" "b/racingcar\354\213\244\354\212\265/java/inpututils/InputValidator.java" new file mode 100644 index 00000000..b17c2fda --- /dev/null +++ "b/racingcar\354\213\244\354\212\265/java/inpututils/InputValidator.java" @@ -0,0 +1,23 @@ +package inpututils; + +public class InputValidator { + private static final int MAX_NAME = 5; + + public static void nameValidator(String name) { + nullCheck(name); + lengthCheck(name); + } + + public static void nullCheck(String name) { + if ("".equals(name)) { + throw new IllegalArgumentException("[ERROR]자동차 이름을 입력해주세요."); + } + } + + public static void lengthCheck(String name) { + if (name.length() > MAX_NAME) { + throw new IllegalArgumentException("[ERROR]자동차 이름은 5자 이내여야합니다."); + } + } + +} diff --git "a/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" "b/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" index ffdd75df..d81e0b13 100644 --- "a/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" +++ "b/racingcar\354\213\244\354\212\265/java/racingcar/Car.java" @@ -7,6 +7,7 @@ public class Car { private int position = 0; public Car(String name) { + InputValidator.nameValidator(name); this.name = name; } From 743df51054777c7d6ef68e24cbb2b1e022165cb6 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 17 May 2021 20:47:31 +0900 Subject: [PATCH 13/14] =?UTF-8?q?refactor:playGames=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 7 +++---- .../java/racingcar/Cars.java" | 7 ++++++- .../java/utils/GameUtils.java" | 6 +----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6b34e4df..4a247061 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,8 @@ - - - + + diff --git "a/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" index 5ff4b658..0eb7e6a4 100644 --- "a/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" +++ "b/racingcar\354\213\244\354\212\265/java/racingcar/Cars.java" @@ -58,5 +58,10 @@ public static void setWinnerList(int max) { public static ArrayList getWinnerList() { return winner; } - + public static void playGames(int inputCount){ + for (int i = 0; i < inputCount; i++) { + playGame(); + System.out.println(); + } + } } diff --git "a/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" index fe55608f..2d687467 100644 --- "a/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" +++ "b/racingcar\354\213\244\354\212\265/java/utils/GameUtils.java" @@ -24,11 +24,7 @@ public static void run() { Cars cars = new Cars(makeCarList(splitResult)); - for (int i = 0; i < inputCount; i++) { - cars.playGame(); - System.out.println(); - } - + Cars.playGames(inputCount); Cars.setWinnerList(Cars.getMax()); OutputView.printWinner(Cars.getWinnerList()); From 91229beea03256beb8d8af21f98bf10dbe138446 Mon Sep 17 00:00:00 2001 From: YeonSooYeon Date: Mon, 16 Aug 2021 22:50:14 +0900 Subject: [PATCH 14/14] =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4a247061..549566a9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,10 +1,7 @@ - - - - +