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,369 @@
|
|
|
1
|
+
# 우아한테크코스 kotlin-lotto PR 리뷰 분석 — 총정리
|
|
2
|
+
|
|
3
|
+
141개의 closed PR (라인 코멘트 ≥ 5개), 71명의 reviewee를 분석해 도출한 OOP 설계 교훈 모음.
|
|
4
|
+
|
|
5
|
+
> **분석 범위:** 책임/응집/결합/캡슐화/Tell-Don't-Ask/테스터빌리티/도메인 모델링/일급 컬렉션/원시 강박/의존 방향/명명 설계.
|
|
6
|
+
> **제외:** Kotlin 관용구 (scope function, smart cast, null 처리 idiom, `val/var`, data class *문법* 자체).
|
|
7
|
+
> **추가:** 안티패턴 발견 시 실제 `diff_hunk` 코드 스니펫 인용 — 읽을 때 즉시 파악 가능.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 자주 하는 설계 실수 TOP 10 (lotto 도메인 특화)
|
|
12
|
+
|
|
13
|
+
### 1. **`LottoNumber` 도메인 누락** — 모든 lotto 미션의 마스터 키 누락
|
|
14
|
+
|
|
15
|
+
**증상:** `Lotto`가 `List<Int>` 또는 `Set<Int>`를 그대로 보유. 1-45 범위 검증을 Lotto가 직접.
|
|
16
|
+
|
|
17
|
+
**예시 PR:** [#15](hyunji1203/15-1단계-로또.md), [#19](krrong/19-1단계-로또.md), [#62](ii2001/62-1단계-로또.md), [#120](junseo511/120-1단계-로또.md), [#126](oungsi2000/126-1단계-로또.md), [#117](parkjiminnnn/117-1단계-로또.md), [#114](tobae-time/114-1단계-로또.md)
|
|
18
|
+
|
|
19
|
+
**해법 패턴:**
|
|
20
|
+
- `value class LottoNumber(val value: Int) { init { require(value in 1..45) } }`
|
|
21
|
+
- flyweight 캐싱 (1-45 범위 고정 → 45개만 존재)
|
|
22
|
+
- Lotto는 *LottoNumber 개수와 중복*만 보장
|
|
23
|
+
|
|
24
|
+
**리뷰어 인용:**
|
|
25
|
+
> 로또에서 사용하는 숫자는 결국 Int 타입이라고 볼 수 있겠습니다. 그렇다면 외부에서 가져온 이 숫자들이 로또 번호라는 것을 어떻게 알 수 있을까요? — @laco-dev ([PR #19](krrong/19-1단계-로또.md))
|
|
26
|
+
|
|
27
|
+
### 2. **`Rank` enum + `matchBonus` 필드 위치 의문**
|
|
28
|
+
|
|
29
|
+
**증상:** 5개 일치가 2등(보너스 일치) vs 3등(미일치) 둘 다 가능 → matchBonus를 어디서 어떻게 표현?
|
|
30
|
+
|
|
31
|
+
**예시 PR:** [#15](hyunji1203/15-1단계-로또.md), [#19](krrong/19-1단계-로또.md), [#65](songpink/65-1단계-로또.md), [#120](junseo511/120-1단계-로또.md), [#111](donghyun81/111-1단계-로또.md), [#110](moondev03/110-1단계-로또.md)
|
|
32
|
+
|
|
33
|
+
**3가지 답안 + 트레이드오프:**
|
|
34
|
+
1. **Rank가 matchBonus 필드** — enum이 모든 정보 보유, 외부 분기 사라짐
|
|
35
|
+
2. **`Rank.SECOND`만 특수 처리** — 일반화 어색 (`matchBonus = true`만 단독)
|
|
36
|
+
3. **`matchBonus`는 *판별 입력*** — `Rank.of(matchCount, matchBonus)`로 검색, 필드는 없음
|
|
37
|
+
|
|
38
|
+
**리뷰어 핵심:** `Rank.values()[matchCount]` 같은 순서 의존 silent bug 회피 ([#106](giovannijunseokim/106-1단계-로또.md)).
|
|
39
|
+
|
|
40
|
+
### 3. **`Statistics`/`Analyzer`/`Calculator` god-object** (Tell-Don't-Ask 위반)
|
|
41
|
+
|
|
42
|
+
**증상:** Lottos + WinningLotto의 정보를 꺼내 외부 객체가 통계 + 등수 + 수익률 계산.
|
|
43
|
+
|
|
44
|
+
**예시 PR:** [#19](krrong/19-1단계-로또.md), [#59](jaeyeongjo/59-1단계-로또.md), [#26](briandr97/26-1단계-로또.md), [#18](s9hn/18-1단계-로또.md), [#125](devfeijoa/125-1단계-로또.md), [#2](DYGames/2-1단계-로또.md), [#111](donghyun81/111-1단계-로또.md)
|
|
45
|
+
|
|
46
|
+
**해법 패턴 (Tell-Don't-Ask):**
|
|
47
|
+
```kotlin
|
|
48
|
+
// 안 됨
|
|
49
|
+
class LottoStatistics(...) {
|
|
50
|
+
fun calculate(): Map<Rank, Int> {
|
|
51
|
+
val winningNumbers = winningLotto.getNumbers() // ⚠ 꺼내기
|
|
52
|
+
return lottos.map { ... compare ... } // ⚠ 외부 비교
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 됨
|
|
57
|
+
val rank: Rank = winningLotto.match(lotto)
|
|
58
|
+
val results: Map<Rank, Int> = winningLotto.matchAll(lottos)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**리뷰어 인용:**
|
|
62
|
+
> 몇개가 일치하는지 요청해서 결과를 받아오도록 해보세요. 객체지향 프로그래밍에서는 이 개념을 메시지를 보낸다 라고 표현합니다. — @laco-dev ([PR #19](krrong/19-1단계-로또.md))
|
|
63
|
+
|
|
64
|
+
### 4. **enum/도메인에 UI 표현 문자열 침투**
|
|
65
|
+
|
|
66
|
+
**증상:** `Rank` enum에 `description = "6개 일치"`, `LottoPrize.message`, `GainLoss.description = "이득"` 같은 UI 표현이 도메인 데이터에 박힘.
|
|
67
|
+
|
|
68
|
+
**예시 PR:** [#15](hyunji1203/15-1단계-로또.md), [#16](ippnsj/16-1단계-로또.md), [#85](kkosang/85-2단계-로또.md), [#135](Leeyerin0210/135-2단계-로또.md), [#130](medAndro/130-2단계-로또.md), [#62](ii2001/62-1단계-로또.md), [#14](Choisehyeon/14-1단계-로또.md), [#24](chws0508/24-1단계-로또.md)
|
|
69
|
+
|
|
70
|
+
**해법:** enum은 *영구한 도메인 데이터*만 (matchCount, winningMoney). 표현은 OutputView.
|
|
71
|
+
|
|
72
|
+
**리뷰어 인용:**
|
|
73
|
+
> Rank에 대한 출력 값은 UI의 관심사입니다. 도메인 모델에서 UI 로직을 제거하고. — @laco-dev ([PR #15](hyunji1203/15-1단계-로또.md))
|
|
74
|
+
|
|
75
|
+
### 5. **Controller god-controller** (racingcar에서도 반복)
|
|
76
|
+
|
|
77
|
+
**증상:** `LottoController`가 input + parsing + validation + 로또 생성 + 비교 + 출력까지.
|
|
78
|
+
|
|
79
|
+
**예시 PR:** [#85](kkosang/85-2단계-로또.md), [#15](hyunji1203/15-1단계-로또.md), [#106](giovannijunseokim/106-1단계-로또.md), [#41](krrong/41-2단계-로또.md), [#131](junseo511/131-2단계-로또.md), [#27](2chang5/1단계-로또.md), [#137](giovannijunseokim/137-2단계-로또.md)
|
|
80
|
+
|
|
81
|
+
**해법:** Controller = view-domain 연결만. 도메인 로직은 도메인.
|
|
82
|
+
|
|
83
|
+
**리뷰어 인용:**
|
|
84
|
+
> 2단계 요구사항을 모두 컨트롤러에서 반영한 느낌이에요. 마치 자동차 경주와 1단계에서 배운 내용을 다 잊어버린 것처럼 보여요. — @krrong ([PR #131](junseo511/131-2단계-로또.md))
|
|
85
|
+
|
|
86
|
+
### 6. **`Money`/`PurchaseAmount`/`Profit` 원시값 미포장 또는 wrapping만**
|
|
87
|
+
|
|
88
|
+
**증상:** Money를 Int로 그대로, 또는 wrapping했지만 `.value` 노출 후 Controller가 `Money.value / 1000` 같이 계산.
|
|
89
|
+
|
|
90
|
+
**예시 PR:** [#15](hyunji1203/15-1단계-로또.md), [#41](krrong/41-2단계-로또.md), [#72](Yunseok-Nam/72-1단계-로또.md), [#102](aprilgom/102-2단계-로또.md), [#136](gahyunkim/136-2단계-로또.md), [#10](sujin9/10-1단계-로또.md), [#66](s6m1n/66-1단계-로또.md)
|
|
91
|
+
|
|
92
|
+
**해법:**
|
|
93
|
+
- `class Money(val value: Int) { fun numberOfLottos(): Int = value / LOTTO_PRICE }`
|
|
94
|
+
- 또는 `class Money(val value: Int) : Comparable<Money>` + operator overloading
|
|
95
|
+
- value class로 인라인 + 동치성
|
|
96
|
+
|
|
97
|
+
### 7. **수동/자동 로또 분리 vs 통합** (2단계 핵심 결정)
|
|
98
|
+
|
|
99
|
+
**증상:** 2단계 수동 로또 추가 시 `ManualLottoGenerator` + `RandomLottoGenerator`를 별도 처리 + Controller에서 분기.
|
|
100
|
+
|
|
101
|
+
**예시 PR:** [#85](kkosang/85-2단계-로또.md), [#99](songpink/99-2단계-로또.md), [#34](DYGames/34-2단계-로또.md), [#147](cucumber99/147-2단계-로또.md), [#92](Hevton/92-2단계-로또.md), [#91](sh1mj1/91-2단계-로또.md), [#150](wondroid-world/150-2단계-로또.md), [#83](jaeyeongjo/83-2단계-로또.md), [#137](giovannijunseokim/137-2단계-로또.md)
|
|
102
|
+
|
|
103
|
+
**해법 패턴:**
|
|
104
|
+
```kotlin
|
|
105
|
+
fun interface LottoGenerator { fun generate(): Lotto }
|
|
106
|
+
class RandomLottoGenerator(...) : LottoGenerator { ... }
|
|
107
|
+
class ManualLottoGenerator(val numbers: List<Int>) : LottoGenerator { ... }
|
|
108
|
+
|
|
109
|
+
class LottoMachine {
|
|
110
|
+
fun purchase(generators: List<LottoGenerator>): Lottos = ...
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
→ Strategy 패턴 + 통합 인터페이스.
|
|
115
|
+
|
|
116
|
+
### 8. **`Constants.kt` / `LottoConstants` / `Constant` god-folder**
|
|
117
|
+
|
|
118
|
+
**증상:** 모든 상수를 한 파일에 모음.
|
|
119
|
+
|
|
120
|
+
**예시 PR:** [#85](kkosang/85-2단계-로또.md), [#83](yujamint/...)... wait, racingcar의 예시군. Let me adjust.
|
|
121
|
+
|
|
122
|
+
lotto PR: [#85](kkosang/85-2단계-로또.md), [#118](wondroid-world/118-1단계-로또.md), [#74](kimhm0728/74-1단계-로또.md), [#111](donghyun81/111-1단계-로또.md), [#78](gaeun5744/78-1단계-로또.md), [#62](ii2001/62-1단계-로또.md), [#27](2chang5/27-1단계-로또.md), [#121](HamBeomJoon/121-1단계-로또.md), [#9](whk06061/9-1단계-로또.md)
|
|
123
|
+
|
|
124
|
+
**해법:** 도메인 객체가 자기 상수 소유 (`LottoNumber.MIN`, `Lotto.SIZE`, `Money.LOTTO_PRICE`).
|
|
125
|
+
|
|
126
|
+
### 9. **테스트만을 위해 public**
|
|
127
|
+
|
|
128
|
+
**예시 PR:** [#19](krrong/19-1단계-로또.md), [#113](hwannow/113-1단계-로또.md), [#116](cucumber99/116-1단계-로또.md), [#41](whk06061/41-2단계-로또.md) (racingcar에서도 동일).
|
|
129
|
+
|
|
130
|
+
**해법:** 도메인 재설계. internal 가시성. 또는 *통합 테스트*로 외부 행위 검증.
|
|
131
|
+
|
|
132
|
+
### 10. **자동/수동 패턴 불일치 + 통합 추상화 부재** (2단계)
|
|
133
|
+
|
|
134
|
+
**증상:** 자동은 인터페이스 통한 호출, 수동은 Controller가 직접 처리 또는 다른 시그니처.
|
|
135
|
+
|
|
136
|
+
**예시 PR:** [#83](jaeyeongjo/83-2단계-로또.md), [#149](oungsi2000/149-2단계-로또.md), [#34](DYGames/34-2단계-로또.md), [#92](Hevton/92-2단계-로또.md)
|
|
137
|
+
|
|
138
|
+
**해법:** 같은 *발급 협력 인터페이스* → 다른 구현체.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 리뷰어들이 반복적으로 하는 말 (lotto 특화)
|
|
143
|
+
|
|
144
|
+
### 🎯 "객체에게 메시지를 던져라" (Tell Don't Ask)
|
|
145
|
+
|
|
146
|
+
> 몇개가 일치하는지 요청해서 결과를 받아오도록 해보세요. 객체지향 프로그래밍에서는 이 개념을 메시지를 보낸다 라고 표현합니다. — @laco-dev
|
|
147
|
+
|
|
148
|
+
**출현 PR:** [#19](krrong/19-1단계-로또.md), [#26](briandr97/26-1단계-로또.md), [#18](s9hn/18-1단계-로또.md), [#107](gahyunkim/107-1단계-로또.md), [#137](giovannijunseokim/137-2단계-로또.md), [#128](jiyuneel/128-1단계-로또.md), [#144](jiyuneel/144-2단계-로또.md), [#95](haeum808/95-2단계-로또.md), [#52](2chang5/52-2단계-로또.md)
|
|
149
|
+
|
|
150
|
+
### 🎯 "View → Domain 의존은 OK"
|
|
151
|
+
|
|
152
|
+
> domain 레이어는 view를 알면 안되지만, view에서는 domain을 알기 때문에 저는 InputView에서 바로 domain 모델을 만드는 방법을 선호하는 편입니다. — @laco-dev ([PR #27](2chang5/27-1단계-로또.md))
|
|
153
|
+
|
|
154
|
+
→ Controller가 String parsing 안 하고 도메인 객체 받기. View가 변환 책임.
|
|
155
|
+
|
|
156
|
+
### 🎯 "1000원 1장 = 가격은 누구의 책임?"
|
|
157
|
+
|
|
158
|
+
> 로또 한장의 가격이 1,000원이라는 것을 이 곳에서 결정하는게 적절할까? — @laco-dev ([PR #124](chanho0908/124-1단계-로또.md))
|
|
159
|
+
|
|
160
|
+
→ Lotto/Money 책임 토론. 미래 다중 가격 정책 시뮬레이션.
|
|
161
|
+
|
|
162
|
+
### 🎯 "LottoNumber 캐싱 (flyweight)"
|
|
163
|
+
|
|
164
|
+
> 동일한 숫자는 한 번만 만들고 재활용해 볼 수 있을까요? 1억개의 티켓을 만들더라도, 번호는 45개만 활용할 수 있도록이요. — @malibinYun ([PR #105](m6z1/105-1단계-로또.md))
|
|
165
|
+
|
|
166
|
+
**출현 PR:** [#2](DYGames/2-1단계-로또.md), [#4](re4rk/4-1단계-로또.md), [#67](haeum808/67-1단계-로또.md), [#105](m6z1/105-1단계-로또.md), [#106](giovannijunseokim/106-1단계-로또.md), [#96](JoYehyun99/96-2단계-로또.md), [#136](gahyunkim/136-2단계-로또.md)
|
|
167
|
+
|
|
168
|
+
### 🎯 "수동은 어디서 발행?"
|
|
169
|
+
|
|
170
|
+
> 수동은 어디서 발행하는 것일까요? 이 질문의 의도는 정말 어디서 발행하는지를 묻는 것이 아닌, 자동과 수동의 관계와 현재의 구조 설계에 대한 질문입니다. — @laco-dev
|
|
171
|
+
|
|
172
|
+
**출현 PR:** [#94](kimhm0728/94-2단계-로또.md), [#103](s6m1n/103-2단계-로또.md), [#99](songpink/99-2단계-로또.md), [#100](Hogu59/100-2단계-로또.md)
|
|
173
|
+
|
|
174
|
+
### 🎯 "거스름돈, 1000원 미만 입력 = UX 시나리오"
|
|
175
|
+
|
|
176
|
+
> 1500원과 같은 나머지 금액이 발생해도 별다른 안내가 이루어지지 않고 있습니다. — @KwonDae ([PR #145](tobae-time/145-2단계-로또.md))
|
|
177
|
+
|
|
178
|
+
→ 명세 외 시나리오 검증.
|
|
179
|
+
|
|
180
|
+
### 🎯 "Map<Rank, Int>도 wrapping 후보"
|
|
181
|
+
|
|
182
|
+
> Map으로 리턴되는 값들을 WinningXXX or Lottos 등으로 묶어보는 것은 어떨까 라는 생각이 듭니다 — @Gyuil-Hwnag ([PR #123](rosemin928/123-1단계-로또.md))
|
|
183
|
+
|
|
184
|
+
**출현 PR:** [#19](krrong/19-1단계-로또.md), [#16](ippnsj/16-1단계-로또.md), [#99](songpink/99-2단계-로또.md), [#123](rosemin928/123-1단계-로또.md)
|
|
185
|
+
|
|
186
|
+
→ Map은 *임시 자료구조*. 도메인 의미가 있으면 객체로.
|
|
187
|
+
|
|
188
|
+
### 🎯 "이전 미션 (racingcar) 학습 적용"
|
|
189
|
+
|
|
190
|
+
> 로또에서 랜덤 테스트를 구성하지 못한다는 의미는, 자동차 경주에서의 랜덤 테스트를 가능하게 하는 방법에 대해... — @malibinYun ([PR #149](oungsi2000/149-2단계-로또.md))
|
|
191
|
+
|
|
192
|
+
**출현 PR:** [#62](ii2001/62-1단계-로또.md), [#13](otter66/13-1단계-로또.md), [#149](oungsi2000/149-2단계-로또.md), [#127](Junyoung-WON/127-2단계-로또.md)
|
|
193
|
+
|
|
194
|
+
→ racingcar의 NumberGenerator 추상화를 lotto에 재적용.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 조영호님 강의 토픽과의 매핑 (lotto)
|
|
199
|
+
|
|
200
|
+
### `god-object`
|
|
201
|
+
|
|
202
|
+
- **Controller god-controller**: [#85](kkosang/85-2단계-로또.md), [#15](hyunji1203/15-1단계-로또.md), [#106](giovannijunseokim/106-1단계-로또.md), [#41](krrong/41-2단계-로또.md)
|
|
203
|
+
- **`Statistics`/`Bank`/`Judgement`/`Analyzer` god-object**: [#19](krrong/19-1단계-로또.md), [#59](jaeyeongjo/59-1단계-로또.md), [#26](briandr97/26-1단계-로또.md), [#18](s9hn/18-1단계-로또.md), [#2](DYGames/2-1단계-로또.md)
|
|
204
|
+
- **`World` god-naming**: [#2](DYGames/2-1단계-로또.md), [#3](inseonyun/3-1단계-로또.md), [#27](2chang5/27-1단계-로또.md)
|
|
205
|
+
|
|
206
|
+
### `feature-envy`
|
|
207
|
+
|
|
208
|
+
- WinningLotto의 numbers를 외부에서 꺼내 비교: 거의 모든 1단계 PR
|
|
209
|
+
- `getNumbers()`/`getValue()` 노출 후 외부 로직: [#46](Choisehyeon/46-...)... actually racingcar. Lotto는 [#18](s9hn/18-1단계-로또.md), [#19](krrong/19-1단계-로또.md), [#26](briandr97/26-1단계-로또.md), [#62](ii2001/62-1단계-로또.md)
|
|
210
|
+
|
|
211
|
+
### `non-newable` / Random 의존 분리
|
|
212
|
+
|
|
213
|
+
- Controller/LottoMachine이 Random 직접 호출: [#85](kkosang/85-2단계-로또.md), [#99](songpink/99-2단계-로또.md), [#62](ii2001/62-1단계-로또.md), [#105](m6z1/105-1단계-로또.md), [#108](yrsel/108-1단계-로또.md), [#117](jinuemong/117-2단계-로또.md)
|
|
214
|
+
|
|
215
|
+
### `Tell-Don't-Ask`
|
|
216
|
+
|
|
217
|
+
- `winningLotto.match(lotto): Rank` 패턴: [#19](krrong/19-1단계-로또.md), [#26](briandr97/26-1단계-로또.md), [#107](gahyunkim/107-1단계-로또.md), [#137](giovannijunseokim/137-2단계-로또.md), [#52](2chang5/52-2단계-로또.md), [#144](jiyuneel/144-2단계-로또.md)
|
|
218
|
+
|
|
219
|
+
### `책임-역할-협력` (조영호 "객체지향의 사실과 오해" 3요소)
|
|
220
|
+
|
|
221
|
+
- 체스 비유: 유저 → 체스판 → 말 (lotto: 구매자 → LottoMachine → Lotto) — [#125](Hogu59/125-2단계-로또.md) (racingcar에서도 동일)
|
|
222
|
+
- 현실 모델링 — 로또 기계는 돈을 받고 로또를 *준다*, 소유 X: [#135](Leeyerin0210/135-2단계-로또.md), [#113](hwannow/113-1단계-로또.md)
|
|
223
|
+
|
|
224
|
+
### `의존 방향`
|
|
225
|
+
|
|
226
|
+
- Validator가 OutputView 의존: lotto에도 동일
|
|
227
|
+
- 인터페이스는 domain, 구현체는 data/infra: 모든 2단계 PR의 진화 방향
|
|
228
|
+
|
|
229
|
+
### `일급 컬렉션`
|
|
230
|
+
|
|
231
|
+
- `Lottos` 일급 컬렉션 표준: [#46](Choisehyeon/...)... 다시 racingcar. Lotto에는 [#16](ippnsj/16-1단계-로또.md), [#80](dpcks0509/80-1단계-로또.md), [#109](Leeyerin0210/109-1단계-로또.md), [#122](ijh1298/122-1단계-로또.md)
|
|
232
|
+
- delegation으로 일급 컬렉션 만든 후 *불필요 메서드 노출*: [#4](re4rk/4-1단계-로또.md), [#47](Choisehyeon/47-2단계-로또.md), [#8](ki960213/8-1단계-로또.md)
|
|
233
|
+
|
|
234
|
+
### `원시 강박 (Primitive Obsession)`
|
|
235
|
+
|
|
236
|
+
- **`Int` 로또 번호 → `LottoNumber`** — 거의 모든 1단계 PR
|
|
237
|
+
- **`Int` 금액 → `Money/PurchaseAmount`** — 다수 PR
|
|
238
|
+
- **`Double` 수익률 → `ProfitRate`** — [#15](hyunji1203/15-1단계-로또.md), [#16](ippnsj/16-1단계-로또.md), [#68](Hogu59/68-1단계-로또.md), [#123](rosemin928/123-1단계-로또.md)
|
|
239
|
+
|
|
240
|
+
### `명명 설계`
|
|
241
|
+
|
|
242
|
+
- **모호한 이름 god-naming**: `Bank`, `World`, `Veilfier`(오타), `Validator`, `Constant`, `Helper`, `Calculator`, `Analyzer` 등 lotto 전반
|
|
243
|
+
- **함수명 = 도메인 어휘**: `compare()` → `match()`, `yield()` → `profitRate()`
|
|
244
|
+
- **`Evaluator.evaluate()` 동어반복** — [#75](sh1mj1/75-1단계-로또.md), [#8](ki960213/8-1단계-로또.md)
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 단계별 학습 곡선 (lotto)
|
|
249
|
+
|
|
250
|
+
### 1단계 흔한 실수
|
|
251
|
+
|
|
252
|
+
- `Constants.kt` 한 파일에 모든 상수
|
|
253
|
+
- `Validator`/`Util`/`Helper` 모호한 이름
|
|
254
|
+
- Controller가 split + validation + 비교 직접
|
|
255
|
+
- `Lotto`가 `List<Int>` 그대로 노출
|
|
256
|
+
- `Rank` enum에 UI 표현 (`description`)
|
|
257
|
+
- 검증을 어디서 할지 결정 못함
|
|
258
|
+
- `Statistics`/`Analyzer` god-object로 모든 비교 수행
|
|
259
|
+
- Random 직접 의존 → 테스트 불가
|
|
260
|
+
- `Money.ZERO`가 Int 반환 (값 객체 의미 잃음)
|
|
261
|
+
- 테스트 함수명이 "정상 동작한다" 류
|
|
262
|
+
|
|
263
|
+
### 2단계에서 부각되는 이슈
|
|
264
|
+
|
|
265
|
+
- **수동/자동 로또 통합** — Strategy 인터페이스 + 두 구현체
|
|
266
|
+
- **`Map<Rank, Int>` wrapping** — 통계 객체로
|
|
267
|
+
- **`LottoNumber` 캐싱 (flyweight)** — 1억 티켓 시뮬레이션
|
|
268
|
+
- **1단계 피드백 *지속 검증*** — 검증 위치 재조정, 일급 컬렉션 의미
|
|
269
|
+
- **거스름돈/예외 흐름** — UX + 도메인 명세
|
|
270
|
+
- **자가 의문 PR 본문 명시** — 학생 사고의 가시화
|
|
271
|
+
- **이전 라운드 코멘트 링크로 변경 의도 명시** — [#129](chanho0908/129-2단계-로또.md), [#151](m6z1/151-2단계-로또.md)
|
|
272
|
+
|
|
273
|
+
### 가장 잘된 학습 곡선의 시그니처
|
|
274
|
+
|
|
275
|
+
1. 1단계 피드백을 즉시 흡수
|
|
276
|
+
2. 자가 검토로 다음 단계에서 재조정
|
|
277
|
+
3. 결정 *이유*를 PR 본문에 명시 (`이전 PR의 코멘트 링크`)
|
|
278
|
+
4. 더 깊은 자가 의문 던지기
|
|
279
|
+
|
|
280
|
+
가장 좋은 사례 PR:
|
|
281
|
+
- [#161](moondev03/...) ([racingcar 학습 곡선과 유사한 형태])
|
|
282
|
+
- [#115](sh1mj1/115-2단계-로또.md) — racingcar에서 칭찬받은 학생이 lotto에서도 깊은 사고
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## racingcar vs lotto — 도메인 비교
|
|
287
|
+
|
|
288
|
+
### 공통 안티패턴 (두 미션 모두)
|
|
289
|
+
|
|
290
|
+
- god-controller
|
|
291
|
+
- 외부 비교자 (Statistics/Analyzer/Bank/Determiner)
|
|
292
|
+
- 매직넘버 + Constants god-folder
|
|
293
|
+
- Random 직접 의존
|
|
294
|
+
- 모호한 이름 (Manager/Util/Helper/Validator)
|
|
295
|
+
- enum에 UI 표현 누수
|
|
296
|
+
- 테스트만 위한 public
|
|
297
|
+
|
|
298
|
+
### lotto 특화 안티패턴
|
|
299
|
+
|
|
300
|
+
- **`LottoNumber` 도메인 누락** — racingcar의 Position과 비슷하지만 *고정 범위*로 flyweight 패턴 적용 가능
|
|
301
|
+
- **`Map<Rank, Int>` wrapping 회피** — 등수별 집계 자료구조 wrapping
|
|
302
|
+
- **수동/자동 로또 통합** (2단계) — racingcar에 없던 패턴
|
|
303
|
+
- **`Money`/`Profit`/`Yield` 금융 도메인** — racingcar에 없음
|
|
304
|
+
- **`Rank.matchBonus` 필드 위치** — 2등이 특수 케이스인 enum 설계 문제
|
|
305
|
+
|
|
306
|
+
### lotto에서 *처음으로* 학습되는 패턴
|
|
307
|
+
|
|
308
|
+
- **flyweight** (LottoNumber 캐싱)
|
|
309
|
+
- **operator overloading** (Money + Money)
|
|
310
|
+
- **sealed class** (GameState, Result)
|
|
311
|
+
- **value class** (LottoNumber, Money)
|
|
312
|
+
- **확장 시나리오 압박** ("1억 티켓이면?", "다국어 차?" 같은 시뮬레이션)
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 부록: 가장 강력한 리뷰어 명언 10선 (lotto)
|
|
317
|
+
|
|
318
|
+
1. *"로또에서 사용하는 숫자는 결국 Int 타입이라고 볼 수 있겠습니다. 그렇다면 외부에서 가져온 이 숫자들이 로또 번호라는 것을 어떻게 알 수 있을까요?"* — @laco-dev on [#19](krrong/19-1단계-로또.md)
|
|
319
|
+
|
|
320
|
+
2. *"몇개가 일치하는지 요청해서 결과를 받아오도록 해보세요. 객체지향 프로그래밍에서는 이 개념을 메시지를 보낸다 라고 표현합니다."* — @laco-dev on [#19](krrong/19-1단계-로또.md)
|
|
321
|
+
|
|
322
|
+
3. *"단순하게 도메인을 출력하는 것이 UI의 역할이기 때문이에요. 도메인 없이 그냥 출력만 한다면 뭘 출력할건데? 라는 생각을 할 수 있겠죠."* — @laco-dev on [#124](chanho0908/124-1단계-로또.md)
|
|
323
|
+
|
|
324
|
+
4. *"1억개의 티켓을 만들더라도, 번호는 45개만 활용할 수 있도록이요"* — @malibinYun on [#105](m6z1/105-1단계-로또.md)
|
|
325
|
+
|
|
326
|
+
5. *"로또 한장의 가격이 1,000원이라는 것을 이 곳에서 결정하는게 적절할까? A 상점에서는 1,000원 B 상점에서는 2,000원에 팔아야 한다면...?"* — @laco-dev on [#124](chanho0908/124-1단계-로또.md)
|
|
327
|
+
|
|
328
|
+
6. *"로또를 발급하는 기계가 수동 티켓을 미리 가지고 있어야 할까요?"* — @malibinYun on [#34](DYGames/34-2단계-로또.md)
|
|
329
|
+
|
|
330
|
+
7. *"이 객체는 단순히 값을 가지고있는 것 외에 별다른 역할을 가지고 있지 않고 있네요."* — @malibinYun on [#62](ii2001/62-1단계-로또.md)
|
|
331
|
+
|
|
332
|
+
8. *"2단계 요구사항을 모두 컨트롤러에서 반영한 느낌이에요. 마치 자동차 경주와 1단계에서 배운 내용을 다 잊어버린 것처럼 보여요."* — @krrong on [#131](junseo511/131-2단계-로또.md)
|
|
333
|
+
|
|
334
|
+
9. *"View는 멍청해야 한다. 근데 View가 어느정도까지 멍청해야 할까요?"* — @lee-ji-hoon on [#132](hwannow/132-2단계-로또.md)
|
|
335
|
+
|
|
336
|
+
10. *"단지 toString을 오버라이드 하기 위한 일급 컬렉션 사용에 대해 어떻게 생각하시나요?"* — student self-question on [#122](ijh1298/122-1단계-로또.md)
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 통계
|
|
341
|
+
|
|
342
|
+
- **분석된 PR:** 141개
|
|
343
|
+
- **분석된 reviewee:** 71명
|
|
344
|
+
- **고유 reviewer:** ~20명 (laco-dev, Gyuil-Hwnag, KwonDae, malibinYun, vagabond95, hyemdooly, BeokBeok, krrong, ghojeong 등)
|
|
345
|
+
- **단계별:** 1단계 ≈ 50 PR, 2단계 ≈ 90 PR (리팩토링 포함)
|
|
346
|
+
- **수치 비교:** racingcar (133 PR, 77 reviewees) → lotto (141 PR, 71 reviewees). 도메인 깊이 +.
|
|
347
|
+
|
|
348
|
+
이 코퍼스는 lotto 도메인 (금융 + 통계 + 등수)에서의 OOP 학습 곡선을 담는다. racingcar에서 배운 패턴을 lotto에서 *어떻게 재적용*하는지, *새 도메인 (Money, Rank)*에서 어떻게 *원시 강박을 탈출*하는지, *2단계 수동 로또*에서 *Strategy 패턴이 어떻게 자연스럽게 등장*하는지의 흐름이 보인다.
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## oh-my-oop MCP 룰로 코드화된 lotto 안티패턴 (2026-05-23)
|
|
353
|
+
|
|
354
|
+
이 코퍼스에서 도출한 안티패턴 중 5개를 MCP validate 룰로 추가, 함께 트레이드오프 heuristic 4종을 도입.
|
|
355
|
+
|
|
356
|
+
**신규 validate 룰 5개** (총 16개):
|
|
357
|
+
- `empty-object-external-fill` — PR [#14](Choisehyeon/14-1단계-로또.md) @malibinYun
|
|
358
|
+
- `collection-wrapper-without-behavior` — PR [#144](jiyuneel/144-2단계-로또.md) @krrong
|
|
359
|
+
- `primitive-wrapper-without-invariant` — PR [#58](junjange/58-1단계-로또.md) @junjange, [#77](hxeyexn/77-1단계-로또.md) @hxeyexn
|
|
360
|
+
- `strategy-default-param-pollution` — PR [#144](jiyuneel/144-2단계-로또.md) @krrong
|
|
361
|
+
- `function-decomposition-excess` — lotto 일반 (@krrong 류 코멘트)
|
|
362
|
+
|
|
363
|
+
**신규 트레이드오프 heuristic 4종** (typed 8개 + `free_form` = 총 9종):
|
|
364
|
+
- `value_object_shape` — value class vs data class vs class
|
|
365
|
+
- `strategy_or_policy` — Strategy 인터페이스 vs Policy/Lambda
|
|
366
|
+
- `error_handling` — exception vs Result/sealed class
|
|
367
|
+
- `collection_shape` — 일급 컬렉션 vs `Map<K,V>` 노출 vs DTO
|
|
368
|
+
|
|
369
|
+
룰 evidence/remedy에는 위 PR의 *대표 인용*이 발췌되어 있어, MCP가 사용자 설계를 검증할 때 lotto 코퍼스의 학습 결과가 직접 작동한다. 상세 매핑은 `../../MCP_STRUCTURE.md` §3, `PROGRESS.md` "MCP에 반영된 lotto 안티패턴" 섹션 참조.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# PR #25 — [베르] 1단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@SeongHoonC](https://github.com/SeongHoonC)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/25
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @vagabond95 (스카이)
|
|
7
|
+
- **라인 코멘트:** 17
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`LottoBunch` 일급 컬렉션**.
|
|
12
|
+
- **`Rank` enum + `matchCount` + `prizeMoney`** — 응집된 등수 메타데이터.
|
|
13
|
+
- **`Bank.getRank`, `Bank.getYieldRate`** — *통계 책임*을 별도 객체.
|
|
14
|
+
- **후속 라운드 적극 반영** — `BonusResult` enum 도입, `LottoBunch`가 팩토리 직접 사용, `toString` View 이동.
|
|
15
|
+
|
|
16
|
+
## 못한 점 (설계 관점)
|
|
17
|
+
|
|
18
|
+
### 1. Controller가 `lottoes` *직접 만듦* — *멍청한 중계자* 원칙
|
|
19
|
+
|
|
20
|
+
```kotlin
|
|
21
|
+
fun getLottoBunch(purchaseCount: Int): LottoBunch {
|
|
22
|
+
val lottoes = mutableListOf<Lotto>()
|
|
23
|
+
repeat(purchaseCount) {
|
|
24
|
+
lottoes.add(lottoFactory.createLotto()) // ⚠ Controller가 도메인 조립
|
|
25
|
+
}
|
|
26
|
+
val lottoBunch = LottoBunch(lottoes)
|
|
27
|
+
.
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
리뷰어: "lottoes를 *LottoBunch에서 스스로 만들어 주도록 리팩토링*해 보는 것은 어떨까요? *컨트롤러는 세부 도메인 요구사항은 알지 못하고, model과 view 사이의 중계 역할만 하는 다소 멍청하고 게으른 상태*를 유지해 봐도 좋겠어요." 학생: "*LottoBunch에 팩토리를 넘겨주어 내부에서 value를 직접 생산*하도록 변경하였습니다!" — *멍청한 Controller* 표현은 [Smart Controller Anti-Pattern] 카운터.
|
|
32
|
+
|
|
33
|
+
### 2. `Validator` 이름 모호 — *책임 비대 신호*
|
|
34
|
+
|
|
35
|
+
```kotlin
|
|
36
|
+
object Validator {
|
|
37
|
+
const val ERROR_NOT_NUMBER = "."
|
|
38
|
+
const val ERROR_INPUT_HANDLER = "."
|
|
39
|
+
fun isNumber(value: String): Boolean = Pattern.matches("^[0-9]+$", value)
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
리뷰어: "*무엇을 검증*하는지에 대한 구체적인 내용이 들어가면 좋을 것 같아요. *이름이 모호할수록 어떠한 역할이든 수행이 가능*하고 *이는 곧 코드를 비대하게 만들어 주는 신호*가 될 수 있다고 생각해요." + "*extension function*을 활용해 봐도 좋겠어요!" 학생: "*String.toIntOrNull()을 사용*하여 변경하였습니다! 컨트롤러에서 검증하지 않고 *InputView에서 정수인지 체크하고 가공 후 컬렉션 혹은 값을 반환*하는 형태로 변경하였습니다!" — *Validator god-object*는 racing/lotto 미션마다 반복되는 안티패턴.
|
|
44
|
+
|
|
45
|
+
### 3. `Lotto` 도메인이 *정렬* + *toString* 표현 관여
|
|
46
|
+
|
|
47
|
+
```kotlin
|
|
48
|
+
class Lotto(lottoNumbers: List<LottoNumber>) {
|
|
49
|
+
val lottoNumbers: List<LottoNumber> = lottoNumbers.sortedBy { it.value } // ⚠ 정렬
|
|
50
|
+
|
|
51
|
+
override fun toString(): String = lottoNumbers.map { lottoNumber -> lottoNumber.value }.toString() // ⚠ 표현
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
리뷰어: "*도메인 레벨에서 정렬 연산을 해 줘야 할 필요성*이 있을까요?" + "*도메인에서 '어떻게 표현되는지'에 대해 다룰 필요*가 있을까요~?" + "해당 도메인 모델 외에 *다른 곳에서의 toString() 역시 동일하게 참고* 부탁드립니다 :)" 학생: "정렬 연산을 *view에서 하도록 변경*했습니다!" + "도메인에선 *결과만 넘겨주고 view에서 형식을 만들어내도록* 수정하였습니다!" — *도메인의 순수성*: *순서, 포맷, 표현*은 *View*.
|
|
56
|
+
|
|
57
|
+
### 4. `Rank.convertToGrade`에 *분기 if* — *유사 등급* 추가 시 변경 위험
|
|
58
|
+
|
|
59
|
+
```kotlin
|
|
60
|
+
companion object {
|
|
61
|
+
fun convertToGrade(matchCount: Int, bonusMatch: Boolean): Rank {
|
|
62
|
+
if (matchCount == 5) { // ⚠ SECOND/THIRD 분기를 매번 if
|
|
63
|
+
.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
리뷰어: "*특정 등수에 대한 조건문 없이 일관된 로직으로 등수를 구해볼 수 있을까요*? *현재와 같은 구조는 보너스 번호가 다른 등수에도 추가되는 요구사항이 들어오면 계속 if문이 추가될 수밖에 없*을 것 같아요." 학생: "*BonusResult enum class를 만들어 세 가지 분기*를 만들고 *BONUS_MATCH일 때 참으로 조건을 변경*하였습니다!" 후속 리뷰어: "*bonusResult 도입 시도 좋습니다*!" — *if 분기*를 *enum 매칭*으로.
|
|
70
|
+
|
|
71
|
+
### 5. 매직 넘버 `2000000000` — 가독성
|
|
72
|
+
|
|
73
|
+
```kotlin
|
|
74
|
+
FIRST(6, 2000000000),
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
리뷰어 (suggestion 블록):
|
|
78
|
+
```kotlin
|
|
79
|
+
FIRST(6, 2_000_000_000),
|
|
80
|
+
```
|
|
81
|
+
"*언더스코어를 활용*하면 조금 더 가독성을 확보할 수 있습니다 :)" — Kotlin 숫자 리터럴 *underscore separator*.
|
|
82
|
+
|
|
83
|
+
### 6. `Any` 반환 + *타입 캐스팅* — 제네릭 권장
|
|
84
|
+
|
|
85
|
+
```kotlin
|
|
86
|
+
private fun inputErrorHandler(error: Throwable, repeatFunction: () -> Any): Any {
|
|
87
|
+
.
|
|
88
|
+
}
|
|
89
|
+
private fun getPurchaseMoney(): PurchaseMoney {
|
|
90
|
+
return runCatching { PurchaseMoney(.) }.getOrElse { error ->
|
|
91
|
+
inputErrorHandler(error, ::getPurchaseMoney) as PurchaseMoney // ⚠ 캐스팅
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
리뷰어: "Any를 리턴할 경우 *매번 타입 캐스팅이 요구*되므로 *제네릭을 활용*해 보는 것은 어떨까요?" — `<T> inputErrorHandler(error: Throwable, repeatFunction: () -> T): T`.
|
|
97
|
+
|
|
98
|
+
## 리뷰어 의견 요지
|
|
99
|
+
|
|
100
|
+
- **Controller = *멍청한 중계자*** — 도메인 세부 모르게.
|
|
101
|
+
- **`Validator` 같은 *god 이름* 회피** — *무엇을* 검증인지 이름에.
|
|
102
|
+
- **도메인은 *정렬/포맷/표현* 무관**.
|
|
103
|
+
- **`if` 분기 → *enum 매칭***.
|
|
104
|
+
- **숫자 리터럴 underscore**.
|
|
105
|
+
- **`Any` + 캐스팅 → *제네릭***.
|
|
106
|
+
|
|
107
|
+
- **대표 인용:**
|
|
108
|
+
> 컨트롤러는 세부 도메인 요구사항은 알지 못하고, model과 view 사이의 중계 역할만 하는 *다소 멍청하고 게으른 상태*를 유지해 봐도 좋겠어요.
|
|
109
|
+
> — @vagabond95 on `src/main/kotlin/lotto/LottoController.kt`
|
|
110
|
+
|
|
111
|
+
> 이름이 모호할수록 *어떠한 역할이든 수행이 가능*하고 이는 곧 *코드를 비대하게 만들어 주는 신호*가 될 수 있다고 생각해요.
|
|
112
|
+
> — @vagabond95 on `src/main/kotlin/lotto/domain/Validator.kt`
|
|
113
|
+
|
|
114
|
+
> 현재와 같은 구조는 *보너스 번호가 다른 등수에도 추가되는 요구사항이 들어오면 계속 if문이 추가*될 수밖에 없을 것 같아요.
|
|
115
|
+
> — @vagabond95 on `src/main/kotlin/lotto/constant/Rank.kt`
|
|
116
|
+
|
|
117
|
+
> 도메인에서 '어떻게 표현되는지'에 대해 다룰 필요가 있을까요~?
|
|
118
|
+
> — @vagabond95 on `src/main/kotlin/lotto/domain/Lotto.kt`
|
|
119
|
+
|
|
120
|
+
## 얻은 교훈
|
|
121
|
+
|
|
122
|
+
- **Controller는 *얇은 중계자*** — *로또 N장 만들기*도 *LottoBunch가 스스로*. Controller가 도메인 조립을 알면 *View 교체* 시 도메인 코드도 변경.
|
|
123
|
+
- **`Validator` god-object 회피** — *무엇을 검증*하는지 *모호한 이름*은 *어떤 책임이든 흡수*. 검증은 *해당 도메인 객체의 init*에.
|
|
124
|
+
- **도메인은 *정렬/포맷/표현* 무관** — 도메인은 *값*만, *어떤 순서/어떻게 보일지*는 View.
|
|
125
|
+
- **`if` 분기 → *enum 속성 매칭*** — `Rank`에 `bonusResult: BonusResult`를 두면 *find first matching* 한 줄.
|
|
126
|
+
- **숫자 리터럴 `_` 구분자** — `2_000_000_000`이 `2000000000`보다 *자릿수* 즉시 파악.
|
|
127
|
+
- **`Any` 반환 + 캐스팅 = 안티패턴** — *제네릭*으로 *컴파일 타임 타입 안전*.
|
|
128
|
+
- **`runCatching. getOrElse { recursive_call }`** — 입력 재시도의 일관 패턴.
|
|
129
|
+
- **이전 라운드 응답을 명시** — *팩토리 LottoBunch 위임*, *toString View 이동*, *BonusResult 도입* 같은 응답 메시지가 *대화 흐름*을 보여줌.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# PR #37 — [베르] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@SeongHoonC](https://github.com/SeongHoonC)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/37
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @vagabond95
|
|
7
|
+
- **라인 코멘트:** 11
|
|
8
|
+
|
|
9
|
+
## 핵심 지적
|
|
10
|
+
|
|
11
|
+
### 1. `ErrorHandler` — function vs value
|
|
12
|
+
|
|
13
|
+
> function 보다는 value 에 가깝지 않을까요?
|
|
14
|
+
|
|
15
|
+
### 2. `repeat` 이름의 혼동
|
|
16
|
+
|
|
17
|
+
```kotlin
|
|
18
|
+
fun repeat(.) {. }
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> 반복이 된다는 것은 '외부'의 기준이지, 현재 함수 내부에서는 반복작업이 이루어지지 않으므로 repeat 이라는 이름은 혼동을 줄 수 있지 않을까요?
|
|
22
|
+
|
|
23
|
+
→ 함수 이름은 *함수가 무엇을 하는지*이지 *호출자가 어떻게 쓰는지*가 아님.
|
|
24
|
+
|
|
25
|
+
## 얻은 교훈
|
|
26
|
+
|
|
27
|
+
- **함수명 = 함수 내부 행위**. `repeat`은 함수 내부에서 반복할 때만 의미.
|