Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

프리코스 스터디 1주차 - 고루 #182

Open
wants to merge 28 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2fc1bfd
docs : 필요 기능 목록 작성
oyoungsun Nov 20, 2023
c7a2b21
feat(Product) : 상품 도메인 생성 기능 구현
oyoungsun Nov 20, 2023
0202311
docs : 기능 구현 사항 추가
oyoungsun Nov 20, 2023
f2f1c4b
feat(ProductPrice) : 상품의 금액에 대한 검증 기능 구현
oyoungsun Nov 20, 2023
8508f92
refactor(Price) : Product의 Price를 일급 컬렉션으로 분리
oyoungsun Nov 20, 2023
9952b1e
feat(Input) : 프록시 인풋 뷰 구조 구현
oyoungsun Nov 20, 2023
1410922
feat(InputValidator) : 입력값 검증 기능 목록 구현
oyoungsun Nov 20, 2023
b86b176
test(Product) : 예외 반환 테스트 coverage 100% 작성
oyoungsun Nov 20, 2023
b447174
feat(Products) : 자판기의 판매 목록 생성 기능 구현
oyoungsun Nov 20, 2023
8e7308a
feat(ProductsValidator) : 상품 목록 검증 기능 구현
oyoungsun Nov 20, 2023
00be49c
feat(OutputView) : 자판기 보유 금액 입력 요청 출력 기능 구현
oyoungsun Nov 20, 2023
79134b5
feat(InputValidator) : 입력받은 정수를 검사하는 기능 구현
oyoungsun Nov 20, 2023
5c27707
feat(Convertor) : 문자열을 정수로 변환하는 기능 구현
oyoungsun Nov 20, 2023
2005c79
feat(Convertor) : 상품을 변환하고, 변환이 불가능하면 예외를 반환하는 기능 구현
oyoungsun Nov 20, 2023
ae3facd
feat(OutputView) : 자판기 상품을 입력받는 기능 구현
oyoungsun Nov 20, 2023
ca93aa2
feat(controller) : view-domain 등록 구조 구현
oyoungsun Nov 20, 2023
96745c6
refactor(Input) : 보유 금액 입력 메서드 네이밍 변경
oyoungsun Nov 20, 2023
91d4310
feat(ExceptionHandler) : 잘못된 입력시 [ERROR] 에러 이유를 출력하고 재입력 받는 기능 구현
oyoungsun Nov 20, 2023
072a08e
feat(controller) : 게임 흐름 진행 기능 구현
oyoungsun Nov 20, 2023
a22b57b
fix(OutputView) : 상품 목록 입력요청 출력 관련 버그 수정
oyoungsun Nov 20, 2023
42a85db
feat(ExceptionHandlier) : 변환시 예외 발생시 입력을 다시 받는 기능 구현
oyoungsun Nov 20, 2023
4fd1033
feat(PurchaseService) : 구매 관련 비지니스 로직을 수행하는 서비스 생성메서드 구현
oyoungsun Nov 20, 2023
917e9c3
docs : 상품 구매 관련 상세 기능 추가
oyoungsun Nov 20, 2023
d653499
test(CoinGenrator) : 코인 개수 생성하는 함수 pickNumberInList() 기능 확인
oyoungsun Nov 20, 2023
ca7bd9e
feat(CoinGenerator) : 자판기의 보유 금액만큼 코인을 생성하는 기능 구현
oyoungsun Nov 20, 2023
ab243df
feat(CoinService) : 동전을 관리하는 서비스 생성메소드 구현
oyoungsun Nov 20, 2023
e27dbdf
feat(CoinService) : coinGenerator로 보유금액을 코인으로 변환하는 기능 구현
oyoungsun Nov 20, 2023
5db58c6
feat(CoinService) : 구매 후 남은 금액을 코인으로 변환하는 메서드 정의
oyoungsun Nov 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ dependencies {

java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
languageVersion = JavaLanguageVersion.of(17)
}
}


test {
useJUnitPlatform()
}
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
257 changes: 153 additions & 104 deletions gradlew
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh

#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -17,67 +17,101 @@
#

##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# 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
app_path=$0

# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${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" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum

warn () {
echo "$*"
}
} >&2

die () {
echo
echo "$*"
echo
exit 1
}
} >&2

# 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
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
Expand All @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
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"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Expand All @@ -98,88 +132,103 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
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
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
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
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

JAVACMD=$( cygpath --unix "$JAVACMD" )

# 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\""
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
i=`expr $i + 1`
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
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;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.

set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

# 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"
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'

exec "$JAVACMD" "$@"
40 changes: 40 additions & 0 deletions src/main/docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 자판기
### 기능 : 상품을 구매하면 자판기가 가진 동전만으로 잔돈을 거슬러준다.
1. 자판기의 보유 금액 입력받기
- Coin으로 나누어 떨어져야 한다. 즉, 10원 단위로 나누어 떨어진다.
- 0원도 가능하다 (잔돈 반환 불가능 시, 자판기에 남는다.)
- 0원 미만은 불가능 하다.
2. 투입 금액 받기
```[콜라,1500,20];[사이다,1000,10]```
- 상품명 입력받기
- 가격 입력받기
- [x] 최소 상품 판매 금액은 100원 이상이다.
- [x] 10원으로 나누어떨어져야 한다.
- 수량 입력받기
- [x] 최소 1개 이상이다.
3. 자판이가 보유하고 있는 금액에서 동전을 무작위로 생성하기
- 자판기가 보유한 동전을 출력한다.
4. 잔돈 돌려주기
- [ ] 동전의 개수를 최소한으로 잔돈 돌려주기
- 지폐 단위는 사용 불가하다.
- [ ] 잔액 중 동전만 사용해 반환 불가능 시에 남은 금액은 자판기에 남는다.
5. 상품을 구매하기
- [ ] ```구매할 상품명```이 자판기에 존재하는지 검사한다.
- [ ] 현재 금액으로 구매가 가능한지 검사한다.
- [ ] 상품을 구매하여 최초 투입 금액에서 차감한다.
- [ ] 더이상 구매가 불가능한 경우(남은 금액이 상품의 최저 가격보다 적음, 모든 상품이 소진됨.) 잔돈을 반환한다


# 프로그래밍 요구사항 - Coin
Coin 클래스를 활용해 구현해야 한다.
필드(인스턴스 변수)인 amount의 접근 제어자 private을 변경할 수 없다.

IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다

Randoms, Console API를 사용한다.

✅ indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
✅ 3항 연산자를 쓰지 않는다.
✅ 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
✅ 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
✅ else 예약어를 쓰지 않는다.
Loading