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

[로또] 이상지 미션 제출합니다. #183

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
65 changes: 65 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
이번 로또 게임은 실행 결과와 게임 규칙을 중심으로
Readme를 작성하고 기힉, 코드 작성, 테스트 순으로 진행한다.

# 이번 미션의 목표
A. 클래스(객체)를 분리하는 연습
단일 책임 원칙(Single Responsibility Principle)에 따라
하나의 주요 역할만 수행하도록 설계되어함
B. 도메인 로직에 대한 단위 테스트를 작성하는 연습
테스트 주도 개발(Test-Driven Development, TDD) 방법론을 따라 도메인 로직을 개발하는 경우,
테스트가 코드 작성의 주요 동기가 됨


# 1. 구입금액을 입력해 주세요.
=> 사용자에게 구입 금액을 입력 받는다.
-> 사용자가 입력하는 값은
camp.nextstep.edu.missionutils.Console의
readLine()을 활용한다.
- 로또 1장의 가격은 1,000원이다
-> 입력된 구입 금액 / 1,000 = 구매한 로또 장 수

# 2. n개를 구매했습니다.
=> 출력
위에서 구한 장수를 출력한다. print()

# 3. [ , , , , , ] * n
=> n번의 결과를 출력한다. print()
이때,
- 로또 번호의 숫자 범위는 1~45까지이다.
-> 이 밖의 범위의 숫자를 입력하면 IllegalArgumentException
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
-> Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의
pickUniqueNumbersInRange()를 활용한다.
-> 중복되는 숫자를 입력하면 IllegalArgumentException

*이번 미션부터는 종료를 시키는 것이 아닌 그 부분부터 다시 입력을 받는 것이 포인트!

# 4. 당첨 번호를 입력해 주세요.
=> 입력은 1번 조건은 3번과 같음

# 5. 보너스 번호를 입력해 주세요.
=> 입력은 1번, 조건은 3번인 대신에 하나의 숫자만 입력해야한다.

# 6. 당첨 통계
=> "---", 결과, 수익률 출력
- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
-> 이 기준을 토대로 결과를 2번과 같이 출력
- 총 수익률 출력 (소수점 두자리 수에서 반올림)
-> 수익률 = (총 당첨 금액 / 로또 구매 금액) * 100
62.5 = (5000/8000) * 100

# 추가된 요구 사항
함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
else를 지양한다.
힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
때로는 if/else, when문을 사용하는 것이 더 깔끔해 보일 수 있다. 어느 경우에 쓰는 것이 적절할지 스스로 고민해 본다.
Enum 클래스를 적용해 프로그래밍을 구현한다.
도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
단위 테스트 작성이 익숙하지 않다면 test/kotlin/lotto/LottoTest를 참고하여 학습한 후 테스트를 구현한다.
5 changes: 0 additions & 5 deletions src/main/kotlin/lotto/Application.kt

This file was deleted.

26 changes: 26 additions & 0 deletions src/main/kotlin/lotto/Constants.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package lotto

class Constants {
companion object {
const val LOTTO_PRICE = 1000
const val MIN_LOTTO_NUMBER = 1
const val MAX_LOTTO_NUMBER = 45
const val INPUT_PURCHASE_AMOUNT_MESSAGE = "구입금액을 입력해 주세요.\n"
const val OUTPUT_PURCHASE_COUNT_MESSAGE = "%d개를 구매했습니다.\n"
const val INPUT_WINNING_NUMBERS_MESSAGE = "당첨 번호를 입력해 주세요.\n"
const val INPUT_BONUS_NUMBERS_MESSAGE = "보너스 번호를 입력해 주세요.\n"
const val OUTPUT_WINNING_STATISTICS_MESSAGE = "당첨 통계\n"
const val OUTPUT_LINES = "---\n"
const val OUTPUT_THREE_MATCH_MESSAGE = "3개 일치 (5,000원) - %d개\n"
const val OUTPUT_FOUR_MATCH_MESSAGE = "4개 일치 (50,000원) - %d개\n"
const val OUTPUT_FIVE_MATCH_MESSAGE = "5개 일치 (1,500,000원) - %d개\n"
const val OUTPUT_FIVE_WITH_BONUS_MATCH_MESSAGE = "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개\n"
const val OUTPUT_SIX_MATCH_MESSAGE = "6개 일치 (2,000,000,000원) - %d개\n"
const val OUTPUT_PROFIT_PERCENTAGE_MESSAGE = "총 수익률은 %.1f%%입니다."
const val ERROR_INVALID_PURCHASE_AMOUNT_MESSAGE = "[ERROR] 알맞는 금액을 입력해주세요.(구입 금액은 1,000원 단위로 입력)"
const val ERROR_OUT_OF_RANGE_NUMBER_MESSAGE = "[ERROR] 1~45 사이의 숫자를 입력해 주세요."
const val ERROR_INVALID_NUMBER_MESSAGE = "[ERROR] 총 6개의 숫자를 입력해 주세요."
const val ERROR_OVERLAP_NUMBER_MESSAGE = "[ERROR] 당첨 번호는 서로 다른 숫자여야합니다."
const val ERROR_OVERLAP_TOTAL_NUMBER_MESSAGE = "[ERROR] 보너스 번호는 당첨 번호와 중복될 수 없습니다."
}
}
9 changes: 0 additions & 9 deletions src/main/kotlin/lotto/Lotto.kt

