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,155 @@
|
|
|
1
|
+
# PR #141 — [다이스] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@moondev03](https://github.com/moondev03)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/141
|
|
5
|
+
- **단계:** 2단계 (수동 로또)
|
|
6
|
+
- **리뷰어:** @krrong
|
|
7
|
+
- **라인 코멘트:** 27 (리뷰어 21 + 학생 6)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`LottoBundle` 일급 컬렉션** — Strategy 시도.
|
|
12
|
+
- **후속 라운드 반응 좋음** — 리뷰어 칭찬: "*의도했던 바를 정확히 파악해 주셨네요* 💯".
|
|
13
|
+
|
|
14
|
+
## 못한 점 (설계 관점)
|
|
15
|
+
|
|
16
|
+
### 1. `LottoNumber.MIN/MAX` + `RandomLottoNumbersGenerator` *양쪽 보유*
|
|
17
|
+
|
|
18
|
+
```kotlin
|
|
19
|
+
class LottoNumber {
|
|
20
|
+
companion object { const val MIN = 1; const val MAX = 45 }
|
|
21
|
+
}
|
|
22
|
+
class RandomLottoNumbersGenerator {
|
|
23
|
+
val numbers = (1..45).shuffled().take(6) // ⚠ 다시 1..45
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
리뷰어: "*로또의 최대, 최소 값이 LottoNumber, RandomLottoNumbersGenerator 모두 가지고 있어요. 최대 최소 값은 누구의 관심사일까요? 🤔 LottoNumber에서 만들어 놓은 값을 잘 활용하려면 어떻게 해야 할까요*?"
|
|
28
|
+
|
|
29
|
+
리뷰어 후속: "*LottoNumber의 최대, 최소 값은 LottoNumber만이 관심 있는 값이죠. 자동 숫자 생성기는 LottoNumber에게 이렇게 요청할 수 있겠어요. '너가 가진 모든 번호를 주겠니?'* 그러면 *인스턴스화 시켜 놓은 값들을 적절히 활용*할 수 있을 것 같아요". 강사 동일 가르침 (*LottoMachine은 범위에 관심 없다*).
|
|
30
|
+
|
|
31
|
+
### 2. *Pair + nullable 반환* — 두 의미 손실
|
|
32
|
+
|
|
33
|
+
```kotlin
|
|
34
|
+
fun buyLottos(.): Pair<Lottos, Lottos>? =.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
리뷰어: "*Pair로 반환을 하고 있는데 게다가 값이 있을지도 없을지도 모른다*..? *로또를 구매하는 일을 한다고 생각해 보고 조금 더 명확한 값을 반환*해 보도록 할까요? 🤠" + "nit: *Pair를 만들 때는 a to b처럼 사용*할 수도 있어요!"
|
|
38
|
+
|
|
39
|
+
### 3. *디폴트 파라미터의 위험*
|
|
40
|
+
|
|
41
|
+
리뷰어: "*디폴트 파라미터를 정의해 두면 어떤 문제가 생길 수 있을까요*?".
|
|
42
|
+
|
|
43
|
+
### 4. *`service` 패키지 의도*
|
|
44
|
+
|
|
45
|
+
리뷰어: "*service 패키지는 어떤 역할을 하나요? model과는 어떤 차이가 있기에 패키지를 구분*했나요? 🤔"
|
|
46
|
+
|
|
47
|
+
### 5. *구매 수량 + 주문 클래스 분리* 전략
|
|
48
|
+
|
|
49
|
+
```kotlin
|
|
50
|
+
// 현재: 금액에서 수동/자동을 줄여 가며 계산
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
리뷰어 (제안): "자동 로또와 수동 로또의 *구매 수를 계산하기 위해 금액을 줄이는 전략을 사용했네요*! 다음과 같은 *클래스를 만드는 전략*은 어떤가요? 🤔
|
|
54
|
+
1. *구매 수량 클래스* - 수동 구매 수 - 자동 구매 수
|
|
55
|
+
2. *주문 클래스* - 금액 - 수동 구매 수 - 자동 구매 수"
|
|
56
|
+
|
|
57
|
+
추가 (현실 비유): "실제로 *로또를 사러 가서 돈, 수동 번호를 주며 자동 몇 개요~ 하고 주문하는 것처럼 Order에 수동 로또 번호도 추가*해 보면 어떨까요? 🤔"
|
|
58
|
+
|
|
59
|
+
### 6. *CsvSource 보다 분리*
|
|
60
|
+
|
|
61
|
+
리뷰어: "테스트를 보다 *split이 왜 필요할까 하는 의문점*이 들었어요. *수익률을 계산하는 테스트를 진행하기 위해서는 테스트의 가독성을 위해 CsvSource를 사용하는 것보다 분리해서 작성하는 게 좋아* 보여요."
|
|
62
|
+
|
|
63
|
+
### 7. *`Lotto.contains` 의도* — 보너스인지 모름
|
|
64
|
+
|
|
65
|
+
리뷰어: "사실 의도는 *'로또가 x를 포함하면 true를 반환한다'와 같이 수정하기를 바*랐어요. *Lotto의 관점에서 바라봤을 때 들어오는 값이 보너스 번호인지 그냥 번호인지 알 필요가 없으니까요* 🤠" — *호출자가 의미 구분*, 도메인은 *순수 행위*.
|
|
66
|
+
|
|
67
|
+
### 8. *테스트 가독성*
|
|
68
|
+
|
|
69
|
+
리뷰어:
|
|
70
|
+
```kotlin
|
|
71
|
+
@Test
|
|
72
|
+
fun `1등의 수익률은 2000000이다`() {
|
|
73
|
+
val result = mapOf(LottoRank.FIRST to 1)
|
|
74
|
+
val actual = LottoResult(result).calculateTotalReturn(1000).toDouble()
|
|
75
|
+
assertThat(actual).isEqualTo(2000000.00)
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
"조금 더 가독성을 개선하고 싶다면 아래처럼 작성할 수도 있겠어요 🤠"
|
|
79
|
+
|
|
80
|
+
### 9. `LottoMachine` *발급 책임* — 구조 변경
|
|
81
|
+
|
|
82
|
+
리뷰어: "이 부분은 *구조적인 변경이 커질 수도 있을 것 같아 참고만 하셔도* 좋을 것 같아요 🤠 현재 *LottoMachine은 LottoNumbersGenerator에게 받아온 숫자들을 로또로 만들어 주고* 있는데요. *현실 세계에 대입해 보면 로또는 기계에게 로또 몇 장 줘!라고 이야기해서 로또를 받아 와요*. 즉, *LottoMachine이 Lotto를 혹은 LottoBundle을 발급한다!라고도 볼 수* 있죠. 그리고 *로또를 파는 상점에서는 돈과 어떤 로또 기계를 사용할지를 받아 로또를 판다*. 이렇게 구성하면 *LottoMachine의 뎁스가 낮아지고 ManualLottoNumbersGenerator는 불필요한 count 멤버변수를 갖지 않을 수* 있어요!".
|
|
83
|
+
|
|
84
|
+
### 10. *출력 형식 불일치* — `Int` vs `List<LottoNumber>`
|
|
85
|
+
|
|
86
|
+
리뷰어: "*로또 구매 수를 출력할 때는 Int를 따로따로 넘겨주고, 로또 번호를 출력할 때는 List<LottoNumber>의 형태를 넘겨주고* 있네요. *각각의 기준이 있는 걸까요*? 🤔" — *일관성 검토*.
|
|
87
|
+
|
|
88
|
+
### 11. *테스트 = LottoMachine 진짜 책임 검증?*
|
|
89
|
+
|
|
90
|
+
리뷰어: "*이 테스트는 정말 LottoMachine의 테스트가 맞을까요*? 🤔"
|
|
91
|
+
|
|
92
|
+
### 12. *InputView가 Model을 모르는 이유*
|
|
93
|
+
|
|
94
|
+
리뷰어: "*OutputView에서도 당연히 Model을 받아 사용할 수 있어요. 저 또한 Model을 넘겨주는 것이나 List를 넘겨주는 것 모두 가능하고, 둘 중 어느 방법을 선택해야 하느냐는 트레이드 오프의 영역이라고 생각*해요. 그런데, *다이스의 설계에서 OutputView는 Model을 알고 있는데, InputView는 왜 Model을 알지 못할까요? 이 부분은 앞으로 개발을 하면서 고민*해 보시면 좋을 것 같아요 😊" — *비대칭 점검*.
|
|
95
|
+
|
|
96
|
+
### 13. *모든 LottoNumber 메시지* — 도메인 어휘
|
|
97
|
+
|
|
98
|
+
리뷰어: "*모든 LottoNumber를 가져오는 것 또한 메시지를 넘길 수 있겠네요* 🤠"
|
|
99
|
+
|
|
100
|
+
### 14. *generateLottoBundle 포함 가능*
|
|
101
|
+
|
|
102
|
+
리뷰어: "*generateLottoBundle 안에 포함되어도 될 것처럼 보이네요* 🤠"
|
|
103
|
+
|
|
104
|
+
### 15. *amount 가시성*
|
|
105
|
+
|
|
106
|
+
리뷰어: "*amount는 외부에서 사용하지 않으니 가시성을 수정해 볼 수* 있겠어요"
|
|
107
|
+
|
|
108
|
+
### 16. *테스트명 + 변수명 일치*
|
|
109
|
+
|
|
110
|
+
리뷰어: "*테스트명과 변수명도 무엇을 테스트하는지에 맞춰 변경하면 좋겠어요* 🤠"
|
|
111
|
+
|
|
112
|
+
## 리뷰어 의견 요지
|
|
113
|
+
|
|
114
|
+
- **MIN/MAX *단일 출처 = LottoNumber***. *Generator는 메시지로 요청*.
|
|
115
|
+
- **`Pair? + nullable` *두 의미 손실*** → data class.
|
|
116
|
+
- **`a to b` *Pair Kotlin idiom***.
|
|
117
|
+
- **디폴트 파라미터 *위험 검토***.
|
|
118
|
+
- **`service` 패키지 *의도 검증***.
|
|
119
|
+
- **구매 수량 + 주문 클래스 *책임 분배***.
|
|
120
|
+
- **CsvSource *과사용 검토***.
|
|
121
|
+
- **`Lotto.contains(x)` *의미 중립*** — 보너스/일반 호출자 의미.
|
|
122
|
+
- **`LottoMachine = Lotto 발급* 현실 비유**.
|
|
123
|
+
- **출력 형식 *일관성*** (Int vs List).
|
|
124
|
+
- **InputView/OutputView *비대칭 점검***.
|
|
125
|
+
- **가시성 *최소화***.
|
|
126
|
+
|
|
127
|
+
- **대표 인용:**
|
|
128
|
+
> LottoNumber의 최대, 최소 값은 *LottoNumber만이 관심 있는 값*이죠. 자동 숫자 생성기는 LottoNumber에게 이렇게 요청할 수 있겠어요. *'너가 가진 모든 번호를 주겠니?'*
|
|
129
|
+
> — @krrong on `src/main/kotlin/lotto/service/RandomLottoNumbersGenerator.kt`
|
|
130
|
+
|
|
131
|
+
> 다이스의 설계에서 *OutputView는 Model을 알고 있는데, InputView는 왜 Model을 알지 못할까요*?
|
|
132
|
+
> — @krrong on `src/main/kotlin/lotto/view/InputView.kt`
|
|
133
|
+
|
|
134
|
+
> 실제로 로또를 사러 가서 *돈, 수동 번호를 주며 자동 몇 개요~ 하고 주문하는 것처럼* Order에 수동 로또 번호도 추가해 보면 어떨까요?
|
|
135
|
+
> — @krrong on `src/main/kotlin/lotto/domain/Order.kt`
|
|
136
|
+
|
|
137
|
+
> Lotto의 관점에서 바라봤을 때 *들어오는 값이 보너스 번호인지 그냥 번호인지 알 필요가 없으니까요*.
|
|
138
|
+
> — @krrong on `src/main/kotlin/lotto/domain/Lotto.kt`
|
|
139
|
+
|
|
140
|
+
## 얻은 교훈
|
|
141
|
+
|
|
142
|
+
- **MIN/MAX *단일 출처 = LottoNumber***. *Generator는 LottoNumber.getAll() 메시지*로 요청. 강사 동일 가르침.
|
|
143
|
+
- **`Pair? + nullable`** = *두 의미 손실*. *data class*는 *필드 이름*, *Result 객체*는 *상태 표현*.
|
|
144
|
+
- **`a to b` Kotlin idiom** = *Pair* 생성 자연.
|
|
145
|
+
- **디폴트 파라미터 = *잘못된 추상화 신호***.
|
|
146
|
+
- **`service` vs `model` 패키지 *의도 검증*** — *Layered Architecture*가 *DDD*인지 *책임 분배*인지.
|
|
147
|
+
- **`Order` 도메인 객체** — *돈 + 수동 번호 + 자동 수*를 *하나의 메시지*로. *현실 메타포* 충실.
|
|
148
|
+
- **CsvSource *과사용*** — *테스트 1개면 vanilla `@Test`*.
|
|
149
|
+
- **`Lotto.contains(x)` *의미 중립*** — 도메인은 *값 검사*만, *의미 분류*는 호출자.
|
|
150
|
+
- **`LottoMachine = Lotto 발급* 현실 비유** — *기계에게 로또 몇 장 줘* + *상점에서 어떤 기계 사용할지 결정*. PR #131 *Cashier-Machine 흐름*과 같은 결.
|
|
151
|
+
- **출력 형식 *일관성*** — `Int`와 `List`가 *섞이면* 호출자 *어떤 형식 기대*에 혼란.
|
|
152
|
+
- **InputView/OutputView *비대칭 점검*** — *OutputView는 Model 알고*, *InputView는 Model 모름*은 *비대칭 신호*. 둘 다 Model 가능.
|
|
153
|
+
- **가시성 *최소화*** — *외부 사용 없으면 private*.
|
|
154
|
+
- **테스트명 + 변수명 일치** — *변수명이 테스트 의도 드러내야*.
|
|
155
|
+
- **함수 *포함 가능성*** — *별도 함수가 의미가 약하면* 통합 검토.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# PR #69 — [오둥이] 1단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@murjune](https://github.com/murjune)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/69
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @Gyuil-Hwnag (규일)
|
|
7
|
+
- **라인 코멘트:** 43 (리뷰어 31 + 학생 12)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **원시값 포장** — 리뷰어 칭찬: "*원시값 포장 잘해 주셨네요*👍".
|
|
12
|
+
- **`init` 검증** — "*init 블록을 통한 초기 Validation Check 아주 좋네요*👍".
|
|
13
|
+
- **`companion object` 상수** — "companion object를 통한 *상수값 관리 좋습니다*💯".
|
|
14
|
+
- **`operator fun contains`** — `number in lotto` 표현. 칭찬: "*operator 함수의 활용 좋습니다*~".
|
|
15
|
+
- **`fun interface LottoGenerator`** — SAM. 칭찬: "interface의 활용 *정말 좋네요*💯".
|
|
16
|
+
- **`value class`** — 사용.
|
|
17
|
+
- **`LOTTO_NUMBER_RANGE`** — 칭찬: "범위 지정 좋습니다👍".
|
|
18
|
+
- **테스트 정밀도** — "*Lotto에서 들어갈 수 있는 모든 경우에 대해서 테스트*해 주셨네요💯".
|
|
19
|
+
- **`junit @ParameterizedTest`** 활용.
|
|
20
|
+
|
|
21
|
+
## 못한 점 (설계 관점)
|
|
22
|
+
|
|
23
|
+
### 1. Controller가 *runCatching*으로 검증
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
fun run() {
|
|
27
|
+
val purchaseMoney = runCatching {. }.getOrElse {. }
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
리뷰어: "*runCatching을 사용한 이유가 궁금*합니다🤔 *해당 내용을 보면 inputView에 대한 Validation 실패인데 과연 해당 내용을 체크해 주는 게 Controller에서 담당해야 할 기능인지에 대해서도 고민*해 볼 필요가 있을 것 같습니다!" — *Controller가 검증 책임*인가 *InputView/도메인*인가. PR #36 (galcyurio)과 같은 *Elizarov 글* 시리즈.
|
|
32
|
+
|
|
33
|
+
### 2. `operator fun contains` *의도 메타-질문*
|
|
34
|
+
|
|
35
|
+
```kotlin
|
|
36
|
+
class Lotto {
|
|
37
|
+
operator fun contains(number: LottoNumber): Boolean =.
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
리뷰어: "operator 함수의 활용 좋습니다~ 고민해 볼 내용이 *operator 함수로 작성하신 이유가 궁금*합니다🤔" — *Kotlin idiom* `number in lotto` 표현을 *도메인 어휘 일치*로 정당화해야.
|
|
42
|
+
|
|
43
|
+
### 3. `let { }` 가독성 — *apply/forEach* 대안
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
return getRankMap().let {. }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
리뷰어: "*let을 사용하는 것도 좋기는 하지만 좀 더 의미를 명확하게* 아래처럼 하는 방법도 있을 것 같아서 참고 부탁드립니다~ 1. *getRankMap().apply {. }* 2. *getRankMap().ranks.forEach {. }*" — *scope function*의 의도 (변환/this 설정/부수효과)를 *어휘 일치*로.
|
|
50
|
+
|
|
51
|
+
### 4. `fun interface LottoGenerator` *키워드 이유*
|
|
52
|
+
|
|
53
|
+
```kotlin
|
|
54
|
+
fun interface LottoGenerator {
|
|
55
|
+
fun generate(): List<LottoNumber>
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
리뷰어: "*LottoGenerator interface 앞에 fun 키워드가 붙은 이유가 궁금*합니다🤔" — *SAM (Single Abstract Method)*로 *람다 변환 가능*. 의도 명시.
|
|
60
|
+
|
|
61
|
+
### 5. `value class` vs `data class` — 메타-질문 반복
|
|
62
|
+
|
|
63
|
+
리뷰어: "*value class를 사용해 주셨군요*👍 수정이 필요한 것은 아니고 같이 고민해 보면 좋을 것 같아서 코멘트 남겨 두었습니다~ *value class와 data class는 어떤 차이점이 존재*할까요?? 해당 내용을 *value class로 작성하신 이유*가 궁금합니다!"
|
|
64
|
+
|
|
65
|
+
### 6. *1..45 변경 시 깨질 위험*
|
|
66
|
+
|
|
67
|
+
리뷰어: "*그럴 일은 없겠지만 1..45라는 최소, 최대값이 만약 바뀌게 된다면, 해당 기능은 사용을 못하게 될 텐데, 확장성을 위해서 고민*을 해 보는 것도 좋을 것 같습니다💪"
|
|
68
|
+
|
|
69
|
+
### 7. `ConsoleLottoGameInputView` *class* 선택 이유
|
|
70
|
+
|
|
71
|
+
리뷰어: "*ConsoleLottoGameInputView를 class로 작성하신 이유가 궁금*합니다!🤔" + "*ConsoleLottoGameOutputView를 class로 작성하신 이유가 궁금*합니다!🤔" — *object vs class* 선택 정당화.
|
|
72
|
+
|
|
73
|
+
### 8. 테스트 *랜덤 시나리오 부재*
|
|
74
|
+
|
|
75
|
+
리뷰어: "*로또 번호 생성기에 대해서 주어진 값을 테스트하는 것도 좋지만, 랜덤으로 번호가 주여졌을 경우도 테스트해 보는 것도 좋은 경험*이 될 것 같다는 생각이 듭니다!💪" + "*해당 부분도 setUp을 랜덤하게 구현될 수 있도록 고민*해 보는 것도 좋을 것 같습니다!🤔"
|
|
76
|
+
|
|
77
|
+
### 9. 매직 넘버 `-1, 10, 1` 상수화
|
|
78
|
+
|
|
79
|
+
리뷰어: "*하드 코딩으로 들어간 -1, 10, 1에 대해서 상수 값으로 분류*를 해 보는 것도 고민해 볼 필요는 있을 것 같습니다!💪"
|
|
80
|
+
|
|
81
|
+
### 10. EOF 설정 + 디버깅용 *println*
|
|
82
|
+
|
|
83
|
+
리뷰어: "*다음 설정 옵션을 활성화하여 EOF 경고를 없애*주세요🥲 *File > Preferences > Editor > General > Ensure every saved file ends with a line break*" + 디버깅 코드: "*해당 내용이 들어간 이유가 있을까요*??😅"
|
|
84
|
+
|
|
85
|
+
### 11. *공통 테스트 데이터* — `DEFAULT_LOTTO`
|
|
86
|
+
|
|
87
|
+
리뷰어: "Lotto(1, 2, 3, 4, 5, 6)의 경우 *테스트에서 많이 사용*되고 있는데, *이를 재사용하기 위해서 DEFAULT_LOTTO = Lotto(1, 2, 3, 4, 5, 6) 등으로 작성*해 보시는 것도 고민해 보면 좋을 것 같습니다!" — test fixture.
|
|
88
|
+
|
|
89
|
+
### 12. `BonusLottoNumber`의 `List<LottoNumber>` *의존*
|
|
90
|
+
|
|
91
|
+
```kotlin
|
|
92
|
+
class BonusLottoNumber(val lottoNumber: LottoNumber, winningNumbers: List<LottoNumber>) {. }
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
리뷰어: "*BonusLottoNumber가 List<LottoNumber>에 대한 의존성을 가지게* 되었군요! *보너스 번호의 경우 로또 결과에 대해서 중복값이면 안 된다는 이유로 인하여 발생한 것이라면 괜찮아 보이기*는 합니다~" — *의존 정당화*는 *도메인 invariant*가 기준.
|
|
96
|
+
|
|
97
|
+
### 13. *예외 케이스 인식* — 리뷰어 격려
|
|
98
|
+
|
|
99
|
+
리뷰어: "*개발자가 알고 있는 경우 외의 예외 케이스는 언제든 발생*할 수 있어서, 코멘트 남겨 둔 내용이었습니다~" — *알고 있는 예외 + 알 수 없는 예외*. *방어적 코딩*의 범위 인식.
|
|
100
|
+
|
|
101
|
+
## 리뷰어 의견 요지
|
|
102
|
+
|
|
103
|
+
- ***Controller의 검증 책임*** 점검 — *InputView/도메인*과 분리.
|
|
104
|
+
- **`operator fun contains` *도메인 어휘 일치***.
|
|
105
|
+
- **`let` 보다 *명확한 scope function* (apply/forEach)**.
|
|
106
|
+
- **`fun interface` *SAM 의도 명시***.
|
|
107
|
+
- **`value class` vs `data class` *근거 정리***.
|
|
108
|
+
- **`1..45` 변경 *확장성***.
|
|
109
|
+
- **`InputView/OutputView` *class vs object* 정당화**.
|
|
110
|
+
- **테스트 *랜덤 시나리오***.
|
|
111
|
+
- **매직 넘버 *상수화***.
|
|
112
|
+
- **EOF / 디버깅 코드 *제거***.
|
|
113
|
+
- **`DEFAULT_LOTTO` test fixture**.
|
|
114
|
+
- **`BonusLottoNumber`의 *도메인 의존* 정당화 OK**.
|
|
115
|
+
|
|
116
|
+
- **대표 인용:**
|
|
117
|
+
> runCatching을 사용한 이유가 궁금합니다🤔 *해당 내용을 보면 inputView에 대한 Validation 실패인데 과연 해당 내용을 체크해 주는 게 Controller에서 담당해야 할 기능인지*에 대해서도 고민해 볼 필요가 있을 것 같습니다!
|
|
118
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
119
|
+
|
|
120
|
+
> let을 사용하는 것도 좋기는 하지만 *좀 더 의미를 명확하게* 아래처럼 하는 방법도 있을 것 같아서 참고 부탁드립니다.
|
|
121
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
122
|
+
|
|
123
|
+
> 1..45라는 *최소, 최대값이 만약 바뀌게 된다면, 해당 기능은 사용을 못하게 될 텐데, 확장성을 위해서 고민*을 해 보는 것도 좋을 것 같습니다.
|
|
124
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/LottoNumber.kt`
|
|
125
|
+
|
|
126
|
+
> 개발자가 알고 있는 경우 외의 *예외 케이스는 언제든 발생*할 수 있어서, 코멘트 남겨 둔 내용이었습니다.
|
|
127
|
+
> — @Gyuil-Hwnag (방어적 코딩 격려)
|
|
128
|
+
|
|
129
|
+
## 얻은 교훈
|
|
130
|
+
|
|
131
|
+
- **Controller *검증 책임*은 *얇아야*** — *InputView*는 *형식*, *도메인*은 *논리*. *Controller의 runCatching*은 *어느 단계 검증인지* 모호.
|
|
132
|
+
- **`operator fun contains`는 *도메인 어휘 일치*가 정당화** — *Kotlin idiom*만 보고 도입하면 *어휘 충돌*.
|
|
133
|
+
- **`let` 보다 *의도 명확*** — `apply` (this 설정), `forEach`, `also` (부수효과). *Kotlin scope function*은 *부수 의도 차이*가 핵심.
|
|
134
|
+
- **`fun interface` = *SAM 명시*** — *람다로 즉시 사용* 가능. *명시적 단일 메서드*.
|
|
135
|
+
- **`value class`는 *최적화 + 타입 안전*** — `data class`는 *힙 + copy/equals 자동*. *작은 래퍼*에 부적합.
|
|
136
|
+
- **`1..45` *상수 확장성*** — *변경 가능성*이 *낮아도 단일 변경 지점* 가치.
|
|
137
|
+
- **`InputView` *class vs object*** — *변경 가능성*이 *class* 선택 기준.
|
|
138
|
+
- **테스트 *랜덤 시나리오*** — *주어진 값*과 *랜덤 시나리오* 모두. *Random 외부 주입*이 *재현 가능 랜덤*.
|
|
139
|
+
- **매직 넘버 *모두 상수화*** — *-1, 10, 1*도 *의미*가 있으면 상수.
|
|
140
|
+
- **EOF / 디버깅 코드 = *PR 셀프 리뷰 항목***.
|
|
141
|
+
- **`DEFAULT_LOTTO` test fixture** — *공통 데이터 재사용*. PR #21 *MethodSource 지역성*과 함께 *테스트 가독성*의 균형.
|
|
142
|
+
- ***도메인 의존 정당화 = invariant*** — `BonusLottoNumber`가 `winningNumbers` 의존하는 건 *중복 방지 invariant* 표명. 결합도라기보다 *모델링*.
|
|
143
|
+
- **방어적 코딩 = *알 수 있는 + 알 수 없는 예외*** — *방어 범위 자각*이 *과방어 회피*.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# PR #90 — [오둥이] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@murjune](https://github.com/murjune)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/90
|
|
5
|
+
- **단계:** 2단계 (수동 로또)
|
|
6
|
+
- **리뷰어:** @Gyuil-Hwnag (규일)
|
|
7
|
+
- **라인 코멘트:** 45 (리뷰어 33 + 학생 12)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`LottoCount` value class + `require`** — 리뷰어 칭찬: "require에 대한 활용 *정말* 좋네요👍".
|
|
12
|
+
- **`AutoLottieGenerator` / `ManualLottieGenerator` 인터페이스 분리** — Strategy 시도.
|
|
13
|
+
- **`Thread.setDefaultUncaughtExceptionHandler` 도입** — 학생: "*추가된 이유를 알고 있습니다*🤔".
|
|
14
|
+
- **`tailrec` 키워드** — 재귀 함수 최적화 의식.
|
|
15
|
+
- **`data object` 사용** — Kotlin 1.9+ 어휘 활용.
|
|
16
|
+
- **`@BeforeEach` 테스트 fixture 활용** — 칭찬: "*기능 활용 좋습니다*~👍".
|
|
17
|
+
- **패키지 분리** — 칭찬: "패키지 분리 좋습니다~👍".
|
|
18
|
+
- **`LottoResult` Success/Failure 상태값** — 학생 후속 도입.
|
|
19
|
+
|
|
20
|
+
## 못한 점 (설계 관점)
|
|
21
|
+
|
|
22
|
+
### 1. *try-catch 요구사항* — runCatching이 답인가?
|
|
23
|
+
|
|
24
|
+
리뷰어: "*이번 미션 힌트에서 '일반적인 코틀린 코드에서 try-catch를 사용하지 않는다.'라는 요구사항*이 있는데, *이에 대한 요구사항이 try-catch 대신에 runCatching을 사용하는 것일까??* 고민해 보셔도 좋을 것 같습니다! 관련해서 읽어 보시면 좋은 글 있어서 첨부하였습니다~ https://elizarov.medium.com/kotlin-and-exceptions-8062f589d07" — *Elizarov 글*은 PR #36과 같은 인용 (다른 강사). *catch의 다른 형태가 아닌 본질*: 정상 흐름은 *null + while 패턴*.
|
|
25
|
+
|
|
26
|
+
### 2. `View`에서 `Int` 반환 — *Int → LottoNumber 추상화*
|
|
27
|
+
|
|
28
|
+
```kotlin
|
|
29
|
+
class ConsoleLottoGameInputView {
|
|
30
|
+
fun readWinning(): List<Int> {. } // ⚠ 원시
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
리뷰어: "*요구사항에 있는 대로 Int를 LottoNumber로 추상화*해 보는 것도 좋을 것 같습니다!! *과연 해당 로직은 View가 책임을 가지고 있는 게 맞는지도 고민*해 볼 필요도 있겠네요~💪" — *View → Domain 의존*은 허용. *원시값 포장*은 *경계가 명확한 곳*에.
|
|
35
|
+
|
|
36
|
+
### 3. *Generator 인터페이스 2개* 통합?
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
interface AutoLottieGenerator { fun generate(.): List<Lotto> }
|
|
40
|
+
interface ManualLottieGenerator { fun generate(.): List<Lotto> }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
리뷰어: "AutoLottieGenerator과 ManualLottieGenerator의 *generate한다는 같은 기능을 가진 인터페이스가 두 가지가 존재*하는데 *두 가지의 인터페이스를 하나로 통합할 수* 있을까요??🤔"
|
|
44
|
+
|
|
45
|
+
리뷰어 후속 (sealed class 제안):
|
|
46
|
+
```kotlin
|
|
47
|
+
sealed class LottoGeneratorType {
|
|
48
|
+
data class Manual(val cost: Money): LottoGeneratorType()
|
|
49
|
+
data class Auto(val lottoNumbers: List<List<LottoNumber>>): LottoGeneratorType()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface LottoGenerator {
|
|
53
|
+
fun generate(type: LottoGeneratorType): List<Lotto>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
class DefaultLottoGenerator: LottoGenerator {
|
|
57
|
+
override fun generate(type: LottoGeneratorType): List<Lotto> {
|
|
58
|
+
return when (type) {
|
|
59
|
+
is LottoGeneratorType.Manual -> {}
|
|
60
|
+
is LottoGeneratorType.Auto -> {}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
"다만 위와 같은 형태가 되려면 *Lotto와 LottoResult, 수동 & 자동 로또 생성기 등에 대한 코드를 통합하는 작업이 들어가야* 겠군요!"
|
|
66
|
+
|
|
67
|
+
### 4. `BonusLottoNumber?`, `Count?` *nullable* — Result 타입 권장
|
|
68
|
+
|
|
69
|
+
```kotlin
|
|
70
|
+
class BonusLottoNumber(lottoNumber: GeneralLottoNumber?,.) {. }
|
|
71
|
+
fun createBonusLottoNumber(): BonusLottoNumber? {. } // ⚠ nullable
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
리뷰어 (3회 반복): "BonusLottoNumber를 *nullable하도록 작성하신 이유*가 있을까요??🤔" + "Count도 *nullable*하도록 작성하신 이유가 있을까요??🤔" + "*nullable하게 반환하는 것보다 성공, 실패 등의 상태 등으로 만들어 반영*해 보는 것도 좋을 것 같다는 생각이 듭니다!" 학생 후속: `LottoResult.Success` / `LottoResult.Failure` 도입. 리뷰어 추가: "*LottoResult에 대한 조건이 점점 증가하게 된다면, 그에 따라서 모든 내용을 작성하게 될 수 있으므로 LottoResult.Failure이라는 것으로 한 번에 묶는 것도 고민*해 보면 좋을 듯 싶습니다~"
|
|
75
|
+
|
|
76
|
+
### 5. *재실행 패턴* — 사용하지 않는 반환값
|
|
77
|
+
|
|
78
|
+
```kotlin
|
|
79
|
+
private fun readBonusLottoNumber(): BonusLottoNumber? {
|
|
80
|
+
return runCatching {. }.getOrElse {
|
|
81
|
+
readBonusLottoNumber() // ⚠ return을 다시 안 씀
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
리뷰어: "사실상 아래의 내용들은 *return을 하지만 전혀 사용을 안 하고 있다*는 생각이 드네요🥲 *재실행을 하더라도 해당 내용들을 유의미하게 사용하여 재실행을 시키는 방법을 고민*해 볼 수 있을 것 같습니다!" + 후속 (오류 메시지 출력): "*BonusLottoNumber의 생성자에서 적용해 둔 '%s: 보너스 번호는 우승 로또 번호와 중복될 수 없습니다.'가 출력이 되도록 구현*해 보는 것도 좋을 것 같습니다~💪" + "*단순 재실행이 아닌 Money에서 정의한 오류 문구를 출력하고 재실행을 시키는 방식*으로 수정해 봐도 좋을 것 같다는 생각이 듭니다~💪" — *재시도와 사용자 피드백*은 별개 책임.
|
|
87
|
+
|
|
88
|
+
### 6. *팩토리 함수 vs 부 생성자*
|
|
89
|
+
|
|
90
|
+
```kotlin
|
|
91
|
+
class BonusLottoNumber(.) {
|
|
92
|
+
companion object {
|
|
93
|
+
fun of(.): BonusLottoNumber? {. }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
리뷰어: "*팩토리 함수를 만들었지만 현재 팩토리 함수는 부 생성자를 사용하는 것보다 좋은 효과를 보여주지는 않는 것 같*아 보이긴 합니다! (companion object의 of로 해당 BonusLottoNumber를 만들어서 사용하는 것과 *BonumLottoNumber.lottoNumber로 사용하는 것을 비교*해 봤을 때입니다!)" + "*어떤 상황에서 생성자보다 팩토리 함수를 사용하는 것이 더 나을까요*?" + 후속:
|
|
99
|
+
```kotlin
|
|
100
|
+
val bonusLottoNumber = BonusLottoNumber(GeneralLottoNumber(bonusNumber), winningLottoNumbers)
|
|
101
|
+
bonusLottoNumber.lottoNumber.toIntOrNull() ?: createBonusLottoNumber(winningLottoNumbers)
|
|
102
|
+
```
|
|
103
|
+
"*현재 작성해 주신 내용을 보면 팩토리 함수를 만들었지만, '팩토리 함수가 있음으로서 장점이 있는가?'라는 물음에는 해결이 되지 않는 것* 같습니다!!"
|
|
104
|
+
|
|
105
|
+
→ *팩토리 함수 = 구분되는 의도 (네이밍, 분기, 검증)이 있을 때*.
|
|
106
|
+
|
|
107
|
+
### 7. *Money/Count 무한 재귀* — 입력 없을 시
|
|
108
|
+
|
|
109
|
+
리뷰어: "*Validation Check 너무 잘해 주셨네요*~👍 Money와 Count에 대한 *입력은 없을 경우 무한 재귀로 빠지*는군요~" — *재시도 종료 조건* 부재.
|
|
110
|
+
|
|
111
|
+
### 8. `tailrec` *학생 의도*
|
|
112
|
+
|
|
113
|
+
리뷰어: "tailrec 키워드를 통해서 *재귀 함수를 호출해 주셨군요*!! 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *tailrec을 사용함으로써 어떤 이점이 존재할까요*??🤔" — *꼬리 재귀 최적화* 이해 점검.
|
|
114
|
+
|
|
115
|
+
### 9. `data object` vs `object`
|
|
116
|
+
|
|
117
|
+
리뷰어: "*data object를 사용해 주셨군요*!! 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *object와 data object는 어떤 차이점이 있을까요*?🤔" — `data object`는 *toString, equals 명시 (Kotlin 1.9)*.
|
|
118
|
+
|
|
119
|
+
### 10. `inline` 함수 *장점*
|
|
120
|
+
|
|
121
|
+
리뷰어: "inline 함수로 *작성을 해 주셨군요*~ inline 함수를 사용함으로써 *얻을 수 있는 장점은 어떤 것이 있을까요*??🤔 고민해 보면 추후에 좋을 내용인 것 같아서 남겨 두었습니다!" — *고차 함수 호출 비용 회피*.
|
|
122
|
+
|
|
123
|
+
### 11. `0` 매직 넘버 — `INIT_COUNT` 상수화
|
|
124
|
+
|
|
125
|
+
리뷰어: "해당 내용에 들어간 *0도 INIT_COUNT (예시) 등으로 묶는 게 가독성 측면에서 이점이 있을지* 고민해 보는 것도 좋을 것 같습니다~"
|
|
126
|
+
|
|
127
|
+
### 12. *테스트 fixture* 개념
|
|
128
|
+
|
|
129
|
+
리뷰어: "테스트 코드에 대해서 전반적으로 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *테스트 코드에는 test fixture라는 개념이 존재*하는데 내용을 살펴 보고 해당 내용을 어떻게 수정하면 좋을지 고민해 보시면 좋을 것 같다는 생각이 듭니다!💪" — *공통 테스트 데이터 설정 + 재사용*.
|
|
130
|
+
|
|
131
|
+
### 13. 테스트 함수명 *모호*
|
|
132
|
+
|
|
133
|
+
리뷰어: "*해당 테스트 함수를 보고 어떤 기능을 테스트하는 함수인지 알 수 있게 네이밍 고민*해 보셔도 좋을 것 같습니다!🤔"
|
|
134
|
+
|
|
135
|
+
### 14. *자동 vs 수동 generator 통합*
|
|
136
|
+
|
|
137
|
+
리뷰어: "프로젝트의 많은 구성이 바뀌겠지만 추후에 *로또 자동, 수동 생성기를 하나의 generate 함수에서 하나로 통합해 보는 작업*을 해 보셔도 좋을 것 같습니다!💪"
|
|
138
|
+
|
|
139
|
+
## 리뷰어 의견 요지
|
|
140
|
+
|
|
141
|
+
- ***try-catch 미사용 = catch 표현 회피*** 아니라 *예외 발생 자체 줄이기*. Elizarov 글 권장.
|
|
142
|
+
- **`View`가 *도메인 타입 반환* 가능** — *원시값 포장*은 *경계*에서.
|
|
143
|
+
- **`AutoGenerator` + `ManualGenerator` → *sealed class + 단일 인터페이스***.
|
|
144
|
+
- **`nullable` 반환 → *Result/Success/Failure***.
|
|
145
|
+
- **재시도 패턴 + *오류 메시지 활용***.
|
|
146
|
+
- **팩토리 함수 = *구분 의도가 있을 때***.
|
|
147
|
+
- **`tailrec`, `data object`, `inline` *학습 점검***.
|
|
148
|
+
- **테스트 fixture 활용**.
|
|
149
|
+
- **자동/수동 generator 통합 가능**.
|
|
150
|
+
|
|
151
|
+
- **대표 인용:**
|
|
152
|
+
> 이번 미션 힌트에서 "*일반적인 코틀린 코드에서 try-catch를 사용하지 않는다.*"라는 요구사항이 있는데, *이에 대한 요구사항이 try-catch 대신에 runCatching을 사용하는 것일까*??
|
|
153
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
154
|
+
|
|
155
|
+
> 사실상 아래의 내용들은 *return을 하지만 전혀 사용을 안 하고 있다*는 생각이 드네요🥲
|
|
156
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/view/ConsoleLottoGameInputView.kt`
|
|
157
|
+
|
|
158
|
+
> 현재 작성해 주신 내용을 보면 팩토리 함수를 만들었지만, *"팩토리 함수가 있음으로서 장점이 있는가?"라는 물음에는 해결이 되지 않는 것 같*습니다!!
|
|
159
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/BonusLottoNumber.kt`
|
|
160
|
+
|
|
161
|
+
> 두 가지의 인터페이스를 하나로 통합할 수 있을까요?🤔 (sealed class 예시 포함)
|
|
162
|
+
> — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/LottoGenerator.kt`
|
|
163
|
+
|
|
164
|
+
## 얻은 교훈
|
|
165
|
+
|
|
166
|
+
- **`try-catch 미사용` 요구사항 = *catch의 다른 형태가 아닌 본질***. *runCatching*도 *예외 사용*. 정상 흐름은 *null + while* 또는 *Result*.
|
|
167
|
+
- **`View`가 도메인 타입 반환 OK** — *Presentation → Domain 의존*은 허용 (PR #21 galcyurio도 같은 의견).
|
|
168
|
+
- **`sealed class` + *단일 인터페이스*가 *2개 인터페이스 + when 분기*보다 자연**.
|
|
169
|
+
- **`nullable` 반환 → *Result/Success/Failure 상태***. nullable은 *원인 정보 손실*.
|
|
170
|
+
- **재시도 ≠ 사용자 피드백** — `runCatching {. }.getOrElse { recurse() }`는 *오류 메시지 출력*과 *재시도*를 분리.
|
|
171
|
+
- **팩토리 함수 = *생성자보다 의도가 명확*할 때만** — `BonusLottoNumber.of(n)`와 `BonusLottoNumber(n)`이 같은 효과면 *팩토리 무용*. 분기 (`Range A → typeA, Range B → typeB`)나 *서로 다른 입력 변환*일 때 가치.
|
|
172
|
+
- **`tailrec` *꼬리 재귀 최적화*** — JVM에서 *스택 오버플로 회피*.
|
|
173
|
+
- **`data object` = *toString/equals 자동* (Kotlin 1.9)** — *Sentinel 객체* (NONE, EMPTY 등)에 유용.
|
|
174
|
+
- **`inline` 함수 *고차 함수 호출 비용 회피*** — 람다 객체 생성 → 인라인.
|
|
175
|
+
- **재시도 *종료 조건*** — 입력이 없으면 *무한 재귀*. *try N times* 또는 *EOF 처리*.
|
|
176
|
+
- **테스트 *fixture*** — `@BeforeEach`로 *공통 setup*. 또는 *factory function*.
|
|
177
|
+
- **자동/수동 generator 통합 = *Open-Closed*** — *제 3 종류 추가*에도 인터페이스 무변경.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# PR #20 — [반달] 1단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@no1msh](https://github.com/no1msh)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/20
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @woowajames
|
|
7
|
+
- **라인 코멘트:** 49
|
|
8
|
+
|
|
9
|
+
## 잘한 점
|
|
10
|
+
|
|
11
|
+
- **`LottoNumber` value class** — 칭찬받음.
|
|
12
|
+
- **`Rank` enum**, `Money`/`Bank`/`Lotto` 분리.
|
|
13
|
+
|
|
14
|
+
## 못한 점 + 핵심 지적
|
|
15
|
+
|
|
16
|
+
### 1. lint 실패 다수
|
|
17
|
+
|
|
18
|
+
> 대부분의 테스트 코드에서 lint 테스트가 실패하고 있습니다. 인텔리제이에서 제공하는 정렬 기능을 습관화하고 이용해보세요.
|
|
19
|
+
|
|
20
|
+
### 2. 정상 케이스 테스트 누락
|
|
21
|
+
|
|
22
|
+
```kotlin
|
|
23
|
+
@Test fun `범위 밖이면 예외`() {. } // 예외만 테스트
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
> 범위 밖에 있는 경우에 대한 검증을 했다면 범위 내에 에러가 발생하지 않는 검증은 불필요한 검증으로 보입니다. 오히려 create()가 정상적으로 동작했는지에 대한 검증이 필요할 것 같아요. create()의 결과가 무엇이고 제대로 그 결과가 나왔는지 확인해볼까요?
|
|
27
|
+
|
|
28
|
+
### 3. Money 테스트 — 정상 동작 미검증
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
@Test fun `1000원 단위가 아니면 에러`() {. }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> Money 클래스가 어떤 값을 넣어도 에러만 발생하고 있다면 제대로 동작하는 것일까요?
|
|
35
|
+
|
|
36
|
+
→ *Happy path* 우선, *예외*는 부차.
|
|
37
|
+
|
|
38
|
+
### 4. Rank 테스트 2등만
|
|
39
|
+
|
|
40
|
+
→ 모든 등수 테스트.
|
|
41
|
+
|
|
42
|
+
### 5. `check` 함수명 → Kotlin API와 충돌
|
|
43
|
+
|
|
44
|
+
```kotlin
|
|
45
|
+
fun check(.) {. }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
> check는 코틀린 api로 존재하기 때문에 함수명에 사용하면 오해의 여지가 있을 수도 있을 것 같아요.
|
|
49
|
+
|
|
50
|
+
→ stdlib과 *동명* 회피.
|
|
51
|
+
|
|
52
|
+
### 6. RandomLottoGenerator가 다른 클래스 상수 참조
|
|
53
|
+
|
|
54
|
+
```kotlin
|
|
55
|
+
class RandomLottoGenerator {
|
|
56
|
+
fun generate(): Lotto {
|
|
57
|
+
(LottoNumber.MIN..LottoNumber.MAX).shuffled() // ⚠ LottoNumber 상수 의존
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> 다른 클래스의 상수를 참조해서 사용하면 의존성이 생깁니다. 의존성 주입(메서드 주입)을 받으면 어떨까요?
|
|
63
|
+
|
|
64
|
+
## 얻은 교훈
|
|
65
|
+
|
|
66
|
+
- **Happy path 테스트 우선** — 예외만 검증 = 객체가 *제대로 동작하는지* 확신 못함.
|
|
67
|
+
- **stdlib 동명 회피** — `check`, `apply`, `let` 같은 Kotlin 함수와 같은 이름.
|
|
68
|
+
- **다른 클래스의 상수 참조 = 결합도 ↑**. 의존성 주입 또는 자기 상수 보유.
|
|
69
|
+
- **Rank 케이스 전부 테스트** — 각 등수 = 비즈니스 분기.
|