diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..76611b0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+.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/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..29af3ee
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..2e82af5
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 woowacourse
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 94a4ce9..1bee390 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,130 @@
-# java-challenges
-https://github.com/JunHoPark93/woowacourse-projects
-- 학습한 자바를 사용하여 프로젝트를 직접 구현
-- 리뷰를 통한 코드의 개선
-
-## java-baseball-game
-https://github.com/woowacourse/java-baseball-precourse
-
-## 브랜치
-- `main`브랜치가 아닌, 프로젝트 별 브랜치를 생성하여 진행합니다.
- - ex) 브랜치 명을 `java_baseball_game_손현경` 으로 생성합니다.
-- 구현이 끝나면, `PR`을 올리고, `Assignee`를 본인으로 지정합니다.
-- 스터디장이 `Reviewers`를 한 프로젝트 당 `3명씩` 지정하고, 코드 리뷰를 진행합니다.
-- 리뷰에 달린 수정사항들을 반영한 후 `main`에 `Merge`합니다.
-## 폴더명
-- 자신의 작업물은 자신의 깃허브 아이디 디렉토리에서 관리합니다.
- - ex) shkisme/java_baseball_game
-## 커밋 메세지 구조
-- `Review`가 용이하도록, 역할에 따라 `Commit`을 분리합니다.
-- `feat` : 새로운 기능에 대한 커밋
-- `fix` : 버그 수정에 대한 커밋
-- `chore` : 자잘한 수정에 대한 커밋
-- `docs` : 문서 수정에 대한 커밋
-- `style` : 코드 리팩토링에 대한 커밋
-- `test` : 테스트 코드 수정에 대한 커밋
+# 미션 - 숫자 야구 게임
+
+## 🔍 진행방식
+
+- 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다.
+- 세 개의 요구사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
+
+## ✉️ 미션 제출 방법
+
+- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다.
+ - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다.
+- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다.
+ - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다.
+ - **Pull Request만 보내고, 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.**
+
+## ✔️ 과제 제출 전 체크리스트 - 0점 방지
+
+- 터미널에서 `java -version`을 실행해 자바 8인지 확인한다. 또는 Eclipse, IntelliJ IDEA와 같은 IDE의 자바 8로 실행하는지 확인한다.
+- 터미널에서 맥 또는 리눅스 사용자의 경우 `./gradlew clean test`, 윈도우 사용자의 경우 `gradlew.bat clean test` 명령을 실행했을 때 모든 테스트가 통과하는지 확인한다.
+
+---
+
+## 🚀 기능 요구사항
+
+기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
+
+- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
+ - 예) 상대방(컴퓨터)의 수가 425일 때
+ - 123을 제시한 경우 : 1스트라이크
+ - 456을 제시한 경우 : 1볼 1스트라이크
+ - 789를 제시한 경우 : 낫싱
+- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
+- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
+- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
+- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다.
+- 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
+
+
+
+## ✍🏻 입출력 요구사항
+
+### ⌨️ 입력
+
+- 3자리의 수
+- 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수
+
+### 🖥 출력
+
+- 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시
+
+```
+1볼 1스트라이크
+```
+
+- 하나도 없는 경우
+
+```
+낫싱
+```
+
+- 3개의 숫자를 모두 맞힐 경우
+
+```
+3스트라이크
+3개의 숫자를 모두 맞히셨습니다! 게임 종료
+```
+
+### 💻 프로그래밍 실행 결과 예시
+
+```
+숫자를 입력해주세요 : 123
+1볼 1스트라이크
+숫자를 입력해주세요 : 145
+1볼
+숫자를 입력해주세요 : 671
+2볼
+숫자를 입력해주세요 : 216
+1스트라이크
+숫자를 입력해주세요 : 713
+3스트라이크
+3개의 숫자를 모두 맞히셨습니다! 게임 종료
+게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
+1
+숫자를 입력해주세요 : 123
+1볼
+…
+```
+
+
+
+---
+
+## 🎱 프로그래밍 요구사항
+
+- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다.
+- JDK 8 버전에서 실행 가능해야 한다. **JDK 8에서 정상 동작하지 않을 경우 0점 처리**한다.
+- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
+ - https://naver.github.io/hackday-conventions-java
+- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
+ - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
+ - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
+- 3항 연산자를 쓰지 않는다.
+- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.
+
+### 프로그래밍 요구사항 - Randoms, Console
+
+- JDK에서 기본 제공하는 Random, Scanner API 대신 `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms`, `Console` API를 활용해 구현해야 한다.
+ - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInRange()`를 활용한다.
+ - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다.
+- 프로그램 구현을 완료했을 때 `src/test/java` 디렉터리의 `ApplicationTest`에 있는 모든 테스트 케이스가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.**
+
+
+
+---
+
+## 📈 과제 진행 요구사항
+
+- 미션은 [java-baseball-precourse](https://github.com/woowacourse/java-baseball-precourse) 저장소를 Fork/Clone해 시작한다.
+- **기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리**해 추가한다.
+- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다.
+ - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다.
+- 과제 진행 및 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다.
+
+
+
+---
+
+## 📝 License
+
+This project is [MIT](https://github.com/woowacourse/java-baseball-precourse/blob/master/LICENSE) licensed.
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..fae7297
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+apply plugin: 'eclipse'
+
+version = '1.0.0'
+sourceCompatibility = 1.8
+
+repositories {
+ maven { url 'https://jitpack.io' }
+ mavenCentral()
+}
+
+dependencies {
+ implementation('com.github.woowacourse-projects:mission-utils:1.0.0')
+}
+
+test {
+ useJUnitPlatform()
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..87b738c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..bb8b2fc
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..af6708f
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..6d57edc
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java
new file mode 100644
index 0000000..c2102d0
--- /dev/null
+++ b/src/main/java/baseball/Application.java
@@ -0,0 +1,15 @@
+package baseball;
+
+public class Application {
+
+ public static void main(String[] args) {
+ //TODO: 숫자 야구 게임 구현
+
+ BaseballGame baseballgame = new BaseballGame();
+ InputAndOutput input = new InputAndOutput();
+
+ do {
+ baseballgame.Game();
+ } while (input.isContinue());
+ }
+}
diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java
new file mode 100644
index 0000000..6423c9b
--- /dev/null
+++ b/src/main/java/baseball/BaseballGame.java
@@ -0,0 +1,21 @@
+package baseball;
+
+public class BaseballGame {
+
+ void Game() {
+ RandomInt answer = new RandomInt();
+ answer.generateRandomInt();
+ InputAndOutput inout = new InputAndOutput();
+
+ int user, strike, ball;
+
+ do {
+ user = inout.userNumber();
+
+ strike = answer.countStrike(user);
+ ball = answer.countSameNumber(user) - strike;
+
+ inout.printResult(ball, strike);
+ } while (strike != 3);
+ }
+}
diff --git a/src/main/java/baseball/ContinueOrNot.java b/src/main/java/baseball/ContinueOrNot.java
new file mode 100644
index 0000000..6bdab0d
--- /dev/null
+++ b/src/main/java/baseball/ContinueOrNot.java
@@ -0,0 +1,15 @@
+package baseball;
+
+public enum ContinueOrNot {
+ CONTINUE(1), END(2);
+
+ private final int value;
+
+ ContinueOrNot(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/src/main/java/baseball/InputAndOutput.java b/src/main/java/baseball/InputAndOutput.java
new file mode 100644
index 0000000..fe68851
--- /dev/null
+++ b/src/main/java/baseball/InputAndOutput.java
@@ -0,0 +1,46 @@
+package baseball;
+
+import java.util.Scanner;
+
+import static baseball.ContinueOrNot.CONTINUE;
+
+public class InputAndOutput {
+
+ Scanner scanner = new Scanner(System.in);
+
+ public int userNumber() {
+ System.out.print("숫자를 입력해주세요: ");
+ int user;
+ try {
+ user = scanner.nextInt();
+ } catch (Exception e) {
+ throw new IllegalArgumentException("answer must be INTEGERS");
+ }
+
+ if (user < 100) {
+ throw new IllegalArgumentException("answer must be THREE integers");
+ }
+
+ return user;
+ }
+
+ public boolean isContinue() {
+ System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
+ int isContinue = scanner.nextInt();
+ return isContinue == CONTINUE.getValue();
+ }
+
+ public void printResult(int ball, int strike) {
+ if (ball == 0 && strike == 0) {
+ System.out.println("낫싱");
+ } else {
+ if (ball != 0) {
+ System.out.print(ball + "볼");
+ }
+ if (strike != 0) {
+ System.out.print(strike + "스트라이크");
+ }
+ System.out.print("\n");
+ }
+ }
+}
diff --git a/src/main/java/baseball/RandomInt.java b/src/main/java/baseball/RandomInt.java
new file mode 100644
index 0000000..9f168db
--- /dev/null
+++ b/src/main/java/baseball/RandomInt.java
@@ -0,0 +1,60 @@
+package baseball;
+
+import java.util.Random;
+
+public class RandomInt {
+
+ int number;
+
+ RandomInt() {
+ }
+
+ public void generateRandomInt() {
+ Random random = new Random();
+ while (true) {
+ number = random.nextInt(999);
+ int com1, com2, com3;
+ com1 = number % 10;
+ com2 = (number / 10) % 10;
+ com3 = number / 100;
+ if (com1 != com2 && com2 != com3 && com3 != com1) {
+ break;
+ }
+ }
+ }
+
+ public int countStrike(int user) {
+ int strike = 0;
+ int answer = number;
+
+ while (answer > 0) {
+ if (answer % 10 == user % 10) {
+ strike++;
+ }
+ answer /= 10;
+ user /= 10;
+ }
+
+ return strike;
+ }
+
+ public int countSameNumber(int user) {
+ int howMany = 0;
+ int answer = number;
+
+ while (answer > 0) {
+ if (answer % 10 == user % 10) {
+ howMany++;
+ }
+ if (answer % 10 == (user / 10) % 10) {
+ howMany++;
+ }
+ if (answer % 10 == user / 100) {
+ howMany++;
+ }
+ answer /= 10;
+ }
+
+ return howMany;
+ }
+}
diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java
new file mode 100644
index 0000000..359aacf
--- /dev/null
+++ b/src/test/java/baseball/ApplicationTest.java
@@ -0,0 +1,36 @@
+package baseball;
+
+import camp.nextstep.edu.missionutils.test.NsTest;
+import org.junit.jupiter.api.Test;
+
+import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest;
+import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+class ApplicationTest extends NsTest {
+
+ @Test
+ void 게임종료_후_재시작() {
+ assertRandomNumberInRangeTest(
+ () -> {
+ run("246", "135", "1", "597", "589", "2");
+ assertThat(output()).contains("낫싱", "3스트라이크", "1볼 1스트라이크", "3스트라이크", "게임 종료");
+ },
+ 1, 3, 5, 5, 8, 9
+ );
+ }
+
+ @Test
+ void 예외_테스트() {
+ assertSimpleTest(() ->
+ assertThatThrownBy(() -> runException("1234"))
+ .isInstanceOf(IllegalArgumentException.class)
+ );
+ }
+
+ @Override
+ public void runMain() {
+ Application.main(new String[]{});
+ }
+}