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,278 @@
|
|
|
1
|
+
# PR #51 — [블랙잭 2단계] 부나 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@tmdgh1592](https://github.com/tmdgh1592)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/51
|
|
5
|
+
- **단계:** 2단계 (베팅 + State 패턴 + Composition)
|
|
6
|
+
- **리뷰어:** @laco-dev
|
|
7
|
+
- **라인 코멘트:** 30 (리뷰어 19 / 리뷰이 11)
|
|
8
|
+
- **참고:** 같은 학생의 1단계 = [PR #29](./29-1단계-블랙잭.md)
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **State 패턴 도입** — `CardState` 추상 + `StartState`/`HitState`/`StayState`/`BustState`/`BlackjackState`.
|
|
13
|
+
- **`Money` + `BetMoney` 도메인** — *연산자 오버로딩* (`+`, `*`, `unaryMinus`) — 리뷰어 칭찬.
|
|
14
|
+
- **`Participants.takePlayerTurns / takeDealerTurns`** — 진행자 메서드.
|
|
15
|
+
- **`BlackjackEventListener`로 콜백 통합 (후속 반영)** — Controller god-object 회피.
|
|
16
|
+
- **Fixtures.kt 테스트 fixture** — 리뷰어 칭찬.
|
|
17
|
+
- **후속 반영 — Blackjack 생성자에 deck + players 동시 주입 + 불변 RunningState (add 시 새 List) + canDraw 내부 호출 + while → do-while 변경**.
|
|
18
|
+
|
|
19
|
+
## 못한 점 (설계 관점)
|
|
20
|
+
|
|
21
|
+
### 1. `Int.isGreaterThan(value: Int): Boolean` 확장 함수 — 친숙성 ↓
|
|
22
|
+
|
|
23
|
+
```kotlin
|
|
24
|
+
// blackjack/Extensions.kt
|
|
25
|
+
fun Int.isGreaterThan(value: Int): Boolean = this > value
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
리뷰어: "*이 함수를 사용하는 것과 Int > Int 를 비교하는 것중 무엇이 더 개발자에게 친숙할까요?* `val isBust = 5 > 10` vs `val isBust = 5.isGratherthan(10)`"
|
|
29
|
+
|
|
30
|
+
학생 자가 인정: "*한글자로 끝낼 수 있는걸 늘려놓은 느낌인 것 같아 전자가 더 친숙해보입니다! 수정하겠습니다 : )*" — **확장 함수 *과잉*. *기본 연산자가 명확*하면 *DSL 효과 없음***. PR #34·#92와 같은 결.
|
|
31
|
+
|
|
32
|
+
### 2. `BlackjackController.start()`가 *5개 callback 인자*
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
fun start() {
|
|
36
|
+
Blackjack(CardDeck()).start(
|
|
37
|
+
players = InputView.inputPlayers(),
|
|
38
|
+
onStartFirstDrawn = OutputView::printFirstDrawnMessage,
|
|
39
|
+
onFirstDrawn = OutputView::printFirstOpenCards,
|
|
40
|
+
onDrawnMore = OutputView::printAllCards,
|
|
41
|
+
onEndGame = OutputView::printBlackjackResult
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
리뷰어: "*출력에 대해서 요구사항이 변경될 때 마다 start() 함수의 파라미터로 많은 값을 넘겨야 할 수 있습니다.* *이와 관련된 리스너 인터페이스를 만들어서 전달 해 보는건 어떨까요?*"
|
|
47
|
+
|
|
48
|
+
학생: "*BlackjackEventListener를 통해서 하나의 객체만 전달하도록 해보겠습니다!*" — **5개 callback = 인터페이스 신호**. `interface BlackjackEventListener { fun onStartFirstDrawn(); fun onFirstDrawn(); ... }`. *EventListener 패턴*.
|
|
49
|
+
|
|
50
|
+
### 3. `Blackjack(deck)` — 덱 보유, 플레이어는 start() 인자
|
|
51
|
+
|
|
52
|
+
```kotlin
|
|
53
|
+
class Blackjack(private val deck: CardDeck) {
|
|
54
|
+
fun start(players: List<Player>, ...) { ... }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
리뷰어: "*하나의 블랙잭 게임에서 덱은 재사용되고있고 플레이어는 매번 새로가 준비되는 것이 어색하다고 느껴집니다.* *(게임을 두번 이상할 때 덱은 그대로 사용하고 플레이어만 변경되는가?)* *하나의 블랙잭 게임에서는 하나의 덱과 플레이어들로 이루어진 게임으로 만들어 보면 어떨까요?*"
|
|
59
|
+
|
|
60
|
+
학생 자가 인정: "*블랙잭 객체를 하나 생성하고 start() 메서드를 호출할 때마다, 카드덱은 소모된 상태이고 플레이어만 새롭게 변경되는 문제가 발생하는군요..!* 블랙잭 객체 생성시 *카드덱과 플레이어를 동시에 전달받고, 해당 인자에 대해 게*..."
|
|
61
|
+
|
|
62
|
+
→ **객체 생명주기 일관성**. *한 게임 = 한 인스턴스 + 덱 + 플레이어 모두 생성자*. PR #92·#114와 같은 결.
|
|
63
|
+
|
|
64
|
+
### 4. `ParticipantsTest`에 *주석 처리된 테스트*
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
class ParticipantsTest {
|
|
68
|
+
// @Test
|
|
69
|
+
// fun `참여자들은 최대 8명까지 가능하다`() { ... 주석 ... }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
리뷰어: "*테스트 코드 곳곳에 이유를 알 수 없는 주석이 쳐져 있습니다. 왜일까요?*" — PR #17 (rhkrwngud445)과 같은 *주석 처리 코드 = 의도 불명*. *TODO 코멘트* 또는 *삭제*.
|
|
74
|
+
|
|
75
|
+
### 5. `BetMoney : Money` 상속 — Liskov 위반 위험
|
|
76
|
+
|
|
77
|
+
```kotlin
|
|
78
|
+
open class Money(private val amount: Int) {
|
|
79
|
+
operator fun times(operand: Double): Money = Money((amount * operand).toInt())
|
|
80
|
+
operator fun plus(money: Money): Money = Money(amount + money.amount)
|
|
81
|
+
}
|
|
82
|
+
class BetMoney(amount: Int) : Money(amount) {
|
|
83
|
+
init { require(amount > 0); require(amount % 1000 == 0) }
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
리뷰어: "*배팅 금액이 돈의 성격을 띄고 있어서 단순히 Money를 상속한 것으로 보입니다.* 하지만 *Money에서 제공하는 함수가 다시 Money 타입을 반환하기 때문에* 아래와 같은 상황이 발생할 수 있습니다. ```kotlin val baseBetMoney: BetMoney = BetMoney(10000); val myBetMoney: Money = baseMetMoney * (-2) // -2만원``` 즉 *Money 함수를 사용하고 나면 더이상 BetMoney 타입이 아닌 Money 타입이 되어 기존의 로직이 손상되는 결과로 이어질 수* 있습니다. *상속 대신 Composition을 이용*해 보면 어떨까요?"
|
|
88
|
+
|
|
89
|
+
→ **상속 + 반환 타입 불일치 = Liskov 위반**. `BetMoney * (-2)`가 *유효한 BetMoney가 아닌 Money*. *Composition* (BetMoney가 Money를 *멤버*로 보유)이 *invariant 보호*. **상속의 깊은 함정**.
|
|
90
|
+
|
|
91
|
+
### 6. `Dealer.stay()` — *상태 변경 없음*
|
|
92
|
+
|
|
93
|
+
```kotlin
|
|
94
|
+
class Dealer(cardState: CardState = StartState()) : Participant(...) {
|
|
95
|
+
override fun stay(): Participant = Dealer(cardState) // ⚠ 같은 상태로 반환
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
리뷰어: "*스테이 요청에 카드의 상태가 아무런 변경이 되지 않는 것 같습니다.*" — `stay()`가 *동작 동사*인데 *실제로는 상태 변경 X*. `StayState`로 *명시 전이*가 자연.
|
|
100
|
+
|
|
101
|
+
### 7. `Participant.draw(card: Card): Participant` 추상 — *Dealer/Player 자율성 차이*
|
|
102
|
+
|
|
103
|
+
```kotlin
|
|
104
|
+
abstract class Participant(...) {
|
|
105
|
+
abstract fun draw(card: Card): Participant
|
|
106
|
+
abstract fun stay(): Participant
|
|
107
|
+
abstract fun getProfit(other: Participant): Money
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
리뷰어: "*더 뽑을지 말지를 선택하는 것은 딜러와 플레이어가 각각 다른데, 이 규칙을 상태에게 전파시킬 필요는 없는 것 같습니다.* 어떤 기능을 추상화 하는가에따라 구현이 달라진다는 의미로 볼 수 있는데요. *결국 트레이드 오프의 영역*이라고 하는 부분이죠. 저는 이렇게 작성 해볼 것 같아요 ```class Dealer { override fun draw(card: Card): Participant { if (canDraw()) return copy(state = state.draw(card)) else return stay() }; fun canDraw(): Boolean { ... } }```"
|
|
112
|
+
|
|
113
|
+
→ **State 패턴의 *전이 책임* 위치**: *Participant.draw가 canDraw() 확인 + draw/stay 분기*가 자연. *State에 직접 전파*하면 *State가 Dealer/Player 룰 알아야*.
|
|
114
|
+
|
|
115
|
+
### 8. `Participants.onStartFirstDrawn()` callback — 외부 책임
|
|
116
|
+
|
|
117
|
+
리뷰어: "*onStartFirstDrawn()은 사용하는 곳에서 처리하는 곳의 책임으로 볼 수 있지 않을까요?* ```val participants: Participants; onStartDrawn(participants); participants.drawFirst(...)```"
|
|
118
|
+
|
|
119
|
+
학생: "*onStartFirstDrawn()은 인자로 참여자 객체를 넘겨주기 때문에 내부에서 직접 실행하는 것보다 외부에서 호출하도록 변경*했습니다!" — **callback 내부 호출 vs 외부 호출**. *외부 호출이 도메인 → View 의존* 회피.
|
|
120
|
+
|
|
121
|
+
### 9. `Participants.getDealer()` / `getPlayers()` 함수 vs 프로퍼티
|
|
122
|
+
|
|
123
|
+
```kotlin
|
|
124
|
+
class Participants(private val participants: List<Participant>) {
|
|
125
|
+
fun getDealer(): Dealer = participants.first() as Dealer
|
|
126
|
+
fun getPlayers(): List<Player> = participants.subList(1, ...).map { it as Player }
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
리뷰어: "*Participants 객체가 딜러 1명, 그리고 플레이어들을 가지고 있는 개념이 명확하다면 위 값들을 매번 함수로 호출하는 것이 아닌, 프로퍼티로 만들어서 가지고 있어도 좋을 듯 합니다.* 또한 *지금 생성자에서 딜러를 포함해 2 명 ~*..." — *getXxx() 매번 캐스팅*보다 *생성자에서 분리 + 프로퍼티*. PR #63·#28과 같은 결.
|
|
131
|
+
|
|
132
|
+
### 10. `Participants.takePlayerTurn`의 *do-while* 구조
|
|
133
|
+
|
|
134
|
+
```kotlin
|
|
135
|
+
do {
|
|
136
|
+
val choice = participant.needToDraw()
|
|
137
|
+
if (choice) result = result.draw(...)
|
|
138
|
+
} while (...)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
리뷰어: "*do, while 문을 이용하는 것 보다는 while 문 하나로 해결할 수 없을지? 생각해보고 적용하는게 좋습니다.* *while이 조건을 먼저 확인하기 때문에 코드 이해에도 도움이 되고 가독성도 좋습니다* ```var result: Participant = participant ...```"
|
|
142
|
+
|
|
143
|
+
학생: "*canDraw()를 내부에서 호출하도록 하고, do-while 대신 while문으로 변경*하였습니다! 대신 *canDraw() 마다 플레이어는 람다를 호출하기 때문에 while 조건에 `result.isRunning`를 추가하여 플레이어가 아직 카드 뽑기를 실행중인지 체크하도*..." — **`do-while < while`** — *조건 먼저 확인*이 가독성. 학생 후속 반영 + *람다 호출 비용*까지 고려.
|
|
144
|
+
|
|
145
|
+
### 11. `Participants.needToDraw()` 호출 위치 — Player 내부?
|
|
146
|
+
|
|
147
|
+
리뷰어: "*needToDraw()를 참가자들에서 호출하는 것이 아닌 플레이어 객체에서 직접 호출해야 하지 않을까요?* 앞서 남겨드린 *canDraw()와 draw() 함수의 개선 피드백과 같이 생각*해보세요"
|
|
148
|
+
|
|
149
|
+
학생: "*다시 생각해보니 Player가 가지고 있는 함수인만큼 내부에서 호출하는 것이 좋을 것 같습니다!*" — **Tell-Don't-Ask**. *플레이어가 자기 의지를 묻는 callback*은 *Player 내부*. PR #20과 같은 결.
|
|
150
|
+
|
|
151
|
+
### 12. `Participants.calculateProfit(participants)` — Participant 메서드로
|
|
152
|
+
|
|
153
|
+
```kotlin
|
|
154
|
+
class Participants { fun calculateProfit(): Map<Participant, Money> { ... } }
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
리뷰어: "*이 기능도 잘 돌려보면 Participant에서 구현할 수 있을 것 같네요!?* `abstract class Participant { abstract fun getProfit(others: List<Participant>: Money }`" — *수익 계산*도 *참가자 자율 = Tell-Don't-Ask*. 1대다 확장.
|
|
158
|
+
|
|
159
|
+
### 13. `BustState.earningRate = 1.0`
|
|
160
|
+
|
|
161
|
+
```kotlin
|
|
162
|
+
class BustState : FinishedState() { override val earningRate: Double = 1.0 }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
리뷰어: "*earningRate를 음수로 생각해볼 수 도 있지 않을까요?*" — **Bust = 패배 = 음수 earningRate**. *호출자가 *-1 곱셈*하는 트릭*보다 *enum/state에 음수*가 자연. PR #135·#119와 같은 결.
|
|
166
|
+
|
|
167
|
+
### 14. `FinishedState`에서 *draw/stay 시 IllegalStateException*
|
|
168
|
+
|
|
169
|
+
```kotlin
|
|
170
|
+
abstract class FinishedState : CardState {
|
|
171
|
+
override fun draw(card: Card): CardState = throw IllegalStateException(...)
|
|
172
|
+
override fun stay(): CardState = throw IllegalStateException(...)
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
리뷰어: "*종료 상태에서 카드를 더 뽑거나 스테이를 하는 것이 충분히 논리적으로 가능할 수 있지 않을까요?* *비즈니스 상태를 가급적 오류를 발생시키기 보다는, 논리적으로 계산을 하는 것도 방법*입니다. `override fun draw(card: Card): CardState = this // 변화 없음`"
|
|
177
|
+
|
|
178
|
+
학생: "*확실히 오류를 발생시키지 않는 것이 더 안전할 것 같습니다!*" — **State 패턴 + 종료 상태에서의 *no-op*** = *invariant 깨짐 회피 + 호출자 코드 단순*. PR #34와 같은 결.
|
|
179
|
+
|
|
180
|
+
### 15. `HitState.draw`가 *무조건 BustState로*
|
|
181
|
+
|
|
182
|
+
```kotlin
|
|
183
|
+
class HitState : RunningState() {
|
|
184
|
+
override fun draw(card: Card): CardState = BustState(cards + card) // ⚠ 항상 Bust?
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
리뷰어: "*히트 상태에서는 스테이 혹은 버스트로 넘어갈 수 있지 않을까요?* *다음 상태가 무조건 버스트가 되는 것이 맞을까요?* *다음 상태라는 추상 함수로 정의*하는 것이 맞을까? 를 생각 해보세요"
|
|
189
|
+
|
|
190
|
+
학생 자가 답변: "*제가 잘 이해한지 모르겠습니다만..*🥲 > *히트 상태에서는 스테이 혹은 버스트로 넘어갈 수 있지 않을까요?* 우선 *히트 상태에서는 스테이와 버스트가 될 수 있습니다*. 플레이어라면 n을 입력했을 때, *딜러라면 17점 이상일*..." — **State 전이의 의미 토론**. *HitState.draw* 이후 *점수에 따라 다음 상태 결정* (RunningState 유지 또는 BustState로). 무조건 BustState는 *조기 종료*.
|
|
191
|
+
|
|
192
|
+
### 16. `RunningState.draw(card)` mutable cards 위험
|
|
193
|
+
|
|
194
|
+
```kotlin
|
|
195
|
+
abstract class RunningState : CardState {
|
|
196
|
+
protected val cards: MutableList<Card> // ⚠ mutable
|
|
197
|
+
override fun draw(card: Card): CardState {
|
|
198
|
+
cards.add(card)
|
|
199
|
+
return ...
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
리뷰어: "*cards 객체가 내부적으로 가변 컬렉션으로 이루어져 있기 때문에, 아래와 같은 시나리오가 생길 수 있어요.* ```val currentState: RunningState // 2장; val nextState: CardState = currentState.draw(card) // 3장; // 이 시점에, currentState 는 카드를*..."
|
|
205
|
+
|
|
206
|
+
학생: "*아.. 불변을 구현하고 싶었지만 이런 문제가 있었군요..! 카드 목록에 add() 하면 새로운 카드 목록을 반환하도록 변경해보겠습니다!*" — **State 패턴 + immutable cards = 정확한 패턴**. *draw → 새 RunningState 반환*. `currentState`는 *불변 상태*.
|
|
207
|
+
|
|
208
|
+
### 17. `HitState`와 `StayState`의 *2장 invariant*
|
|
209
|
+
|
|
210
|
+
리뷰어: "*스테이 상태에도 동일하게 최소 2장의 카드를 가져야 하지 않을까요?*"
|
|
211
|
+
|
|
212
|
+
학생: "*Stay 상태에서는 FinishedState를 상속하고 있어서 `최소 2장의 카드를 갖는다` 라는 조건을 검증하고 있습니다!*" — **상속을 통한 invariant 검증 공유** — *Hit/Stay 둘 다 적용*은 다른 메커니즘.
|
|
213
|
+
|
|
214
|
+
### 18. `StayState.matchWith`의 *if/else if*
|
|
215
|
+
|
|
216
|
+
```kotlin
|
|
217
|
+
if (other is BustState) return WIN
|
|
218
|
+
else if (other is StayState) { ... }
|
|
219
|
+
else { ... }
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
리뷰어: "*if, else if 구문 대신 when 조건을 사용 해보세요*" — Kotlin 컨벤션. PR #33·#34와 같은 결.
|
|
223
|
+
|
|
224
|
+
## 리뷰어 의견 요지
|
|
225
|
+
|
|
226
|
+
- ***확장 함수 과잉 (`isGreaterThan`) = 기본 연산자가 친숙***.
|
|
227
|
+
- ***5개 callback = Listener 인터페이스 신호***.
|
|
228
|
+
- ***Blackjack 객체 생명주기 = 덱 + 플레이어 모두 생성자***.
|
|
229
|
+
- ***주석 처리 테스트 = 의도 불명***.
|
|
230
|
+
- ***`BetMoney : Money` 상속 = Liskov 위반*** — Composition.
|
|
231
|
+
- ***`Dealer.stay()` 상태 변경 없음 = StayState 명시 전이***.
|
|
232
|
+
- ***`draw(card): Participant` 추상은 Dealer/Player 자율성 다름*** — Participant 분기 + canDraw().
|
|
233
|
+
- ***callback 내부 호출 < 외부 호출 (도메인 → View 의존 회피)***.
|
|
234
|
+
- ***`getDealer()` 함수 매번 캐스팅 < 생성자 분리 + 프로퍼티***.
|
|
235
|
+
- ***do-while < while*** (조건 먼저 확인).
|
|
236
|
+
- ***needToDraw 호출 위치 = Player 내부 (Tell-Don't-Ask)***.
|
|
237
|
+
- ***calculateProfit = Participant 메서드 (1대다 확장)***.
|
|
238
|
+
- ***Bust earningRate = -1.0 (음수)***.
|
|
239
|
+
- ***FinishedState에서 IllegalStateException < no-op***.
|
|
240
|
+
- ***HitState.draw = 무조건 Bust X = 점수에 따라 분기***.
|
|
241
|
+
- ***RunningState mutable cards = stale 위험 = immutable 새 인스턴스***.
|
|
242
|
+
- ***`if/else if` < `when`***.
|
|
243
|
+
|
|
244
|
+
## 대표 인용
|
|
245
|
+
|
|
246
|
+
> 이 함수를 사용하는 것과 *Int > Int 를 비교하는 것중 무엇이 더 개발자에게 친숙*할까요?
|
|
247
|
+
> — @laco-dev on `Extensions.kt`
|
|
248
|
+
|
|
249
|
+
> 출력에 대해서 요구사항이 변경될 때 마다 start() 함수의 *파라미터로 많은 값을 넘겨야 할 수 있습니다.* 이와 관련된 *리스너 인터페이스를 만들어서 전달*해 보는건 어떨까요?
|
|
250
|
+
> — @laco-dev on `BlackjackController.kt`
|
|
251
|
+
|
|
252
|
+
> 배팅 금액이 돈의 성격을 띄고 있어서 단순히 Money를 상속한 것으로 보입니다. 하지만 *Money에서 제공하는 함수가 다시 Money 타입을 반환하기 때문에* [...] *즉 Money 함수를 사용하고 나면 더이상 BetMoney 타입이 아닌 Money 타입이 되어 기존의 로직이 손상*되는 결과로 이어질 수 있습니다. *상속 대신 Composition을 이용*해 보면 어떨까요?
|
|
253
|
+
> — @laco-dev on `BetMoney.kt`
|
|
254
|
+
|
|
255
|
+
> cards 객체가 내부적으로 *가변 컬렉션으로 이루어져 있기 때문에*, 아래와 같은 시나리오가 생길 수 있어요. `val nextState: CardState = currentState.draw(card) // 3장; // 이 시점에, currentState 는 카드를`...
|
|
256
|
+
> — @laco-dev on `RunningState.kt`
|
|
257
|
+
|
|
258
|
+
> 종료 상태에서 카드를 더 뽑거나 스테이를 하는 것이 *충분히 논리적으로 가능할 수 있지 않을까요?* *비즈니스 상태를 가급적 오류를 발생시키기 보다는, 논리적으로 계산을 하는 것도 방법*입니다.
|
|
259
|
+
> — @laco-dev on `FinishedState.kt`
|
|
260
|
+
|
|
261
|
+
## 얻은 교훈
|
|
262
|
+
|
|
263
|
+
- ***확장 함수 과잉 (`Int.isGreaterThan`) = 기본 연산자가 친숙*** — *DSL 효과 없으면 과잉*.
|
|
264
|
+
- ***5개 callback = Listener 인터페이스 신호*** — *EventListener 패턴*.
|
|
265
|
+
- ***Blackjack 객체 생명주기 = 덱 + 플레이어 모두 생성자*** — *한 게임 = 한 인스턴스*.
|
|
266
|
+
- ***주석 처리 테스트 = 의도 불명*** — *TODO 코멘트* 또는 *삭제*. PR #17·#8과 같은 결.
|
|
267
|
+
- ***`BetMoney : Money` 상속 = 반환 타입 불일치로 Liskov 위반*** — *상속의 깊은 함정*. **Composition으로 invariant 보호**.
|
|
268
|
+
- ***`Dealer.stay()` 상태 변경 없음 = State 패턴의 명시 전이*** — *StayState로 명시*.
|
|
269
|
+
- ***State 패턴 + immutable cards = 정확한 패턴*** — *draw → 새 인스턴스 반환*. *currentState 불변* 보장.
|
|
270
|
+
- ***FinishedState에서 IllegalStateException < no-op*** — *비즈니스 상태 = 호출 가능한 모든 메서드는 논리적 결과 반환*. *예외는 invariant 깨짐* 시에만.
|
|
271
|
+
- ***HitState.draw = 점수에 따라 RunningState/BustState 분기*** — *조기 종료 X*.
|
|
272
|
+
- ***Bust earningRate = -1.0 음수*** — *호출자가 곱셈 트릭* X. 의미 명시.
|
|
273
|
+
- ***do-while < while*** — *조건 먼저 확인*이 가독성.
|
|
274
|
+
- ***`needToDraw` callback = Player 내부 호출 (Tell-Don't-Ask)***.
|
|
275
|
+
- ***calculateProfit = Participant.getProfit(others) 메서드 (1대다 확장)*** — PR #24와 같은 결.
|
|
276
|
+
- ***`getDealer()` 매번 캐스팅 = 생성자 분리 + 프로퍼티***.
|
|
277
|
+
- ***callback 내부 호출 vs 외부 호출 = 도메인 → View 의존 회피***.
|
|
278
|
+
- ***`if/else if` < `when` Kotlin 컨벤션***.
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# PR #115 — [블랙잭 1단계] 토바에 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@tobae-time](https://github.com/tobae-time) (토바에) — 2025 모바일 안드로이드 7기 코호트
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/115
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** [@laco-dev](https://github.com/laco-dev) (페로로) — 누적 14명 reviewer
|
|
7
|
+
- **라인 코멘트:** 15 스레드 — *학생 자가 `Rule` god-object 시도 + reviewer 강한 반대 메타 정점 (4 thread 동일 패턴 반복) + 현실 세계 vs 객체지향 세계 메타포 충돌 어휘 + 패키지로 enum/data class 종류 구분 비판 + 출력 표현 UI 책임 + 참가자 vs 딜러 vs 플레이어 일반화 + 빌더 필수 속성 vs 미초기화 위험 + Deck mutable 직접 접근 시나리오 + 점진적 테스트 묘사*
|
|
8
|
+
- **신규 reviewee** (2025 모바일 안드로이드 7기). PR 본문에 *셀프 체크리스트 + 집중 리뷰 요청* (네이밍).
|
|
9
|
+
- **메타 케이스 정점**: 학생 자가 *`Rule` 객체 시도* → reviewer *"모든 메서드 Rule.canX() 변환 가능 = god-object"* 4 thread 반복 비판 + *"쎄게 피드백 양해부탁드립니다"* 메타 어휘.
|
|
10
|
+
|
|
11
|
+
## 잘한 점 (설계 관점)
|
|
12
|
+
|
|
13
|
+
### 1. PR 본문 셀프 체크리스트 + 집중 리뷰 요청
|
|
14
|
+
|
|
15
|
+
PR 본문에 7개 체크리스트 (기능/테스트/이전 피드백/스타일/요구사항/README) 모두 체크 + *"네이밍 읽기 어떠신지 궁금합니다"* 집중 리뷰 요청.
|
|
16
|
+
|
|
17
|
+
→ **`pr-self-checklist-vocabulary`** + **`pr-focused-review-request`** = PR #144 (m6z1 셀프 코드 리뷰) 결 합류.
|
|
18
|
+
|
|
19
|
+
### 2. 학생 자가 답변 매우 적극적 + 커밋 SHA 첨부
|
|
20
|
+
|
|
21
|
+
15 thread 중 **10 thread 학생 자가 답변** + 모두 *커밋 SHA + 변경 사항 인용* 첨부. *학습 가시화 정점*.
|
|
22
|
+
|
|
23
|
+
### 3. HandTest 점진적 묘사 칭찬 (Thread 6)
|
|
24
|
+
|
|
25
|
+
reviewer:
|
|
26
|
+
|
|
27
|
+
> *"카드뭉치에 대한 기능과 테스트를 역할에 맞게 잘 구현해주셨습니다. 👍🏻"*
|
|
28
|
+
|
|
29
|
+
## 못한 점 (설계 관점) — 핵심: `Rule` god-object 메타
|
|
30
|
+
|
|
31
|
+
### 1. `Rule` 객체 도입 — god-object 신규 모범 사례 (Thread 11·12·13·14, 4 thread 반복)
|
|
32
|
+
|
|
33
|
+
#### 학생 자가 시도 + 의문
|
|
34
|
+
|
|
35
|
+
PR 첫 답변에서 학생 자가 답변:
|
|
36
|
+
|
|
37
|
+
> *"안녕하세요, 페로로! 결과를 만드는 것이 참가자 객체의 역할 보다는 블랙잭 규칙의 역할이라는 생각을 하게 되어 Rule이라는 객체를 만들었습니다. **블랙잭 규칙에 관련된 행위를 모으다 보니, Rule이 너무 커진 것 같습니다.** 이전에는 컨트롤러에 있던 비즈니스 로직(딜러 결과 함수)을 옮겨 왔지만 딜러와 플레이어가 각각 들고 있는 편이 더 좋았을지 고민됩니다."*
|
|
38
|
+
|
|
39
|
+
#### Thread 11 (Rule.kt) — reviewer 강한 반대
|
|
40
|
+
|
|
41
|
+
```kotlin
|
|
42
|
+
object Rule {
|
|
43
|
+
fun ...(...) { ... } // 결과 계산
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
reviewer:
|
|
48
|
+
|
|
49
|
+
> *"왜 참가자의 규칙이 아니라고 생각하는지 궁금합니다. **현실세계라면 블랙잭 게임에서의 규칙이지만, 객체지향 세계에서 객체는 모두 스스로 일을 합니다.** 또한 객체들은 서로 긴밀하게 협력을 통해 필요한 정보를 요청하는데 Rule은 그 역할을 다 하고 있다고 보시나요?"*
|
|
50
|
+
|
|
51
|
+
#### Thread 12·13 (Players.kt + Participant.kt) — 반복 비판
|
|
52
|
+
|
|
53
|
+
reviewer Thread 12: *"토바에가 제시한 방향에 따르면 **이런것도 전부 Rule 아닌가요?**"*
|
|
54
|
+
|
|
55
|
+
reviewer Thread 13:
|
|
56
|
+
|
|
57
|
+
> *"Rule 논리대로면 이것도 다 Rule입니다.*
|
|
58
|
+
> *`Rule.canDealerDraw()`*
|
|
59
|
+
> *`Rule.canPlayerDraw()`*"*
|
|
60
|
+
|
|
61
|
+
→ **MCP 룰 `rule-as-god-object-anti-pattern`** ⭐⭐⭐ **신규 정점**:
|
|
62
|
+
- 학생이 *모든 도메인 행위*를 `Rule` 클래스로 모음 = *god-object 변형*.
|
|
63
|
+
- reviewer 강한 어휘 — *"모든 메서드를 `Rule.canX()` 형태로 만들 수 있다 = god-object 시그널"*.
|
|
64
|
+
- 책임 분배 = *참가자가 자기 카드로 결과 도출 + 메시지 협력*.
|
|
65
|
+
|
|
66
|
+
#### Thread 14 (OutputView.kt) — 출력 규칙도 Rule?
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
> 최초 공개시 딜러는 1장, 플레이어는 2장을 노출한다.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
reviewer:
|
|
73
|
+
|
|
74
|
+
> *"이는 게임에서 결정한 규칙으로 명확한 비즈니스 로직이지 않을까요? 이것을 UI에서 결정하는 것이 게임의 규칙인지? UI의 규칙인지? 고민할 필요가 있습니다. (...) **하지만 이것도 Rule에 구현을 해야 할까요...?**"*
|
|
75
|
+
|
|
76
|
+
→ **`Rule god-object 반복 시그널 — 모든 도메인을 Rule로 모으면 다음 규칙도 Rule이 됨`** ⭐⭐⭐.
|
|
77
|
+
|
|
78
|
+
#### reviewer 최종 메타 어휘 — *"쎄게 피드백 양해"*
|
|
79
|
+
|
|
80
|
+
reviewer 마지막 review:
|
|
81
|
+
|
|
82
|
+
> *"지금까지 3개의 미션을 통해 객체가 무엇인지, 스스로 일을 하거나 기능을 작게 나누어 객체의 책임을 분리하는 등 여러가지 연습을 해왔는데 그걸 모두 걷어차고 클래스 하나에 다 몰아 넣은 이유를 잘 모르겠어요.*
|
|
83
|
+
>
|
|
84
|
+
> *모든 도메인 클래스를 게임과 의존하지 않도록 만들 의도였으면 blackjack 패키지도 필요 없었습니다. blackjack.Rule만 유의미하지 나머지는 블랙잭이랑 관계 없으니까요.*
|
|
85
|
+
>
|
|
86
|
+
> *한편으로는 **왜 블랙잭 규칙이 유일하다고 보시는지도 고민해보셨으면 좋겠어요. 규칙의 세부사항은 언제나 바뀔 가능성이 있지 않을까요?***
|
|
87
|
+
>
|
|
88
|
+
> *시간이 지체되어서 1단계는 마무리 하고 2단계에서 다시 보도록 하겠습니다.*
|
|
89
|
+
>
|
|
90
|
+
> ***힘드시겠지만, 그동안 학습한 경험이 아쉬워서 조금 쎄게 피드백을 드린 점 양해부탁드립니다.***"*
|
|
91
|
+
|
|
92
|
+
→ **MCP 룰 `reviewer-strong-feedback-apology-meta`** ⭐⭐⭐ **신규** — *피드백 강도 + 학생 학습 경험 아쉬움 + 양해 표현*. PR #106 (말리빈 *권력 자제*) 결의 *피드백 강도 메타* 다른 축 (`자제` vs `쎄게 + 양해`).
|
|
93
|
+
|
|
94
|
+
→ **MCP 룰 `rule-uniqueness-assumption-question`** ⭐⭐ — *"왜 규칙이 유일하다고 보시는지" — 규칙의 변경 가능성 시그널*.
|
|
95
|
+
|
|
96
|
+
→ **MCP `oh-my-oop` 핵심 가치 메타 어휘 정점** — *현실세계 메타포 vs 객체지향 세계 책임 분배 충돌*.
|
|
97
|
+
|
|
98
|
+
학생 자가 답변 (Thread 7):
|
|
99
|
+
|
|
100
|
+
> *"결과를 내는 것은 블랙잭 룰에 의한 것이고, 룰이 바뀌었을 때 참가자에서 변경하는 것보다 블랙잭 규칙을 찾아 변경하는 것이 적절하다고 생각하여 변경하였습니다.*
|
|
101
|
+
> *+) 7a55ba918b73e04563816f36f10d5b24c4b3c5f9 **블랙잭 규칙은 유일하게 존재하는 개념이라고 보고 object로 변경하였습니다!**"*
|
|
102
|
+
|
|
103
|
+
→ **학생 자가 *유일성 + object* 추가 시도 (그러나 reviewer 강한 거부 후)** = 학습 시간성 메타.
|
|
104
|
+
|
|
105
|
+
### 2. enum vs data class 패키지 구분 비판 (Thread 0)
|
|
106
|
+
|
|
107
|
+
```kotlin
|
|
108
|
+
// 패키지 구조
|
|
109
|
+
blackjack/enums/Action.kt
|
|
110
|
+
blackjack/enums/Suit.kt
|
|
111
|
+
blackjack/enums/Result.kt
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
reviewer:
|
|
115
|
+
|
|
116
|
+
> *"만약 Action 객체가 enum class가 아닌 data class가 된다면 패키지가 바뀌어야 할까요? **객체의 타입은 상황에 따라 달라질 수 있습니다. 그렇기 때문에 특정 종류를 패키지로 구분하는 것은 좋지 않은 방법입니다.**"*
|
|
117
|
+
|
|
118
|
+
→ **MCP 룰 `package-by-type-anti-pattern`** ⭐⭐ 신규 — *enum/data class 등 *타입 종류*로 패키지 분리 = 변경 시 패키지 이동 필요 = 잘못된 분리*. PR #80 (util-package-definition) 결의 *패키지 분류 기준* 다른 축.
|
|
119
|
+
|
|
120
|
+
### 3. Suit `♥` 출력 = UI 책임 (Thread 1)
|
|
121
|
+
|
|
122
|
+
```kotlin
|
|
123
|
+
enum class Suit(val display: String) {
|
|
124
|
+
HEART("하트"), ...
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
reviewer:
|
|
129
|
+
|
|
130
|
+
> *"만약 하트를 ❤️이렇게 출력해달라고 한다면. 우리는 도메인 모델을 수정해야 할까요? 혹은 문자가 아닌 그림으로 나타내달라고 하면 어떻게 해야 할까요?"*
|
|
131
|
+
|
|
132
|
+
→ **출력 표현 = UI 책임 (도메인 수정 필요 X)** = 누적 다수 (PR #15 다국어 어휘 + PR #130 medAndro 안드로이드 리소스).
|
|
133
|
+
|
|
134
|
+
### 4. 승부 결과 = UI 관심사 (Thread 2)
|
|
135
|
+
|
|
136
|
+
```kotlin
|
|
137
|
+
enum class Result(val display: String) {
|
|
138
|
+
WIN("승"), LOSE("패"), DRAW("무")
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
reviewer: *"승부 결과 또한, 어떻게 출력될지를 결정하는 것은 UI의 관심사로 보입니다 😓"*
|
|
143
|
+
|
|
144
|
+
→ **enum 출력 문자열 = UI 책임** = 누적 다수.
|
|
145
|
+
|
|
146
|
+
### 5. 결과 도출 책임 = 참가자 vs Rule (Thread 3·7)
|
|
147
|
+
|
|
148
|
+
reviewer Thread 3:
|
|
149
|
+
|
|
150
|
+
> *"블랙잭 규칙으로 보면, 21점이 넘는다거나 하면 무조건 패배가 됩니다. 참가자 입장에서 승부가 벌어지고 있는데 단순히 점수만으로 추가로 결정하기에는 로직이 분산되어 있는 느낌이 들기도 합니다. **가령 점수가 높더라도 질 수도 있으니까요.**"*
|
|
151
|
+
|
|
152
|
+
reviewer Thread 7:
|
|
153
|
+
|
|
154
|
+
> *"승부를 벌이는 것은 플레이어 vs 딜러가 아니더라도 **참가자끼리라면 누구라도 결과를 만들어 낼 수 있지 않을까요?** 그렇다면 참가자 객체가 할 역할로 볼 수도 있지 않나요?*
|
|
155
|
+
> *> 딜러 vs 플레이어*
|
|
156
|
+
> *플레이어 vs 딜러*
|
|
157
|
+
> *플레이어 vs 플레이어*"*
|
|
158
|
+
|
|
159
|
+
→ **참가자 vs 참가자 일반화** = PR #148·#151·#49·#132 결 합류 누적 5+ PR.
|
|
160
|
+
|
|
161
|
+
→ **점수만으로 승부 결정 ≠ 블랙잭 규칙 (21점 초과 = 패)** ⭐⭐ — *도메인 룰 정확성*. PR #19·#125 (블랙잭 룰 오해) 결.
|
|
162
|
+
|
|
163
|
+
### 6. Deck 유일성 + static 결합 위험 (Thread 4·5·10)
|
|
164
|
+
|
|
165
|
+
```kotlin
|
|
166
|
+
// Deck.kt - 모든 곳에서 접근 가능
|
|
167
|
+
object Deck { val cards = mutableListOf(...) }
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
reviewer Thread 4: *"모든 게임에 덱이 유일하게 존재하는 개념이라고 봐도 될까요? 그렇다면 여기저기서 덱에 접근하면 참사가 벌어지지는 않을까요?"*
|
|
171
|
+
|
|
172
|
+
학생 자가 답변:
|
|
173
|
+
|
|
174
|
+
> *"덱이 유일하게 존재하는 개념보다는 게임이 시작할 때마다 새로운 덱을 사용하게 하고 덱이 필요한 곳에 주입하는 것이 좋을 것 같습니다."*
|
|
175
|
+
|
|
176
|
+
→ **학생 자가 답변 — *유일성 가정 거부 + DI*** ⭐⭐ 학습 모범.
|
|
177
|
+
|
|
178
|
+
reviewer Thread 10 (시나리오 예시):
|
|
179
|
+
|
|
180
|
+
```kotlin
|
|
181
|
+
val deck = Deck.create()
|
|
182
|
+
deck.cards.remove()
|
|
183
|
+
deck.cards.remove()
|
|
184
|
+
deck.cards.clear()
|
|
185
|
+
deck.pick()
|
|
186
|
+
deck.cards.remove()
|
|
187
|
+
deck.pick()
|
|
188
|
+
deck.cards.remove()
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
reviewer: *"아래 코드는 어떤 문제가 있나요?"*
|
|
192
|
+
|
|
193
|
+
→ **`mutable-collection-direct-access-scenario`** = **MCP 룰 후보** ⭐⭐ — *외부 mutable 직접 접근 시나리오 예시 + 학생 자가 진단*. PR #22 (`static-mutable-collection-unsafe`) 결.
|
|
194
|
+
|
|
195
|
+
→ **테스트 가능성 (Thread 5)**: *"덱에서 카드를 한장 뽑으면 마지막 카드가 나온다 — 기본적인 기능에 대한 테스트도 누락"* = 누적 다수.
|
|
196
|
+
|
|
197
|
+
### 7. 빌더 필수 속성 + `lateinit` 위험 (Thread 9)
|
|
198
|
+
|
|
199
|
+
```kotlin
|
|
200
|
+
class PersonBuilder {
|
|
201
|
+
lateinit var name: String
|
|
202
|
+
fun name(v: String) { name = v }
|
|
203
|
+
fun build() = Person(name)
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
reviewer:
|
|
208
|
+
|
|
209
|
+
> *"Builder의 특징은 선택적으로 속성을 부여하는 것 일텐데, name을 호출하지 않고 build() 하면 어떤 문제가 생기나요? 어떻게 해결해야 할까요? **\"호출하지 않으면 이름은 빈값이다\" 라는 답변은 아니길 바랍니다..** 힌트는 이름은 필수라는 점입니다."*
|
|
210
|
+
|
|
211
|
+
학생 자가 답변:
|
|
212
|
+
|
|
213
|
+
> *"이름 없이 build() 했을 때, 해당 오류 메세지 확인했습니다!*
|
|
214
|
+
> *`Exception in thread \"main\" kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized`*
|
|
215
|
+
> ***생성자로 이름을 받게 하도록 변경하였습니다.**"*
|
|
216
|
+
|
|
217
|
+
→ **`builder-required-property-as-constructor`** = **MCP 룰 후보** ⭐⭐ — *Builder = 선택적 속성 / 필수 속성 = 생성자*. PR #38 (`lateinit` 위험) 결 합류 누적 2 PR → ***`lateinit` 위험 어휘*** ⭐⭐⭐ 강화.
|
|
218
|
+
|
|
219
|
+
→ **`reviewer-hint-vocabulary`** — *"힌트는 X"* = 학생 사고 유도 어휘.
|
|
220
|
+
|
|
221
|
+
### 8. 점진적 테스트 묘사 (Thread 6)
|
|
222
|
+
|
|
223
|
+
reviewer:
|
|
224
|
+
|
|
225
|
+
> *"디테일하게 들어가본다면, 왜 Ace 한장이 있는데 점수가 다른지에 대한 묘사를 점진적으로 풀어주면 더욱 좋습니다.*
|
|
226
|
+
> *> 퀸 한장은 10점이다.*
|
|
227
|
+
> *> 에이스 카드가 포함되어 있을 때, 다른 카드의 합이 11점 이하면 보너스 점수 10점을 획득한다.*
|
|
228
|
+
> *> 에이스 카드가 포함되어 있을 때, 다른 카드의 합이 11점을 초과하면 총 보너스 점수가 없다."*
|
|
229
|
+
|
|
230
|
+
학생 자가 답변: *"점진적인 묘사가 이해하기 쉬운 것 같아서 테스트에 반영하였습니다."*
|
|
231
|
+
|
|
232
|
+
→ **`test-narrative-incremental-build`** ⭐⭐ — *기본 케이스 → 추가 조건 → 경계 조건*. PR #109 (BDD given-when-then) 결 합류.
|
|
233
|
+
|
|
234
|
+
### 9. Dealer canDraw — static Deck 결합 (Thread 8)
|
|
235
|
+
|
|
236
|
+
```kotlin
|
|
237
|
+
// Dealer.kt - Deck.shared 결합
|
|
238
|
+
fun draw() { cards.add(Deck.pop()) }
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
reviewer 코드 제안:
|
|
242
|
+
|
|
243
|
+
```kotlin
|
|
244
|
+
val participant: Participant
|
|
245
|
+
if (participant.canDraw()) { ... }
|
|
246
|
+
// 딜러는 16점 이하라면 항상 받지만, 플레이어는?
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
→ **`can-draw-vs-blind-draw`** ⭐⭐ — *카드 받기 전 받을 수 있는지 판단* + 딜러/플레이어 다형성 어휘. PR #151 (`canHit` vs `isBust` 부울 의미) 결.
|
|
250
|
+
|
|
251
|
+
## 대표 인용
|
|
252
|
+
|
|
253
|
+
> [laco-dev Thread 11]
|
|
254
|
+
> *"현실세계라면 블랙잭 게임에서의 규칙이지만, 객체지향 세계에서 객체는 모두 스스로 일을 합니다."*
|
|
255
|
+
|
|
256
|
+
→ **현실 세계 vs OOP 세계 메타포 충돌 어휘 정점**.
|
|
257
|
+
|
|
258
|
+
> [laco-dev Thread 13]
|
|
259
|
+
> *"Rule 논리대로면 이것도 다 Rule입니다. Rule.canDealerDraw(), Rule.canPlayerDraw()"*
|
|
260
|
+
|
|
261
|
+
→ **Rule god-object 반복 시그널 어휘**.
|
|
262
|
+
|
|
263
|
+
> [laco-dev 최종 review]
|
|
264
|
+
> *"왜 블랙잭 규칙이 유일하다고 보시는지도 고민해보셨으면 좋겠어요. 규칙의 세부사항은 언제나 바뀔 가능성이 있지 않을까요?"*
|
|
265
|
+
|
|
266
|
+
→ **규칙 유일성 가정 거부 어휘**.
|
|
267
|
+
|
|
268
|
+
> [laco-dev 최종 review]
|
|
269
|
+
> *"힘드시겠지만, 그동안 학습한 경험이 아쉬워서 조금 쎄게 피드백을 드린 점 양해부탁드립니다."*
|
|
270
|
+
|
|
271
|
+
→ **reviewer 강한 피드백 양해 메타 어휘**.
|
|
272
|
+
|
|
273
|
+
> [tobae-time 최초 자가 답변]
|
|
274
|
+
> *"블랙잭 규칙에 관련된 행위를 모으다 보니, Rule이 너무 커진 것 같습니다."*
|
|
275
|
+
|
|
276
|
+
→ **학생 자가 god-object 인지 메타 어휘**.
|
|
277
|
+
|
|
278
|
+
> [laco-dev Thread 9]
|
|
279
|
+
> *"\"호출하지 않으면 이름은 빈값이다\" 라는 답변은 아니길 바랍니다.."*
|
|
280
|
+
|
|
281
|
+
→ **reviewer 답변 유도 + 부정 가이드 어휘**.
|
|
282
|
+
|
|
283
|
+
> [laco-dev Thread 0]
|
|
284
|
+
> *"객체의 타입은 상황에 따라 달라질 수 있습니다. 그렇기 때문에 특정 종류를 패키지로 구분하는 것은 좋지 않은 방법입니다."*
|
|
285
|
+
|
|
286
|
+
→ **패키지 = 타입 종류로 분리 X 어휘**.
|
|
287
|
+
|
|
288
|
+
## 얻은 교훈 (보편)
|
|
289
|
+
|
|
290
|
+
1. **`Rule` god-object 신규 모범 사례** — **MCP 룰 `rule-as-god-object-anti-pattern` 후보** ⭐⭐⭐ 신규 정점.
|
|
291
|
+
2. **reviewer 강한 피드백 양해 메타** — **MCP 룰 `reviewer-strong-feedback-apology-meta` 후보** ⭐⭐⭐ 신규.
|
|
292
|
+
3. **현실 세계 vs OOP 세계 메타포 충돌** — *MCP `oh-my-oop` 핵심 가치 메타 어휘*.
|
|
293
|
+
4. **규칙 유일성 가정 거부** — **MCP 룰 `rule-uniqueness-assumption-question` 후보** ⭐⭐.
|
|
294
|
+
5. **패키지 = 타입 종류 분리 X** — **MCP 룰 `package-by-type-anti-pattern` 후보** ⭐⭐.
|
|
295
|
+
6. **빌더 필수 속성 = 생성자 + `lateinit` 위험 누적 2 PR** — **MCP 룰 `builder-required-property-as-constructor` + `lateinit-initialization-checking-burden` 후보** ⭐⭐⭐.
|
|
296
|
+
7. **외부 mutable 직접 접근 시나리오 진단** — **MCP 룰 `mutable-collection-direct-access-scenario` 후보** ⭐⭐.
|
|
297
|
+
8. **점진적 테스트 묘사 (기본 → 조건 → 경계)** — **MCP 룰 `test-narrative-incremental-build` 후보** ⭐⭐.
|
|
298
|
+
9. **참가자 vs 참가자 일반화** = 누적 5+ PR.
|
|
299
|
+
10. **출력 표현 = UI 책임** = 누적 다수.
|
|
300
|
+
|
|
301
|
+
## 메타 노트
|
|
302
|
+
|
|
303
|
+
- **tobae-time 2025 모바일 안드로이드 7기 코호트** — PR #115 1단계로 합류. PR #142 (doabletuple)·PR #143 (medAndro)·PR #109 (cucumber99)·PR #118 (jiyuneel)·PR #113 (gahyunkim) 외 다수 결의 *2025 코호트 누적 ≥12 PR*.
|
|
304
|
+
- **메타 케이스 6번째 — Rule god-object 학생 자가 시도 → reviewer 4 thread 반복 비판 → 강한 양해 메타** (학습 시간성 메타와 다른 *학습 *방향성* 충돌* 메타).
|
|
305
|
+
- **`Rule.kt` 같은 god-object 변형 — MCP validate 룰 후보 1순위**: lotto의 `god-object` 룰을 *클래스명 기반 god-object* (Rule/Game/Manager 등) 패턴 변형으로 확장 가능. evidence = laco-dev *"모든 메서드를 Rule.canX() 변환 가능"* 어휘.
|