oh-my-oop 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_STRUCTURE.md +301 -0
- package/README.md +167 -0
- package/SCOPE.md +27 -0
- package/dist/application/discovery.d.ts +133 -0
- package/dist/application/discovery.js +62 -0
- package/dist/application/discovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/collaborators.d.ts +2 -0
- package/dist/domain/collaborators.js +26 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/ids.d.ts +4 -0
- package/dist/domain/ids.js +23 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/model.d.ts +71 -0
- package/dist/domain/model.js +2 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/schemas.d.ts +213 -0
- package/dist/domain/schemas.js +79 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/stereotypes.d.ts +7 -0
- package/dist/domain/stereotypes.js +65 -0
- package/dist/domain/stereotypes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/io/classStore.d.ts +9 -0
- package/dist/io/classStore.js +39 -0
- package/dist/io/classStore.js.map +1 -0
- package/dist/io/collaborationStore.d.ts +7 -0
- package/dist/io/collaborationStore.js +32 -0
- package/dist/io/collaborationStore.js.map +1 -0
- package/dist/io/design.d.ts +3 -0
- package/dist/io/design.js +22 -0
- package/dist/io/design.js.map +1 -0
- package/dist/io/designIndex.d.ts +6 -0
- package/dist/io/designIndex.js +49 -0
- package/dist/io/designIndex.js.map +1 -0
- package/dist/io/frontmatter.d.ts +8 -0
- package/dist/io/frontmatter.js +31 -0
- package/dist/io/frontmatter.js.map +1 -0
- package/dist/io/history.d.ts +10 -0
- package/dist/io/history.js +38 -0
- package/dist/io/history.js.map +1 -0
- package/dist/io/useCaseStore.d.ts +8 -0
- package/dist/io/useCaseStore.js +36 -0
- package/dist/io/useCaseStore.js.map +1 -0
- package/dist/io/workspace.d.ts +14 -0
- package/dist/io/workspace.js +82 -0
- package/dist/io/workspace.js.map +1 -0
- package/dist/oop/commands.d.ts +446 -0
- package/dist/oop/commands.js +319 -0
- package/dist/oop/commands.js.map +1 -0
- package/dist/oop/conformance.d.ts +16 -0
- package/dist/oop/conformance.js +30 -0
- package/dist/oop/conformance.js.map +1 -0
- package/dist/prompts/discovery.d.ts +2 -0
- package/dist/prompts/discovery.js +41 -0
- package/dist/prompts/discovery.js.map +1 -0
- package/dist/prompts/imagineWithoutController.d.ts +2 -0
- package/dist/prompts/imagineWithoutController.js +75 -0
- package/dist/prompts/imagineWithoutController.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/phasePressureTest.d.ts +2 -0
- package/dist/prompts/phasePressureTest.js +69 -0
- package/dist/prompts/phasePressureTest.js.map +1 -0
- package/dist/prompts/rddIntro.d.ts +2 -0
- package/dist/prompts/rddIntro.js +53 -0
- package/dist/prompts/rddIntro.js.map +1 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +45 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
- package/dist/prompts/stateMachineIntrospect.js +80 -0
- package/dist/prompts/stateMachineIntrospect.js.map +1 -0
- package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
- package/dist/prompts/tellDontAskRephrase.js +66 -0
- package/dist/prompts/tellDontAskRephrase.js.map +1 -0
- package/dist/render/diff.d.ts +21 -0
- package/dist/render/diff.js +84 -0
- package/dist/render/diff.js.map +1 -0
- package/dist/render/mermaid.d.ts +24 -0
- package/dist/render/mermaid.js +53 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/sideBySide.d.ts +14 -0
- package/dist/render/sideBySide.js +91 -0
- package/dist/render/sideBySide.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +349 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/alternatives.d.ts +2 -0
- package/dist/tools/alternatives.js +9 -0
- package/dist/tools/alternatives.js.map +1 -0
- package/dist/tools/classes.d.ts +2 -0
- package/dist/tools/classes.js +13 -0
- package/dist/tools/classes.js.map +1 -0
- package/dist/tools/collaborations.d.ts +2 -0
- package/dist/tools/collaborations.js +8 -0
- package/dist/tools/collaborations.js.map +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +9 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/conformance.d.ts +3 -0
- package/dist/tools/conformance.js +11 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/diagram.d.ts +2 -0
- package/dist/tools/diagram.js +9 -0
- package/dist/tools/diagram.js.map +1 -0
- package/dist/tools/discovery.d.ts +2 -0
- package/dist/tools/discovery.js +23 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +9 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/oop.d.ts +9 -0
- package/dist/tools/oop.js +26 -0
- package/dist/tools/oop.js.map +1 -0
- package/dist/tools/responsibilities.d.ts +2 -0
- package/dist/tools/responsibilities.js +13 -0
- package/dist/tools/responsibilities.js.map +1 -0
- package/dist/tools/state.d.ts +2 -0
- package/dist/tools/state.js +8 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/useCases.d.ts +2 -0
- package/dist/tools/useCases.js +18 -0
- package/dist/tools/useCases.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -0
- package/dist/tools/validate.js +9 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tradeoff/engine.d.ts +61 -0
- package/dist/tradeoff/engine.js +171 -0
- package/dist/tradeoff/engine.js.map +1 -0
- package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
- package/dist/tradeoff/heuristics/classSplit.js +94 -0
- package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
- package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
- package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
- package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collectionShape.js +113 -0
- package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
- package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
- package/dist/tradeoff/heuristics/errorHandling.js +110 -0
- package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
- package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
- package/dist/tradeoff/templates.d.ts +2 -0
- package/dist/tradeoff/templates.js +33 -0
- package/dist/tradeoff/templates.js.map +1 -0
- package/dist/util/log.d.ts +1 -0
- package/dist/util/log.js +7 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/mcp.d.ts +4 -0
- package/dist/util/mcp.js +18 -0
- package/dist/util/mcp.js.map +1 -0
- package/dist/validate/cohesion.d.ts +3 -0
- package/dist/validate/cohesion.js +88 -0
- package/dist/validate/cohesion.js.map +1 -0
- package/dist/validate/collectionWrapper.d.ts +3 -0
- package/dist/validate/collectionWrapper.js +131 -0
- package/dist/validate/collectionWrapper.js.map +1 -0
- package/dist/validate/coupling.d.ts +3 -0
- package/dist/validate/coupling.js +47 -0
- package/dist/validate/coupling.js.map +1 -0
- package/dist/validate/cycle.d.ts +3 -0
- package/dist/validate/cycle.js +101 -0
- package/dist/validate/cycle.js.map +1 -0
- package/dist/validate/dataDuplication.d.ts +3 -0
- package/dist/validate/dataDuplication.js +150 -0
- package/dist/validate/dataDuplication.js.map +1 -0
- package/dist/validate/dependencyDirection.d.ts +3 -0
- package/dist/validate/dependencyDirection.js +106 -0
- package/dist/validate/dependencyDirection.js.map +1 -0
- package/dist/validate/dualUseKnowing.d.ts +3 -0
- package/dist/validate/dualUseKnowing.js +137 -0
- package/dist/validate/dualUseKnowing.js.map +1 -0
- package/dist/validate/emptyObjectFill.d.ts +3 -0
- package/dist/validate/emptyObjectFill.js +119 -0
- package/dist/validate/emptyObjectFill.js.map +1 -0
- package/dist/validate/findings.d.ts +22 -0
- package/dist/validate/findings.js +12 -0
- package/dist/validate/findings.js.map +1 -0
- package/dist/validate/functionDecompositionExcess.d.ts +3 -0
- package/dist/validate/functionDecompositionExcess.js +120 -0
- package/dist/validate/functionDecompositionExcess.js.map +1 -0
- package/dist/validate/functionNotObject.d.ts +3 -0
- package/dist/validate/functionNotObject.js +80 -0
- package/dist/validate/functionNotObject.js.map +1 -0
- package/dist/validate/godObject.d.ts +6 -0
- package/dist/validate/godObject.js +76 -0
- package/dist/validate/godObject.js.map +1 -0
- package/dist/validate/presentationInDomain.d.ts +3 -0
- package/dist/validate/presentationInDomain.js +57 -0
- package/dist/validate/presentationInDomain.js.map +1 -0
- package/dist/validate/primitiveWrapper.d.ts +3 -0
- package/dist/validate/primitiveWrapper.js +106 -0
- package/dist/validate/primitiveWrapper.js.map +1 -0
- package/dist/validate/rules.d.ts +24 -0
- package/dist/validate/rules.js +269 -0
- package/dist/validate/rules.js.map +1 -0
- package/dist/validate/singletonStatefulHolder.d.ts +3 -0
- package/dist/validate/singletonStatefulHolder.js +128 -0
- package/dist/validate/singletonStatefulHolder.js.map +1 -0
- package/dist/validate/strategyAsymmetry.d.ts +3 -0
- package/dist/validate/strategyAsymmetry.js +131 -0
- package/dist/validate/strategyAsymmetry.js.map +1 -0
- package/dist/validate/testability.d.ts +5 -0
- package/dist/validate/testability.js +157 -0
- package/dist/validate/testability.js.map +1 -0
- package/dist/validate/vagueName.d.ts +3 -0
- package/dist/validate/vagueName.js +136 -0
- package/dist/validate/vagueName.js.map +1 -0
- package/dist/validate/validationLocation.d.ts +3 -0
- package/dist/validate/validationLocation.js +120 -0
- package/dist/validate/validationLocation.js.map +1 -0
- package/lessons/STYLE_GUIDE.md +304 -0
- package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
- package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
- package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
- package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
- package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
- package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
- package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
- package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
- package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
- package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
- package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
- package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
- package/lessons/woowacourse-racingcar/README.md +69 -0
- package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
- package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
- package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
- package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
- package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
- package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
- package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
- package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/package.json +46 -0
- package/skills/oh-my-oop/SKILL.md +39 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# PR #46 — [반달] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@no1msh](https://github.com/no1msh)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/46
|
|
5
|
+
- **단계:** 2단계 (수동 로또)
|
|
6
|
+
- **리뷰어:** @woowajames
|
|
7
|
+
- **라인 코멘트:** 19
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **기능 목록 README** — 칭찬: "*기능 목록 작성에 고민을 많이 하신 것* 같아요!".
|
|
12
|
+
|
|
13
|
+
## 못한 점 (설계 관점)
|
|
14
|
+
|
|
15
|
+
### 1. *수익률 소수점 둘째 자리 미적용*
|
|
16
|
+
|
|
17
|
+
리뷰어: "*미션 실행 결과를 보면 당첨 통계는 소수점 둘째자리까지 보여주고* 있습니다. *동일하게 개선*해 보면 좋겠습니다."
|
|
18
|
+
|
|
19
|
+
### 2. *기능 목록 단위 커밋* 권유
|
|
20
|
+
|
|
21
|
+
리뷰어: "*추후에는 커밋 단위를 기능 목록 단위로 하시면 더 좋을 것* 같아요."
|
|
22
|
+
|
|
23
|
+
### 3. `Lotto` *init과 부 생성자 호출 순서*
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
class Lotto(val numbers: List<LottoNumber>) {
|
|
27
|
+
constructor(input: String) : this(input.split(",").map { LottoNumber(it.toInt()) }) {
|
|
28
|
+
// ⚠ 검증?
|
|
29
|
+
}
|
|
30
|
+
init { require(numbers.size == 6) }
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
리뷰어: "*이 부분이 실제로 동작하는 경우가 있을까요? 초기화 블록과 생성자의 호출 순서에 대해 알아*보세요! 🤔" — Kotlin: *부 생성자 → 주 생성자 → init*.
|
|
35
|
+
|
|
36
|
+
### 4. `runCatching + onSuccess return + !!`
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
runCatching { payment = Payment(money) }
|
|
40
|
+
.onSuccess { return payment!! } // ⚠
|
|
41
|
+
.onFailure { println(it.message) }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
리뷰어: "*이렇게 표현할 수도 있어요*! 그리고 *while(true) {. }와 같은 구조는 자칫 무한 루프에 빠질 수 있는 위험 요소*가 있습니다. 특히 *컨트롤러에서는 while 문 내에서 또 while 문으로 들어가는 부분들이* 보입니다. *while 문을 제거하고 동일하게 동작할 수 있는 방법*을 고민해 보세요. 또한 *manualCount!!를 리턴해 주고 있는데요. !! 연산자 사용을 지양*해 보면 어떨까요?"
|
|
45
|
+
|
|
46
|
+
### 5. *생성자 인자 vs 메서드 인자*
|
|
47
|
+
|
|
48
|
+
리뷰어: "*메서드의 파라미터로 받아도 되는 부분을 생성자로 받아서 프로퍼티에 할당하는 것은 불필요*해 보입니다."
|
|
49
|
+
|
|
50
|
+
### 6. *Controller에 여러 역할 혼재* — 수동 로또 생성 분리
|
|
51
|
+
|
|
52
|
+
리뷰어: "*컨트롤러에 여러 가지 역할은 혼재해* 있습니다. *수동 로또 생성을 이렇게 컨트롤러 내부의 메서드로 존재하기 보다 별도의 클래스로 분리*하면 좋지 않을까요?"
|
|
53
|
+
|
|
54
|
+
### 7. *LottoBundle*에서 수동/자동 분리 — 같은 곳?
|
|
55
|
+
|
|
56
|
+
리뷰어: "*LottoBundle은 로또가 여러 장 모여 있는 클래스*입니다. *여기서 자동 생성을 한다면 수동 생성은 왜 이곳에서 이뤄지지 않을까요? 만약 역할이 많아진다고 생각되면 생성하는 부분은 별도로 분리*하면 좋겠죠? 😄"
|
|
57
|
+
|
|
58
|
+
### 8. *오버로딩 = 외부 검증 중복 신호*
|
|
59
|
+
|
|
60
|
+
리뷰어: "*이 함수가 이런 식으로 오버로딩되었다는 것은 숫자인지 아닌지 검증하는 로직이 외부에서 발생하고 있다는 의미*로 보입니다. *결국 같은 검증을 이곳저곳에서 하고 있다는 것인데 하나로 통일*해 보면 좋겠네요."
|
|
61
|
+
|
|
62
|
+
### 9. `Payment` *수량 계산* + 별도 수량 함수 *분산*
|
|
63
|
+
|
|
64
|
+
리뷰어: "*Payment에서 수량을 계산하는 함수가 있*습니다. 그리고 *여기에 또 수량 관련 함수가* 있네요. *비슷한 역할을 하는 게 흩어져* 있습니다. 또한 *ManualCount라는 클래스에서 AutoLottoCount를 계산하는 것도 이상*하게 보입니다."
|
|
65
|
+
|
|
66
|
+
### 10. *생성자 2개 → 검증 중복*
|
|
67
|
+
|
|
68
|
+
리뷰어: "*이런 식으로 생성자가 2개로 나뉠 이유가 없*습니다. *둘 중 하나를 선택해서 사용하시면 질문하셨던 검증 부분이 중복되는 것을 피할 수* 있습니다. *현재 각 생성자가 쓰이는 부분을 확인*해 보세요. *각각 한 곳에서 쓰이고 있기 때문에 통일하는 것은 크게 어렵지 않을 것*으로 보이네요."
|
|
69
|
+
|
|
70
|
+
### 11. *수동 = 자동 + 입력 차이뿐* — 통합
|
|
71
|
+
|
|
72
|
+
리뷰어: "*이 부분이 마음에 들지 않는다고 하셨습니다*. *LottoBundle 클래스에서 manualGenerate()와 autoGenerate()를 모두 해 주고 있*네요. *autoGenerate()는 쉽게 된다고 느끼는데 왜 manualGenerate()는 복잡하게 보일까요?* *자동이나 수동이나 실제 로또 도메인을 생각해 보면 6개의 숫자를 가지는 것으로 동일*합니다. 반달의 프로그램으로 대입하면 *'6개의 숫자를 가지는 것 = Lotto 클래스'*입니다. *단지 숫자를 자동으로 6개 만들어서 Lotto 클래스를 구성하느냐 입력 받은 값으로 구성하느냐의 차이 뿐*입니다. *거의 같다고 느껴지지 않나요? 그러면 '6개의 숫자를 가지는 것'에 대한 방식을 통일하면 좀 쉽게 접근이 가능*할 것이라 생각합니다. *현재 자동에 대한 6개의 숫자 모임(= Lotto 객체)은 RandomLottoGenerator 클래스에서 생성*하고 있습니다. *이러한 역할을 하는 수동 제너레이터를 만들어 볼 수 있지 않을까요*?"
|
|
73
|
+
|
|
74
|
+
### 12. *매직 넘버 상수화*
|
|
75
|
+
|
|
76
|
+
리뷰어: "*매직 넘버에 대한 상수화*를 하면 좋을 것 같습니다."
|
|
77
|
+
|
|
78
|
+
### 13. `TotalPrize` *수익률 얻기 vs 생성*
|
|
79
|
+
|
|
80
|
+
리뷰어: "*TotalPrize 입장에서 수익률을 얻는 게 아니라 생성하고* 있습니다. *네이밍이 조금 더 자연*스러워지면 어떨까요?"
|
|
81
|
+
|
|
82
|
+
### 14. *별도 함수 분리* + *지역 변수 vs 직접*
|
|
83
|
+
|
|
84
|
+
리뷰어: "*별도의 함수로 분리하면 더 깔끔할 것* 같네요." + "*굳이 지역 변수를 쓰지 않고 바로 넘겨줘도 좋을 거 같*습니다."
|
|
85
|
+
|
|
86
|
+
### 15. *오버로딩 vs private constructor*
|
|
87
|
+
|
|
88
|
+
리뷰어: "*취향의 영역인 거 같은데 private constructor 사용을 굳이 고집하지 않는다면 of() 함수 오버로딩을 쉽게 피할 수* 있을 것 같습니다. *오버로딩이 나쁘다는 게 아니라 중복된 로직이 나눠져 있는 게 약간 신경*이 쓰이네요. *이건 꼭 반영 안 하셔도 됩니다. 그냥 제 개인적인 생각*을 말씀드려 봤어요."
|
|
89
|
+
|
|
90
|
+
### 16. *함수 길이 + 라인 분리*
|
|
91
|
+
|
|
92
|
+
리뷰어: "*함수가 길기도 하지만 적당한 라인 분리가 안되어서 보기가 어려*워요. *관련 있는 부분으로 라인을 나눠* 보면 좋겠어요."
|
|
93
|
+
|
|
94
|
+
### 17. *create 메서드 누락*
|
|
95
|
+
|
|
96
|
+
리뷰어: "*숫자가 아닌 값이 들어올 때 → 어떻게 되어야 한다는 건지 불분명*합니다. 더불어 *피드백 반영이 안된 것이 위쪽에 있는데 'create를 사용하여 인자로 들어간 int값으로 LottoNumber를 만든다'라는 테스트에서 create의 메서드명이 변경되면 적절하지 않은 네이밍이라고 하였는데 현재 create라는 메서드가 없*네요. 함께 수정되면 좋겠습니다. *테스트 네이밍을 좀 더 신경*쓰시면 좋겠습니다."
|
|
97
|
+
|
|
98
|
+
### 18. *정수형 vs 숫자*
|
|
99
|
+
|
|
100
|
+
리뷰어: "*정확히는 정수형이 아닙니다. 현재 Int 값으로만 변환을 하고 있*습니다. *숫자라고 표현하는 게 차라리 적절*할 것 같습니다."
|
|
101
|
+
|
|
102
|
+
## 리뷰어 의견 요지
|
|
103
|
+
|
|
104
|
+
- **소수점 둘째 자리**.
|
|
105
|
+
- **커밋 단위 = 기능 목록**.
|
|
106
|
+
- ***init + 부 생성자 호출 순서***.
|
|
107
|
+
- **`while + runCatching + !!` *무한 루프 위험***.
|
|
108
|
+
- **Controller *수동 생성 분리***.
|
|
109
|
+
- **`LottoBundle` *수동/자동 분리* 일관**.
|
|
110
|
+
- **오버로딩 = *외부 검증 중복 신호***.
|
|
111
|
+
- **`Payment` vs `ManualCount` *역할 분산***.
|
|
112
|
+
- **생성자 *중복 통합***.
|
|
113
|
+
- **수동 = 자동 + 입력 차이뿐 → 통합 (`Generator`)**.
|
|
114
|
+
- **매직 넘버 *상수***.
|
|
115
|
+
- **네이밍 *현실 동작*** (얻기 vs 생성).
|
|
116
|
+
- **함수 *라인 분리***.
|
|
117
|
+
|
|
118
|
+
- **대표 인용:**
|
|
119
|
+
> 자동이나 수동이나 실제 로또 도메인을 생각해 보면 *6개의 숫자를 가지는 것으로 동일*합니다. 반달의 프로그램으로 대입하면 *'6개의 숫자를 가지는 것 = Lotto 클래스'*입니다.
|
|
120
|
+
> — @woowajames on `src/main/kotlin/lotto/domain/LottoBundle.kt`
|
|
121
|
+
|
|
122
|
+
> 이런 식으로 *생성자가 2개로 나뉠 이유가 없*습니다. 둘 중 하나를 선택해서 사용하시면 질문하셨던 검증 부분이 중복되는 것을 피할 수 있습니다.
|
|
123
|
+
> — @woowajames on `src/main/kotlin/lotto/domain/Lotto.kt`
|
|
124
|
+
|
|
125
|
+
> 추후에는 *커밋 단위를 기능 목록 단위로 하시면 더 좋을 것* 같아요.
|
|
126
|
+
> — @woowajames (커밋 관리 가르침)
|
|
127
|
+
|
|
128
|
+
## 얻은 교훈
|
|
129
|
+
|
|
130
|
+
- **소수점 *명세에 명시*** — 출력 형식도 *요구사항*.
|
|
131
|
+
- **커밋 단위 = *기능 목록 단위*** — *PR 리뷰 가독성* + *되돌리기 단위*.
|
|
132
|
+
- **`init` vs *부 생성자* 호출 순서** — Kotlin: *부 → 주 → init*. *부 생성자에 검증*만 두면 *주 생성자 호출 경로*에서 누락.
|
|
133
|
+
- **`while + runCatching + !!`** = *세 가지 위험 합산*. 무한 루프 + null 단언 + 흐름 모호.
|
|
134
|
+
- **Controller *역할 혼재 = 객체 분리 신호***.
|
|
135
|
+
- **`LottoBundle` *자동만 분리 = 수동도 분리* 일관성**.
|
|
136
|
+
- **오버로딩 = *외부 검증 중복 신호*** — *입력 형태 다양*하면 *팩토리 함수*에서 통합.
|
|
137
|
+
- **`Payment` 수량 + `ManualCount` 수량** = 책임 분산. *Order/Quantity 통합*.
|
|
138
|
+
- **생성자 2개 = *검증 중복***. *하나로 통일*.
|
|
139
|
+
- **수동 = 자동 + 입력 차이뿐** = *통합 추상화*. *6개 숫자 모음*이 *공통*. 가르침.
|
|
140
|
+
- **매직 넘버 *상수화*** — 모든 PR 공통.
|
|
141
|
+
- **`TotalPrize.calculate` *얻기 vs 생성* 네이밍**.
|
|
142
|
+
- **함수 *라인 분리*** = 가독성. PR #131 *분리 vs 분해* 균형.
|
|
143
|
+
- ***create 메서드 사라짐* 같은 *변경 일관성*** — 테스트가 *사라진 메서드*를 가리키면 *PR 셀프 리뷰 부재*.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# PR #13 — [수달] 1단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@otter66](https://github.com/otter66)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/13
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @namjackson
|
|
7
|
+
- **라인 코멘트:** 35
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Rank` enum에 `(countOfMatch, winningMoney, description)`** — 등수+상금+설명 한 곳.
|
|
12
|
+
- **`Rank.valueOf(countOfMatch, matchBonus)`** — 보너스 매치 조건을 enum factory에 흡수 시도.
|
|
13
|
+
- **`PurchaseAmount` 도입** — 금액 원시값 포장.
|
|
14
|
+
- **`WinningLottery`로 당첨 번호 + 보너스를 묶음** — 1차 책임 분리.
|
|
15
|
+
- **`LotteryNumber` 도메인 객체화** — 1~45 범위 검증을 객체 init으로.
|
|
16
|
+
|
|
17
|
+
## 못한 점 (설계 관점)
|
|
18
|
+
|
|
19
|
+
### 1. 매직넘버 `6`이 generator에 박힘
|
|
20
|
+
|
|
21
|
+
```kotlin
|
|
22
|
+
class LotteryGenerator {
|
|
23
|
+
fun generateLottery(): Lottery {
|
|
24
|
+
val lotteryNumbers: MutableList<LotteryNumber> = mutableListOf()
|
|
25
|
+
repeat(6) { // ⚠ 6의 의미가 코드 안에 없음
|
|
26
|
+
lotteryNumbers.add(generateUniqueLotteryNumber(lotteryNumbers))
|
|
27
|
+
}
|
|
28
|
+
return Lottery(lotteryNumbers)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
리뷰어: "6이라는 숫자는 무엇을 의미하는 걸까요? 다른 컬렉션 API를 활용해 보면 어떨까요?" 학생 답: "Lottery가 가지는 번호의 개수이므로 Lottery에서 해당 상수를 가지도록 하고, 외부에서 가져다 쓸 수 있도록 하였습니다." — *6은 Lottery의 정체성*에 속함.
|
|
34
|
+
|
|
35
|
+
### 2. `LotteryGenerator`/`LotteryNumberGenerator` 강결합 + 테스트 불가
|
|
36
|
+
|
|
37
|
+
```kotlin
|
|
38
|
+
private fun generateUniqueLotteryNumber(lotteryNumbers: List<LotteryNumber>): LotteryNumber {
|
|
39
|
+
val lotteryNumberGenerator = LotteryNumberGenerator() // ⚠ 내장 인스턴스화
|
|
40
|
+
while (true) {
|
|
41
|
+
val randomLotteryNumber = lotteryNumberGenerator.generateLotteryNumber()
|
|
42
|
+
if (lotteryNumbers.contains(randomLotteryNumber)) continue
|
|
43
|
+
return randomLotteryNumber
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
리뷰어: "LotteryNumberGenerator는 LotteryGenerator와 강한 결합 구조네요! LotteryGenerator.generateLottery()를 테스트 가능한 구조로 만들어 보아요! (자동차경주 미션을 떠올려보아요!)" — 이전 미션의 *NumberGenerator 인터페이스 주입* 패턴 재적용 필요.
|
|
49
|
+
|
|
50
|
+
### 3. 무한 루프 위험 — 중복 시 재시도
|
|
51
|
+
|
|
52
|
+
```kotlin
|
|
53
|
+
while (true) {
|
|
54
|
+
val randomLotteryNumber = lotteryNumberGenerator.generateLotteryNumber()
|
|
55
|
+
if (lotteryNumbers.contains(randomLotteryNumber)) continue
|
|
56
|
+
return randomLotteryNumber
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
리뷰어: "lotteryNumberGenerator.generateLotteryNumber()가 항상 같은 값이 호출된다면, 종료되지 않을 거 같아요! 중복되지 않는 숫자들을 생성하는 방법을 고민해 보면 어떨까요?" — 학생 수정: "로또 번호로 사용이 가능한 숫자들만을 사용해 중복이 없는 로또 번호들을 만들도록 하였습니다!" → `(1..45).shuffled().take(6)`.
|
|
61
|
+
|
|
62
|
+
### 4. `Rank.SECOND`/`THIRD` 구분이 `valueOf`에서만
|
|
63
|
+
|
|
64
|
+
```kotlin
|
|
65
|
+
enum class Rank(val countOfMatch: Int, val winningMoney: Int, val description: String) {
|
|
66
|
+
SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치"),
|
|
67
|
+
THIRD(5, 1_500_000, "5개 일치"),.
|
|
68
|
+
|
|
69
|
+
companion object {
|
|
70
|
+
fun valueOf(countOfMatch: Int, matchBonus: Boolean): Rank {
|
|
71
|
+
if (countOfMatch == 5) return decideSecondOrThird(matchBonus)
|
|
72
|
+
return values().find { it.countOfMatch == countOfMatch } ?: MISS
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
리뷰어: "2등과 3등은 countOfMatch가 동일하네요, 어떻게 2등과 3등을 구분할 수 있을까요? bonus 여부 또한 Rank가 가져야 하는 책임이 아닐까요?" — Rank에 *bonus 필요 여부* 필드를 추가하거나, 판별 로직을 더 일반화.
|
|
79
|
+
|
|
80
|
+
### 5. Controller에 로직 집중
|
|
81
|
+
|
|
82
|
+
```kotlin
|
|
83
|
+
private fun calculateResult(lotteries: List<Lottery>, winningLottery: WinningLottery): WinningResult {
|
|
84
|
+
val winningResult = WinningResult()
|
|
85
|
+
repeat(lotteries.size) {
|
|
86
|
+
val countOfMatch = lotteries[it].countMatches(winningLottery)
|
|
87
|
+
val matchBonus = lotteries[it].containBonusNumber(winningLottery.bonusNumber)
|
|
88
|
+
winningResult.countRank(Rank.valueOf(countOfMatch, matchBonus))
|
|
89
|
+
}
|
|
90
|
+
return winningResult
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
리뷰어: "lotteries의 데이터를 사용해서, Rank를 만들고, winningResult에 set하는 구조네요. **객체에게 메세지를 던져서 책임을 위임**해보도록 해요!" — `winningLottery.calculateResult(lotteries)` 한 줄로.
|
|
95
|
+
|
|
96
|
+
### 6. `WinningResult`의 가변 `countMatchRanks`
|
|
97
|
+
|
|
98
|
+
```kotlin
|
|
99
|
+
class WinningResult(val countMatchRanks: MutableList<Int> = MutableList(6) { 0 }) {
|
|
100
|
+
fun countRank(rank: Rank) { countMatchRanks[rank.ordinal]++ }
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
리뷰어 1: "countMatchRanks는 외부에서 수정이 가능한 구조네요!" 리뷰어 2: "countRank와 같은 set 함수는 언제, 얼마나 실행되었는지 관리하기가 까다로워지는데요, set를 외부에서 여러 번 실행되기보다, `List<Rank>`를 생성자로 받아서 처리해 보면 어떨까요?" — *생성 시 완성*된 객체로 만들면 시간차 무결성 보장.
|
|
105
|
+
|
|
106
|
+
### 7. `println()`이 Controller에
|
|
107
|
+
|
|
108
|
+
```kotlin
|
|
109
|
+
fun run() {
|
|
110
|
+
val winningResult = calculateResult(lotteries, winningLottery)
|
|
111
|
+
println() // ⚠ Controller가 출력 결정
|
|
112
|
+
outputView.printWinningStats(purchaseAmount, winningResult)
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
리뷰어: "View는 언제든 변경될 수 있어요, println()은 View에서 처리하도록 해요!" — 출력 형식은 View 책임.
|
|
117
|
+
|
|
118
|
+
### 8. `OutputView`에 5개 등수 print 코드 중복
|
|
119
|
+
|
|
120
|
+
```kotlin
|
|
121
|
+
println("${Rank.FIFTH.description} (${Rank.FIFTH.winningMoney})- ${result.countMatchRanks[Rank.FIFTH.ordinal]}")
|
|
122
|
+
println("${Rank.FOURTH.description} (${Rank.FOURTH.winningMoney})- ${result.countMatchRanks[Rank.FOURTH.ordinal]}")
|
|
123
|
+
//. 5번 반복
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
리뷰어: "중복된 코드를 분리해 보면 어떨까요?" — `Rank.values().filterNot { it == MISS }.forEach {. }`. 학생 수정: "associateWith를 이용해 해결."
|
|
127
|
+
|
|
128
|
+
### 9. 테스트명/검증 모호
|
|
129
|
+
|
|
130
|
+
```kotlin
|
|
131
|
+
@ValueSource(ints = [1, 45])
|
|
132
|
+
fun `번호를 하나 가진다`(number: Int) {. }
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
리뷰어: "테스트 케이스를 좀 더 구체적으로 사용해 보면 어떨까요? 하나의 요구사항 명세서라고 생각하면 좋아요! `1~45의 숫자로 로또 번호를 생성할 수 있다.`" + "에러 메시지까지 검증해 보면 어떨까요? 다른 의도하지 않은 에러가 같은 타입으로 에러가 발생할 경우, 테스트의 신뢰성이 떨어질 수도 있을 것 같아요!"
|
|
136
|
+
|
|
137
|
+
### 10. `List<Lottery>` 일급 컬렉션 부재 — 학생 자가 의문
|
|
138
|
+
|
|
139
|
+
학생: "Lotteries라는 일급 객체를 만들더라도 아무런 역할이 없는 단순히 리스트만 가지고 있는 객체가 될 것 같습니다. 이러한 경우에도 일급 객체를 만드는 것이 좋을까요?" — 리뷰어 후속: `lotteries`의 *집계 책임*이 있다면 일급 객체로. 단순 `List<Lottery>`로 외부에서 다 처리하면 절차적.
|
|
140
|
+
|
|
141
|
+
## 리뷰어 의견 요지
|
|
142
|
+
|
|
143
|
+
1. **매직넘버는 *위치 = 소유*** — 6은 Lottery의 정체성 → Lottery 안에 상수.
|
|
144
|
+
2. **랜덤 의존은 *주입*** — 이전 미션(racingcar)의 패턴 재적용.
|
|
145
|
+
3. **무한 루프 가능성 = 도메인 위반 신호** — 중복 회피를 *재시도*로 풀지 말고 *자료구조*로 풀어라(shuffle).
|
|
146
|
+
4. **enum의 한 분기는 *enum이 책임지게*** — `SECOND.requiresBonus`/`isBonusMatched()` 필드 도입.
|
|
147
|
+
5. **Controller = 조립**, 메시지 위임은 도메인에 — `winningLottery.calculateResult(lotteries)`.
|
|
148
|
+
6. **객체는 *생성 시 완성*되어야 함** — 외부에서 setter를 여러 번 호출하는 누적 패턴 회피.
|
|
149
|
+
7. **View 분리** — `println()`은 OutputView로.
|
|
150
|
+
8. **테스트명 = 요구사항 명세서** — 요구사항 단어로 표현.
|
|
151
|
+
|
|
152
|
+
- **대표 인용:**
|
|
153
|
+
> 6이라는 숫자는 무엇을 의미하는 걸까요?
|
|
154
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/LotteryGenerator.kt`
|
|
155
|
+
|
|
156
|
+
> LotteryNumberGenerator는 LotteryGenerator와 강한 결합 구조네요! LotteryGenerator.generateLottery()를 테스트 가능한 구조로 만들어 보아요! (자동차경주 미션을 떠올려 보아요!)
|
|
157
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/LotteryGenerator.kt`
|
|
158
|
+
|
|
159
|
+
> 2등과 3등은 countOfMatch가 동일하네요, 어떻게 2등과 3등을 구분할 수 있을까요? bonus 여부 또한 Rank가 가져야 하는 책임이 아닐까요?
|
|
160
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/Rank.kt`
|
|
161
|
+
|
|
162
|
+
> 객체에게 메세지를 던져서 책임을 위임해 보도록 해요!
|
|
163
|
+
> — @namjackson on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
164
|
+
|
|
165
|
+
> countRank와 같은 set 함수는 언제, 얼마나 실행되었는지 관리하기가 까다로워지는데요, set를 외부에서 여러 번 실행되기보다, `List<Rank>`를 생성자로 받아서 처리해 보면 어떨까요?
|
|
166
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/WinningResult.kt`
|
|
167
|
+
|
|
168
|
+
## 얻은 교훈
|
|
169
|
+
|
|
170
|
+
- **이전 미션 학습을 *명시적으로 재적용***. racingcar의 NumberGenerator 주입은 lotto에도 동일하게 — 패턴은 *과제를 넘어 일반화*.
|
|
171
|
+
- **매직넘버의 *소유*는 도메인 정체성**. `6`은 LottoSize 도메인 상수 — Lottery 안에서 정의.
|
|
172
|
+
- **중복 회피 = 자료구조 선택** — `shuffled().take(N)` (전수 셔플) vs 무한 루프 재시도. 도메인이 *유한 집합*이면 셔플이 항상 종료.
|
|
173
|
+
- **enum의 분기 조건은 enum 안에**. `Rank.valueOf` 안의 `if (countOfMatch == 5)` 매직넘버는 `Rank.SECOND.countOfMatch`로.
|
|
174
|
+
- **객체는 *생성 시 완성*** — `setter`를 외부에서 여러 번 호출하는 객체는 *시간 의존성*을 외부에 노출.
|
|
175
|
+
- **Controller = 조립**. 도메인 로직(`forEach + countRank`)은 도메인 객체(`winningLottery.calculateResult(lotteries)`)로 위임.
|
|
176
|
+
- **`println()` = View 책임**. Controller가 `println()`을 호출하면 *흐름 조립자*가 *출력 형식*까지 결정.
|
|
177
|
+
- **테스트명은 요구사항 문장**. `번호를 하나 가진다` → `1 이상 45 이하의 로또 번호를 생성할 수 있다`.
|
|
178
|
+
- **일급 컬렉션은 *집계 행위가 있을 때***. Lotteries에 별다른 메서드가 없다면 굳이 만들지 말고 List로 유지 — *책임이 생기면* 일급 객체로 승격.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# PR #53 — [수달] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@otter66](https://github.com/otter66)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/53
|
|
5
|
+
- **단계:** 2단계 (수동 로또 추가)
|
|
6
|
+
- **리뷰어:** @namjackson
|
|
7
|
+
- **라인 코멘트:** 19
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`LotteryMachine` 도입** — *발행 기계*로 책임 응집 시도.
|
|
12
|
+
- **`Lotteries` 일급 컬렉션 + `plus(other)`** — 자동/수동 합치기 행위.
|
|
13
|
+
- **`LotteryNumber` `data class` + value 명명 적용** — `lotteryNumber.number` → `.value`.
|
|
14
|
+
- **`runCatching.getOrNull()` 패턴** — InputView에서 *null 반환*으로 Controller에 분기 위임.
|
|
15
|
+
- **자가 의문 PR에 풍부히 명시** — *View 책임 경계*, *data vs value class*, *LottoTicket 도입 여부* 등.
|
|
16
|
+
- **학습 로그 작성** — `data class vs value class`를 prolog에 정리.
|
|
17
|
+
|
|
18
|
+
## 못한 점 (설계 관점)
|
|
19
|
+
|
|
20
|
+
### 1. 수동/자동 흐름이 뒤바뀜
|
|
21
|
+
|
|
22
|
+
```kotlin
|
|
23
|
+
fun run() {
|
|
24
|
+
val amount: PurchaseAmount = getPurchaseAmount()
|
|
25
|
+
val autoLotteries: Lotteries = getLotteries(amount.autoNumber) // ⚠ 자동을 먼저
|
|
26
|
+
val manualLotteries: Lotteries = getLotteries(amount.manualNumber) // ⚠ 수동을 나중에
|
|
27
|
+
val lotteries: Lotteries = autoLotteries.plus(manualLotteries)
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
리뷰어: "리팩토링 과정에서 *로직이 꼬인 것* 같아요! *기존 자동 로또 기능에, 수동 기능이 추가*된 부분이에요! *수동 로또 발행 이후, 남는 금액에 맞는 자동 로또가 발행*되도록 작업해 주세요!" — 요구사항: *수동 N장 + (남은 금액)/1000 장 자동*.
|
|
32
|
+
|
|
33
|
+
### 2. `LotteryMachine.createWinningResult` — 책임 위치
|
|
34
|
+
|
|
35
|
+
```kotlin
|
|
36
|
+
class LotteryMachine {
|
|
37
|
+
fun createWinningResult(winningLottery: WinningLottery, lotteries: Lotteries, amount: PurchaseAmount): WinningResult {. }
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
리뷰어: "LotteryMachine에서 winningLottery, lotteries, amount의 파라미터를 받아서, *당첨 결과를 리턴해 줄 필요*가 있을까요? LotteryMachine은 *어떤 책임*을 가지고 있을까요? *winning에 대한 당첨에 대한 부분은 winningLottery에 위임*해 보면 어떨까요?" — *발행 기계*가 *당첨 판정*까지 흡수.
|
|
42
|
+
|
|
43
|
+
### 3. `winningResult[rank]!!.plus(1)` — `!!` 강제 언패킹
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
val winningResult: MutableMap<Rank, Int> = Rank.values().associateWith { 0 }.toMutableMap()
|
|
47
|
+
repeat(lotteries.size) {
|
|
48
|
+
.
|
|
49
|
+
winningResult[rank] = winningResult[rank]!!.plus(1) // ⚠
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
리뷰어: "`!!`은 nullable한 변수를 notNull로 *강제로 변경*해 주는 동작을 해요, 변수에 null이 있는 경우, *에러가 발생*하곤 합니다. null을 처리할 수 있는 여러 방법을 고민해 보아요." + 후속: "당첨 리스트를, WinningResult의 *생성자로 전달*하여, Winning *집계하는 부분은 WinningResult에서* 하도록 해 보면 어떨까요?" — 누적 책임도 *결과 객체*에.
|
|
54
|
+
|
|
55
|
+
### 4. `LotteryNumber(private val number)` getter + 변수명 중복
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
data class LotteryNumber(private val number: Int) {
|
|
59
|
+
fun toInt(): Int = number
|
|
60
|
+
fun toString(): String = number.toString()
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
리뷰어: "코틀린에서는 getter를 따로 만들어 줄 필요가 없기도 해요, *number가 불변이라면, number를 노출해도 무방*. number라는 변수는 `lotteryNumber.number`라는 *중복 코드*가 발생되기도 하는데요, *value*와 같은 네이밍으로 `lotteryNumber.value`으로 *중복을 제거*할 수도 있을 거 같아요!" 학생: "외부에서 매개변수를 호출할 때 일관성을 위해 `.toInt()`, `.toString()`과 같이 작성하였는데, *내부에서 외부 로직과 관련 지어 변수명을 짓지 않도록* 하는 관점에서도 더 좋은 방법인 것 같습니다!"
|
|
65
|
+
|
|
66
|
+
### 5. `value class` vs `data class` — 학생 자가 학습
|
|
67
|
+
|
|
68
|
+
학생 학습 로그: "로또 번호를 원시값 포장하는 것에 대해 *data class*를 추천해 주셨는데, 현재 코드에서는 *value class*가 더 좋지 않을까? 라는 고민이 있습니다!" 리뷰어: "*value class와 data class는 서로 다른 역할*. 제가 data class를 언급한 부분은 직접 override한 *equals, hashCode 등을 자동으로 생성*해 주는 data class에 대한 *소개를 위함*이었고, *data class를 써야 한다는 코멘트는 아니긴* 했어요. 무엇을 사용하여 어떻게 구현하는지에 대한 *정답은 없다*고 생각이 들어요. 로또 번호가 *숫자로만 동일하면 되는 부분*일지, 아니면, 로또 번호를 *숫자를 가진 하나의 데이터 객체*라고 정의를 하는지에 따라 달라질 것 같아요." 학생 결론: "value class를 적용시켜 보았습니다! 객체 생성의 비용이 절감되고, 중복된 객체를 만들지 않기 위해 pool을 생성하는 과정을 줄일 수 있기 때문."
|
|
69
|
+
|
|
70
|
+
### 6. InputView가 *수동 로또 N장*까지 직접 read + Lotteries 생성
|
|
71
|
+
|
|
72
|
+
```kotlin
|
|
73
|
+
fun readLotteries(count: Int): Lotteries? {
|
|
74
|
+
val lotteries: MutableList<Lottery> = mutableListOf()
|
|
75
|
+
repeat(count) {
|
|
76
|
+
val lottery: Lottery = Lottery(readln().split(", ").map { LotteryNumber(it.toInt()) })
|
|
77
|
+
lotteries.add(lottery)
|
|
78
|
+
}
|
|
79
|
+
return runCatching { Lotteries(lotteries) }.getOrNull()
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
리뷰어: "로또 생성에 대한 부분은 *LottoMachine에 위임*해 보아도 좋을 거 같아요!" + "수동 로또를 *몇 장 살 것인가에 대한 Amount*에 대한 부분과 *구매하는 수동 로또 리스트와 분리*될 필요가 있을까요? 수동 로또 번호를 받게 되면, 구매하는 수동 로또의 갯수도 *당연히 알 수 있을 것* 같아요!" — *입력*과 *생성*의 분리. 학생 자가 답변: "View의 역할은 어디까지인지에 대해서는 *저만의 기준이 확정되지 않았습니다*. 추천해 주신 방법의 장점이 *view에서의 로직을 최소화*하고, 역할을 각 클래스에 맞게 분리할 수 있다는 장점 때문이 맞을까요?"
|
|
84
|
+
|
|
85
|
+
### 7. View 책임 경계 — 학생 vs 페어 의견 차이
|
|
86
|
+
|
|
87
|
+
학생 자가 의견 정리: "저는 *뷰에서 가공된 값을 보내고, controller의 기능을 최소화*한다는 것에 집중. 베르는 *뷰의 역할을 최소화 하고, controller를 통해 전달*해 도메인에서 값을 가공. 저의 방법에서는 controller의 기능이 최소화되는 장점이 있지만, *도메인의 역할을 뷰에게 빼앗긴 것* 같기도 하다는 단점. 베르의 방법에서는 controller의 기능이 조금은 늘어나는 단점이 있지만, *역할 분배가 좀 더 적절한* 것 같다는 장점." 학생: "아직 어떠한 방법이 더 좋은 방법인지 결정을 하지 못했기 때문에 다음 미션에서 *두 방법을 비교*해 보고자 합니다!"
|
|
88
|
+
|
|
89
|
+
### 8. `LotteryGenerator`가 `LotteryMachine` 내부에서 직접 생성
|
|
90
|
+
|
|
91
|
+
```kotlin
|
|
92
|
+
fun generateLotteries(count: Int): Lotteries {
|
|
93
|
+
val generator: LotteryGenerator = LotteryGenerator()
|
|
94
|
+
.
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
리뷰어: "LotteryGenerator는 *LotteryMachine 생성 시점에 주입*받아 보면 어떨까요? LotteryMachine에서 *로또를 생성하는 부분에서 상세한 생성 테스트*를 할 수 있을 것 같아요! *인터페이스를 분리*한다면, 원하는 로또 번호를 생성하는 LottoMachine을 *테스트*할 수 있을 것 같아요!" — 의존성 주입 + Fake 주입 가능.
|
|
99
|
+
|
|
100
|
+
### 9. `PurchaseAmount`에 `autoNumber` 상태값 보유
|
|
101
|
+
|
|
102
|
+
```kotlin
|
|
103
|
+
class PurchaseAmount(private val amount: Int, val manualNumber: Int) {
|
|
104
|
+
val autoNumber: Int = getPurchaseQuantity() - manualNumber // ⚠ 상태값
|
|
105
|
+
fun toInt(): Int = amount
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
리뷰어: "상태값을 가지는 변수보단 *Backing field*를 활용해 보면 어떨까요?" + "*불필요한 getter 함수*로 보여지네요! amount가 *불변 변수라면 외부에 공개해 주어도* 좋을 거 같아요!"
|
|
110
|
+
|
|
111
|
+
### 10. `while (true)` 무한 루프 — `?: getPurchaseAmount()` 권장
|
|
112
|
+
|
|
113
|
+
```kotlin
|
|
114
|
+
private fun getPurchaseAmount(): PurchaseAmount {
|
|
115
|
+
while (true) {
|
|
116
|
+
val amount: PurchaseAmount? = inputView.readPurchaseAmount()
|
|
117
|
+
if (amount != null) return amount
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
리뷰어: "이런 식으로도 사용할 수 있을 거 같아요! `return inputView.readPurchaseAmount() ?: getPurchaseAmount()`." — 재귀가 *while 무한 루프*보다 Kotlin idiomatic.
|
|
123
|
+
|
|
124
|
+
## 리뷰어 의견 요지
|
|
125
|
+
|
|
126
|
+
- **요구사항 순서** — 자동 *남는 금액*은 *수동 발행 후*.
|
|
127
|
+
- **`LotteryMachine`의 책임** — *발행*에 집중, *당첨 판정*은 `WinningLottery`.
|
|
128
|
+
- **`!!` 회피** — null 처리 방법 다양화.
|
|
129
|
+
- **`value class` vs `data class`** — 정답 없음, *도메인 의미*에 따라 선택.
|
|
130
|
+
- **InputView 책임 경계** = 학생 vs 페어 의견 차이의 *명시적 트레이드오프*.
|
|
131
|
+
- **`LotteryMachine`이 `Generator` 주입받기** — 테스트 가능 구조.
|
|
132
|
+
- **Backing field + 외부 노출** — `private val` + getter 함수보다 `val` 직접.
|
|
133
|
+
- **`?: retry()`** > `while (true)`.
|
|
134
|
+
|
|
135
|
+
- **대표 인용:**
|
|
136
|
+
> 리팩토링 과정에서 로직이 꼬인 것 같아요! … 수동 로또 발행 이후, *남는 금액에 맞는 자동 로또가 발행*되도록 작업해 주세요!
|
|
137
|
+
> — @namjackson on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
138
|
+
|
|
139
|
+
> LotteryMachine에서 winningLottery, lotteries, amount의 파라미터를 받아서, *당첨 결과를 리턴해 줄 필요*가 있을까요? *winning에 대한 당첨에 대한 부분은 winningLottery에 위임*해 보면 어떨까요?
|
|
140
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/LotteryMachine.kt`
|
|
141
|
+
|
|
142
|
+
> value class와 data class는 *서로 다른 역할*을 한다고 보면 좋을 거 같아요! … *무엇을 사용하여 어떻게 구현하는지에 대한 정답은 없다*고 생각이 들어요.
|
|
143
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/LotteryNumber.kt`
|
|
144
|
+
|
|
145
|
+
> LotteryGenerator는 *LotteryMachine 생성 시점에 주입*받아 보면 어떨까요? *인터페이스를 분리*한다면, 원하는 로또 번호를 생성하는 LottoMachine을 *테스트*할 수 있을 것 같아요!
|
|
146
|
+
> — @namjackson on `src/main/kotlin/lotto/domain/LotteryMachine.kt`
|
|
147
|
+
|
|
148
|
+
## 얻은 교훈
|
|
149
|
+
|
|
150
|
+
- **요구사항 *순서*에 충실** — *자동 N장*이 *남는 금액*이라면 *수동 발행 후* 잔액 기준.
|
|
151
|
+
- **`LotteryMachine`은 *발행*에 집중** — 당첨 판정은 `WinningLottery`로. 한 객체에 *발행 + 판정 + 통계*가 모이면 응집도↓.
|
|
152
|
+
- **`!!` 회피** — *명시적 null 처리* 또는 *애초 null이 안 되는 구조*.
|
|
153
|
+
- **`value class` vs `data class`** — 정답 없음. *로또 번호가 숫자로만 동일하면 되는가*(value class) vs *데이터 객체로 보는가*(data class).
|
|
154
|
+
- **getter 함수 vs `val` 직접 노출** — Kotlin은 `val` 자체가 getter. 추가 함수는 *의도가 있을 때*만.
|
|
155
|
+
- **변수명에 *내부 타입*을 두지 말 것** — `lotteryNumber.number` 같은 *타입 반복*은 *호출자 부담*. `.value`/`.toInt()`로.
|
|
156
|
+
- **InputView vs Controller 책임 경계** — *정답 없는 트레이드오프*. *역할 분배의 적절성* vs *Controller 단순성*.
|
|
157
|
+
- **`Generator` 주입** — `LotteryMachine`이 *Generator를 생성자에서 받으면* Fake로 테스트 가능.
|
|
158
|
+
- **`?: retry()`** — Kotlin idiomatic 재시도. `while(true)`보다 *간결 + 의도 명시*.
|
|
159
|
+
- **Backing field 활용** — `private var _x` + `val x get() = _x` 패턴은 *외부 불변 + 내부 가변* 표현.
|
|
160
|
+
- **학습 로그로 *기준 정립*** — *value class vs data class* 같은 토픽은 *결론*보다 *비교 정리*가 학습.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# PR #126 — [로또 1단계] 밀러 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@oungsi2000](https://github.com/oungsi2000)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/126
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @malibinYun
|
|
7
|
+
- **라인 코멘트:** 45
|
|
8
|
+
|
|
9
|
+
## 못한 점 + 핵심 지적
|
|
10
|
+
|
|
11
|
+
### 1. Lotto에서 Int 노출 + 파싱
|
|
12
|
+
|
|
13
|
+
```kotlin
|
|
14
|
+
class Lotto(val numbers: List<Int>) {
|
|
15
|
+
fun fromInput(input: String): Lotto = Lotto(input.split(",").map { it.toInt() })
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
> Int로는 로또 번호가 아닌 것을 걸러내기는 어려워보여요. 로또 번호에 대한 값 객체를 만들어보는 건 어떨까요?
|
|
20
|
+
|
|
21
|
+
> 입력 문자열을 파싱하는 것은, 콘솔 뷰에 굉장히 의존적이란 생각이 드네요. 안드로이드로 옮겼을 때도, 숫자 버튼을 눌렀을 때 항상 "," 로 구분되어있는 문자열이 입력으로 들어오는 것이 기대될까요?
|
|
22
|
+
|
|
23
|
+
→ 도메인이 *파싱 형식*을 알면 *콘솔* 종속. View에서 파싱 후 도메인은 *완성된 값*.
|
|
24
|
+
|
|
25
|
+
### 2. `RankMap` — 이름과 역할 모호
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
class RankMap(val data: Map<Rank, Int>) {. }
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
> RankMap이란 단어만 보고 다른 아무나 붙잡고 어떤 역할을 수행하는지 한 번에 유추해낼 수 있을까요?
|
|
32
|
+
|
|
33
|
+
→ `WinningStatistic`/`RankCount` 같은 *역할*을 표현하는 이름.
|
|
34
|
+
|
|
35
|
+
### 3. `global/Config` 패키지
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
lotto/
|
|
39
|
+
global/
|
|
40
|
+
Config.kt
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
> 상수를 한 파일에 몰아서 사용한 큰 이유가 있으신가요?
|
|
44
|
+
|
|
45
|
+
→ `global/` god-folder.
|
|
46
|
+
|
|
47
|
+
### 4. `LottoValidator` — 우회 가능
|
|
48
|
+
|
|
49
|
+
```kotlin
|
|
50
|
+
object LottoValidator {
|
|
51
|
+
fun validate(numbers: List<Int>) {. }
|
|
52
|
+
}
|
|
53
|
+
val lotto = Lotto(numbers) // ⚠ Validator 안 거치고 직접 생성 가능
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> 어딘가에서 이 검증기를 통과했더라도, Lotto객체 등은 검증기의 도움 없이 바로 생성할 수 있겠지요. Lotto 객체 생성을 하고자 하는 다른 개발자는 이런 검증기가 있는지 조차 모를 수 있겠어요. 그럴 때 그렇게 만들어진 객체는 과연 신뢰도 높은 객체일까요?
|
|
57
|
+
|
|
58
|
+
→ Validator는 *도메인 외부*에 둘 수 없음. Lotto.init이 invariant 강제.
|
|
59
|
+
|
|
60
|
+
### 5. `@DisplayName` vs 메서드명
|
|
61
|
+
|
|
62
|
+
> 메서드 명 대신 DisplayName을 활용한 특별한 이유가 있으신가요?
|
|
63
|
+
|
|
64
|
+
→ Kotlin은 백틱으로 함수명 자유. DisplayName은 자바 관습.
|
|
65
|
+
|
|
66
|
+
## 얻은 교훈
|
|
67
|
+
|
|
68
|
+
- **외부 Validator의 함정** — 우회 가능하면 도메인이 *불완전한 상태*로 생성 가능. invariant는 init이 강제.
|
|
69
|
+
- **`global/Config` 패키지 = god-folder의 다른 이름**.
|
|
70
|
+
- **Kotlin 백틱 함수명 > DisplayName**. 코틀린식.
|
|
71
|
+
- **Int 노출 + 파싱이 도메인에 = 매체 종속**. 콘솔 idiom이 안드로이드/웹에서 어색.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# PR #149 — [로또 2단계] 밀러 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@oungsi2000](https://github.com/oungsi2000)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/149
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @malibinYun
|
|
7
|
+
- **라인 코멘트:** 41
|
|
8
|
+
|
|
9
|
+
## 못한 점 + 핵심 지적
|
|
10
|
+
|
|
11
|
+
### 1. 1단계 피드백 미반영 (racingcar 랜덤 테스트 패턴)
|
|
12
|
+
|
|
13
|
+
> 이전 피드백을 먼저 반영해주세요 로또에서 랜덤 테스트를 구성하지 못한다는 의미는, 자동차 경주에서의 랜덤 테스트를 가능하게 하는 방법에 대해.
|
|
14
|
+
|
|
15
|
+
→ racingcar에서 배운 NumberGenerator 추상화 패턴 미적용.
|
|
16
|
+
|
|
17
|
+
### 2. object → class 변경 이유?
|
|
18
|
+
|
|
19
|
+
```kotlin
|
|
20
|
+
class LottoGenerator {. } // 이전엔 object
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
> 갑자기 object -> class 로 변경된 이유는 무엇인가요?
|
|
24
|
+
|
|
25
|
+
### 3. for + mutableList 패턴
|
|
26
|
+
|
|
27
|
+
→ `List(count) { generate() }` 또는 `(1..count).map { generate() }`.
|
|
28
|
+
|
|
29
|
+
### 4. `associate/group` 컬렉션 함수 활용
|
|
30
|
+
|
|
31
|
+
```kotlin
|
|
32
|
+
val map = mutableMapOf<Rank, Int>()
|
|
33
|
+
lottos.forEach {. map[rank] = (map[rank] ?: 0) + 1. }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
→ `lottos.groupingBy { it.match(winning) }.eachCount()`.
|
|
37
|
+
|
|
38
|
+
### 5. 수동 로또가 LottoGenerator를 안 쓰는 분기
|
|
39
|
+
|
|
40
|
+
```kotlin
|
|
41
|
+
val manual = Lotto(.) // ⚠ Generator 우회
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> LottoGenerator 라는 객체가 있는데, 수동 로또는 생성기를 통하지 않네요. 수동 로또를 어디서 만드는 지 과연 다른 개발자들을 짐작할 수 있을까요?
|
|
45
|
+
|
|
46
|
+
→ 자동/수동 모두 Generator 인터페이스 구현체.
|
|
47
|
+
|
|
48
|
+
### 6. `UserInput`의 메서드 — View 전용?
|
|
49
|
+
|
|
50
|
+
> 이 메서드들이 꼭 View에서 사용해야하는 메서드인가요?
|
|
51
|
+
|
|
52
|
+
## 얻은 교훈
|
|
53
|
+
|
|
54
|
+
- **이전 피드백 흡수 = 다음 단계의 기반**. 1단계 안 받았으면 2단계도 무너짐.
|
|
55
|
+
- **`groupingBy { }.eachCount()`** = Map 집계의 표준. lotto 통계에 자연.
|
|
56
|
+
- **자동/수동 통합 = Strategy/Generator 인터페이스 둘 다 거치게**. 일관성.
|