This file was deleted.

13 changes: 13 additions & 0 deletions src/main/kotlin/lotto/Main.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package lotto
import lotto.service.LottoService
import lotto.utils.ConsoleUtils
import lotto.utils.RandomUtils


fun main() {
val consoleUtils = ConsoleUtils()
val randomUtils = RandomUtils()
consoleUtils.inputPurchaseAmountMessage()
consoleUtils.outputPurchaseCountMessage()
randomUtils.lottoNumberCreat()
}
27 changes: 27 additions & 0 deletions src/main/kotlin/lotto/model/Lotto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package lotto.model

import lotto.Constants.Companion.ERROR_INVALID_PURCHASE_AMOUNT_MESSAGE
import lotto.Constants.Companion.ERROR_OUT_OF_RANGE_NUMBER_MESSAGE
import lotto.Constants.Companion.ERROR_OVERLAP_NUMBER_MESSAGE
import lotto.Constants.Companion.MAX_LOTTO_NUMBER
import lotto.Constants.Companion.MIN_LOTTO_NUMBER
class Lotto(private val numbers: List<Int>) {
init {
require(numbers.size == 6)
// 숫자가 6개가 아니면
{ ERROR_INVALID_PURCHASE_AMOUNT_MESSAGE }
require(numbers.distinct().size == 6)
//당첨 번호 중복되면
{ ERROR_OVERLAP_NUMBER_MESSAGE }
require(numbers.all { it in MIN_LOTTO_NUMBER..MAX_LOTTO_NUMBER })
//숫자 범위 아니면
{ ERROR_OUT_OF_RANGE_NUMBER_MESSAGE }
}
val getNumber: List<Int>
get() = numbers

}




5 changes: 5 additions & 0 deletions src/main/kotlin/lotto/service/LottoService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package lotto.service

class LottoService {

}
22 changes: 22 additions & 0 deletions src/main/kotlin/lotto/utils/ConsoleUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package lotto.utils

import camp.nextstep.edu.missionutils.Console
import lotto.Constants.Companion.INPUT_PURCHASE_AMOUNT_MESSAGE
import lotto.Constants.Companion.OUTPUT_PURCHASE_COUNT_MESSAGE
class ConsoleUtils {
//구매 금액 입력
fun inputPurchaseAmountMessage(): String{
print(INPUT_PURCHASE_AMOUNT_MESSAGE)
return Console.readLine()
}

//구매 갯수 출력
fun outputPurchaseCountMessage(): String{
print(OUTPUT_PURCHASE_COUNT_MESSAGE)
return Console.readLine()
}

//당첨 번호 입력


}
16 changes: 16 additions & 0 deletions src/main/kotlin/lotto/utils/RandomUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package lotto.utils

import camp.nextstep.edu.missionutils.Randoms
import lotto.utils.ConsoleUtils
class RandomUtils {
fun lottoNumberCreat(){
val consoleUtils = ConsoleUtils()
val purchaseAmount = consoleUtils.inputPurchaseAmountMessage()
val purchaseCount = purchaseAmount.toDouble()/1000

repeat(purchaseCount.toInt()){
val numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6)
println("$numbers")
}
}
}
7 changes: 7 additions & 0 deletions src/test/kotlin/lotto/LottoTest.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lotto

import lotto.model.Lotto
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows

Expand All @@ -21,4 +22,10 @@ class LottoTest {
}

// 아래에 추가 테스트 작성 가능
@Test
fun `로또 번호에 1~45 밖의 숫자가 있으면 예외가 발생한다`() {
assertThrows<IllegalArgumentException> {
Lotto(listOf(-1, 46, 3, 4, 5, 0))
}
}
}