songining

๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ฐ›์•˜๋˜ ํ”ผ๋“œ๋ฐฑ์„ ํ† ๋Œ€๋กœ ๋ฐฐ์šด ์ ๋“ค์„ ์ ์–ด๋ณด๋ ค ํ•œ๋‹ค.

ํด๋ฆฐ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”ํ‹€๋ฆฐ์„ ์ข€ ๋” ์ฝ”ํ‹€๋ฆฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋งŽ์ด ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค!

 

Step2

https://github.com/next-step/kotlin-lotto/pull/759

๊ฒ€์ฆ๋ถ€๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์ž

ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๋„๋ฉ”์ธ์˜ ์ƒ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด ๊ฒ€์ฆ ๋กœ์ง์„ ์งฐ๋Š”๋ฐ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ํ™œ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ์„ ํ•ด๋ณด๋Š”๊ฑด ์–ด๋–ป๊ฒ ๋ƒ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค.

๊ฒ€์ฆ๋ถ€์— ๋„๋ฉ”์ธ ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ฌด์˜๋ฏธํ•œ ๊ฒ€์ฆ
    • ์‚ฌ์‹ค์ƒ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ & ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
  2. ๊ตฌํ˜„ ์ฝ”๋“œ์™€์˜ ๊ฐ•๊ฒฐํ•ฉ
    • ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์™€ ๊ฐ•๊ฒฐํ•ฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•œ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๋„๋ฉ”์ธ ๋กœ์ง ๋˜ํ•œ ํ•จ๊ป˜ ๊ณ ์ณ์•ผ ํ•œ๋‹ค.
  3. ๊ฑฐ์ง“ ์„ฑ๊ณต
    • ๋„๋ฉ”์ธ ๋กœ์ง ์ž์ฒด๊ฐ€ ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ฆ‰, ๊ฒ€์ฆ๋ฌธ์— ๋™์ผํ•œ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„ ๋‚ด ๋„๋ฉ”์ธ ๋กœ์ง์€ ๊ฒ€์ฆ์„ ๋ณด์žฅ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.
  4. Test First(TDD)์˜ ์–ด๋ ค์›€
    • ์†Œํ”„ํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋‚˜๋Š” Test First๋กœ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. Test First ์ž์ฒด๊ฐ€ ๊ตฌํ˜„๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ›„ ๊ตฌํ˜„๋ถ€๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฆฌํŒฉํ† ๋ง ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๊ตฌํ˜„๋ถ€๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅผ๋ฐ” ์—†๋‹ค.
  5. ๊ฒฐ๊ณผ ์˜ˆ์ธก์˜ ์–ด๋ ค์›€
    • ์˜ˆ์ƒ๋˜๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด expected ๊ฐ€ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒ์ด ๋ ๊นŒ?
string expected = "C:\\\\Output Folder" + string.Join("\\\\", target.Field1, target.Field2, target.Field3, target.Field4);

 

์ฐธ๊ณ 

https://jojoldu.tistory.com/615?category=1036934

 

Step3

https://github.com/next-step/kotlin-lotto/pull/769

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€ ๊ฐ’ ์ฒ˜๋ฆฌํ•˜๊ธฐ

  • ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๋ฉฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์„ธ๋ถ€์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ถˆ๋ณ€ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์ ์šฉํ•˜๋Š”๋ฐ ๋‚ด๋ถ€ ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ๋Š” ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋”๋Ÿฌ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค.
  • ๋‚ด๋ถ€ ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๊บผ๋‚ด๊ธฐ๋ณด๋‹ค ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊นŒ์ง€๊ฐ€ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์˜ ์—ญํ• ์ด๋ฉฐ ์—ญํ• ๋„ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
class LottoMatcher(private val winningNumbers: List<Int>) {

    fun getMatchingResult(lottoTickets: LottoTickets): LottoResult {
        val map = lottoTickets.numbers
            .map { numbers -> countMatchingNumbers(numbers) }
            .groupingBy { LottoRank.getLottoRankByMatchCount(it) }
            .eachCount()
        return LottoResult(map)
    }

    private fun countMatchingNumbers(myNumbers: Numbers) = myNumbers.values.count { winningNumbers.contains(it) }
}
class WinningTicket(private val winningNumbers: LottoNumbers) {

