From bed1a440d3d370fa0e3f4b9ea3d3b2f726395641 Mon Sep 17 00:00:00 2001 From: Larshew <59397242+Larshew@users.noreply.github.com> Date: Tue, 13 Dec 2022 20:28:03 +0900 Subject: [PATCH 01/15] Update README.md --- README.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fcf3f057..bca9efe8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,21 @@ -# 숫자 야구 게임 -## 진행 방법 -* 숫자 야구 게임 요구사항을 파악한다. -* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 과제를 제출한다. +# 숫자 야구 게임 - 어떻게 구현할 것인가? +## dataobject package +### Num3Balls class +숫자야구에서 숫자 공 3개를 저장할 data object입니다. +숫자 3개가 1-9 사이의 값을 가지며, 중복되지 않음을 보장합니다. +(중복되거나 1-9 사이의 값을 가지지 않는 경우 예외를 발생시킵니다) -## 과제 제출 과정 -* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) +### TrialResult +Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저장하는 data object입니다. +strike, ball 변수와 getter/setter/constructor로 이루어질 예정입니다. + +*** + +## manager package +### ProcessManager Class +### GameManager Class +### Num3BallsManager Class +### GameUserInterface Interface +### GameUSerInterfaceKorean Class + +추가예정 From 74a9539b5acdcd36ce94cb4032ac2733c9bd6f59 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Mon, 19 Dec 2022 07:10:22 +0900 Subject: [PATCH 02/15] feat : make public NumBallsNSize(int size) and unit test add NumBaseBallsNSize(int size), which makes new object with randomly assigned numbers(nums) unit test comprises of two sectors, one is whether constructors raise exception and the other one is whether constructors make randomly assigned numbers. --- .../num3baseball/dataobject/NumBalls.java | 5 ++ .../dataobject/NumBallsNBalls.java | 49 +++++++++++++++++++ .../exception/WrongNumberException.java | 4 ++ src/test/java/study/NumBallsNBallsTest.java | 34 +++++++++++++ src/test/java/study/StringTest.java | 13 ----- 5 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 src/main/java/num3baseball/dataobject/NumBalls.java create mode 100644 src/main/java/num3baseball/dataobject/NumBallsNBalls.java create mode 100644 src/main/java/num3baseball/exception/WrongNumberException.java create mode 100644 src/test/java/study/NumBallsNBallsTest.java delete mode 100644 src/test/java/study/StringTest.java diff --git a/src/main/java/num3baseball/dataobject/NumBalls.java b/src/main/java/num3baseball/dataobject/NumBalls.java new file mode 100644 index 00000000..2dad1fe6 --- /dev/null +++ b/src/main/java/num3baseball/dataobject/NumBalls.java @@ -0,0 +1,5 @@ +package num3baseball.dataobject; + +public interface NumBalls { + public int getNum(int index); +} diff --git a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java new file mode 100644 index 00000000..09cac086 --- /dev/null +++ b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java @@ -0,0 +1,49 @@ +package num3baseball.dataobject; + +import num3baseball.exception.WrongNumberException; + +import java.util.*; + +public class NumBallsNBalls implements NumBalls{ + + private final ArrayList nums = new ArrayList<>(); + private final int size; + + private int randomlyChoose(Set numSet){ + Iterator iter = numSet.iterator(); + int randomChoose = (int)(numSet.size() * Math.random()); + for (int i=1;i<=randomChoose;i++){ + iter.next(); + } + return (int)iter.next(); + } + + private void isValidNumber(ArrayList num) throws WrongNumberException{ + Set numSet = new HashSet(Arrays.asList(1,2,3,4,5,6,7,8,9)); + int initialSize = numSet.size(); + for (int i:num){ + numSet.remove(i); + } + int endSize = numSet.size(); + if (initialSize - endSize != num.size()){ // 모든 번호가 한번씩 빠짐 = 중복되지 않고 + throw new WrongNumberException(); + } + } + + public NumBallsNBalls(int size) throws WrongNumberException{ + this.size=size; + if (size>9 || size<1){ + throw new WrongNumberException(); + } + Set numSet = new HashSet(Arrays.asList(1,2,3,4,5,6,7,8,9)); + for (int i=1;i<=this.size;i++){ + nums.add(randomlyChoose(numSet)); + numSet.remove(nums.get(i-1)); + } + isValidNumber(nums); + } + @Override + public int getNum(int index) { + return nums.get(index); + } +} diff --git a/src/main/java/num3baseball/exception/WrongNumberException.java b/src/main/java/num3baseball/exception/WrongNumberException.java new file mode 100644 index 00000000..4de92626 --- /dev/null +++ b/src/main/java/num3baseball/exception/WrongNumberException.java @@ -0,0 +1,4 @@ +package num3baseball.exception; + +public class WrongNumberException extends RuntimeException{ +} diff --git a/src/test/java/study/NumBallsNBallsTest.java b/src/test/java/study/NumBallsNBallsTest.java new file mode 100644 index 00000000..db0dfc3e --- /dev/null +++ b/src/test/java/study/NumBallsNBallsTest.java @@ -0,0 +1,34 @@ +package study; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; + +import num3baseball.dataobject.NumBallsNBalls; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +public class NumBallsNBallsTest { + @Test + @DisplayName("Constructor(int size) - does not raise exception") + void NumBallsNBallsTest1() { + int iter = 10; + for (int i=1;i<=iter;i++){ + assertThatCode(()->{ + NumBallsNBalls t = new NumBallsNBalls(3); + }).doesNotThrowAnyException(); + } + } + @Test + @DisplayName("Constructor(int size) - does not make duplicated one") + void NumBallsNBallsTest2() { + int iter = 10; + int dupCount = 0; + for (int i=1;i<=iter;i++){ + NumBallsNBalls t1 = new NumBallsNBalls(3); + NumBallsNBalls t2 = new NumBallsNBalls(3); + if (t1.getNum(0) == t2.getNum(0) && t1.getNum(1) == t2.getNum(1) && t1.getNum(2) == t2.getNum(2)){ + dupCount++; + } + } + assertThat(dupCount<(iter*3/10)).isTrue(); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -} From dca974161b5b5830890feffc85ef2493127193ef Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Mon, 19 Dec 2022 07:52:07 +0900 Subject: [PATCH 03/15] feat : add NumBallsNBalls(ArrayList nums) in NumBallsNBalls.java and unit test unit test comprises whether the constructor throws exception appropriately. --- .../dataobject/NumBallsNBalls.java | 6 ++++ src/test/java/study/NumBallsNBallsTest.java | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java index 09cac086..ed72ee15 100644 --- a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java +++ b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java @@ -42,6 +42,12 @@ public NumBallsNBalls(int size) throws WrongNumberException{ } isValidNumber(nums); } + + public NumBallsNBalls(ArrayList nums) throws WrongNumberException{ + this.size = nums.size(); + isValidNumber(nums); + this.nums.addAll(nums); + } @Override public int getNum(int index) { return nums.get(index); diff --git a/src/test/java/study/NumBallsNBallsTest.java b/src/test/java/study/NumBallsNBallsTest.java index db0dfc3e..0aff092e 100644 --- a/src/test/java/study/NumBallsNBallsTest.java +++ b/src/test/java/study/NumBallsNBallsTest.java @@ -2,10 +2,17 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.exception.WrongNumberException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.ArrayList; + public class NumBallsNBallsTest { @Test @DisplayName("Constructor(int size) - does not raise exception") @@ -31,4 +38,28 @@ void NumBallsNBallsTest2() { } assertThat(dupCount<(iter*3/10)).isTrue(); } + + @ParameterizedTest + @CsvSource(value = {"123:false", "121:true", "320:true", "335:true", "948:false", "191:true"}, delimiter = ':') + @DisplayName("Constructor(ArrayList) - raises exception(or not) appropriately") + void NumBallsNBallsTest3(int num, boolean isThrown){ + if (isThrown){ + ArrayList nums = new ArrayList<>(); + nums.add(num/100); + nums.add(num/10%10); + nums.add(num%10); + assertThatThrownBy(()->{ + NumBallsNBalls t = new NumBallsNBalls(nums); + }).isInstanceOf(WrongNumberException.class); + } + else{ + ArrayList nums = new ArrayList<>(); + nums.add(num/100); + nums.add(num/10%10); + nums.add(num%10); + assertThatCode(()->{ + NumBallsNBalls t = new NumBallsNBalls(nums); + }).doesNotThrowAnyException(); + } + } } From b9a2f71541e5d40aec79d381f526d16ecf7ac4bd Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Mon, 19 Dec 2022 11:18:53 +0900 Subject: [PATCH 04/15] feat : add dataobject.TrialResult and its unit tests - add dataobject.TrialResult and its methods - add unit test(chkValidNumber method : throw appropriately) --- .../num3baseball/dataobject/TrialResult.java | 48 +++++++++++++++++++ src/test/java/study/TrialResultTest.java | 39 +++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/num3baseball/dataobject/TrialResult.java create mode 100644 src/test/java/study/TrialResultTest.java diff --git a/src/main/java/num3baseball/dataobject/TrialResult.java b/src/main/java/num3baseball/dataobject/TrialResult.java new file mode 100644 index 00000000..e2f2e0b0 --- /dev/null +++ b/src/main/java/num3baseball/dataobject/TrialResult.java @@ -0,0 +1,48 @@ +package num3baseball.dataobject; + +import num3baseball.exception.WrongNumberException; + +public class TrialResult { + private int strike = 0; + private int ball = 0; + private final int size; + + public TrialResult(int size){ + this.size = size; + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } + + public int getSize() { + return size; + } + + public TrialResult(int strike, int ball, int size){ + this.size = size; + + chkValidNumber(strike, ball); + this.strike = strike; + this.ball = ball; + } + + private void chkValidNumber(int strike, int ball){ + if (strike<0 || ball<0){ + throw new WrongNumberException(); + } + if (strike+ball > size || (strike==size-1 && ball==1)){ + throw new WrongNumberException(); + } + } + + public void setStrikeBall(int strike, int ball){ + chkValidNumber(strike, ball); + this.strike = strike; + this.ball = ball; + } +} diff --git a/src/test/java/study/TrialResultTest.java b/src/test/java/study/TrialResultTest.java new file mode 100644 index 00000000..36256d8a --- /dev/null +++ b/src/test/java/study/TrialResultTest.java @@ -0,0 +1,39 @@ +package study; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class TrialResultTest { + @ParameterizedTest + @CsvSource(value = {"12:false", "30:false", "21:true", "22:true", "00:false", "11:false", "01:false"}, delimiter = ':') + @DisplayName("Check appropriately throw exception when strike and ball values are not valid") + void TrialResultTest(int sb, boolean isthrown){ + final int size=3; + int strike = sb/10; + int ball = sb%10; + if (isthrown){ + assertThatThrownBy(()->{ + TrialResult t = new TrialResult(strike, ball, size); + }).isInstanceOf(WrongNumberException.class); + assertThatThrownBy(()->{ + TrialResult t = new TrialResult(size); + t.setStrikeBall(strike, ball); + }).isInstanceOf(WrongNumberException.class); + } + else{ + assertThatCode(()->{ + TrialResult t = new TrialResult(strike, ball, size); + }).doesNotThrowAnyException(); + assertThatCode(()->{ + TrialResult t = new TrialResult(size); + t.setStrikeBall(strike, ball); + }).doesNotThrowAnyException(); + } + } +} From 1157a40ae2cc3070f6f3c5fd9e9079b2c5305832 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Mon, 19 Dec 2022 13:20:21 +0900 Subject: [PATCH 05/15] feat : add ui.GameUserInterface and ui.GameUserInterfaceKorean not add unit test because of programming requirements. additionally add "private int inputNum(String promptStr)" because inputNumbers method exceeds 10 lines and depth limitation. --- .../num3baseball/ui/GameUserInterface.java | 13 ++++ .../ui/GameUserInterfaceKorean.java | 75 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/num3baseball/ui/GameUserInterface.java create mode 100644 src/main/java/num3baseball/ui/GameUserInterfaceKorean.java diff --git a/src/main/java/num3baseball/ui/GameUserInterface.java b/src/main/java/num3baseball/ui/GameUserInterface.java new file mode 100644 index 00000000..421a8494 --- /dev/null +++ b/src/main/java/num3baseball/ui/GameUserInterface.java @@ -0,0 +1,13 @@ +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; + +import java.util.ArrayList; + +public interface GameUserInterface { + public ArrayList inputNumbers(); // input을 받아 ArrayList로 반환 + public void printResult(TrialResult res); // TrialResult 객체를 받아 strike, ball을 출력 + public void printError(Exception e); // Exception e에 따라 여러 가지의 에러 문구 표시 + public void printGameClear(int size); // 게임을 통과하였을 시에 출력 + public boolean printRetry(); // 다시 하시겠습니까? 출력 +} diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java new file mode 100644 index 00000000..2c189398 --- /dev/null +++ b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java @@ -0,0 +1,75 @@ +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; + +import java.sql.Array; +import java.util.ArrayList; +import java.util.Scanner; + +public class GameUserInterfaceKorean implements GameUserInterface{ + private final Scanner sc = new Scanner(System.in); + + private int inputNum(String promptStr){ + try { + System.out.print(promptStr); + return Integer.parseInt(sc.next()); + } catch (Exception e) { + printError(e); + return -1; + } + } + @Override + public ArrayList inputNumbers() { + ArrayList res = new ArrayList<>(); + int getNum=0; + do { + getNum = inputNum("숫자를 입력해주세요 : "); + }while(getNum>0); + while(getNum>0){ + res.add(0,getNum%10); + getNum/=10; + } + return res; + } + @Override + public void printResult(TrialResult res) { + if (res.getStrike() > 0){ + System.out.print(res.getStrike()+" 스트라이크 "); + } + if (res.getBall() > 0){ + System.out.print(res.getBall()+" 볼"); + } + if (res.getStrike() == 0 && res.getBall() == 0){ + System.out.print("낫싱"); + } + System.out.println(); + } + + @Override + public void printError(Exception e) { + if (e instanceof WrongNumberException){ + System.out.println("올바른 숫자를 입력해주시기 바랍니다."); + return; + } + if (e instanceof NumberFormatException){ + System.out.println("숫자를 입력해주시기 바랍니다."); + return; + } + System.out.println("알 수 없는 오류가 발생하였습니다"); + } + + @Override + public void printGameClear(int size) { + System.out.println(size+"개의 숫자를 모두 맞히셨습니다. 게임 종료"); + } + + @Override + public boolean printRetry() { + int code; + do{ + code = inputNum("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n"); + }while(code!=1 && code!=2); + return code==1; + } +} From 4e4faa9bdf972abaf56e94cd8698bbc7f26e22d6 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Tue, 20 Dec 2022 20:44:52 +0900 Subject: [PATCH 06/15] docs : upload README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 원래 README.md를 작성 후 clone하여 다운받아야 하는데 clone을 하고 README.md를 작성하였다. 그 결과 push를 했을 때 오류가 났는데, 단순 오류라고 생각하여 -f를 써 강제로 push하였다. 그 결과 README.md가 초기화가 되어버렸다. 이에 다시 업로드한다. --- README.md | 95 ++++++++++++++++--- .../num3baseball/manager/GameManager.java | 2 + 2 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 src/main/java/num3baseball/manager/GameManager.java diff --git a/README.md b/README.md index bca9efe8..cc2af551 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,94 @@ # 숫자 야구 게임 - 어떻게 구현할 것인가? ## dataobject package -### Num3Balls class -숫자야구에서 숫자 공 3개를 저장할 data object입니다. -숫자 3개가 1-9 사이의 값을 가지며, 중복되지 않음을 보장합니다. -(중복되거나 1-9 사이의 값을 가지지 않는 경우 예외를 발생시킵니다) +### NumBalls interface +숫자야구에서 숫자를 담을 객체들을 위한 인터페이스이다. +문제의 조건에서는 1~9만을 허용하나, 확장에 자유롭기 위하여(0 허용, 중복 허용 등의 가능성) 인터페이스를 구현하였다. -### TrialResult -Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저장하는 data object입니다. -strike, ball 변수와 getter/setter/constructor로 이루어질 예정입니다. +#### 메서드 +* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) + +### NumBallsNBalls class implements NumBalls +숫자야구에서 숫자 공 n개를 저장할 data object이다. +숫자 n개가 1-9 사이의 값을 가지며, 중복되지 않음을 보장한다. +(중복되거나 1-9 사이의 값을 가지지 않는 경우 WrongNumbersException 예외를 발생시킨다) + +#### 인스턴스 변수 +* private final ArrayList nums - 숫자야구에서 사용할 공 n개(1~9 사이의 숫자)를 나타낸다. +* private final int size; + +#### 메서드 +* public NumBalls(int size) - 숫자야구 조건에 맞는 랜덤한 숫자 n개를 nums에 저장한다. +* public NumBalls(ArrayList nums) - 지정한 nums대로 저장한다. 조건에 맞지 않으면 WrongNumberException을 발생시킨다. +* private boolean isValidNumber(ArrayList nums) - nums가 숫자야구 조건에 맞는지 확인한다(1~9 사이의 값, 중복되지 않음) +* public int getNum(int index) - index번째에 해당하는 숫자 출력 + +### TrialResult class +Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저장하는 data object이다. + +#### 인스턴스 변수 +* private int strike = 0 - 스트라이크 개수를 저장 +* private int ball = 0 - 볼 개수를 저장 +* private final int size - 총 공의 개수를 저장 + +#### 메서드 +* public TrialResult(int size) - size 초기화 후, (strike,ball) = (0,0)으로 초기화하는 생성자 +* public TrialResult(int strike, int ball, int size) - 매개변수대로 strike, ball, size을 초기화하는 생성자 +* private chkValidNumber(int strike, int ball) - strike, ball이 가능한 경우인지(각각 0 이상의 값, 0<=strike+ball<=size, (size-1) strike 1 ball 불가능) +* getter +* public setStrikeBall(int strike, int ball) - strike, ball을 따로 결정하는 경우 예외발생을 적절히 확인하지 못함. *** ## manager package -### ProcessManager Class +### ProcessManager Class +게임 전체의 lifecycle을 담당하는 클래스 +ProcessManager Class와는 Aggregation 연관을 가진다. + +#### 인스턴스 객체 +* private GameUserInterface gameUserInterface - 입출력을 담당하는 ui객체 +* private GameManager gameManager - 한 게임이 시작될 때 그 게임의 설정을 가지는 객체 + +#### 인스턴스 메소드 +* setter - (gameManager, gameUserInterface에 대해) +* public ProcessManager(GameUserInterface gameUserInterface) - gameUserInterface를 주입 +* public void execute() - 프로그램을 실행 + ### GameManager Class -### Num3BallsManager Class +한 게임의 시작(숫자 size개를 랜덤하게 정함)부터 끝(사용자가 size개를 다 맞춤)까지의 한 사이클을 담당하는 클래스 +gameUserInterface, numBalls를 initialize하며 다 맞출 때 까지 계속 묻고 결과를 출력해준다. + +#### 인스턴스 객체 +* private GameUserInterface gameUserInterface - 입출력을 담당하는 ui객체 +* private final NumBalls answer; - 정답을 담을 객체 +* private final int size - 숫자야구 공의 개수 + +#### 인스턴스 메소드 +* public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size) - 각각의 객체를 주입 및 size, answer 초기화 +* public void execute() - 게임 실행 전반을 책임질 메소드 +* private boolean executeOneCycle() - 게임 중 한 사이클(숫자 입력 후 출력까지)를 담당. 게임이 끝나는 경우((size)strike) true 반환 +* private ArrayList input() - 입력을 받아 ArrayList 형태로 반환 +* private TrialResult verdict(ArrayList inputBalls) - 입력받은 NumBalls에 대해서 verdict + +*** +## exception package +### WrongNumberException class extends RunTimeException +NumBalls, TrialResult 등에서 조건에 맞지 않는 값이 입력되는 경우에 대한 예외. + +*** + + +## ui package ### GameUserInterface Interface -### GameUSerInterfaceKorean Class +사용자와 어떤 입력을 받으며, 어떤 출력을 하는지에 대한 함수가 정의되어 있다. +* ArrayList inputNumbers() - 입력을 받아 ArrayList형태로 저장하여 return +* void printResult(TrialResult res) - TrialResult 객체를 받아 strike, ball을 출력 +* void printError(Exception e) - Exception e에 따라 여러 가지의 에러 문구 표시 +* void printGameClear() - 게임을 통과하였을 시에 출력 +* boolean printRetry() - 다시 하시겠습니까? 출력 + +### GameUserInterfaceKorean Class implements GameUserInterface +UI를 구현할 클래스. 한국어로 prompt되기 때문에 GameUI**Korean**으로 하였다. + +### GameUserInterfaceTestStub Class implements GameUserInterface +단위 Test시 입출력을 거치지 않고 테스트하기 위한 TestStub -추가예정 diff --git a/src/main/java/num3baseball/manager/GameManager.java b/src/main/java/num3baseball/manager/GameManager.java new file mode 100644 index 00000000..62fbc027 --- /dev/null +++ b/src/main/java/num3baseball/manager/GameManager.java @@ -0,0 +1,2 @@ +package num3baseball.manager;public class ProcessManager { +} From 498febf0e1e0cc49daf7462eabe12e604c6a964e Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 00:04:02 +0900 Subject: [PATCH 07/15] feat : add NumBalls.compare(NumBalls trial) and NumBallsNBalls.compare(NumBalls trial) Would be better to add compare method in NumBalls and its child classes, rather than manager.GameManager, because comparison of two numbers is property of NumBalls. Need to fix README.md --- .../num3baseball/dataobject/NumBalls.java | 3 ++ .../dataobject/NumBallsNBalls.java | 29 +++++++++++++++++++ .../exception/WrongTypeException.java | 2 ++ src/main/java/num3baseball/main/Main.java | 2 ++ .../ui/GameUserInterfaceTestStub.java | 2 ++ src/test/java/study/GameManagerTest.java | 2 ++ src/test/java/study/NumBallsNBallsTest.java | 24 +++++++++++++++ 7 files changed, 64 insertions(+) create mode 100644 src/main/java/num3baseball/exception/WrongTypeException.java create mode 100644 src/main/java/num3baseball/main/Main.java create mode 100644 src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java create mode 100644 src/test/java/study/GameManagerTest.java diff --git a/src/main/java/num3baseball/dataobject/NumBalls.java b/src/main/java/num3baseball/dataobject/NumBalls.java index 2dad1fe6..802332b6 100644 --- a/src/main/java/num3baseball/dataobject/NumBalls.java +++ b/src/main/java/num3baseball/dataobject/NumBalls.java @@ -2,4 +2,7 @@ public interface NumBalls { public int getNum(int index); + public int getSize(); + + public TrialResult compare(NumBalls trial); } diff --git a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java index ed72ee15..d484466f 100644 --- a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java +++ b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java @@ -1,6 +1,7 @@ package num3baseball.dataobject; import num3baseball.exception.WrongNumberException; +import num3baseball.exception.WrongTypeException; import java.util.*; @@ -52,4 +53,32 @@ public NumBallsNBalls(ArrayList nums) throws WrongNumberException{ public int getNum(int index) { return nums.get(index); } + + @Override + public int getSize() { + return size; + } + + private void compareOne(int thisIndex, int trialIndex, TrialResult result){ + if (trialIndex==-1){ + return; + } + if (thisIndex == trialIndex){ + result.setStrikeBall(result.getStrike()+1, result.getBall()); + } + if (thisIndex != trialIndex){ + result.setStrikeBall(result.getStrike(), result.getBall()+1); + } + } + @Override + public TrialResult compare(NumBalls trial) { + if (!(trial instanceof NumBallsNBalls) || trial.getSize()!=size){ + throw new WrongTypeException(); + } + TrialResult result = new TrialResult(size); + for (int i=0;i numToList(int num){ + ArrayList res = new ArrayList<>(); + while(num>0){ + res.add(0, num%10); + num/=10; + } + return res; + } + @ParameterizedTest + @CsvSource(value={"475:0", "492:1", "912:2", "231:3", "983:10", "192:11", "321:12", "923:20", "123:30"}, delimiter=':') + void NumBallsNBallsTest4(int trials, int sb){ + int answer = 123; + + NumBallsNBalls ans = new NumBallsNBalls(numToList(answer)); + TrialResult res = ans.compare(new NumBallsNBalls(numToList(trials))); + assertThat(res.getStrike()).isEqualTo(sb/10); + assertThat(res.getBall()).isEqualTo(sb%10); + } } From 2e9dd22c158754b7a3db147b033242e64d233665 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 12:25:34 +0900 Subject: [PATCH 08/15] docs : update README.md for changes on dataobject.NumBalls, dataobject.NumBallsNBalls, manager.GameManager class Add TrialResult compare(NumBalls trial) on dataobject.NumBalls, dataobject.NumBallsNBalls. Remove TrialResult verdict(NumBalls trial) on manager.GameManager class. --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index cc2af551..55f9cefd 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ 문제의 조건에서는 1~9만을 허용하나, 확장에 자유롭기 위하여(0 허용, 중복 허용 등의 가능성) 인터페이스를 구현하였다. #### 메서드 -* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) +* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) +* public TrialResult compare(NumBalls trial) - trial(예상 시도)를 했을 때 몇 스트라이크 몇 볼인지 출력 ### NumBallsNBalls class implements NumBalls @@ -22,6 +23,8 @@ * public NumBalls(ArrayList nums) - 지정한 nums대로 저장한다. 조건에 맞지 않으면 WrongNumberException을 발생시킨다. * private boolean isValidNumber(ArrayList nums) - nums가 숫자야구 조건에 맞는지 확인한다(1~9 사이의 값, 중복되지 않음) * public int getNum(int index) - index번째에 해당하는 숫자 출력 +* private void compareOne(int thisIndex, int trialIndex, TrialResult result) - trial의 trialIndex번째 수가 thisIndex(없으면 -1)에 있을 때 스트라이크/볼/낫싱을 result에 갱신 +* public TrialResult compare(NumBalls trial) - trial이 NumBallsNBalls의 객체인지 확인 후(같지 않으면 예외 발생), 결과를 반환 ### TrialResult class Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저장하는 data object이다. @@ -65,14 +68,14 @@ gameUserInterface, numBalls를 initialize하며 다 맞출 때 까지 계속 묻 #### 인스턴스 메소드 * public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size) - 각각의 객체를 주입 및 size, answer 초기화 * public void execute() - 게임 실행 전반을 책임질 메소드 -* private boolean executeOneCycle() - 게임 중 한 사이클(숫자 입력 후 출력까지)를 담당. 게임이 끝나는 경우((size)strike) true 반환 -* private ArrayList input() - 입력을 받아 ArrayList 형태로 반환 -* private TrialResult verdict(ArrayList inputBalls) - 입력받은 NumBalls에 대해서 verdict +* private boolean executeOneCycle() - 게임 중 한 사이클(숫자 입력 후 출력까지)를 담당. 게임이 끝나는 경우 true 반환 *** ## exception package ### WrongNumberException class extends RunTimeException -NumBalls, TrialResult 등에서 조건에 맞지 않는 값이 입력되는 경우에 대한 예외. +* NumBalls, TrialResult 등에서 조건에 맞지 않는 값이 입력되는 경우에 대한 예외. +### WrongTypeException class extends RunTimeException +* NumBallsNBalls.compare(NumBalls trial)에서 trial이 원래 비교대상과 형식이 같지 않는 경우 발생시킴. *** @@ -87,7 +90,7 @@ NumBalls, TrialResult 등에서 조건에 맞지 않는 값이 입력되는 경 * boolean printRetry() - 다시 하시겠습니까? 출력 ### GameUserInterfaceKorean Class implements GameUserInterface -UI를 구현할 클래스. 한국어로 prompt되기 때문에 GameUI**Korean**으로 하였다. +UI를 구현할 클래스. 한국어로 prompt되기 때문에 GameUserInterface**Korean**으로 하였다. ### GameUserInterfaceTestStub Class implements GameUserInterface 단위 Test시 입출력을 거치지 않고 테스트하기 위한 TestStub From cc3f72a6453c5752de2ec72c5096d37386f4f9d5 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 12:29:23 +0900 Subject: [PATCH 09/15] feat : add exception.WrongTypeException.class This should commit with commit #dca9741, which contains method that throws WrongTypeException.class --- src/main/java/num3baseball/exception/WrongTypeException.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/num3baseball/exception/WrongTypeException.java b/src/main/java/num3baseball/exception/WrongTypeException.java index b373ebc6..a542269d 100644 --- a/src/main/java/num3baseball/exception/WrongTypeException.java +++ b/src/main/java/num3baseball/exception/WrongTypeException.java @@ -1,2 +1,4 @@ -package num3baseball.exception;public class WrongTypeException { +package num3baseball.exception; + +public class WrongTypeException extends RuntimeException{ } From 84f8f6028e422d3c6ea5b4bb53e88b3060570063 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 12:32:02 +0900 Subject: [PATCH 10/15] feat : add manager.GameManager.class and its unit test with test stub(GameUserInterfaceTestStub) This methods are implemented in GameManager: public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size) public void execute() public boolean executeOneCycle() - return true if game ends. Fix one tiny omission on GameUserInterfaceKorean.printError(Exception e) consider WrongTypeException (newly added in #498febf, #cc3f72a Implement unit test and supplimentary test stub(replace I/O) --- .../num3baseball/manager/GameManager.java | 41 +++++++++++++- .../ui/GameUserInterfaceKorean.java | 3 +- .../ui/GameUserInterfaceTestStub.java | 53 ++++++++++++++++++- src/test/java/study/GameManagerTest.java | 45 +++++++++++++++- 4 files changed, 138 insertions(+), 4 deletions(-) diff --git a/src/main/java/num3baseball/manager/GameManager.java b/src/main/java/num3baseball/manager/GameManager.java index 62fbc027..f167b390 100644 --- a/src/main/java/num3baseball/manager/GameManager.java +++ b/src/main/java/num3baseball/manager/GameManager.java @@ -1,2 +1,41 @@ -package num3baseball.manager;public class ProcessManager { +package num3baseball.manager; + +import num3baseball.dataobject.NumBalls; +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import num3baseball.ui.GameUserInterface; + +import java.sql.Array; +import java.util.ArrayList; + +public class GameManager { + private GameUserInterface gameUserInterface; + private final NumBalls answer; + + private final int size; + + public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size){ + this.gameUserInterface = gameUserInterface; + answer = numBalls; + this.size=size; + } + + public boolean executeOneCycle(){ + try{ + ArrayList trial = gameUserInterface.inputNumbers(); + TrialResult result = answer.compare(new NumBallsNBalls(trial)); + gameUserInterface.printResult(result); + return result.getStrike() == result.getSize(); + } + catch(Exception e){ + gameUserInterface.printError(e); + } + return false; + } + public void execute(){ + while(!executeOneCycle()) { + } + gameUserInterface.printGameClear(size); + } } diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java index 2c189398..27cbddce 100644 --- a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java +++ b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java @@ -2,6 +2,7 @@ import num3baseball.dataobject.TrialResult; import num3baseball.exception.WrongNumberException; +import num3baseball.exception.WrongTypeException; import java.sql.Array; import java.util.ArrayList; @@ -48,7 +49,7 @@ public void printResult(TrialResult res) { @Override public void printError(Exception e) { - if (e instanceof WrongNumberException){ + if (e instanceof WrongNumberException || e instanceof WrongTypeException){ System.out.println("올바른 숫자를 입력해주시기 바랍니다."); return; } diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java b/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java index cb3e98c9..88ab221f 100644 --- a/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java +++ b/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java @@ -1,2 +1,53 @@ -package num3baseball.ui;public class GameUserInterfaceTestStub { +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; + +import java.util.ArrayList; + +public class GameUserInterfaceTestStub implements GameUserInterface{ + + private ArrayList input; + @Override + public ArrayList inputNumbers() { + return input; + } + + public GameUserInterface inputNumbers(ArrayList input){ + this.input = input; + return this; + } + + public TrialResult res; + @Override + public void printResult(TrialResult res) { + this.res = res; + } + + @Override + public void printError(Exception e){ + if (e instanceof WrongNumberException) { + throw (WrongNumberException)e; + } + if (e instanceof NumberFormatException) { + throw (NumberFormatException)e; + } + } + + @Override + public void printGameClear(int size) { + + } + + private boolean retry; + @Override + public boolean printRetry() { + return retry; + } + + public GameUserInterface printRetry(boolean retry){ + this.retry=retry; + return this; + } } + diff --git a/src/test/java/study/GameManagerTest.java b/src/test/java/study/GameManagerTest.java index a2b5a895..4e2f9683 100644 --- a/src/test/java/study/GameManagerTest.java +++ b/src/test/java/study/GameManagerTest.java @@ -1,2 +1,45 @@ -package study;public class GameManagerTest { +package study; + +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.manager.GameManager; +import num3baseball.ui.GameUserInterface; +import num3baseball.ui.GameUserInterfaceTestStub; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameManagerTest { + + private ArrayList numToArrayList(int num){ + ArrayList res = new ArrayList<>(); + while(num>0){ + res.add(0,num%10); + num /= 10; + } + return res; + } + @Test + @DisplayName("WholeGameProcess") + public void test1() { + int startNum = 123; + GameUserInterfaceTestStub gameUIStub = new GameUserInterfaceTestStub(); + GameManager gameManager = new GameManager(gameUIStub, + new NumBallsNBalls(numToArrayList(startNum)), 3); + + int[] trial = {147, 258, 369, 159, 138, 132, 123}; + int[] sb = {10, 1, 1, 10, 11, 12, 30}; + + int size = trial.length; + for (int i = 0; i < size; i++) { + gameUIStub.inputNumbers(numToArrayList(trial[i])); + boolean isEnd = gameManager.executeOneCycle(); + assertThat(gameUIStub.res.getStrike()).isEqualTo(sb[i] / 10); + assertThat(gameUIStub.res.getBall()).isEqualTo(sb[i] % 10); + assertThat(isEnd).isEqualTo(gameUIStub.res.getStrike()==3); + } + } } From f71ad914e3767e829e33b51e4e52c34b6028d5ee Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 13:21:30 +0900 Subject: [PATCH 11/15] feat : add manager.ProcessManager and main.Main manager.ProcessManager - just call execute() for game start. main.Main - make executable program --- src/main/java/num3baseball/main/Main.java | 12 +++++++- .../num3baseball/manager/ProcessManager.java | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/num3baseball/manager/ProcessManager.java diff --git a/src/main/java/num3baseball/main/Main.java b/src/main/java/num3baseball/main/Main.java index 6f23cd87..fa65066d 100644 --- a/src/main/java/num3baseball/main/Main.java +++ b/src/main/java/num3baseball/main/Main.java @@ -1,2 +1,12 @@ -package num3baseball.main;public class main { +package num3baseball.main; + +import num3baseball.manager.ProcessManager; +import num3baseball.ui.GameUserInterfaceKorean; +import num3baseball.ui.GameUserInterfaceTestStub; + +public class Main { + public static void main(String[] args){ + ProcessManager processManager = new ProcessManager(new GameUserInterfaceKorean()); + processManager.execute(); + } } diff --git a/src/main/java/num3baseball/manager/ProcessManager.java b/src/main/java/num3baseball/manager/ProcessManager.java new file mode 100644 index 00000000..62c6ed61 --- /dev/null +++ b/src/main/java/num3baseball/manager/ProcessManager.java @@ -0,0 +1,28 @@ +package num3baseball.manager; + +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.ui.GameUserInterface; + +public class ProcessManager { + private GameUserInterface gameUserInterface; + private GameManager gameManager; + + public ProcessManager(GameUserInterface gameUserInterface){ + this.gameUserInterface = gameUserInterface; + } + + public void setGameUserInterface(GameUserInterface gameUserInterface) { + this.gameUserInterface = gameUserInterface; + } + + public void setGameManager(GameManager gameManager) { + this.gameManager = gameManager; + } + + public void execute(){ + do{ + setGameManager(new GameManager(gameUserInterface, new NumBallsNBalls(3), 3)); + gameManager.execute(); + }while(gameUserInterface.printRetry()); + } +} From 77126295bbd626bffd8df3a66a7d9d7c524af36a Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 13:24:09 +0900 Subject: [PATCH 12/15] fix : fix infinite loop because of bad conditional in while loop, infinite loop is made (in ui.GameUserInterfaceKorean.inputNumbers()) --- src/main/java/num3baseball/ui/GameUserInterfaceKorean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java index 27cbddce..32240c77 100644 --- a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java +++ b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java @@ -26,7 +26,7 @@ public ArrayList inputNumbers() { int getNum=0; do { getNum = inputNum("숫자를 입력해주세요 : "); - }while(getNum>0); + }while(getNum<=0); while(getNum>0){ res.add(0,getNum%10); getNum/=10; From 6c36ad39e88b3b2056a4556c23082af2d878b387 Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 16:23:30 +0900 Subject: [PATCH 13/15] chore : delete unused code delete unused imported library(automatically added but not used) --- src/main/java/num3baseball/ui/GameUserInterfaceKorean.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java index 32240c77..ac0c066b 100644 --- a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java +++ b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java @@ -4,7 +4,6 @@ import num3baseball.exception.WrongNumberException; import num3baseball.exception.WrongTypeException; -import java.sql.Array; import java.util.ArrayList; import java.util.Scanner; From d106afa0cc7331468bac586b24e5171786d4482f Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 16:40:32 +0900 Subject: [PATCH 14/15] chore : refactor some code in manager.GameManager reduce one line through refactoring ArrayList trial = gameUserInterface.inputNumbers(); TrialResult result = answer.compare(new NumBallsNBalls(trial)); TrialResult result = answer.compare(new NumBallsNBalls(gameUserInterface.inputNumbers())); --- src/main/java/num3baseball/manager/GameManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/num3baseball/manager/GameManager.java b/src/main/java/num3baseball/manager/GameManager.java index f167b390..5b020757 100644 --- a/src/main/java/num3baseball/manager/GameManager.java +++ b/src/main/java/num3baseball/manager/GameManager.java @@ -23,8 +23,7 @@ public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int s public boolean executeOneCycle(){ try{ - ArrayList trial = gameUserInterface.inputNumbers(); - TrialResult result = answer.compare(new NumBallsNBalls(trial)); + TrialResult result = answer.compare(new NumBallsNBalls(gameUserInterface.inputNumbers())); gameUserInterface.printResult(result); return result.getStrike() == result.getSize(); } From c9dcda52f7f291e908b92de50ca64c0ac270786d Mon Sep 17 00:00:00 2001 From: Minsu Kim Date: Wed, 21 Dec 2022 16:45:50 +0900 Subject: [PATCH 15/15] docs : fix README.md Correct some mismatches, such as type mismatch. Add missing methods of some private methods. --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 55f9cefd..eb98ec53 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ 문제의 조건에서는 1~9만을 허용하나, 확장에 자유롭기 위하여(0 허용, 중복 허용 등의 가능성) 인터페이스를 구현하였다. #### 메서드 -* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) +* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) +* public int getSize(); - 공이 몇 개 있는지 알 수 있는 메서드(이번 요구사항에서는 3) * public TrialResult compare(NumBalls trial) - trial(예상 시도)를 했을 때 몇 스트라이크 몇 볼인지 출력 @@ -19,10 +20,12 @@ * private final int size; #### 메서드 +* private int randomlyChoose(Set numSet) - numSet에 들어있는 값 중 랜덤한 값을 return한다. +* private void isValidNumber(ArrayList nums) - nums가 숫자야구 조건에 맞는지 확인한다(1~9 사이의 값, 중복되지 않음), 조건에 맞지 않으면 WrongNumberException 발생. * public NumBalls(int size) - 숫자야구 조건에 맞는 랜덤한 숫자 n개를 nums에 저장한다. -* public NumBalls(ArrayList nums) - 지정한 nums대로 저장한다. 조건에 맞지 않으면 WrongNumberException을 발생시킨다. -* private boolean isValidNumber(ArrayList nums) - nums가 숫자야구 조건에 맞는지 확인한다(1~9 사이의 값, 중복되지 않음) +* public NumBalls(ArrayList nums) - 지정한 nums대로 저장한다. size는 nums의 크기로 저장된다. 조건에 맞지 않으면 WrongNumberException을 발생시킨다. * public int getNum(int index) - index번째에 해당하는 숫자 출력 +* public int getSize() - size를 return * private void compareOne(int thisIndex, int trialIndex, TrialResult result) - trial의 trialIndex번째 수가 thisIndex(없으면 -1)에 있을 때 스트라이크/볼/낫싱을 result에 갱신 * public TrialResult compare(NumBalls trial) - trial이 NumBallsNBalls의 객체인지 확인 후(같지 않으면 예외 발생), 결과를 반환 @@ -38,7 +41,7 @@ Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저 * public TrialResult(int size) - size 초기화 후, (strike,ball) = (0,0)으로 초기화하는 생성자 * public TrialResult(int strike, int ball, int size) - 매개변수대로 strike, ball, size을 초기화하는 생성자 * private chkValidNumber(int strike, int ball) - strike, ball이 가능한 경우인지(각각 0 이상의 값, 0<=strike+ball<=size, (size-1) strike 1 ball 불가능) -* getter +* getter - strike, ball, size 변수에 대해서. * public setStrikeBall(int strike, int ball) - strike, ball을 따로 결정하는 경우 예외발생을 적절히 확인하지 못함. ***