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,107 @@
|
|
|
1
|
+
# PR #153 — [이든] 2단계 로또 (최신 PR)
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@devfeijoa](https://github.com/devfeijoa)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/153
|
|
5
|
+
- **단계:** 2단계 (lotto 미션 가장 최신 PR)
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 22 (리뷰어 15 + 학생 7)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **인터페이스 활용 시도**.
|
|
12
|
+
|
|
13
|
+
## 못한 점 (설계 관점)
|
|
14
|
+
|
|
15
|
+
### 1. `ManualLottoGenerator`의 *count 묵시적 invariant*
|
|
16
|
+
|
|
17
|
+
```kotlin
|
|
18
|
+
class ManualLottoGenerator(val manualNumbersList: List<List<Int>>) {
|
|
19
|
+
fun generate(count: Int): List<Lotto> =. // ⚠ count == manualNumbersList.size?
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
리뷰어: "*ManualLottoGenerator 객체를 활용하는 개발자는 manualNumbersList의 count와 generate의 count가 같아야 한다는 사실을 알 수 있을까요? LottoGenerator 인터페이스의 역할을 제대로 하는 것일지 고민*해 보세요. 힌트를 조금 더 드리자면, *로또를 발급하는 객체가 랜덤 로또를 생성하는 객체를 활용하는 형태로 구성해 볼 수* 있겠어요." — *묵시적 약속 = 동료 혼란*.
|
|
24
|
+
|
|
25
|
+
### 2. `Lotto`가 *당첨 티켓 관심*?
|
|
26
|
+
|
|
27
|
+
리뷰어: "*로또 티켓 자체는 당첨 티켓에 대한 관심을 가져야 할지 고민*해 보세요!" — *책임 경계 검토*.
|
|
28
|
+
|
|
29
|
+
### 3. *부 생성자 vs 팩토리* — 메타-질문
|
|
30
|
+
|
|
31
|
+
리뷰어: "*이 부분을 생성자로 만들지 않은 이유가 궁금*하네요" — *팩토리 함수* 정당화.
|
|
32
|
+
|
|
33
|
+
### 4. *에러 메시지에 입력값 없음*
|
|
34
|
+
|
|
35
|
+
리뷰어: "*어떤 값이 들어왔는지 에러 메시지에 담아 보는 건* 어떨까요? *어떤 장점이 생길 수 있을까요*?" + "*어떤 입력 값이었는지도 메시지에 남겨보는 건* 어떨까요?".
|
|
36
|
+
|
|
37
|
+
### 5. *`value class` → `class` 변경 이유*
|
|
38
|
+
|
|
39
|
+
리뷰어: "*value class에서 class가 된 이유가 궁금*하네요!"
|
|
40
|
+
|
|
41
|
+
### 6. *`assertAll` 사용 안 함*
|
|
42
|
+
|
|
43
|
+
리뷰어: "*assertAll로 묶는 것과 그렇지 않은 것은 어떤 차이가 있을까요*?".
|
|
44
|
+
|
|
45
|
+
### 7. *일급 컬렉션 부재* (Lottos, LottoResults)
|
|
46
|
+
|
|
47
|
+
리뷰어: "*로또들을 담는 일급 컬렉션을 만들어 보는 건* 어떨까요?" + "*로또 결과들을 담는 일급 컬렉션을 만들어 보는 건* 어떨까요?" + 추가: "*여전히 유효한 피드백*이에요. *이번 미션의 요구사항이기도 한 일급 컬렉션을 만들어 보세요*." — *명세 요구사항*.
|
|
48
|
+
|
|
49
|
+
### 8. `Lotto` *테스트 누락 요소*
|
|
50
|
+
|
|
51
|
+
리뷰어: "*Lotto에 테스트 코드가 없는 어떠한 요소들이 있*네요. *잘 찾아서 추가해 보세요* :)"
|
|
52
|
+
|
|
53
|
+
### 9. *LottoGenerator 인터페이스 구현체 강제 회피*
|
|
54
|
+
|
|
55
|
+
리뷰어: "이렇게 되면 *수동 티켓을 만들 때마다 LottoFactory 객체와 ManualLottoGenerator 객체를 새로 생성*해야겠어요. *여기에서 자동, 수동 티켓을 만드는 역할을 수행하고, 랜덤의 요소를 국소적으로 분리해 보는 건 어떨까요? LottoGenerator 인터페이스가 반드시 수동 자동 구현체를 만들어야 한다는 것에 매몰되지 않아도 좋겠*어요." — *추상화의 자유*. *수동/자동 = LottoGenerator 구현체*에 강박 X.
|
|
56
|
+
|
|
57
|
+
### 10. *테스트 불가 클래스* — LottoGenerator 가지는 객체로 테스트
|
|
58
|
+
|
|
59
|
+
리뷰어: "*이 클래스는 테스트 불가능하니, LottoGenerator를 가지는 machine 객체를 테스트*해 보세요." — *간접 테스트*.
|
|
60
|
+
|
|
61
|
+
### 11. *테스트 데이터 로직 vs 하드코딩*
|
|
62
|
+
|
|
63
|
+
리뷰어: "*테스트에 필요한 정보를 로직을 통해 만들어 내지 않고, 직접 하드코딩으로 생성*해 보는 건 어떨까요?".
|
|
64
|
+
|
|
65
|
+
### 12. *오해 여지 이름 vs 본인 기준*
|
|
66
|
+
|
|
67
|
+
리뷰어: "*이름에 오해의 여지가 있으면 피하는 게 좋겠지요. 그렇다고 무조건 피하는 것은 좋은 방법일지도 생각*해 보세요 :) *본인만의 기준을 만들어 낼 수 있는 좋은 고민거리*네요!" — *기준과 근거*.
|
|
68
|
+
|
|
69
|
+
## 리뷰어 의견 요지
|
|
70
|
+
|
|
71
|
+
- **묵시적 invariant *시그니처로 명시*** (List/count 일치 문제).
|
|
72
|
+
- **`Lotto` *당첨 무관***.
|
|
73
|
+
- **부 생성자 vs 팩토리 *의도 정리***.
|
|
74
|
+
- **에러 메시지에 *입력값***.
|
|
75
|
+
- **`value class → class` *근거 정리***.
|
|
76
|
+
- **`assertAll` *Soft Assertion 의도***.
|
|
77
|
+
- **일급 컬렉션 (Lottos, LottoResults)**.
|
|
78
|
+
- **`LottoGenerator` *수동/자동 구현체 강박 X***.
|
|
79
|
+
- **테스트 불가 클래스 *간접 테스트***.
|
|
80
|
+
- **테스트 데이터 *하드코딩 선호***.
|
|
81
|
+
|
|
82
|
+
- **대표 인용:**
|
|
83
|
+
> ManualLottoGenerator 객체를 활용하는 개발자는 *manualNumbersList의 count와 generate의 count가 같아야 한다는 사실을 알 수 있을까요*?
|
|
84
|
+
> — @malibinYun on `src/main/kotlin/lotto/domain/ManualLottoGenerator.kt`
|
|
85
|
+
|
|
86
|
+
> LottoGenerator 인터페이스가 *반드시 수동 자동 구현체를 만들어야 한다는 것에 매몰되지 않아도 좋겠*어요.
|
|
87
|
+
> — @malibinYun on `src/main/kotlin/lotto/domain/LottoFactory.kt`
|
|
88
|
+
|
|
89
|
+
> 이름에 오해의 여지가 있으면 피하는 게 좋겠지요. *그렇다고 무조건 피하는 것은 좋은 방법일지도 생각*해 보세요. *본인만의 기준을 만들어 낼 수 있는 좋은 고민거리*네요!
|
|
90
|
+
> — @malibinYun
|
|
91
|
+
|
|
92
|
+
> 로또 티켓 자체는 *당첨 티켓에 대한 관심을 가져야 할지* 고민해 보세요!
|
|
93
|
+
> — @malibinYun on `src/main/kotlin/lotto/domain/Lotto.kt`
|
|
94
|
+
|
|
95
|
+
## 얻은 교훈
|
|
96
|
+
|
|
97
|
+
- **묵시적 invariant *시그니처 명시*** — `ManualLottoGenerator(list).generate(count)`에서 *list.size == count*는 *암묵 약속*. *동료가 알 수 없음*.
|
|
98
|
+
- **`Lotto` *당첨 무관*** — 당첨은 *WinningLotto* 책임.
|
|
99
|
+
- **부 생성자 vs 팩토리 *의도 정리*** — *생성자 = 단순 생성*, *팩토리 = 분기/변환*.
|
|
100
|
+
- **에러 메시지에 *입력값*** = *디버깅 비용 절감*. *로그 수집 시대*에 *유일한 데이터 보존*.
|
|
101
|
+
- **`assertAll` *Soft Assertion*** = 한 검증 실패해도 나머지 실행.
|
|
102
|
+
- **일급 컬렉션 *요구사항*** — *역할/책임 부여*가 진짜 가치.
|
|
103
|
+
- **`LottoGenerator` *추상화의 자유*** — *수동/자동 구현체 강박 X*. *랜덤 요소 국소 분리*가 더 자연.
|
|
104
|
+
- **테스트 불가 클래스 = *간접 테스트*** — 협력자 (`Machine`) 테스트.
|
|
105
|
+
- **테스트 데이터 *하드코딩 선호*** — *로직으로 생성*은 *읽기 비용*.
|
|
106
|
+
- **`value class → class` *근거 정리*** — *왜 변경했는지 자가 설명*.
|
|
107
|
+
- **이름 *오해 여지 vs 자기 기준*** — *완전 회피 X*. *왜 그 이름인지 근거*가 더 중요.
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# PR #119 — [디랙] 1단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@doabletuple](https://github.com/doabletuple)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/119
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @woowahan-dino (디노)
|
|
7
|
+
- **라인 코멘트:** 29 (리뷰어 15 + 학생 14)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`LottoNumber` 원시값 포장**.
|
|
12
|
+
- **`profitRate` Double 반환** — 후속 디스커션.
|
|
13
|
+
|
|
14
|
+
## 못한 점 (설계 관점)
|
|
15
|
+
|
|
16
|
+
### 1. 테스트 *함수명과 검증 코드 불일치*
|
|
17
|
+
|
|
18
|
+
```kotlin
|
|
19
|
+
@Test fun `1~45 사이의 숫자인지 검증`() {
|
|
20
|
+
assertThrows<.> { LottoNumber(0) }
|
|
21
|
+
assertThrows<.> { LottoNumber(46) }
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
리뷰어: "*테스트 항목은 로또 번호가 1~45의 숫자인데 실제 코드는 1~45의 숫자가 아닌, 0과 46의 경계에 대한 테스트*네요! 두 가지로 나눠볼 수 있을 것 같은데, *1~45를 검사하는 테스트 코드와, 그 외에 값인 0과 46일 때 테스트 코드로 만들어볼 수 있을 것* 같아요~"
|
|
26
|
+
|
|
27
|
+
### 2. *secondary constructor* — Fake Constructor
|
|
28
|
+
|
|
29
|
+
```kotlin
|
|
30
|
+
Lotto(setOf(1,2,3,4,5,6).map{LottoNumber(it)}.toSet()) // ⚠ 반복
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
리뷰어: "*Lotto 객체를 만들 때 setOf().map{}.toSet()하는 게 반복*되는데 *secondary constructor를 만들어서 조금 더 간편하게 Lotto 객체를 만들 수* 있게 하면 어떨까요? `Lotto(1, 2, 3, 4, 5, 6)`" — 패턴.
|
|
34
|
+
|
|
35
|
+
### 3. *`@ParameterizedTest`* 활용
|
|
36
|
+
|
|
37
|
+
리뷰어: "이런 유형의 테스트는 *@ParameterizedTest를 사용*해서 만들어 볼 수 있을 것 같아요~"
|
|
38
|
+
|
|
39
|
+
### 4. `readLine()` vs `readlnOrNull()` — IDE 워닝
|
|
40
|
+
|
|
41
|
+
리뷰어: "아마도 IntelliJ에서 *'Replace readLine with readlnOrNull'와 같은 워닝*을 보실 수 있을 것 같아요. *readlnOrNull()도 결국 내부적으로 readLine()을 호출하고 있어서 같은 효과를 내는 함수임에도 불구하고 IntelliJ가 readlnOrNull()을 사용하게 권장하는 이유가 어떤 건지 한 번 생각*해 보시면 좋을 것 같아요" — *null 안전성*은 *명시적*.
|
|
42
|
+
|
|
43
|
+
### 5. *View에 `floor` 계산 로직* — 도메인 침투
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
// OutputView
|
|
47
|
+
floor(profitRate * 100) / 100
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
리뷰어: "*floor(profitRate * 100) / 100와 같은 로직이 View에 있는 것보단 Domain에 있는 게 더 적절*해 보이는데 어떻게 생각하시나요?"
|
|
51
|
+
|
|
52
|
+
### 6. *View에서 profitRate 비교 → enum 변환*
|
|
53
|
+
|
|
54
|
+
```kotlin
|
|
55
|
+
if (profitRate < 1) "손해."
|
|
56
|
+
else if (profitRate > 1) "이익."
|
|
57
|
+
else "현상유지."
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
리뷰어: "*View에서 profitRate가 1보다 작은지, 큰지, 같은지와 같은 로직이 있는 것 좋지 않아 보여요*! *View가 아닌 다른 곳에서 profitRate를 가지고 enum으로 변환하고 View에서는 enum에 따라 message만 출력*해 주면 어떨까요?".
|
|
61
|
+
|
|
62
|
+
### 7. `!in` 연산자 가독성
|
|
63
|
+
|
|
64
|
+
```kotlin
|
|
65
|
+
!lotto.numbers.contains(bonusNumber)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
리뷰어: "*bonusNumber !in lotto.numbers와 같이 사용할 수도 있*습니다~ *'bonusNumber가 lotto.numbers에 있지 않다'와 같이 읽혀서 저는 이렇게 작성하는 것을 선호*하는데 어떠신가요?" — *Kotlin idiom*으로 *자연어 읽기*.
|
|
69
|
+
|
|
70
|
+
### 8. 상수 *위치* — `Lotto` 안에 *LottoNumber 상수*
|
|
71
|
+
|
|
72
|
+
리뷰어: "*이것은 Lotto보다 LottoNumber의 상수로 있는 게 좋아 보여요*" — *책임 단위*에 상수 부착.
|
|
73
|
+
|
|
74
|
+
### 9. `Lottos = Set<Lotto>` — 중복 의미
|
|
75
|
+
|
|
76
|
+
리뷰어: "*Lottos에 Lotto가 중복으로 존재할 수 있다고 생각하는데 Set으로 하신 이유가 있을까요*?" — *Lottos*는 *List<Lotto>*. *같은 번호 조합 다중 구매* 가능.
|
|
77
|
+
|
|
78
|
+
### 10. *검증 전 출력* 순서
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
fun convertLottos() {
|
|
82
|
+
showLottoCount(amount / 1000) // ⚠ 출력 먼저
|
|
83
|
+
return Lottos.buy(amount) // 검증
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
리뷰어: "*price에 대한 검증을 convertLottos() 안에 Lottos.buy() 내부에서 하고 있는데 검증하기 전에 showLottoCount로 로또의 개수를 출력하는 게 조금 어색*하네요. *금액을 받고 바로 Lottos를 만든 다음 이 객체를 사용해서 출력을 하는 것*으로 변경해 보면 어떨까요?" — *검증 → 객체 → 출력* 흐름.
|
|
88
|
+
|
|
89
|
+
### 11. *Controller가 result 직접 계산* — `Lottos` 활용
|
|
90
|
+
|
|
91
|
+
리뷰어: "Controller에서 *직접 result를 구하는 것보단 Lottos 클래스에서 함수로 제공*하면 어떨까요?"
|
|
92
|
+
|
|
93
|
+
### 12. *View가 문구 가공* — 도메인 결과만 받기
|
|
94
|
+
|
|
95
|
+
리뷰어: "이런 *문구를 만들어서 출력하는 것도 OutputView의 역할*이라고 생각이 되서 실제로 *View.showResult에는 List<LottoResult>만 전달*해도 될 것 같아 보이네요"
|
|
96
|
+
|
|
97
|
+
### 13. `makeRandomNumbers` — 매번 Range 생성
|
|
98
|
+
|
|
99
|
+
```kotlin
|
|
100
|
+
fun makeRandomNumbers(): List<LottoNumber> {
|
|
101
|
+
return (1..45).shuffled().take(6).map { LottoNumber(it) } // ⚠ 매번 (1..45)
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
리뷰어: "*LottoNumber를 만들기 위해 makeRandomNumbers를 사용하는데 매번 Range를 만들 필요는 없을 것* 같아요. 결국 List<Int>를 가지고 List<LottoNumber>를 만들게 될 탠데, *1~45의 LottoNumber 객체를 만들고 거기서 shuffle한 다음 take하면 될 것 같*은데 어떻게 생각하시나요? *만약 로또를 10억 치 사면 1,000,000번의 makeRandomNumbers가 호출될 탠데 그때 매번 Range 객체가 생긴다면 성능면에서 좋지는 않을 것* 같아요" — *Flyweight + 상수 컬렉션 재사용*.
|
|
106
|
+
|
|
107
|
+
### 14. *일급 컬렉션 누락* — `LottoResults`
|
|
108
|
+
|
|
109
|
+
리뷰어: "추가된 요구사항에 보면 *'일급 컬렉션을 쓴다.'라는 게 있*는데 *List<LottoResult>를 가지는 LottoResults를 만들고 내부에서 getProfitRate()를 만들어서 사용*하면 더 좋을 것 같아요"
|
|
110
|
+
|
|
111
|
+
### 15. *수익률 표시*
|
|
112
|
+
|
|
113
|
+
리뷰어: "이거는 *제가 잘못 이해하고 남겼던 것 같*네요 ㅠㅠ profitRate가 이미 수익률을 나타내는 것이었네요! 소수점 2자리까지만 표시를 해야 한다면 저렇게 하기보다 *%.2f 이런식으로 String format을 이용*해 보시는 것도 좋을 것 같아요" — *리뷰어 자기 정정*도 자연.
|
|
114
|
+
|
|
115
|
+
## 리뷰어 의견 요지
|
|
116
|
+
|
|
117
|
+
- **테스트 *함수명 = 검증 결과***.
|
|
118
|
+
- **`Lotto(1,2,3,4,5,6)` *fake constructor*** — 테스트 가독성.
|
|
119
|
+
- **`@ParameterizedTest` 활용**.
|
|
120
|
+
- **`readlnOrNull()` *null 안전 명시***.
|
|
121
|
+
- **View의 *계산/분기* → 도메인**.
|
|
122
|
+
- **`!in` *자연어 가독성***.
|
|
123
|
+
- **상수 *책임 단위*에**.
|
|
124
|
+
- **`Lottos` = `List` (중복 허용)**.
|
|
125
|
+
- **검증 → 객체 → 출력** 순서.
|
|
126
|
+
- **Controller가 *result 직접 계산 X***.
|
|
127
|
+
- **View *문구 가공* 책임**.
|
|
128
|
+
- **상수 컬렉션 재사용** (Range 매번 X).
|
|
129
|
+
- **`LottoResults` 일급 컬렉션**.
|
|
130
|
+
- **`%.2f` String format**.
|
|
131
|
+
|
|
132
|
+
- **대표 인용:**
|
|
133
|
+
> 테스트 항목은 로또 번호가 1~45의 숫자인데 실제 코드는 *1~45의 숫자가 아닌, 0과 46의 경계에 대한 테스트*네요!
|
|
134
|
+
> — @woowahan-dino on `src/test/kotlin/lotto/LottoNumberTest.kt`
|
|
135
|
+
|
|
136
|
+
> readlnOrNull()도 결국 내부적으로 readLine()을 호출 하고 있어서 같은 효과를 내는 함수임에도 불구하고 *IntelliJ가 readlnOrNull()을 사용하게 권장하는 이유가 어떤 건지 한 번 생각*해 보시면 좋을 것 같아요.
|
|
137
|
+
> — @woowahan-dino on `src/main/kotlin/lotto/InputView.kt`
|
|
138
|
+
|
|
139
|
+
> 만약 로또를 10억 치 사면 1,000,000번의 makeRandomNumbers가 호출될 탠데 그때 매번 *Range 객체가 생긴다면 성능면에서 좋지는 않을 것* 같아요.
|
|
140
|
+
> — @woowahan-dino on `src/main/kotlin/lotto/Lottos.kt`
|
|
141
|
+
|
|
142
|
+
> 이거는 제가 *잘못 이해하고 남겼던 것 같*네요 ㅠㅠ
|
|
143
|
+
> — @woowahan-dino
|
|
144
|
+
|
|
145
|
+
## 얻은 교훈
|
|
146
|
+
|
|
147
|
+
- **테스트 *함수명과 검증 일치*** — *1~45 검증*이 *경계 외 (0, 46) 테스트*면 *제목/내용 불일치*. *정상 + 경계 외* 두 테스트.
|
|
148
|
+
- **`Lotto(1,2,3,4,5,6)` *fake constructor*** — PR #60, #14, #119 모두 *공통 패턴*.
|
|
149
|
+
- **`readlnOrNull()` = *null 안전 명시*** — `readLine()`도 같은 동작이지만 *암묵 null 가능성*이 *명시적*이지 않음.
|
|
150
|
+
- **`!in` 연산자 = *자연어 가독성*** — `bonusNumber !in lotto`는 *영어 not in*과 일치.
|
|
151
|
+
- **상수 *책임 단위*** — *LottoNumber 범위 (1, 45)*는 *LottoNumber*에. *Lotto*에 두면 *간접 참조*.
|
|
152
|
+
- **`Lottos` = `List`** — *Set*은 *중복 불가*. *같은 번호 다중 구매* 가능하므로 List가 자연.
|
|
153
|
+
- **검증 → 객체 → 출력 순서** — *검증 전 출력*은 *오류 시 잘못된 안내*.
|
|
154
|
+
- **`!in` 연산자 + `in` 연산자** — Kotlin idiom.
|
|
155
|
+
- **상수 컬렉션 재사용** — `(1..45)`를 *매번 생성*하면 *N번 객체 생성*. *Flyweight*나 *companion val*에.
|
|
156
|
+
- **`LottoResults` 일급 컬렉션** — *행위 있으면 자격*. PR #80 (dpcks0509) *역할 없으면 일급 컬렉션 자격 미달*과 같은 결.
|
|
157
|
+
- **`%.2f` String format** — *소수점 자르기 + 표시* 한 번에.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# PR #138 — [디랙] 2단계 로또
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@doabletuple](https://github.com/doabletuple)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/138
|
|
5
|
+
- **단계:** 2단계 (수동 로또)
|
|
6
|
+
- **리뷰어:** @woowahan-dino (디노)
|
|
7
|
+
- **라인 코멘트:** 15 (리뷰어 8 + 학생 7)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **후속 라운드 적극 반영** — 리뷰어 칭찬: "*제가 생각했던 방식보다 더 좋은 방식이 나왔네요* ㅎㅎ 👍".
|
|
12
|
+
|
|
13
|
+
## 못한 점 (설계 관점)
|
|
14
|
+
|
|
15
|
+
### 1. `Set → List` *변경 이유 모호*
|
|
16
|
+
|
|
17
|
+
리뷰어: "*저는 Set으로 해야 LottoNumber가 중복되지 않아서 init에서 size를 검사하지 않아도 생각*하는데 *List로 변경하신 이유*가 있나요?" + (학생 후속): "*디랙 혹시 Set<LottoNumber>였을 때 같은 LottoNumber가 들어가서 그럴까요*? *List와 Set은 각각 자료구조인지 한 번 찾아 보시는 것도 좋을 것* 같아요!" — *자료구조 invariant* 활용.
|
|
18
|
+
|
|
19
|
+
### 2. `Result.entries.find` *두 번 사용*
|
|
20
|
+
|
|
21
|
+
```kotlin
|
|
22
|
+
Result.entries.find { it.matchCount == matchCount && it.bonus }
|
|
23
|
+
?: Result.entries.find { it.matchCount == matchCount }
|
|
24
|
+
?: MISS
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
리뷰어: "*이 부분을 조금 더 최적화*해 볼 수 있을 것 같아요. *Result.entries.find를 두 번 쓰지 않고 한 번만 사용*해도 될 것 같아요"
|
|
28
|
+
|
|
29
|
+
### 3. *Map 일괄 생성* — groupingBy
|
|
30
|
+
|
|
31
|
+
```kotlin
|
|
32
|
+
val result = mutableMapOf<Result, Int>()
|
|
33
|
+
rankList.forEach { rank -> result[rank] = (result[rank] ?: 0) + 1 }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
리뷰어: "*코드를 좀 더 나이스하게 바꿔 볼 수 있을 것* 같아요! *Result를 Key로 가지는 Map을 만들고 하나씩 찾아서 넣지 않고, 한 번에 만들어 볼 수는 없을까요? List<Result> => Map<Result, List<Result>> => Map<Result, Int> 형태로 바꿔* 볼 수 있을 것 같아요" — *`groupingBy { it }.eachCount()`* idiom.
|
|
37
|
+
|
|
38
|
+
### 4. *Result.entries 순서 의존* — sort/reverse vs 선언 순서
|
|
39
|
+
|
|
40
|
+
리뷰어: "*제가 생각했던 방법도 결국 Result.entries의 순서를 의존하는 방식*이었습니다. *저는 로직에서 어느 정도 순서를 의존해도 된다고* 생각합니다. 예를 들면 *잔돈 계산하는 로직이 있다고 하면 이것은 큰 단위 숫자부터 계산해야 하니 순서에 의존*해야 하지 않을까? 라는 생각입니다. *Result.entries를 sort하고 reverse할 필요 없이 선언 순서를 변경해도 되지 않을까요*? 그리고 *hasBonus >= result.requireBonus 이것도 조금 어색*합니다. *Boolean을 >=로 계산한 어떤 것을 기대할 수 있을까요*?" — *enum 선언 순서가 의도된 비즈니스 순서*면 *활용 정당*.
|
|
41
|
+
|
|
42
|
+
### 5. *상수 위치* — 위에 선언
|
|
43
|
+
|
|
44
|
+
리뷰어: "*보통은 상수를 위에 선언하고 함수를 아래에 선언*해요!"
|
|
45
|
+
|
|
46
|
+
### 6. *입력 중복 vs 부족 분리* — 학생 의도 인정
|
|
47
|
+
|
|
48
|
+
리뷰어: "*입력이 중복된 경우와, 입력이 부족한 경우를 나누고 싶어서 그러셨군요*! 이해했습니다 ㅎㅎ" — *학생 의도 이해*.
|
|
49
|
+
|
|
50
|
+
## 리뷰어 의견 요지
|
|
51
|
+
|
|
52
|
+
- **`Set` *invariant 활용*** — 변경 이유 명시.
|
|
53
|
+
- **`Result.entries.find` *2회 → 1회 최적화***.
|
|
54
|
+
- **`groupingBy { }.eachCount()` *Map 집계 idiom***.
|
|
55
|
+
- **`enum 선언 순서` *비즈니스 의도*** — sort/reverse 불필요.
|
|
56
|
+
- **`Boolean >=` *어색한 비교***.
|
|
57
|
+
- **상수 *위에 선언***.
|
|
58
|
+
|
|
59
|
+
- **대표 인용:**
|
|
60
|
+
> 저는 로직에서 *어느 정도 순서를 의존해도 된다고* 생각합니다. 예를 들면 *잔돈 계산하는 로직*이 있다고 하면 이것은 큰 단위 숫자부터 계산해야 하니 순서에 의존해야 하지 않을까? 라는 생각입니다.
|
|
61
|
+
> — @woowahan-dino on `src/main/kotlin/lotto/domain/Result.kt`
|
|
62
|
+
|
|
63
|
+
> Result를 Key로 가지는 Map을 만들고 *하나씩 찾아서 넣지 않고, 한 번에 만들어 볼 수는 없을까요*?
|
|
64
|
+
> — @woowahan-dino on `src/main/kotlin/lotto/domain/LottoResults.kt`
|
|
65
|
+
|
|
66
|
+
> Boolean을 >=로 계산한 *어떤 것을 기대할 수* 있을까요?
|
|
67
|
+
> — @woowahan-dino on `src/main/kotlin/lotto/domain/Result.kt`
|
|
68
|
+
|
|
69
|
+
## 얻은 교훈
|
|
70
|
+
|
|
71
|
+
- **자료구조 선택 *invariant 표현*** — *Set*은 *중복 방지*. *List*는 *순서/중복 허용*.
|
|
72
|
+
- **`Result.entries.find` *1회 사용*** — *찾는 조건을 한 번에 결합*.
|
|
73
|
+
- **`groupingBy { }.eachCount()`** = *Map 집계 표준 idiom*. *MutableMap + forEach*보다 *불변 + 함수형*.
|
|
74
|
+
- **`enum` *선언 순서 = 비즈니스 순서*** — *큰 단위 잔돈 계산*처럼 *순서 의존 정당*. *sort/reverse 불필요*.
|
|
75
|
+
- **`Boolean >=` *어색*** — *비교 연산자*는 *순서 있는 타입*에. *Boolean*은 *and/or*이 자연.
|
|
76
|
+
- **상수 *위치*** — 함수 위에 *Kotlin 컨벤션*.
|
|
77
|
+
- **`>=`로 Boolean 비교 → *Boolean 산술 오용 신호*** — *true=1, false=0* 가정.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# PR #111 — [로또 1단계] 동전 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@donghyun81](https://github.com/donghyun81)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/111
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @malibinYun
|
|
7
|
+
- **라인 코멘트:** 49
|
|
8
|
+
|
|
9
|
+
## 못한 점 + 핵심 지적
|
|
10
|
+
|
|
11
|
+
### 1. `Constants.kt` global — 응집도 0
|
|
12
|
+
|
|
13
|
+
```kotlin
|
|
14
|
+
object Constants {
|
|
15
|
+
// 모든 상수
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
> 이 상수들을 글로벌하게 관리하는 이유가 궁금하네요! 어떠한 객체에 응집도 있게 묶어보는 건 어떨까요?
|
|
20
|
+
|
|
21
|
+
### 2. Controller가 결과 비교 순회
|
|
22
|
+
|
|
23
|
+
```kotlin
|
|
24
|
+
class LottoController {
|
|
25
|
+
fun run() {
|
|
26
|
+
lottos.forEach { lotto ->
|
|
27
|
+
val rank = compare(lotto, winning) // ⚠ Controller가 비교
|
|
28
|
+
.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> 로또 티켓의 순회를 돌면서 하나하나 결과를 비교하고 있네요. 이 로직은 도메인로직일까요, 컨트롤러의 로직일까요?
|
|
35
|
+
|
|
36
|
+
→ `winningLotto.matchAll(lottos)` 메시지.
|
|
37
|
+
|
|
38
|
+
### 3. `WinningNumbers` vs `Lotto` 차이 의문
|
|
39
|
+
|
|
40
|
+
> 당첨 번호를 구성하는 요소는 무엇이 있을까요? 당첨 번호와 로또를 비교하면 어떠한 결과가 나올텐데, "당첨 번호"와 "비교할 로또", 이 둘의 차이점은 무엇일까요?
|
|
41
|
+
|
|
42
|
+
→ 둘 다 6개 번호 = 데이터 같음. 차이는 *역할* (winning은 비교 기준).
|
|
43
|
+
|
|
44
|
+
### 4. `LottoRank.matchBonus` 디폴트값 — 어디는 명시, 어디는 디폴트
|
|
45
|
+
|
|
46
|
+
```kotlin
|
|
47
|
+
enum class LottoRank(val matchBonus: Boolean = false) {
|
|
48
|
+
SECOND(matchBonus = true),
|
|
49
|
+
.
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
> matchBonus란 값을 어디는 명시되어있고 어디는 디폴트네요. 한 곳만 표현해야하는 정보인데 필드로 두는 것은 불필요해보여요. 보너스 볼이 맞아야한다는 것은 로직으로 표현해보는 건 어떨까요?
|
|
54
|
+
|
|
55
|
+
→ matchBonus는 *판별 입력*이지 *enum의 영구 속성*이 아님.
|
|
56
|
+
|
|
57
|
+
### 5. `LottoRankCalculator` — 아무 일도 안 함
|
|
58
|
+
|
|
59
|
+
> 이 객체가 하는 일은 어딘가 아무 일도 하지 않는 객체에 응집도 있게 뭉쳐볼 수 있겠어요!
|
|
60
|
+
|
|
61
|
+
→ Calculator가 *외부 비교*로만 채워지면 Tell-Don't-Ask 위반. WinningLotto가 자기 비교 책임.
|
|
62
|
+
|
|
63
|
+
## 얻은 교훈
|
|
64
|
+
|
|
65
|
+
- **`Constants.kt` global = god-folder 시작점**.
|
|
66
|
+
- **Calculator/Analyzer가 외부 비교 = feature-envy**. 도메인이 자기 비교 책임.
|
|
67
|
+
- **enum의 *판별 입력*과 *영구 속성* 분리** — matchBonus는 전자.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# PR #152 — [로또 2단계] 동전 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@donghyun81](https://github.com/donghyun81)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-lotto/pull/152
|
|
5
|
+
- **단계:** 2단계 (수동 로또 추가)
|
|
6
|
+
- **리뷰어:** @malibinYun
|
|
7
|
+
- **라인 코멘트:** 20
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`sealed class LottoResult` 대규모 도입** — Result 타입화 학습.
|
|
12
|
+
- **`LottoMachine` 인터페이스 + `RandomLottoMachine` 구현체**.
|
|
13
|
+
- **`Lottos` 일급 컬렉션** — 수동/자동 분리 보유.
|
|
14
|
+
- **자가 의문 PR에 풍부히 명시** — *sealed 정당화*, *수동/자동 인터페이스 통합 어려움* 등.
|
|
15
|
+
|
|
16
|
+
## 못한 점 (설계 관점)
|
|
17
|
+
|
|
18
|
+
### 1. sealed class 대규모 도입 — *과적용* 신호
|
|
19
|
+
|
|
20
|
+
```kotlin
|
|
21
|
+
sealed class LottoResult {
|
|
22
|
+
data class Success(val lotto: Lotto) : LottoResult()
|
|
23
|
+
data object InvalidNumbersNull : LottoResult()
|
|
24
|
+
data object InvalidNumberNull : LottoResult()
|
|
25
|
+
data class InvalidNumberRange(val lottoNumber: Int) : LottoResult()
|
|
26
|
+
data class InvalidNumbersSize(val lottoNumbers: Set<LottoNumber>) : LottoResult()
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
리뷰어: "sealed로 대부분이 바뀐 것을 보니 생각이 많아지네요. *sealed를 쓰게 된 이유는 무엇인가요?* sealed로 구성되어 있는 부분도 있고, 아닌 부분들도 보여요. *나눈 기준*은 무엇인가요?" 학생: "사용자와 상호작용을 통해 생기는 처리를 *여러 방법으로* 처리하기 위해. 사용자에게 상황에 맞는 안내를 통해 사용자 경험 향상." 리뷰어 답: "사용자와 상호 작용을 통해 생기는 처리를 위해 sealed를 쓴 것은 공감이 잘 되지 않네요. *그런 처리는 View에서 해도 충분*하지 않았나. 처음부터 *null을 받지 못하도록 구성*하는 건 어떨까요? 논리적으로 맞지 않는 *객체 인스턴스를 생성하지 못하도록 막는 것*이 중요하다 생각해요. sealed도 그것을 해결할 수 있는 방법 중 하나이지요. 그런데 sealed로 *해결할 수도 있지만, 지난 단계의 미션을 진행했을 때 구성*했던 것처럼 해도 똑같이 해결이 됩니다." + "이 미션에서 sealed로 해결하고자 했던 것이, *sealed를 활용하지 않았을 때는 해결할 수 없었는지* 돌아보시면 좋겠어요."
|
|
31
|
+
|
|
32
|
+
### 2. `LottoResult.getSuccessOrThrow()` — sealed인데 throw
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
fun getSuccessOrThrow(): Lotto {
|
|
36
|
+
require(this is Success)
|
|
37
|
+
return lotto
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
리뷰어: "sealed로 묶었는데 *throw를 던진다*라.. 굉장히 특이한데요? sealed를 왜 묶었는지를 먼저 알아본 다음, … sealed로 해결할 수 있는 *문제를 정확하게 짚어내지 못했다*는 느낌이 강하게 드네요." 후속: "*논리적인 오류를 막을 때, throw를 하지 않기 위해* 고안할 수 있는 방법 중 하나가 sealed로 구성하는 것이지요. *왜 throw를 하지 않기 위해* 그런 구성이 나왔는지와, 어떻게 sealed는 그것을 해결해 줄 수 있었는지 고민해 보시면 좋겠어요."
|
|
42
|
+
|
|
43
|
+
### 3. `Lottos`가 setter 패턴
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
class Lottos {
|
|
47
|
+
private val randomLottos: MutableList<Lotto> = mutableListOf()
|
|
48
|
+
private val manualLottos: MutableList<Lotto> = mutableListOf()
|
|
49
|
+
fun addRandomLotto(lotto: Lotto) { randomLottos.add(lotto) }
|
|
50
|
+
fun addManualLotto(lotto: Lotto) { manualLottos.add(lotto) }
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
리뷰어: "이 객체는 값을 갖고 있는 것 말고는 하는 일이 없네요. 어떤 역할을 부여해 볼 수 있어 보여요. 또, *add를 일일이 불러 주기 보다, 생성할 때 값을 받게끔* 만들어 볼 수 있겠어요."
|
|
55
|
+
|
|
56
|
+
### 4. `LottoStore` 명명 혼동
|
|
57
|
+
|
|
58
|
+
```kotlin
|
|
59
|
+
class LottoStore(val lottoRanks: Map<LottoRank, Int>) {. }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
리뷰어: "이 객체 이름은 뭔가 *로또를 판매할 것만 같은* 느낌이 드네요!" 학생: "로또들을 통해 돈을 지급하는 객체를 생각해서 Store라고 생각했는데, *판매할 것 같은 느낌이 더* 드네요." — 명명이 *현실 세계의 다른 기능*을 연상시키면 혼동.
|
|
63
|
+
|
|
64
|
+
### 5. `Lotto.getMatchCount(winningLotto)` — *Lotto가 winningLotto를 안다*
|
|
65
|
+
|
|
66
|
+
리뷰어: "로또가 맡을 수 있는 역할을 잘 가져다 놓아주셨네요. getMatchCount()의 파라미터인 Lotto는 꼭 *당첨 티켓*일 필요는 없어 보여요. 그저 *로또와 로또를 비교*해서 맞는 개수를 비교해 준다는 의미만을 넣어 보는 건 어떨까요? *로또 자체가 굳이 당첨 티켓에 대한 관심을 가지지 않는 것*이죠." → `Lotto.getSameNumberCount(other: Lotto)`.
|
|
67
|
+
|
|
68
|
+
### 6. `RandomLottoMachine` vs `ManualLottoMachine` 인터페이스 통합 어려움
|
|
69
|
+
|
|
70
|
+
학생: "수동 로또 요구사항을 보고 random이랑 manual 머신 구현체를 만들어서 LottoMachine 인터페이스를 통해서 추상화하고 싶어서 여러 방법을 찾아봤지만, *generate의 매개변수가 달라서 오버로딩*을 하거나 *ManualLottoMachine의 생성자에 프로퍼티*를 받는 방법 말고는 찾지를 못했습니다." 리뷰어: "LottoMachine이 1단계에서 랜덤 로또를 생성하는 것만 생각해서 만들어진 *추상체*라 더욱 어려워지는 게 아닐지 고민해 보세요. *랜덤의 요소를 최대한 국소적으로* 만들어 내고, *추상의 단계를 수정*해 보세요." + "꼭 LottoMachine의 하위 구현체로 자동과 수동을 만들 필요는 없다. 저라면 *난수 발생기*만을 랜덤의 요소로 객체 분리했을 거라 생각해요."
|
|
71
|
+
|
|
72
|
+
### 7. `WinningNumbers`가 `Lottos`의 값을 꺼내 사용
|
|
73
|
+
|
|
74
|
+
```kotlin
|
|
75
|
+
private fun getPurchaseLottoRanks(purchaseLotto: Lottos): List<LottoRank> = purchaseLotto.lottos.map {. }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
리뷰어: "결국 Lottos의 값을 꺼내 쓰고 있으니 *메시지를 던진다는 느낌을 받기는 어려워* 보여요. *Lottos에게 WinningNumbers를 역으로 던져 보는 형태*로 구성해 보셔도 좋겠네요."
|
|
79
|
+
|
|
80
|
+
### 8. Inferred Type — 멤버/리턴 타입 명시 부재
|
|
81
|
+
|
|
82
|
+
```kotlin
|
|
83
|
+
fun getSameNumberCount(other: Lotto) = _numbers.count { number -> other._numbers.contains(number) }
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
리뷰어: "*멤버 변수와 메서드의 리턴 타입*은 모두 명시해 주는 것은 어떨까요? 명시해 주는 것과 그렇지 않은 것은 어떤 차이점이 생길까요? Effective Kotlin 서적의 챕터를 참고해서… Item 4: *Inferred Type으로 리턴하지 말라*. Item 14: *변수 타입이 명확하지 않은 경우 확실하게 지정하라*."
|
|
87
|
+
|
|
88
|
+
### 9. 1단계 코멘트 미반영
|
|
89
|
+
|
|
90
|
+
리뷰어: "https://github.com/woowacourse/kotlin-lotto/pull/111#discussion_r1968857015 이 피드백이 반영되지 않은 것은 많이 아쉬운 마음이에요." — 이전 라운드 미반영은 *학습 흐름 단절*.
|
|
91
|
+
|
|
92
|
+
## 리뷰어 의견 요지
|
|
93
|
+
|
|
94
|
+
- **sealed의 *진짜 정당화*는 *throw 회피*** — 사용자 상호작용 처리는 View에서.
|
|
95
|
+
- **sealed에 throw 섞기 X** — *sealed의 의미*가 *닫힌 분기*인데 throw는 *열린 실패*.
|
|
96
|
+
- **Lottos에 *행위*** — setter 누적 패턴 회피, 생성자에 값 받기.
|
|
97
|
+
- **명명은 *현실 세계 다른 기능*과 충돌 회피** — Store는 판매를 연상.
|
|
98
|
+
- **Lotto.matchCount의 파라미터는 *임의의 Lotto*** — 당첨/일반 구분 X.
|
|
99
|
+
- **추상체 *단계 수정*** — LottoMachine을 *Auto/Manual*로 나누기보다 *난수 발생기*만 분리.
|
|
100
|
+
- **`Lottos`에 메시지 던지기** — getter로 꺼내 쓰지 말 것.
|
|
101
|
+
- **Inferred Type 회피** — 멤버/리턴 타입 명시.
|
|
102
|
+
- **이전 라운드 코멘트 반영**은 학습 흐름.
|
|
103
|
+
|
|
104
|
+
- **대표 인용:**
|
|
105
|
+
> sealed로 묶었는데 throw를 던진다라.. 굉장히 특이한데요? sealed를 왜 묶었는지를 먼저 알아본 다음… *sealed로 해결할 수 있는 문제를 정확하게 짚어내지 못했다*는 느낌이 강하게 드네요.
|
|
106
|
+
> — @malibinYun on `src/main/kotlin/lotto/domain/service/RandomLottoMachine.kt`
|
|
107
|
+
|
|
108
|
+
> LottoMachine이 1단계에서 랜덤 로또를 생성하는 것만 생각해서 만들어진 추상체라 더욱 어려워지는 게 아닐지 고민해 보세요. 저라면 *난수 발생기*만을 랜덤의 요소로 객체 분리.
|
|
109
|
+
> — @malibinYun on `src/main/kotlin/lotto/controller/LottoController.kt`
|
|
110
|
+
|
|
111
|
+
> Lotto의 파라미터인 Lotto는 꼭 *당첨 티켓*일 필요는 없어 보여요. 그저 로또와 로또를 비교해서 맞는 개수를 비교해 준다는 의미만을.
|
|
112
|
+
> — @malibinYun on `src/main/kotlin/lotto/domain/model/Lotto.kt`
|
|
113
|
+
|
|
114
|
+
## 얻은 교훈
|
|
115
|
+
|
|
116
|
+
- **sealed의 *진짜 정당화* = *throw 회피*** — 사용자 안내 메시지를 *도메인까지 끌어옴*은 책임 위반.
|
|
117
|
+
- **sealed + throw = 의미 충돌** — sealed는 *모든 경우를 닫음*, throw는 *열린 실패*.
|
|
118
|
+
- **Lottos에 행위** — `add` 누적 setter는 *외부 강제*. 생성자에 값 받기.
|
|
119
|
+
- **명명 충돌 회피** — *Store*는 *판매*를 연상. 도메인 의미 명확화.
|
|
120
|
+
- **`Lotto.matchCount(other)`** — 파라미터는 *임의의 Lotto*. *당첨*은 호출자의 맥락.
|
|
121
|
+
- **추상체 *단계 수정*** — Manual/Auto Machine 통합이 어려우면 *추상이 잘못된 단계*일 수 있음. *난수 발생기*만 분리가 더 적합할 때도 있음.
|
|
122
|
+
- **`Lottos`에 메시지 던지기**, getter로 꺼내 쓰지 말 것 — `Tell, Don't Ask`.
|
|
123
|
+
- **Inferred Type 회피** (Effective Kotlin Item 4, 14) — 멤버/리턴 타입 명시는 *미래 변경의 견고성*.
|
|
124
|
+
- **이전 라운드 미반영은 *학습 흐름 단절*** — *왜 미반영*했는지 PR에 명시.
|