    fun getMatchingResult(lottoTickets: LottoTickets): LottoResult {
        return myTickets
            .matchCount(winningNumbers)
            .groupingBy { matchCount -> LottoRank(matchCount) }
            .eachCount()
            .let { LottoResult(it) }
    }
}

์•„๋ž˜์™€ ๊ฐ™์ด ์ผ์น˜ํ•˜๋Š” ๋กœ๋˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋กœ์ง์„ LottoTickets ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์— ์œ„์ž„ํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

value class ์‚ฌ์šฉํ•˜๊ธฐ (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝํ•˜๊ธฐ)

์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ณ ์ •๋˜์–ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

@JvmInline
value class LottoNumber(
    val number: Int
) {
    init {
        require(number in (MIN..MAX)) {
            "$MIN ๊ณผ $MAX ์‚ฌ์ด์˜ ๊ฐ’๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. input: [$number]"
        }
    }

    companion object {
        private const val MIN = 1
        private const val MAX = 45
    }
}

์œ„์˜ LottoNumber ํด๋ž˜์Šค๋ฅผ ๋””์ปดํŒŒ์ผํ•ด๋ณด๋ฉด ์ƒ์„ฑ์ž์—์„œ int ํƒ€์ž…์„ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•œ ์•ˆ์ •์ ์ธ ๊ฐ์ฒด๋ฅผ ์œ„ํ•ด ์›์‹œ๊ฐ’์„ ๋ž˜ํ•‘ํ•˜๋‹ค๋ณด๋‹ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋ฅผ ์ค„์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ value class๋ฅผ ๋งŒ๋“ค๋ฉด ์ธ์Šคํ„ด์Šค ์ž์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, value class ๋ฅผ ํ†ตํ•ด ์›์‹œ๊ฐ’ ํฌ์žฅ์œผ๋กœ ์ธํ•ด ์ƒ์„ฑ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋กœ ์ธํ•œ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จ, value class ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’(ํ”„๋กœํผํ‹ฐ)๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • 2๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋ฉด ์บ์‹ฑ ๋ฐ ํŒฉํ† ๋ฆฌํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ์•ˆํ•˜๋‹ค → ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋‚ด๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์น˜๊ฐ€ ๋” ํฌ๋‹ค. (ํ•ญ์ƒ ํ•ด์™”๋˜ ๊ณ ๋ฏผ์ธ๋ฐ ์ด์— ๋Œ€ํ•œ ๋ช…์พŒํ•œ ๋‹ต์ธ ๊ฒƒ ๊ฐ™๋‹ค.)

 

Step4

https://github.com/next-step/kotlin-lotto/pull/789

๋ฆฌํ„ด ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ž

  • ๋ฆฌํ„ด ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์„ ์ƒ๋žตํ•˜๊ธฐ ์‰ฌ์šด ํ™˜๊ฒฝ์ด๋ผ ์ด๋ฅผ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ํ•˜์œ„ ํƒ€์ž…์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์ค€ ํƒ€์ž…์„ ์ง€์›Œ๋ฒ„๋ฆฌ๋ฉด ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌํ„ด ํƒ€์ž…์€ API๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณผ ๋•Œ ์•„์ฃผ ์ค‘์š”ํ•œ ์ •๋ณด์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌํ„ด ํƒ€์ž…์€ ์™ธ๋ถ€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

View ์˜ ๋„๋ฉ”์ธ ์˜์กด

View์—์„œ ์ถœ๋ ฅํ•  ๋„๋ฉ”์ธ ์ •๋ณด๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด View์—์„œ ๋„๋ฉ”์ธ ๋กœ์ง์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„์„ ํ•˜์˜€๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ์ง€๋งŒ ํ˜„์žฌ์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๋ฏธ์…˜๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ƒํ™ฉ์—์„œ DTO๊นŒ์ง€๋Š” ๊ตณ์ด ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š์•˜๋‹ค.

View์—์„œ ๋„๋ฉ”์ธ ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋„๋ฉ”์ธ์˜ ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ถœ๋ ฅ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ์šฉํ•ด๋„ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค๋Š” ๋ฆฌ๋ทฐ์–ด๋‹˜์˜ ๋‹ต๋ณ€์„ ๋ฐ›์•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋„๋ฉ”์ธ์ด ์ปค์ง€๊ณ  ๊ทœ๋ชจ๊ฐ€ ์ปค์ง„๋‹ค๋ฉด View์—์„œ๋Š” ๋„๋ฉ”์ธ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด Dto๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.