oh-my-oop 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_STRUCTURE.md +301 -0
- package/README.md +167 -0
- package/SCOPE.md +27 -0
- package/dist/application/discovery.d.ts +133 -0
- package/dist/application/discovery.js +62 -0
- package/dist/application/discovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/collaborators.d.ts +2 -0
- package/dist/domain/collaborators.js +26 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/ids.d.ts +4 -0
- package/dist/domain/ids.js +23 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/model.d.ts +71 -0
- package/dist/domain/model.js +2 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/schemas.d.ts +213 -0
- package/dist/domain/schemas.js +79 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/stereotypes.d.ts +7 -0
- package/dist/domain/stereotypes.js +65 -0
- package/dist/domain/stereotypes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/io/classStore.d.ts +9 -0
- package/dist/io/classStore.js +39 -0
- package/dist/io/classStore.js.map +1 -0
- package/dist/io/collaborationStore.d.ts +7 -0
- package/dist/io/collaborationStore.js +32 -0
- package/dist/io/collaborationStore.js.map +1 -0
- package/dist/io/design.d.ts +3 -0
- package/dist/io/design.js +22 -0
- package/dist/io/design.js.map +1 -0
- package/dist/io/designIndex.d.ts +6 -0
- package/dist/io/designIndex.js +49 -0
- package/dist/io/designIndex.js.map +1 -0
- package/dist/io/frontmatter.d.ts +8 -0
- package/dist/io/frontmatter.js +31 -0
- package/dist/io/frontmatter.js.map +1 -0
- package/dist/io/history.d.ts +10 -0
- package/dist/io/history.js +38 -0
- package/dist/io/history.js.map +1 -0
- package/dist/io/useCaseStore.d.ts +8 -0
- package/dist/io/useCaseStore.js +36 -0
- package/dist/io/useCaseStore.js.map +1 -0
- package/dist/io/workspace.d.ts +14 -0
- package/dist/io/workspace.js +82 -0
- package/dist/io/workspace.js.map +1 -0
- package/dist/oop/commands.d.ts +446 -0
- package/dist/oop/commands.js +319 -0
- package/dist/oop/commands.js.map +1 -0
- package/dist/oop/conformance.d.ts +16 -0
- package/dist/oop/conformance.js +30 -0
- package/dist/oop/conformance.js.map +1 -0
- package/dist/prompts/discovery.d.ts +2 -0
- package/dist/prompts/discovery.js +41 -0
- package/dist/prompts/discovery.js.map +1 -0
- package/dist/prompts/imagineWithoutController.d.ts +2 -0
- package/dist/prompts/imagineWithoutController.js +75 -0
- package/dist/prompts/imagineWithoutController.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/phasePressureTest.d.ts +2 -0
- package/dist/prompts/phasePressureTest.js +69 -0
- package/dist/prompts/phasePressureTest.js.map +1 -0
- package/dist/prompts/rddIntro.d.ts +2 -0
- package/dist/prompts/rddIntro.js +53 -0
- package/dist/prompts/rddIntro.js.map +1 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +45 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
- package/dist/prompts/stateMachineIntrospect.js +80 -0
- package/dist/prompts/stateMachineIntrospect.js.map +1 -0
- package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
- package/dist/prompts/tellDontAskRephrase.js +66 -0
- package/dist/prompts/tellDontAskRephrase.js.map +1 -0
- package/dist/render/diff.d.ts +21 -0
- package/dist/render/diff.js +84 -0
- package/dist/render/diff.js.map +1 -0
- package/dist/render/mermaid.d.ts +24 -0
- package/dist/render/mermaid.js +53 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/sideBySide.d.ts +14 -0
- package/dist/render/sideBySide.js +91 -0
- package/dist/render/sideBySide.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +349 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/alternatives.d.ts +2 -0
- package/dist/tools/alternatives.js +9 -0
- package/dist/tools/alternatives.js.map +1 -0
- package/dist/tools/classes.d.ts +2 -0
- package/dist/tools/classes.js +13 -0
- package/dist/tools/classes.js.map +1 -0
- package/dist/tools/collaborations.d.ts +2 -0
- package/dist/tools/collaborations.js +8 -0
- package/dist/tools/collaborations.js.map +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +9 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/conformance.d.ts +3 -0
- package/dist/tools/conformance.js +11 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/diagram.d.ts +2 -0
- package/dist/tools/diagram.js +9 -0
- package/dist/tools/diagram.js.map +1 -0
- package/dist/tools/discovery.d.ts +2 -0
- package/dist/tools/discovery.js +23 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +9 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/oop.d.ts +9 -0
- package/dist/tools/oop.js +26 -0
- package/dist/tools/oop.js.map +1 -0
- package/dist/tools/responsibilities.d.ts +2 -0
- package/dist/tools/responsibilities.js +13 -0
- package/dist/tools/responsibilities.js.map +1 -0
- package/dist/tools/state.d.ts +2 -0
- package/dist/tools/state.js +8 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/useCases.d.ts +2 -0
- package/dist/tools/useCases.js +18 -0
- package/dist/tools/useCases.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -0
- package/dist/tools/validate.js +9 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tradeoff/engine.d.ts +61 -0
- package/dist/tradeoff/engine.js +171 -0
- package/dist/tradeoff/engine.js.map +1 -0
- package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
- package/dist/tradeoff/heuristics/classSplit.js +94 -0
- package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
- package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
- package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
- package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collectionShape.js +113 -0
- package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
- package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
- package/dist/tradeoff/heuristics/errorHandling.js +110 -0
- package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
- package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
- package/dist/tradeoff/templates.d.ts +2 -0
- package/dist/tradeoff/templates.js +33 -0
- package/dist/tradeoff/templates.js.map +1 -0
- package/dist/util/log.d.ts +1 -0
- package/dist/util/log.js +7 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/mcp.d.ts +4 -0
- package/dist/util/mcp.js +18 -0
- package/dist/util/mcp.js.map +1 -0
- package/dist/validate/cohesion.d.ts +3 -0
- package/dist/validate/cohesion.js +88 -0
- package/dist/validate/cohesion.js.map +1 -0
- package/dist/validate/collectionWrapper.d.ts +3 -0
- package/dist/validate/collectionWrapper.js +131 -0
- package/dist/validate/collectionWrapper.js.map +1 -0
- package/dist/validate/coupling.d.ts +3 -0
- package/dist/validate/coupling.js +47 -0
- package/dist/validate/coupling.js.map +1 -0
- package/dist/validate/cycle.d.ts +3 -0
- package/dist/validate/cycle.js +101 -0
- package/dist/validate/cycle.js.map +1 -0
- package/dist/validate/dataDuplication.d.ts +3 -0
- package/dist/validate/dataDuplication.js +150 -0
- package/dist/validate/dataDuplication.js.map +1 -0
- package/dist/validate/dependencyDirection.d.ts +3 -0
- package/dist/validate/dependencyDirection.js +106 -0
- package/dist/validate/dependencyDirection.js.map +1 -0
- package/dist/validate/dualUseKnowing.d.ts +3 -0
- package/dist/validate/dualUseKnowing.js +137 -0
- package/dist/validate/dualUseKnowing.js.map +1 -0
- package/dist/validate/emptyObjectFill.d.ts +3 -0
- package/dist/validate/emptyObjectFill.js +119 -0
- package/dist/validate/emptyObjectFill.js.map +1 -0
- package/dist/validate/findings.d.ts +22 -0
- package/dist/validate/findings.js +12 -0
- package/dist/validate/findings.js.map +1 -0
- package/dist/validate/functionDecompositionExcess.d.ts +3 -0
- package/dist/validate/functionDecompositionExcess.js +120 -0
- package/dist/validate/functionDecompositionExcess.js.map +1 -0
- package/dist/validate/functionNotObject.d.ts +3 -0
- package/dist/validate/functionNotObject.js +80 -0
- package/dist/validate/functionNotObject.js.map +1 -0
- package/dist/validate/godObject.d.ts +6 -0
- package/dist/validate/godObject.js +76 -0
- package/dist/validate/godObject.js.map +1 -0
- package/dist/validate/presentationInDomain.d.ts +3 -0
- package/dist/validate/presentationInDomain.js +57 -0
- package/dist/validate/presentationInDomain.js.map +1 -0
- package/dist/validate/primitiveWrapper.d.ts +3 -0
- package/dist/validate/primitiveWrapper.js +106 -0
- package/dist/validate/primitiveWrapper.js.map +1 -0
- package/dist/validate/rules.d.ts +24 -0
- package/dist/validate/rules.js +269 -0
- package/dist/validate/rules.js.map +1 -0
- package/dist/validate/singletonStatefulHolder.d.ts +3 -0
- package/dist/validate/singletonStatefulHolder.js +128 -0
- package/dist/validate/singletonStatefulHolder.js.map +1 -0
- package/dist/validate/strategyAsymmetry.d.ts +3 -0
- package/dist/validate/strategyAsymmetry.js +131 -0
- package/dist/validate/strategyAsymmetry.js.map +1 -0
- package/dist/validate/testability.d.ts +5 -0
- package/dist/validate/testability.js +157 -0
- package/dist/validate/testability.js.map +1 -0
- package/dist/validate/vagueName.d.ts +3 -0
- package/dist/validate/vagueName.js +136 -0
- package/dist/validate/vagueName.js.map +1 -0
- package/dist/validate/validationLocation.d.ts +3 -0
- package/dist/validate/validationLocation.js +120 -0
- package/dist/validate/validationLocation.js.map +1 -0
- package/lessons/STYLE_GUIDE.md +304 -0
- package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
- package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
- package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
- package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
- package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
- package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
- package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
- package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
- package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
- package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
- package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
- package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
- package/lessons/woowacourse-racingcar/README.md +69 -0
- package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
- package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
- package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
- package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
- package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
- package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
- package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
- package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/package.json +46 -0
- package/skills/oh-my-oop/SKILL.md +39 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# PR #61 — [로또 1단계] 호두
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Junyoung-WON](https://github.com/Junyoung-WON)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/61
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @ghojeong (파이로)
|
|
7
|
+
- **라인 코멘트:** 18
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **README 기능 목록 잘 정리**.
|
|
12
|
+
- **`Lotto.init`에 *중복/개수* 검증** — `require` 활용.
|
|
13
|
+
- **`enum class WinningRank(countOfMatch, winningMoney)`** — 등수+상금 응집.
|
|
14
|
+
- **`object LottoMachine`** — 상태 없는 발행 객체.
|
|
15
|
+
- **`shuffled().take().sorted()` 체이닝**.
|
|
16
|
+
|
|
17
|
+
## 못한 점 (설계 관점)
|
|
18
|
+
|
|
19
|
+
### 1. 테스트 케이스 *분리되지 않은 두 책임*
|
|
20
|
+
|
|
21
|
+
```kotlin
|
|
22
|
+
@ParameterizedTest
|
|
23
|
+
@ValueSource(strings = ["1, 1, 1, 2, 3, 4", "1, 2, 3, 4, 5, 30, 1", "3, 4, 5, 30, 1"])
|
|
24
|
+
fun `로또 번호는 1~45 사이의 6개의 서로 다른 자연수를 갖지 않으면 오류를 발생시킨다`(input: String) {. }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
리뷰어: "로또 번호의 중복과, 로또 번호의 개수가 6이 아닌 것은 *별개의 로직*이라 생각되는데, 테스트 또한 *분리*하면 어떨지 제안해 봅니다. 가령 `3, 4, 5, 30, 1` 테스트 케이스의 경우 *로또 번호 개수가 5라서 발생*하는데, 앞의 케이스만 보고 있으면, *중복에 대한 테스트를 하고 있다고 넘겨 짚을 수 있을 것* 같아서요." — 테스트는 *한 가지 사실*만 검증.
|
|
28
|
+
|
|
29
|
+
### 2. 매직 넘버 `1000` — 상수화 부재
|
|
30
|
+
|
|
31
|
+
```kotlin
|
|
32
|
+
fun getEarningRate(): Double {
|
|
33
|
+
val total: Long = status.entries.sumOf { it.key.winningMoney * it.value }
|
|
34
|
+
return (total / (status.values.sum() * 1000).toDouble()) // ⚠ 1000
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
리뷰어: "0, 1, 1000과 같은 *매직 넘버*들은 상수화해 주시면, *나중에 유지보수*를 하게 편할 것 같습니다. 가령 *로또 한 장의 가격이 물가가 올라서 1500원으로* 오르게 되면, 어디서 값을 수정해야 하는지 *동료가 코드 전체를 읽고 로직을 파악*해야 할 것 같습니다." 학생: "수업 시간에서도 배웠던 내용이네요!"
|
|
39
|
+
|
|
40
|
+
### 3. `WinningRank`가 `util` 패키지
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
lotto/util/WinningRank.kt
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
리뷰어: "멤버를 가지도록 enum class를 적극적으로 활용해 주신 점 멋집니다. 다만 *WinningRank를 ValidationUtils처럼 util 패키지 안에 배치한 의도*를 여쭈어봅니다. String으로 바꾸는 *formatByRank* 때문인가요?" 학생: "요구사항 형식에 맞춰 *출력할 수 있도록 문자열을 반환*해 주는 formatByString과 *로또 번호를 맞춘 개수에 따라 등수를 반환*해 주는 convert를 활용한다는 점에서, *일종의 도구로써 활용*되는 점이 크다고 생각해 util로 분류." 후속: "WinningRank는 *util보다는 model에서 다루는 것*도 좋아 보인다는 생각도 듭니다."
|
|
47
|
+
|
|
48
|
+
### 4. `WinningRank.formatByRank` — 다국어/문구 변경?
|
|
49
|
+
|
|
50
|
+
```kotlin
|
|
51
|
+
override fun toString(): String =
|
|
52
|
+
WinningRank.entries.filter { it != WinningRank.MISS }.joinToString("\n") {
|
|
53
|
+
"${WinningRank.formatByRank(it)} - ${status.getOrDefault(it, 0)}개"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
리뷰어: "혹시 toString을 하실 때 *어디까지를 model의 영역으로 생각하시고, 어디까지를 view의 영역*이라 생각하시는지 호두님만의 기준이 있으신지 여쭈어봅니다. *다국어 서비스를 지원*하는 안드로이드 개발을 하게 될 경우 *개수를 ~개*와 같은 부분은 여러 언어로 나타내고 싶다는 요구사항이 생긴다면 어떻게 대처를 하실 계획인가요?" + "formatByRank의 경우는 특히나 개발을 잘하는 개발자가 아니라, *영어나 글을 잘 쓰는 기획자가 유지보수*를 하게 될 가능성이 큽니다. 가령 *'할 일'이라는 단어를 Quest, Task, ToDo 중에서 무엇으로 할 것인지 한 달 넘게 싸우면서, A/B 테스트*를 하는 경우도 있습니다 ㅋㅋㅋㅋㅋ" 학생: "*model과 view의 역할에 따라 적절히 구분 지을 필요*가 있다는 것을 알게 되었습니다. checker는 model로써 *자신이 가진 데이터만을 view에게 넘겨주고*, *다른 나라의 언어로 변경 시에 출력 문자를 바꾸는 것은 view의 역할*을 하는 것이 적합할 것이라 생각이 듭니다."
|
|
58
|
+
|
|
59
|
+
### 5. `LottoMachine` 랜덤 내장 — 테스트 불가
|
|
60
|
+
|
|
61
|
+
```kotlin
|
|
62
|
+
object LottoMachine {
|
|
63
|
+
fun issueTickets(count: Int): List<Lotto> {
|
|
64
|
+
.
|
|
65
|
+
tickets.add(Lotto(Lotto.NUMBER_RANGE.shuffled().take(Lotto.NUMBER_COUNT).sorted().map { LottoNumber(it) }))
|
|
66
|
+
.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
리뷰어: "shuffled, take, sorted를 잘 활용해 주신 점 멋집니다! 다만 *shuffled는 자동차 경주 미션 때와 마찬가지로 Random 요소*라 생각이 되는데, 자동차 경주 미션 때처럼 *테스트를 하기 어렵게 만드는 요인*이라 생각됩니다." 학생: "*지난 미션에서 피드백 받은 내용과 아주 흡사*한 것 같습니다. 그때에는 제대로 구현해 보지 못했지만, *functional interface를 활용*하면 테스트를 위한 로또 번호 생성 메서드를 테스트 코드에서 정의하여 *기능 구현과 테스트를 동시에 용이*하게 만들어 줄 수 있다는 피드백을 받았습니다. 이 경우에서도 *함수형 인터페이스를 활용*하면 적합할 것 같다."
|
|
72
|
+
|
|
73
|
+
### 6. `WinningStatusChecker`의 `MutableMap` 누적
|
|
74
|
+
|
|
75
|
+
```kotlin
|
|
76
|
+
class WinningStatusChecker(results: List<WinningRank>) {
|
|
77
|
+
private val status: MutableMap<WinningRank, Int> = mutableMapOf()
|
|
78
|
+
init {
|
|
79
|
+
results.forEach { rank ->
|
|
80
|
+
status[rank] = status.getOrDefault(rank, 0) + 1
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`groupingBy { }.eachCount()`로 한 줄 압축 가능. *누적 절차*가 *함수형 어휘*로.
|
|
87
|
+
|
|
88
|
+
### 7. Controller의 `makeResult` 흐름 — 테스트 가치
|
|
89
|
+
|
|
90
|
+
```kotlin
|
|
91
|
+
private fun makeResult(lottoTickets: List<Lotto>) {
|
|
92
|
+
val winningResult = lottoTickets.map {
|
|
93
|
+
WinningRank.convert(it.checkWinningNumbers(lotteryResult.winning), it.checkBonusNumbers(lotteryResult.bonusNumber))
|
|
94
|
+
}
|
|
95
|
+
val winningStatusChecker = WinningStatusChecker(winningResult)
|
|
96
|
+
.
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
리뷰어: "가령 winningResult가 의도한 대로 만들어졌는지는, *충분히 테스트할 가치가 있는 로직*이라 생각되는데, 이러한 로직은 어떻게 테스트를 할 수 있을까요?" — Controller에 *비즈니스 로직*이 있으면 *도메인으로 이동* 또는 *Controller 단위 테스트*.
|
|
101
|
+
|
|
102
|
+
### 8. `Rank` 테스트 부분만
|
|
103
|
+
|
|
104
|
+
```kotlin
|
|
105
|
+
@CsvSource("6,False,FIRST", "5,True,SECOND", "5,False,THIRD", "2,False,MISS")
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
리뷰어: "기왕 테스트를 한다면 *FOURTH와 FIFTH에 대한 테스트까지* 해주시면 좋을 것 같습니다." — *모든 분기*를 명세서로.
|
|
109
|
+
|
|
110
|
+
## 리뷰어 의견 요지
|
|
111
|
+
|
|
112
|
+
- **테스트 한 가지 사실** — 중복과 개수는 다른 책임, 다른 테스트.
|
|
113
|
+
- **매직 넘버 상수화** — 가격 변경에 유연.
|
|
114
|
+
- **`util` 패키지의 god-folder 위험** — 도메인 객체는 *model*에.
|
|
115
|
+
- **`toString` = View 책임** — *문구/다국어/A-B 테스트*는 도메인이 알면 안 됨.
|
|
116
|
+
- **랜덤은 *함수형 인터페이스*로 주입** — TDD 정합.
|
|
117
|
+
- **Controller의 비즈니스 로직 = 도메인으로 이동** 또는 *별도 테스트*.
|
|
118
|
+
- **모든 enum 분기 테스트**.
|
|
119
|
+
|
|
120
|
+
- **대표 인용:**
|
|
121
|
+
> 로또 번호의 중복과, 로또 번호의 개수가 6이 아닌 것은 *별개의 로직*이라 생각되는데, 테스트 또한 *분리*하면 어떨지 제안해 봅니다.
|
|
122
|
+
> — @ghojeong on `src/test/kotlin/lotto/model/LottoTest.kt`
|
|
123
|
+
|
|
124
|
+
> 어디까지를 model의 영역으로 생각하시고, 어디까지를 view의 영역이라 생각하시는지 호두님만의 기준이 있으신지 여쭈어봅니다. *다국어 서비스를 지원*하는 안드로이드 개발…
|
|
125
|
+
> — @ghojeong on `src/main/kotlin/lotto/model/WinningStatusChecker.kt`
|
|
126
|
+
|
|
127
|
+
> formatByRank의 경우는 특히나 *영어나 글을 잘 쓰는 기획자가 유지보수*를 하게 될 가능성이 큽니다. *'할 일'이라는 단어를 Quest, Task, ToDo 중에서 무엇으로 할 것인지 한 달 넘게 싸우면서, A/B 테스트*를 하는 경우도.
|
|
128
|
+
> — @ghojeong on `src/main/kotlin/lotto/util/WinningRank.kt`
|
|
129
|
+
|
|
130
|
+
> shuffled는 자동차 경주 미션 때와 마찬가지로 Random 요소라 생각이 되는데, *테스트를 하기 어렵게 만드는 요인*이라 생각됩니다.
|
|
131
|
+
> — @ghojeong on `src/main/kotlin/lotto/model/LottoMachine.kt`
|
|
132
|
+
|
|
133
|
+
## 얻은 교훈
|
|
134
|
+
|
|
135
|
+
- **테스트는 *한 가지 사실*** — 중복과 개수가 한 테스트에 섞이면 *실패 메시지가 어느 사실 위배*인지 모름.
|
|
136
|
+
- **매직 넘버 상수화** — *유지보수 단위*를 한 곳에. 가격 변경이 *코드 전체 grep*이 되면 누락 위험.
|
|
137
|
+
- **`util` 패키지에 *도메인 객체* 배치 회피** — `WinningRank`는 *도메인 모델*.
|
|
138
|
+
- **`toString`은 View 책임** — 도메인이 *문구/다국어/A-B 테스트*를 알면 *기획자가 도메인을 수정*해야 함.
|
|
139
|
+
- **랜덤은 *함수형 인터페이스*로 주입** — TDD 정합 + 시나리오 강제 테스트.
|
|
140
|
+
- **누적 패턴은 `groupingBy { }.eachCount()`** — `MutableMap + getOrDefault`보다 함수형.
|
|
141
|
+
- **Controller의 비즈니스 로직** = 테스트 가치 *있음*. 도메인으로 이동 또는 *Controller 단위 테스트*.
|
|
142
|
+
- **enum의 *모든 분기*** 테스트 — 부분만 테스트하면 *나머지 분기*는 미보장.
|
|
143
|
+
- **이전 미션 *피드백 누적*** — 학생이 *자동차 경주 미션*과 *동일 피드백*을 받음을 자가 인정. *반복 학습 신호*.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# PR #93 — [로또] 호두 2단계 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Junyoung-WON](https://github.com/Junyoung-WON)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/93
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @ghojeong
|
|
7
|
+
- **라인 코멘트:** 12
|
|
8
|
+
|
|
9
|
+
## 잘한 점
|
|
10
|
+
|
|
11
|
+
- **로또 번호의 개수와 중복에 관한 테스트 분리** — 1단계 피드백 반영.
|
|
12
|
+
- **WinningRank 등수 반환 테스트 세분화**.
|
|
13
|
+
|
|
14
|
+
## 얻은 교훈
|
|
15
|
+
|
|
16
|
+
- **테스트 시나리오 분리 = 1단계 피드백 흡수**. 각 검증을 별 테스트로.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# PR #109 — [로또 1단계] 시아 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Leeyerin0210](https://github.com/Leeyerin0210)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/109
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @laco-dev
|
|
7
|
+
- **라인 코멘트:** 53
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Lotto` 일급 클래스 (실제로는 일급 컬렉션)**.
|
|
12
|
+
- **PR 본문 자가 의문 명시** — 일급 클래스 정의/개선점, 와일드카드 import 등.
|
|
13
|
+
|
|
14
|
+
## 못한 점 (설계 관점)
|
|
15
|
+
|
|
16
|
+
### 1. 일급 컬렉션 용어 — 일급 클래스로 잘못 부름
|
|
17
|
+
|
|
18
|
+
학생 의문:
|
|
19
|
+
|
|
20
|
+
> Lotto 클래스를 일급 클래스로 사용하였습니다. 일급클래스의 정의에 맞게 잘 사용되었나요?
|
|
21
|
+
|
|
22
|
+
리뷰어:
|
|
23
|
+
|
|
24
|
+
> 정확히는 일급 컬렉션이라고 부르는게 자연스럽겠네요. 지금도 충분히 잘 작성 해주셨습니다. 굳이 역할을 한번 더 나눠 본다면 Lotto, LottoNumbers 두개의 역할로 분리를 해 볼 수 있겠네요.
|
|
25
|
+
|
|
26
|
+
→ "일급 클래스" = first-class citizen (다른 객체와 동등). "일급 컬렉션" = First-class Collection (Object Calisthenics 9번째 룰).
|
|
27
|
+
|
|
28
|
+
### 2. `intersect()` 컬렉션 함수 미활용
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
val matched = lotto.numbers.filter { it in winning.numbers }.size
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
→ `lotto.numbers.intersect(winning.numbers).size`.
|
|
35
|
+
|
|
36
|
+
### 3. `Lotto`가 보너스 관심사 보유
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
class Lotto(.) {
|
|
40
|
+
fun hasBonus(bonus: Int): Boolean =. // ⚠ 보너스 자체는 Lotto의 관심사 아님
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> 로또 입장에서는 보너스 넘버라는 관심사는 아마 필요 없겠죠?
|
|
45
|
+
|
|
46
|
+
→ Lotto는 *번호 6개 보유*만, 보너스 비교는 *WinningLotto*가.
|
|
47
|
+
|
|
48
|
+
### 4. 와일드카드 import lint 위반
|
|
49
|
+
|
|
50
|
+
→ Ktlint 자동 검사. IDE 설정에 따라 자동 import 후 ktlint 실패 — 환경 일관성 필요.
|
|
51
|
+
|
|
52
|
+
## 얻은 교훈
|
|
53
|
+
|
|
54
|
+
- **"일급 컬렉션"의 정확한 용어** — Object Calisthenics 9번째 룰. `List<T>` 그대로 노출 회피 + 컬렉션 자체에 도메인 행위 부여.
|
|
55
|
+
- **`intersect()` 활용** — lotto 매칭 표준 함수.
|
|
56
|
+
- **Lotto의 관심사 = 자기 번호**. 외부 (보너스, 당첨 기준) 비교는 *그 도메인이 시키는 일*.
|
|
57
|
+
- **Lint 설정 + IDE 설정 일관화** — 충돌하면 매번 lint 수정 부담.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# PR #135 — [로또 2단계] 시아 미션 제출합니다
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Leeyerin0210](https://github.com/Leeyerin0210)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/135
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @laco-dev
|
|
7
|
+
- **라인 코멘트:** 67
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Amount` 값 객체 + `Amount.Zero` 같은 상수 추가** — 1단계 흡수.
|
|
12
|
+
- **2단계 자가 의문 4개 PR에 명시** — 출력/도메인 결합, null 흐름, 예외 테스트, 재귀 vs 반복 일관성.
|
|
13
|
+
|
|
14
|
+
## 못한 점 (설계 관점)
|
|
15
|
+
|
|
16
|
+
### 1. enum에 출력 관련 정보 보유 (View-Domain 결합)
|
|
17
|
+
|
|
18
|
+
```kotlin
|
|
19
|
+
enum class Rank(val matchCount: Int, val winnings: Int, val message: String) {
|
|
20
|
+
FIRST(6, 2_000_000_000, "6개 일치"),
|
|
21
|
+
.
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
학생 자가 의문:
|
|
26
|
+
|
|
27
|
+
> 출력 코드를 개선하기 위해 enum에 출력 관련 정보들을 넣어뒀는데, 이러면 뷰와 도메인이 너무 강하게 결합된 것일까요?
|
|
28
|
+
|
|
29
|
+
리뷰어 답:
|
|
30
|
+
|
|
31
|
+
> 넵, 결합된 것 같습니다. 물론 서버에서 출력 순서를 결정하는 경우도 있지만 프레젠테이션.
|
|
32
|
+
|
|
33
|
+
→ 출력 메시지는 OutputView 책임. enum이 *영구한 데이터*만 (matchCount, winnings).
|
|
34
|
+
|
|
35
|
+
### 2. null로 잘못된 입력 표현 → Controller에서 null 체크 + 재입력
|
|
36
|
+
|
|
37
|
+
```kotlin
|
|
38
|
+
class LottoController {
|
|
39
|
+
fun run() {
|
|
40
|
+
val amount = readAmount() ?: return run() // ⚠ null → 재귀
|
|
41
|
+
.
|
|
42
|
+
}
|
|
43
|
+
private fun readAmount(): Amount? {
|
|
44
|
+
return try { Amount(.) } catch (e: Exception) { null }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
학생 의문:
|
|
50
|
+
|
|
51
|
+
> 요구사항은 에러가 생겼을 때 null을 리턴하라고 했으나, null을 사용하면 후속 코드가 전부 꼬이는 것 같습니다.
|
|
52
|
+
|
|
53
|
+
→ null은 *부재*를 표현. *오류*는 sealed result type이 더 적절.
|
|
54
|
+
|
|
55
|
+
### 3. 일관성 부족 — 한 곳은 재귀, 다른 곳은 반복
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
fun readAmount(): Amount = try {. } catch (e) { readAmount() } // ⚠ 재귀
|
|
59
|
+
fun readWinning(): Winning = while (true) { try { return. } catch. } // ⚠ 반복
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> 코드 작성할 때 가장 중요한 요소 중 하나는 일관성입니다. 다른 사람이 이어서 개발을 한다고 하면 뭐로 해야하지? 라는 착각에 빠지기 때문에 여러개로 구현이 나뉘는 것보다 하나의 일관된 흐름을 만드는것이 좋습니다.
|
|
63
|
+
|
|
64
|
+
### 4. `Amount`의 invariant 표현 부족
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
class Amount(val value: Int) {
|
|
68
|
+
init { require(value >= 0) }
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
리뷰어 가르침:
|
|
73
|
+
|
|
74
|
+
> 돈이 마이너스로 내려가면 프로그램이 종료된다와 돈은 최소 Amount.Zero 까지만 내려간다. 라는 차이를 들 수 있겠네요
|
|
75
|
+
|
|
76
|
+
→ 같은 invariant라도 *어떻게 표현하느냐*에 따라 도메인의 의미 명확도가 다름. *Amount.Zero* 같은 의미 있는 경계.
|
|
77
|
+
|
|
78
|
+
### 5. `LottoMachine`이 돈을 받아 직접 차감
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
class LottoMachine(var money: Amount) {
|
|
82
|
+
fun buy(): Lotto {
|
|
83
|
+
money = money.minus(LOTTO_PRICE) // ⚠ 기계가 돈을 소모
|
|
84
|
+
return Lotto(.)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
> 돈을 넣는다는 기능이 별도로 빠진 이점을 잘 모르겠어요! 로또 기계는 왜 스스로 가진 돈을 소모해버리는 건지도 잘 와닿지가 않아요.
|
|
90
|
+
|
|
91
|
+
→ 현실 비유: 로또 기계는 *돈을 받고* 로또를 *준다*. 돈을 *소유*하지 않음.
|
|
92
|
+
|
|
93
|
+
## 리뷰어 의견 요지
|
|
94
|
+
|
|
95
|
+
리뷰어 @laco-dev의 메시지:
|
|
96
|
+
|
|
97
|
+
1. **enum의 *영구 데이터*와 *표현 정보*를 구분** — matchCount/winnings는 영구 데이터, message는 표현.
|
|
98
|
+
|
|
99
|
+
2. **null = 부재. 오류 ≠ null**. sealed result로 오류 의미 명시.
|
|
100
|
+
|
|
101
|
+
3. **일관성 > 미세 최적화** — 입력 흐름이 두 가지로 나뉘면 동료 혼란.
|
|
102
|
+
|
|
103
|
+
4. **현실 모델링** — 로또 기계는 돈을 소유하지 않고 *교환*한다.
|
|
104
|
+
|
|
105
|
+
- **대표 인용:**
|
|
106
|
+
> 돈을 넣는다는 기능이 별도로 빠진 이점을 잘 모르겠어요! 로또 기계는 왜 스스로 가진 돈을 소모해버리는 건지도 잘 와닿지가 않아요.
|
|
107
|
+
>
|
|
108
|
+
> — @laco-dev on `src/main/kotlin/lotto/model/LottoMachine.kt`
|
|
109
|
+
|
|
110
|
+
## 얻은 교훈
|
|
111
|
+
|
|
112
|
+
- **enum의 두 분류** — *영구 도메인 데이터* (matchCount, winnings) vs *표현 정보* (message). 후자는 OutputView로.
|
|
113
|
+
- **null의 의미 = 부재**. 오류는 sealed result. `Amount?`로 null 흐름 만들면 후속 코드가 *부재 ≠ 오류*를 구분해야 함.
|
|
114
|
+
- **일관성이 정답 없을 때의 기준**. 재귀와 반복 둘 다 가능하면 *팀 컨벤션*으로 하나만.
|
|
115
|
+
- **현실 모델링의 비유 검증** — "로또 기계가 돈을 소유하나?" → 사용자 → 로또 기계 → 로또 교환. 기계는 매개체.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# 진행 상황 (작업 일지) — kotlin-lotto
|
|
2
|
+
|
|
3
|
+
이 문서는 `woowacourse/kotlin-lotto` PR 리뷰 분석 작업의 **상태 추적용**이다.
|
|
4
|
+
|
|
5
|
+
## 데이터셋
|
|
6
|
+
|
|
7
|
+
- 출처: https://github.com/woowacourse/kotlin-lotto/pulls?q=is:pr+is:closed
|
|
8
|
+
- 전체 closed PR: **153개**
|
|
9
|
+
- 분석 대상 필터: **라인 레벨 reviewer 코멘트 ≥ 5개**
|
|
10
|
+
- 통과한 PR: **141개**, 고유 reviewee: **71명**
|
|
11
|
+
|
|
12
|
+
## 분석 어휘
|
|
13
|
+
|
|
14
|
+
- 유지: 책임/응집/결합/캡슐화/Tell-Don't-Ask/테스터빌리티/도메인 모델링/일급 컬렉션/원시 강박/의존 방향/명명 설계
|
|
15
|
+
- 제외: Kotlin 관용구 (scope function, smart cast, null 처리, val/var, data class 사용 여부, init 블록 형태, collection API 선택, extension 위치)
|
|
16
|
+
|
|
17
|
+
## 추가 지침 (racingcar와 다른 점)
|
|
18
|
+
|
|
19
|
+
- **코드 스니펫 포함**: 안티패턴이 명확한 경우 `diff_hunk` 또는 인용 코드를 함께 기록해 가독성 향상.
|
|
20
|
+
- **lotto 도메인 특화 어휘**: 당첨 등수 (Rank/Winning), 금액 계산 (Money/Profit), 통계 집계 (Statistics), 로또 번호 검증 (LottoNumber) 등.
|
|
21
|
+
|
|
22
|
+
## ✅ 완료
|
|
23
|
+
|
|
24
|
+
**141 PRs / 71 reviewees 완료** — 2026-05-22
|
|
25
|
+
|
|
26
|
+
`SUMMARY.md` + `README.md` 작성 완료.
|
|
27
|
+
|
|
28
|
+
### 부실 파일 보강 — Round 2 (2026-05-22)
|
|
29
|
+
|
|
30
|
+
이전 세션에서 후반부 51개 파일이 부실하게 작성되어 보강 작업 진행 중. 부실 기준: 코멘트 ≥30개인데 파일 ≤35줄, 또는 코멘트 15-29개에 파일 ≤30줄.
|
|
31
|
+
|
|
32
|
+
**심각 18개 PR 재작성 완료 (2026-05-22)** — 코멘트 30+ / 파일 35줄 미만:
|
|
33
|
+
|
|
34
|
+
| PR | Reviewee | 코멘트 | 결과 길이 |
|
|
35
|
+
|----|----------|--------|----------|
|
|
36
|
+
| #132 | hwannow | 58 | ~140줄 |
|
|
37
|
+
| #91 | sh1mj1 | 42 | ~140줄 |
|
|
38
|
+
| #150 | wondroid-world | 41 | ~120줄 |
|
|
39
|
+
| #129 | chanho0908 | 39 | ~150줄 |
|
|
40
|
+
| #92 | Hevton | 38 | ~150줄 |
|
|
41
|
+
| #78 | gaeun5744 | 38 | ~140줄 |
|
|
42
|
+
| #127 | medAndro | 36 | ~160줄 |
|
|
43
|
+
| #114 | tobae-time | 36 | ~140줄 |
|
|
44
|
+
| #13 | otter66 | 35 | ~150줄 |
|
|
45
|
+
| #94 | kimhm0728 | 34 | ~170줄 |
|
|
46
|
+
| #134 | jerry8282 | 34 | ~160줄 |
|
|
47
|
+
| #122 | ijh1298 | 34 | ~170줄 |
|
|
48
|
+
| #81 | junjange | 32 | ~170줄 |
|
|
49
|
+
| #133 | ijh1298 | 32 | ~170줄 |
|
|
50
|
+
| #116 | cucumber99 | 32 | ~160줄 |
|
|
51
|
+
| #58 | junjange | 31 | ~150줄 |
|
|
52
|
+
| #32 | RightHennessy | 31 | ~150줄 |
|
|
53
|
+
| #112 | etama123 | 31 | ~170줄 |
|
|
54
|
+
|
|
55
|
+
작성 방식:
|
|
56
|
+
- 전체 코멘트(jq dump) 완독 후 분석 (압축 X)
|
|
57
|
+
- 잘한 점 (5-7개) + 못한 점 (9-13개) + 리뷰어 의견 요지 + 대표 인용 + 얻은 교훈
|
|
58
|
+
- 안티패턴마다 `diff_hunk` 또는 인용 코드 스니펫 포함
|
|
59
|
+
- 양호한 벤치마크 PR (kkosang/85, hyunji1203/15) 수준으로 깊이 맞춤
|
|
60
|
+
- Kotlin idiom 제외, OOP 설계만 (책임/응집/결합/Tell-Don't-Ask/도메인 모델링)
|
|
61
|
+
|
|
62
|
+
### 중간 33개 PR 보강 완료 (2026-05-22)
|
|
63
|
+
|
|
64
|
+
코멘트 15-29개에 파일 ≤30줄이던 33개 PR. **모두 80-200줄로 보강 완료**.
|
|
65
|
+
|
|
66
|
+
#143, 95, 63, 51, 35, 145, 117, 103, 97, 71, 151, 9, 24, 70, 38, 152, 98, 82, 53, 52, 61, 146, 49, 40, 25, 148, 36, 144, 80, 8, 77, 75, 21
|
|
67
|
+
|
|
68
|
+
작성 방식 (심각 18개와 동일 수준):
|
|
69
|
+
- 잘한 점 (3-7개) + 못한 점 (6-12개, 각 코드 스니펫 포함) + 리뷰어 의견 요지 + 대표 인용 (4개) + 얻은 교훈 (7-11개)
|
|
70
|
+
- 모든 reviewer 코멘트를 *압축 없이* 전부 인용
|
|
71
|
+
- 학생 자가 의문 + 리뷰어 응답 + 후속 라운드 응답 모두 캡처
|
|
72
|
+
|
|
73
|
+
### 추가 27개 PR 보강 완료 — Round 3 (2026-05-23)
|
|
74
|
+
|
|
75
|
+
원래 HANDOVER 51개 외 추가로 발견된 부실 PR. 댓글 15+, 분석 35-46줄이었던 27개를 모두 100-238줄로 보강.
|
|
76
|
+
|
|
77
|
+
**심각 그룹 (댓글 30+, 댓글 49-56개 4개 PR):**
|
|
78
|
+
- #131 junseo511 (56) — 함수 분리 vs 분해 명언, Wallet 메타포 비대칭
|
|
79
|
+
- #64 aprilgom (50) — 키오스크 시나리오로 View 인터페이스 정당화
|
|
80
|
+
- #113 hwannow (49) — 객체지향=현실 은유 ("객체지향의 사실과 오해" 직접 인용)
|
|
81
|
+
- #90 murjune (45) — try-catch 본질 (Elizarov), sealed class 단일 인터페이스
|
|
82
|
+
|
|
83
|
+
**중상 그룹 (댓글 30-44, 8개 PR):**
|
|
84
|
+
- #123, #69, #60, #147, #3, #14, #48, #140
|
|
85
|
+
|
|
86
|
+
**중하 그룹 (댓글 15-29, 15개 PR):**
|
|
87
|
+
- #119, #87, #31, #141, #72, #5, #137, #50, #153, #89, #47, #55, #12, #46, #138
|
|
88
|
+
|
|
89
|
+
## 진행 상태
|
|
90
|
+
|
|
91
|
+
**심각 18 + 중간 33 + Round 3 추가 27 = 78개 PR 보강 완료 (2026-05-22 ~ 05-23)**
|
|
92
|
+
|
|
93
|
+
전체 141 PR 분석 자료 정상 깊이로 정리 완료. 남은 17개 짧은 파일은 모두 댓글 6-14개의 저-댓글 PR로 적정 길이.
|
|
94
|
+
|
|
95
|
+
## MCP에 반영된 lotto 안티패턴 (2026-05-23)
|
|
96
|
+
|
|
97
|
+
이 코퍼스에서 도출한 안티패턴 중 5개가 oh-my-oop MCP 서버의 validate 룰로 코드화됨. 룰의 evidence/remedy에는 아래 PR의 *대표 인용*이 발췌되어 들어가 있다.
|
|
98
|
+
|
|
99
|
+
| 신규 룰 ID | 인용 PR | 핵심 통찰 |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `empty-object-external-fill` | [#14](Choisehyeon/14-1단계-로또.md) @malibinYun | "빈 껍데기를 만들어서 외부에서 값을 채우지 말 것." 도메인 객체는 생성 시점에 invariant 충족. |
|
|
102
|
+
| `collection-wrapper-without-behavior` | [#144](jiyuneel/144-2단계-로또.md) @krrong | 일급 컬렉션이 *행동* 없이 `toString` 오버라이드 용도면 만들지 않는 것도 좋은 답. |
|
|
103
|
+
| `primitive-wrapper-without-invariant` | [#58](junjange/58-1단계-로또.md) @junjange, [#77](hxeyexn/77-1단계-로또.md) @hxeyexn | `init`은 자기 invariant, factory는 입력 변환 + 생성 결정. invariant 없는 wrapper는 원시값과 동일. |
|
|
104
|
+
| `strategy-default-param-pollution` | [#144](jiyuneel/144-2단계-로또.md) @krrong | 공통 인터페이스 = 공통 시그니처. 분기 인자(`manualNumbers`)는 생성자로 끌어올려야 호출 컨텍스트가 분리됨. |
|
|
105
|
+
| `function-decomposition-excess` | lotto 일반 (@krrong 류 코멘트 다수) | 함수를 *분리*하는 것이지 *분해*하는 것이 아니다. 1-2줄짜리 private 헬퍼 남발은 가독성 저하. |
|
|
106
|
+
|
|
107
|
+
룰을 추가하면서 함께 도입된 트레이드오프 heuristic 4종: `value_object_shape`, `strategy_or_policy`, `error_handling`, `collection_shape` (총 8개 typed heuristic + `free_form`).
|
|
108
|
+
|
|
109
|
+
상세 룰 ↔ 안티패턴 매핑은 `../../MCP_STRUCTURE.md` §3 참조.
|
|
110
|
+
|
|
111
|
+
## 캐시 위치
|
|
112
|
+
|
|
113
|
+
`/tmp/oop-lessons-cache-lotto/`:
|
|
114
|
+
- `prs.json` — 153개 PR 메타
|
|
115
|
+
- `nums.txt` — PR 번호 목록 (1-153)
|
|
116
|
+
- `counts.tsv` — PR# / 라인 코멘트 수
|
|
117
|
+
- `filtered.tsv` — ≥5 코멘트 PR 목록
|
|
118
|
+
- `authors.tsv` — PR# / 작성자
|
|
119
|
+
- `grouped.tsv` — PR# / 코멘트 수 / 고유 리뷰어 수 / 작성자
|
|
120
|
+
- `comments/<N>.json` — PR별 라인 코멘트 (diff_hunk 포함)
|
|
121
|
+
|
|
122
|
+
**주의:** `/tmp`는 재부팅 시 사라질 수 있음. 시작 전 캐시 확인 후 없으면 재생성.
|
|
123
|
+
|
|
124
|
+
## 우선순위 (코멘트 많은 PR 순)
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
85 (132) kkosang - [로또 2단계]
|
|
128
|
+
15 ( 85) hyunji1203 - [로또 1단계]
|
|
129
|
+
19 ( 79) krrong - [로또 1단계]
|
|
130
|
+
65 ( 75) songpink - [로또 1단계]
|
|
131
|
+
16 ( 75) ippnsj - [로또 1단계]
|
|
132
|
+
106 ( 75) giovannijunseokim
|
|
133
|
+
120 ( 71) junseo511
|
|
134
|
+
27 ( 70) 2chang5 - [로또 1단계]
|
|
135
|
+
115 ( 68) jerry8282
|
|
136
|
+
135 ( 67) Leeyerin0210
|
|
137
|
+
... (계속 grouped.tsv 참조)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 다음 세션 시작 시
|
|
141
|
+
|
|
142
|
+
1. 이 파일 + 가장 최근 commit 확인
|
|
143
|
+
2. 캐시 존재 여부 확인 (`ls /tmp/oop-lessons-cache-lotto/comments/ | wc -l == 153`)
|
|
144
|
+
3. 캐시 있으면 미완 reviewee부터 진행
|
|
145
|
+
4. 5-10 PR마다 commit + push로 안전 저장
|
|
146
|
+
5. 전체 141개 완료 후 `SUMMARY.md` + `README.md` 작성
|
|
147
|
+
|
|
148
|
+
## 작성 패턴
|
|
149
|
+
|
|
150
|
+
- 1단계 PR이 비슷한 안티패턴(원시 강박, Statistics god-object 등) 반복 → 2단계는 짧게
|
|
151
|
+
- 핵심 트레이드오프 또는 새로운 패턴에 더 집중
|
|
152
|
+
- 사람마다 40-80 lines 정도가 적정 (1단계 = 60-100, 2단계/리팩토링 = 40-70)
|
|
153
|
+
- **안티패턴 코드 스니펫** 인용 시 ` ```kotlin ... ``` ` 블록으로
|
|
154
|
+
|
|
155
|
+
## 검증 — 최종 단계에서 수행
|
|
156
|
+
|
|
157
|
+
- 무작위 3개 PR 파일을 GitHub 원본과 대조
|
|
158
|
+
- Kotlin 관용구 누수 점검 (`grep -r -E "scope function|apply *\{|let *\{|smart cast"`)
|
|
159
|
+
- `SUMMARY.md`의 PR 카운트 = 실제 `.md` 수
|
|
160
|
+
- 모든 reviewee 폴더에 최소 1개 .md
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# 우아한테크코스 kotlin-lotto PR 리뷰 OOP 교훈
|
|
2
|
+
|
|
3
|
+
[`woowacourse/kotlin-lotto`](https://github.com/woowacourse/kotlin-lotto) 리포의 closed PR 153개 중 라인 코멘트 ≥ 5개인 **141개 PR (71명 reviewee)**을 분석해 도출한 OOP 설계 교훈 모음.
|
|
4
|
+
|
|
5
|
+
## 📖 시작하기
|
|
6
|
+
|
|
7
|
+
- **[SUMMARY.md](SUMMARY.md)** — 전체 정리 (자주 하는 실수 TOP 10, 리뷰어 명언, 조영호 강의 토픽 매핑, 단계별 학습 곡선, **racingcar vs lotto 비교**)
|
|
8
|
+
- **개별 PR 분석** — 각 reviewee 폴더 안에 `<PR번호>-<단계>-로또.md` 형태로 정리
|
|
9
|
+
- **이전 미션**: [racingcar lessons](../woowacourse-racingcar/) — 같은 학생들의 이전 학습 흐름
|
|
10
|
+
|
|
11
|
+
## 🎯 분석 범위
|
|
12
|
+
|
|
13
|
+
**OOP 설계 관점만**:
|
|
14
|
+
책임 분배 / 응집도 / 결합도 / 캡슐화 / Tell-Don't-Ask / 테스터빌리티 / 도메인 모델링 / 일급 컬렉션 / 원시 강박 / 의존 방향 / 명명 설계
|
|
15
|
+
|
|
16
|
+
**제외**:
|
|
17
|
+
Kotlin 관용구 (scope function, smart cast, null 처리 idiom, val/var, data class 문법 자체)
|
|
18
|
+
|
|
19
|
+
**추가 (racingcar lessons와의 차이)**:
|
|
20
|
+
**안티패턴 발견 시 실제 `diff_hunk` 코드 스니펫을 함께 인용** — 가독성과 즉시 파악 ↑.
|
|
21
|
+
|
|
22
|
+
## 📂 폴더 구조
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
woowacourse-kotlin-lotto/
|
|
26
|
+
├── README.md (이 문서)
|
|
27
|
+
├── SUMMARY.md (총정리)
|
|
28
|
+
├── PROGRESS.md (작업 진행 로그)
|
|
29
|
+
└── <reviewee-name>/
|
|
30
|
+
└── <PR번호>-<단계>-로또.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
각 PR 분석은 다음 구조:
|
|
34
|
+
- **잘한 점** (설계 관점)
|
|
35
|
+
- **못한 점** (설계 관점) — *실제 코드 스니펫 포함*
|
|
36
|
+
- **리뷰어 의견 요지** (대표 인용 1~3개 + 출처)
|
|
37
|
+
- **얻은 교훈**
|
|
38
|
+
|
|
39
|
+
## 🔥 lotto 도메인 특화 안티패턴 TOP 5
|
|
40
|
+
|
|
41
|
+
racingcar와 다른 lotto만의 패턴:
|
|
42
|
+
|
|
43
|
+
### 1. `LottoNumber` 도메인 누락
|
|
44
|
+
`Lotto`가 `List<Int>` 노출 → 호출자가 매번 "이 Int가 로또 번호 맞나?" 의심
|
|
45
|
+
|
|
46
|
+
### 2. `Rank` enum + `matchBonus` 처리
|
|
47
|
+
5개 일치 두 가지 분기 (2등 vs 3등) 어떻게 표현?
|
|
48
|
+
→ 필드 vs 검색 입력 vs `null` fallback
|
|
49
|
+
|
|
50
|
+
### 3. `Map<Rank, Int>` wrapping 회피
|
|
51
|
+
통계 자료구조를 그대로 노출 → 표현 책임이 View로 누수
|
|
52
|
+
|
|
53
|
+
### 4. 수동/자동 로또 통합 (2단계)
|
|
54
|
+
같은 *발급 협력*인데 다른 시그니처 → Strategy 패턴 미적용
|
|
55
|
+
|
|
56
|
+
### 5. `Money`/`Profit`/`Yield` 금융 도메인
|
|
57
|
+
원시값 그대로 노출 또는 wrapping만 (행위 부재)
|
|
58
|
+
|
|
59
|
+
자세한 내용: [SUMMARY.md의 "자주 하는 설계 실수 TOP 10"](SUMMARY.md#자주-하는-설계-실수-top-10-lotto-도메인-특화)
|
|
60
|
+
|
|
61
|
+
## 🎓 단계별 학습 곡선
|
|
62
|
+
|
|
63
|
+
**1단계** = LottoNumber 추출, Rank enum 설계, Validator 위치, Statistics god-object
|
|
64
|
+
**2단계** = 수동/자동 통합, Strategy 패턴, Map<Rank, Int> wrapping, flyweight 캐싱, 거스름돈 UX
|
|
65
|
+
|
|
66
|
+
자세한 분석은 [SUMMARY.md의 "단계별 학습 곡선"](SUMMARY.md#단계별-학습-곡선-lotto) 참고.
|
|
67
|
+
|
|
68
|
+
## 🔗 관련 리소스
|
|
69
|
+
|
|
70
|
+
- 원본 리포: https://github.com/woowacourse/kotlin-lotto
|
|
71
|
+
- 이전 미션: [woowacourse-racingcar/](../woowacourse-racingcar/) — racingcar lessons (133 PR)
|
|
72
|
+
- 분석 도구 (Oh-My-OOP MCP): [상위 리포 README](../../README.md)
|
|
73
|
+
- 조영호 "객체지향의 사실과 오해" — 책임/역할/협력 3요소가 본 분석의 주요 어휘
|
|
74
|
+
|
|
75
|
+
## 📝 작업 로그
|
|
76
|
+
|
|
77
|
+
분석 과정과 데이터 위치는 [PROGRESS.md](PROGRESS.md) 참고. 캐시된 PR 메타와 코멘트 JSON은 `/tmp/oop-lessons-cache-lotto/`에 저장됨 (재부팅 시 사라질 수 있음).
|