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,845 @@
|
|
|
1
|
+
# PR #138 — [블랙잭 2단계] 비비 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@rosemin928](https://github.com/rosemin928)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/138
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 1단계 #129 동일 reviewer
|
|
7
|
+
- **라인 코멘트:** 20 스레드 — *PR 본문 자가 의문 2개 (8 덱 도메인 룰 자가 학습 + ParticipantCards 책임 이동) + getResult 다형성 + super 키워드 (4 스레드 학습) + value class + @JvmInline 자가 학습 + 재귀 함수 (tailrec) + BlackJackTable 형식 규칙 부산물 자가 인정 + 디미터 법칙 (외부글) + getOrNull 논리오류 처리 + 8 덱 도메인 룰 적용 + 캐싱 (companion lazy) + 인스턴스 변수 2개 묶음 (name+money vs name+cards) 자가 의문*
|
|
8
|
+
- **양 단계 완성 reviewee** (1단계 #129 batch 19 분석 완료 + 2단계 #138 = batch 20 추가).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 2개 (2025 코호트 자가 학습 정점)
|
|
13
|
+
|
|
14
|
+
#### 1.1. *8 덱 도메인 룰 자가 학습*
|
|
15
|
+
|
|
16
|
+
PR 본문:
|
|
17
|
+
|
|
18
|
+
> *"1단계 merge하며 주신 리뷰 중 `deck을 전부 사용했을 때 어떻게 할 것인가?`를 고민하다가 **블랙잭의 최대 플레이 인원은 8명이다**, **블랙잭은 총 8개의 덱을 사용한다**라는 규칙이 있다는 것을 알게 되었습니다. 따라서 이 도메인 규칙에 따라 Deck 로직을 수정하였습니다! pop 로직을 바꾸지 않으려 해봤지만 결국 바꾸는 방향으로 가게 되었습니다...! 수정한 Deck에 대해 어떻게 생각하시는지 궁금합니다!"*
|
|
19
|
+
|
|
20
|
+
→ **학생 자가 도메인 룰 학습 + 코드 자가 수정**:
|
|
21
|
+
- 1단계 #129 reviewer (Thread 20) *"deck.pop 예외 처리 = 게임 종료 흐름"* 의문 → 학생 자가 도메인 학습.
|
|
22
|
+
- **블랙잭 카지노 룰 = 8 덱** 자가 학습 + `MAX_DECK_COUNT = 8` 적용.
|
|
23
|
+
|
|
24
|
+
**MCP `oh-my-oop` *학습 = 시간 두고 반복* 어휘 정점** — *reviewer 한 마디 의문 → 학생 자가 도메인 학습 → 코드 자가 수정 (1단계 → 2단계 사이 학습)*. PR #58 (otter66 *카지노 6덱 메타포 vs 요구사항*) 결의 *반대 시점 (실제 8덱)*. **MCP 룰 `multi-deck-domain-rule` 강화**.
|
|
25
|
+
|
|
26
|
+
#### 1.2. *ParticipantCards 책임 이동 자가 의문*
|
|
27
|
+
|
|
28
|
+
PR 본문:
|
|
29
|
+
|
|
30
|
+
> *"이번에 각 객체들의 역할과 책임에 대해 고민해보다가 `isBust`, `isBlackJack`, `finalScore` 이 세 가지 함수를 ParticipantCards로 옮기게 되었습니다. 위의 3가지를 각 참여자가 가진 카드들의 상태로 볼 수도 있겠다는 생각을 하게 되어 수정했는데 제이든은 어떻게 생각하시는지 궁금합니다!"*
|
|
31
|
+
|
|
32
|
+
reviewer 칭찬 (Thread 3):
|
|
33
|
+
|
|
34
|
+
> *"좋습니다 👍 2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요. 참가자가 들고 있는 카드들의 역할을 분리해볼 수 있습니다. 손에 있는 카드들 또한 객체로 취급할 수 있으니까요!"*
|
|
35
|
+
|
|
36
|
+
→ **학생 자가 책임 이동 (Participant → ParticipantCards)** = *reviewer 가 권유 전에 학생이 자가 추론*. **학습 정점 = reviewer 예상 코멘트를 학생이 선제 적용**.
|
|
37
|
+
|
|
38
|
+
PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13·#36·#87 결의 *학생 자가 한계 인정* 와 *반대 시점 (학생이 reviewer 보다 한 발 앞서)*.
|
|
39
|
+
|
|
40
|
+
### 2. `value class Money(val value: Int)` + `@JvmInline` + 학생 자가 학습
|
|
41
|
+
|
|
42
|
+
```kotlin
|
|
43
|
+
@JvmInline
|
|
44
|
+
value class Money(val value: Int) {
|
|
45
|
+
init {
|
|
46
|
+
require(value >= MINIMUM_BETTING_MONEY) { ERROR_UNDER_MINIMUM_BETTING_MONEY_MESSAGE }
|
|
47
|
+
}
|
|
48
|
+
...
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
→ **value class + @JvmInline 자가 적용 + 자가 학습 깊이**:
|
|
53
|
+
|
|
54
|
+
reviewer (Thread 1·10): *"value class 활용이 가능해보이네요! 어떤 상황에서 사용할 수 있을까요?"* + *"`@JvmInline` 어노테이션은 어떤 역할을 하는걸까요?"*
|
|
55
|
+
|
|
56
|
+
학생 자가 답변:
|
|
57
|
+
|
|
58
|
+
> *"value class는 함수 호출 및 연산 시, 객체가 아닌 내부 값 자체로 처리되어 참조 비용을 줄이고 실행 속도를 향상시킨다는 장점이 있습니다. (...) `@JvmInline`은 코틀린에서 사용되는 애노테이션 중 하나로 인라인 클래스를 정의할 때 사용됩니다. 인라인 클래스는 **실제 객체를 만들지 않고**, 값을 직접 저장하는 방식으로 동작합니다."*
|
|
59
|
+
|
|
60
|
+
→ **Kotlin 어휘 깊은 학생 자가 학습 + reviewer 가 *왜* 묻기 + 학생 자가 *답*하기**. PR #117 (parkjiminnnn *property val vs computed property*) 결의 *Kotlin 어휘 자가 학습* 강화. PR #36·#82·#76·#107·#106·#18 결의 *value class 적용* 일치.
|
|
61
|
+
|
|
62
|
+
**MCP 룰 `value-class-application-and-rationale` 후보** — *value class 사용 시점 + @JvmInline 의도 명시*.
|
|
63
|
+
|
|
64
|
+
### 3. `enum class GameResult` 멤버 별 수익 책임 분리 — 4 멤버 + 메서드 2개
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
enum class GameResult(
|
|
68
|
+
private val playerMultiplier: Double,
|
|
69
|
+
private val dealerMultiplier: Double,
|
|
70
|
+
) {
|
|
71
|
+
WIN(1.0, 1.0),
|
|
72
|
+
LOSE(-1.0, -1.0),
|
|
73
|
+
DRAW(0.0, 0.0),
|
|
74
|
+
BLACKJACK(1.5, 1.0),
|
|
75
|
+
;
|
|
76
|
+
|
|
77
|
+
fun calculatePlayerProfit(bettingMoney: Money): Double = bettingMoney.value * playerMultiplier
|
|
78
|
+
fun calculateDealerProfit(bettingMoney: Money): Double = bettingMoney.value * dealerMultiplier
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
→ **enum 멤버에 playerMultiplier + dealerMultiplier 2 속성 묶음** + **calculatePlayerProfit + calculateDealerProfit 메서드** = *GameResult 가 수익률 계산 책임*. PR #87 (GameOutcome enum + scoreRecord + payoutMultiplier 묶음) 결.
|
|
83
|
+
|
|
84
|
+
reviewer (Thread 9):
|
|
85
|
+
|
|
86
|
+
> *"수익률을 계산하는 것은 BlackJackGame 내에서 수행하는 역할일까요? 로또 미션에서와 같이 GameResult 가 수익률을 계산해보는건 어떨까요?"*
|
|
87
|
+
|
|
88
|
+
→ **로또 미션 결과 객체 결 일관** + **enum 의 책임 강화 (단순 분류 X)** — PR #133·#108·#46·#39·#88·#90·#131 (Lotto rank 자가 결과 계산) 결 합류.
|
|
89
|
+
|
|
90
|
+
**`BLACKJACK(1.5, 1.0)` 별도 멤버** — *Win + isBlackjack 분기 vs 별도 멤버* 정공. 누적 10+ PR ⭐⭐⭐.
|
|
91
|
+
|
|
92
|
+
#### 3.1. *Player vs Dealer 수익 부호 일관*
|
|
93
|
+
|
|
94
|
+
```kotlin
|
|
95
|
+
WIN(1.0, 1.0), // 둘 다 양수? 의미 양가
|
|
96
|
+
LOSE(-1.0, -1.0),
|
|
97
|
+
DRAW(0.0, 0.0),
|
|
98
|
+
BLACKJACK(1.5, 1.0),
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
→ **WIN 둘 다 1.0 = Player.calculateProfit(WIN, money) = +money, Dealer.calculateProfit(WIN, money) = +money**.
|
|
102
|
+
|
|
103
|
+
다만 *호출 자리에서 부호 처리* (BlackJackGame.getDealerProfit):
|
|
104
|
+
```kotlin
|
|
105
|
+
fun getDealerProfit(): Double =
|
|
106
|
+
participants.players.sumOf { player ->
|
|
107
|
+
val result = participants.dealer.getResult(player) // ← Dealer 의 결과
|
|
108
|
+
result.calculateDealerProfit(player.money)
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
→ *Dealer.getResult(player) = Dealer 시점 결과* → *Dealer Win 시 +money* → *Dealer 수익 = +money* (정확).
|
|
113
|
+
|
|
114
|
+
다만 *Player Win = -money for Dealer* — *현재 GameResult.WIN(1.0, 1.0)* 에서 dealerMultiplier = +1.0 → *Player Win 시 Dealer 도 +money* = *룰 와전?*
|
|
115
|
+
|
|
116
|
+
→ **WIN/LOSE 가 어느 시점 (Player/Dealer)에 적용되는지 명시 X = 양가성 위험**. *부호 일관 (-1.0, +1.0)* 또는 *operator fun not()* (PR #36 결) 활용 가능.
|
|
117
|
+
|
|
118
|
+
**MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보** — *enum 에 양쪽 시점 multiplier 보관 = 부호 양가*.
|
|
119
|
+
|
|
120
|
+
### 4. `Deck` interface + `ShuffledDeck` 구현 + 8 덱 도메인 룰
|
|
121
|
+
|
|
122
|
+
```kotlin
|
|
123
|
+
interface Deck {
|
|
124
|
+
fun pop(): TrumpCard
|
|
125
|
+
fun makeCards(): Deque<TrumpCard>
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
class ShuffledDeck : Deck {
|
|
129
|
+
private val deckPool: MutableList<Deque<TrumpCard>> = mutableListOf()
|
|
130
|
+
private var currentDeckIndex = 0
|
|
131
|
+
|
|
132
|
+
init {
|
|
133
|
+
repeat(MAX_DECK_COUNT) { deckPool.add(makeCards()) }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
override fun pop(): TrumpCard {
|
|
137
|
+
val currentDeck = deckPool.getOrNull(currentDeckIndex)
|
|
138
|
+
?: throw IllegalArgumentException(ERROR_EMPTY_DECK_MESSAGE)
|
|
139
|
+
return if (currentDeck.isNotEmpty()) {
|
|
140
|
+
currentDeck.pop()
|
|
141
|
+
} else {
|
|
142
|
+
currentDeckIndex++
|
|
143
|
+
pop() // ← 재귀
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
companion object {
|
|
148
|
+
private const val MAX_DECK_COUNT = 8
|
|
149
|
+
private val SHUFFLED_DECK: List<TrumpCard> by lazy {
|
|
150
|
+
Shape.entries.flatMap { shape ->
|
|
151
|
+
CardTier.entries.map { tier -> TrumpCard(tier, shape) }
|
|
152
|
+
}.shuffled()
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
→ **3 가지 정공**:
|
|
159
|
+
|
|
160
|
+
#### 4.1. *interface 분리 (DIP)*
|
|
161
|
+
|
|
162
|
+
1단계 #129 reviewer (Thread 9) 의 *Deck 테스트 가능성* 권유 → *interface Deck + ShuffledDeck 구현* 자가 적용 + *2단계 확장*. **MCP 룰 `interface-for-test-substitution` 강화** 누적 5+ PR.
|
|
163
|
+
|
|
164
|
+
#### 4.2. *재귀 함수 (tailrec 미적용)*
|
|
165
|
+
|
|
166
|
+
`pop()` 자가 호출 = *재귀*. reviewer (Thread 11·18) *"while 루프도 좋지만, 재귀함수로도 구현해볼 수 있을거에요. kotlin의 tailrec 에 대해 찾아보셔도 좋습니다!"* → 학생 자가 적용 (다만 `tailrec` 키워드 X).
|
|
167
|
+
|
|
168
|
+
**MCP 룰 `tailrec-optimization-applicability` 후보** — *Kotlin tailrec = 스택 오버플로우 방지*.
|
|
169
|
+
|
|
170
|
+
#### 4.3. *companion object lazy 캐싱*
|
|
171
|
+
|
|
172
|
+
reviewer (Thread 4): *"트럼프 카드에는 중복되는 모양과 숫자, 문자가 존재하죠. 이 객체들을 효율적으로 사용할 수 있을까요?"* → 학생 자가 적용 (`SHUFFLED_DECK by lazy`).
|
|
173
|
+
|
|
174
|
+
→ **lazy initialization + companion object** = *Singleton pool*. 다만 *블랙잭 = 카드 도메인 객체가 8 덱 모두 같은 풀에서 shuffle* = *각 덱이 SHUFFLED_DECK 인스턴스 재사용*. **PR #20·#28·#125·#65·#92·#108·#137·#106·#48·#9·#22·#13·#11·#39·#16·#46·#36·#117·#129 누적 18+ PR Singleton Deck 안티패턴 강화 (다만 정공: interface + lazy 활용)**.
|
|
175
|
+
|
|
176
|
+
**MCP 룰 `lazy-init-companion-vs-instance-pool` 후보** — *companion lazy = 정적 한 번 초기화*.
|
|
177
|
+
|
|
178
|
+
### 5. `getOrNull` 활용 — 논리오류 처리
|
|
179
|
+
|
|
180
|
+
```kotlin
|
|
181
|
+
val currentDeck = deckPool.getOrNull(currentDeckIndex)
|
|
182
|
+
?: throw IllegalArgumentException(ERROR_EMPTY_DECK_MESSAGE)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
→ reviewer (Thread 5): *"kotlin collection 에는 `getOrNull` 이라는 키워드가 존재합니다. 로또미션에서 [논리오류] 에 대해 학습했을 때 이러한 상황에서 어떻게 처리할 수 있을지 배웠던거 같아요. 어떻게 개선해볼 수 있을까요? 그렇다고 지금 상황이 논리오류 라는것은 아닙니다 :)"*
|
|
186
|
+
|
|
187
|
+
학생 자가 답변:
|
|
188
|
+
|
|
189
|
+
> *"1. 수정 전에는 currentDeckIndex가 MAX_DECK_COUNT를 초과하면 반복문이 종료되고 예외가 발생하지만 현재는 MAX_DECK_COUNT를 초과하는 즉시 예외가 발생한다. 2. getOrNull을 사용하여 null을 체크하고 그 경우에 예외를 던지기 때문에 더 안전해졌다."*
|
|
190
|
+
|
|
191
|
+
→ **Kotlin `getOrNull` = 논리오류 즉시 감지** + **`get(index)` 예외 vs `getOrNull` nullable 비교**. 학생 자가 학습.
|
|
192
|
+
|
|
193
|
+
**MCP 룰 `get-vs-getOrNull-exception-timing` 후보**.
|
|
194
|
+
|
|
195
|
+
### 6. `getResult` 다형성 + `super` 키워드 — 4 스레드 학습
|
|
196
|
+
|
|
197
|
+
```kotlin
|
|
198
|
+
// Participant (공통 로직)
|
|
199
|
+
open fun getResult(other: Participant): GameResult {
|
|
200
|
+
val myScore = cards.finalScore()
|
|
201
|
+
val otherScore = other.cards.finalScore()
|
|
202
|
+
return when {
|
|
203
|
+
!cards.isBlackJack() && other.cards.isBlackJack() -> GameResult.LOSE
|
|
204
|
+
cards.isBlackJack() && !other.cards.isBlackJack() -> GameResult.BLACKJACK
|
|
205
|
+
other.cards.isBust() -> GameResult.WIN
|
|
206
|
+
myScore > otherScore -> GameResult.WIN
|
|
207
|
+
myScore < otherScore -> GameResult.LOSE
|
|
208
|
+
else -> GameResult.DRAW
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Player (한 가지 경우만)
|
|
213
|
+
override fun getResult(other: Participant): GameResult =
|
|
214
|
+
when {
|
|
215
|
+
cards.isBust() -> GameResult.LOSE
|
|
216
|
+
else -> super.getResult(other) // ← super 키워드
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Dealer (한 가지 경우만)
|
|
220
|
+
override fun getResult(other: Participant): GameResult =
|
|
221
|
+
when {
|
|
222
|
+
cards.isBust() && !other.cards.isBust() -> GameResult.LOSE
|
|
223
|
+
else -> super.getResult(other)
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
→ **`super` 키워드 활용 = *공통 로직 + 자식 별 한 가지 경우 추가***:
|
|
228
|
+
|
|
229
|
+
#### 6.1. *4 스레드 학습 흐름 (Thread 8 → 13 → 14 → 19)*
|
|
230
|
+
|
|
231
|
+
1. **Thread 8 (reviewer)**: *"결과를 판단하는 로직이 게임 규칙상 굉장히 복잡하죠. 다형성을 활용해볼 수 있습니다. 다형성을 이용해서 어떻게 개선할 수 있을까요?"* — *질문*.
|
|
232
|
+
2. **Thread 8 (학생)**: *"`getResult`의 로직을 확인해보니 한 가지의 경우를 제외하고는 플레이어와 딜러의 로직이 동일하다는 것을 알게 되었습니다. (...) 이렇게 변경한 것이 제이든의 의도와 맞게 변경한 것인지는 잘 모르겠어요 🥲 다형성을 이용해 더 개선할 수 있는 방법이 있을까요?"* — *학생 자가 의문*.
|
|
233
|
+
3. **Thread 13 (reviewer)**: *"식으로 다형성을 활용해볼 수 있을거에요 (super 키워드 코드 예시)"* — *답변 코드 예시*.
|
|
234
|
+
4. **Thread 14·19 (reviewer + 학생)**: *Dealer/Player 양쪽 `super.getResult` 호출 자가 적용 + reviewer 확장 권유 (각 자식이 자가 override 로 더 많은 케이스 다룸)*.
|
|
235
|
+
|
|
236
|
+
→ **양방향 reviewer/학생 토론 + 학생 자가 한계 인정 + reviewer 코드 힌트 + 학생 자가 적용** = *학습 시간성 모범*. PR #87·#117·#129·#137·#151·#133·#146·#147 결 합류.
|
|
237
|
+
|
|
238
|
+
#### 6.2. *open class + super 어휘*
|
|
239
|
+
|
|
240
|
+
PR #129 (1단계) *abstract class 추상 메서드 없음 = open class 동치* 결의 *반대 시점* — *getResult 는 open + super 활용* = *공통 로직 보유 + 자식 확장 정공*.
|
|
241
|
+
|
|
242
|
+
**MCP 룰 `super-keyword-for-shared-logic` 후보** — *부모 open + 자식 super 호출 = 공통 로직 + 자식 확장*.
|
|
243
|
+
|
|
244
|
+
#### 6.3. *reviewer 추가 권유 (Thread 19)*
|
|
245
|
+
|
|
246
|
+
> *"버스트의 케이스에 따라 딜러와 참가자가 다른 속성을 지니고 있죠. 이런 부분은 Dealer 와 Player 가 각각 override를 통해 설정을 해줄 수 있습니다. 그 이외에는 지금처럼 추상클래스에 구현을 하면 공통 로직 활용이 가능하죠. 이부분은 미션이 끝나고 한번 해보셔도 도움이 될 것 같아요.*
|
|
247
|
+
>
|
|
248
|
+
> *현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"*
|
|
249
|
+
|
|
250
|
+
→ **미션 종료 후 추가 학습 권유** — *학생 부담 최소화 + 학습 시간 인정* 어휘. PR #87·#129·#36 결.
|
|
251
|
+
|
|
252
|
+
### 7. `BlackJackTable(deck, bettingMoney)` 객체 자가 생성 → 자가 제거
|
|
253
|
+
|
|
254
|
+
학생 초안:
|
|
255
|
+
```kotlin
|
|
256
|
+
class BlackJackTable(
|
|
257
|
+
val deck: Deck,
|
|
258
|
+
private val bettingMoney: Map<Player, Money>,
|
|
259
|
+
) {
|
|
260
|
+
fun getPlayerBettingMoney(player: Player): Money = ...
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
→ **`BlackJackTable` 객체 자가 생성 후 *형식 규칙 (인스턴스 변수 2개)* 위해서만 묶음** = *형식 규칙 부산물 인공 객체*. PR #133·#88·#132·#136·#93·#87·#147 누적 결.
|
|
265
|
+
|
|
266
|
+
reviewer (Thread 15·16):
|
|
267
|
+
|
|
268
|
+
> *"bettingMoney는 Player에 있음으로써 응집도가 높아진다고 생각해요. 기존처럼 money를 Player가 갖고 있게 된다면 BlackJackTable 객체도 없어질 수 있을까요?"*
|
|
269
|
+
|
|
270
|
+
> *"BlackJackTable 을 생성함으로써 어느 부분의 역할이 가벼워졌을까요? 처음 이 객체를 본 동료 개발자도 Table에 deck, bettingMoney만 있는걸 쉽게 알아차릴 수 있을까요? 🧐"*
|
|
271
|
+
|
|
272
|
+
학생 자가 답변:
|
|
273
|
+
|
|
274
|
+
> *"Table에 deck과 bettingMoney만 있는걸 쉽게 알아차리기는 어려울 것 같아요. 사실 인스턴스 변수를 2개를 유지하기 위해 BlackJackTable을 만들었었는데 Player에서 인스턴스 변수 2개를 유지할 수 있다는 장점을 제외하고는 스스로도 납득이 가는 장점이 크지는 않았던 것 같아요. (...) `돈을 가지고 있는 Player여야 하지 않나?` 라는 의문이 생겼었습니다! 그래서 Money는 Player로 다시 돌려주게 되었습니다!"*
|
|
275
|
+
|
|
276
|
+
→ **학생 자가 형식 규칙 부산물 인정 + 자가 제거**. **MCP 룰 `instance-variable-limit-artificial-grouping` 강화** 누적 6+ PR ⭐⭐ (#133·#88·#132·#136·#93·#87·#138).
|
|
277
|
+
|
|
278
|
+
다만 **현재 최종 코드** 는 `Player(name, cards, money)` = *3 변수* — *형식 규칙 위반*? 또는 *cards 가 ParticipantCards 객체로 추출되었으니 *유의미한 추출* OK*. **학생의 자가 판단**: *cards = 진짜 객체 / money = Player 의 도메인 속성 / name = Player 의 도메인 속성* → *형식 규칙 위반 무의미*.
|
|
279
|
+
|
|
280
|
+
### 8. 디미터 법칙 — table.deck 접근
|
|
281
|
+
|
|
282
|
+
reviewer (Thread 17):
|
|
283
|
+
|
|
284
|
+
> *"table이라는 객체가 생기면서 객체 지향 프로그래밍에서 이야기하는 [디미터의 법칙](https://mangkyu.tistory.com/147)에 대해 한번 찾아보셔도 도움이 될 것 같아요 🙂"*
|
|
285
|
+
|
|
286
|
+
학생 자가 깨달음:
|
|
287
|
+
|
|
288
|
+
> *"table이 있을 때에는 table 내에서 deck을 가져와야 해서 응집도와 캡슐화를 해치게 되네요... 😢 앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*
|
|
289
|
+
|
|
290
|
+
→ **디미터 법칙 + 외부글 (mangkyu.tistory) + 학생 자가 깨달음**:
|
|
291
|
+
|
|
292
|
+
#### 8.1. *table.deck 깊이 = 디미터 위반*
|
|
293
|
+
|
|
294
|
+
`blackJackGame.table.deck.pop()` → *3 단계 위임* = a.b.c.d 위반. 학생 자가 제거 (BlackJackTable 자가 제거).
|
|
295
|
+
|
|
296
|
+
#### 8.2. *외부글 활용*
|
|
297
|
+
|
|
298
|
+
`mangkyu.tistory.com/147` 디미터 법칙 — **외부 자료 + 자가 학습** 어휘. PR #87·#21·#117·#129 결의 *외부글 + 자가 학습* 어휘 합류.
|
|
299
|
+
|
|
300
|
+
**MCP 룰 `law-of-demeter-violation-depth` 강화** 누적 7+ PR.
|
|
301
|
+
|
|
302
|
+
### 9. `Player.choice` 재귀 함수 자가 적용
|
|
303
|
+
|
|
304
|
+
```kotlin
|
|
305
|
+
fun choice(
|
|
306
|
+
deck: Deck,
|
|
307
|
+
getPlayerChoice: (String) -> Boolean,
|
|
308
|
+
onPlayerStateUpdated: (Player) -> Unit,
|
|
309
|
+
) {
|
|
310
|
+
if (!isDrawable()) return
|
|
311
|
+
if (getPlayerChoice(name)) {
|
|
312
|
+
receiveCard(deck.pop())
|
|
313
|
+
onPlayerStateUpdated(this)
|
|
314
|
+
choice(deck, getPlayerChoice, onPlayerStateUpdated) // ← 재귀
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
→ reviewer (Thread 12): *"이런 부분도 재귀로 구현이 가능할 것 같아요!"* → 학생 자가 적용.
|
|
320
|
+
|
|
321
|
+
**재귀 = while 의 함수형 변환**. PR #117 (수학적 풀이) + PR #87 (mutableMap → fold) 결의 *명령형 vs 함수형* 어휘 합류.
|
|
322
|
+
|
|
323
|
+
**MCP 룰 `recursive-vs-while-functional` 후보** — *재귀 = 함수형 정공*.
|
|
324
|
+
|
|
325
|
+
### 10. 추가 칭찬
|
|
326
|
+
|
|
327
|
+
- **2단계 카드 책임 분리 자가 적용 (PR 본문 + Thread 3)** — *reviewer 가 권유 전에 학생 선제 적용*.
|
|
328
|
+
- **재귀 함수 활용 칭찬 (Thread 18)** — *"재귀로 잘 구현해주셨네요 👍"*.
|
|
329
|
+
- **모든 20 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 4+ 회** — *학생 자가 학습 가시화 정점* (PR #117·#129 결 강화).
|
|
330
|
+
|
|
331
|
+
## 못한 점 (설계 관점)
|
|
332
|
+
|
|
333
|
+
### 1. `Money(1000)` 최소 금액 검증 — require vs 재입력
|
|
334
|
+
|
|
335
|
+
학생 초안: `require(value >= 1000)` → 미만 시 예외 던짐 + 프로그램 종료.
|
|
336
|
+
|
|
337
|
+
reviewer (Thread 2):
|
|
338
|
+
|
|
339
|
+
> *"require 로 검증을 잘 해주셨어요. 다만, 1000원 이상을 입력해야 하는 룰이 주어졌었나요? (정말 몰라서 하는 질문입니다 ㅎㅎ) 만약 그런 룰이 있다면 조건을 충족하지 못해 프로그램이 종료되어 버린다면 유저 입장에선 어떨까요?"*
|
|
340
|
+
|
|
341
|
+
학생 자가 적용:
|
|
342
|
+
|
|
343
|
+
> *"룰이 주어지지는 않았지만 실제 블랙잭 게임에서는 최소 베팅액이 주어진다는 것을 알게 되어 해당 검증을 하게 되었습니다! 최소 금액을 입력하지 않았을 때 프로그램을 종료하는 것보다 **에러 메세지를 주고 다시 입력**할 수 있도록 하는 것이 나을 것 같다고 생각하여 수정하였습니다! inputView에서 runCatching을 통해 검증에서 걸렸을 때 메시지를 출력하고 다시 입력하도록 했습니다!"*
|
|
344
|
+
|
|
345
|
+
→ **require 예외 vs 재입력 (graceful retry)** — PR #129 (deck.pop 예외 vs graceful shutdown) 결의 *재입력* 변형:
|
|
346
|
+
|
|
347
|
+
#### 1.1. *3 가지 트레이드오프*
|
|
348
|
+
|
|
349
|
+
| 안 | 장점 | 단점 |
|
|
350
|
+
|---|---|---|
|
|
351
|
+
| `require` 예외 + 프로그램 종료 (학생 초안) | *invariant 강제 + 코드 간결* | *유저 경험 ↓ (재시도 X)* |
|
|
352
|
+
| `require` + `runCatching` 재입력 (학생 자가 적용) | *유저 경험 ↑ + invariant 강제* | *Controller/View 가 runCatching 처리* |
|
|
353
|
+
| `require` 없이 nullable 반환 | *호출자가 명시적 처리* | *invariant 강제 X (null 무시 가능)* |
|
|
354
|
+
|
|
355
|
+
**MCP 룰 `require-exception-vs-graceful-retry` 후보** — *invariant 위반 시 종료 vs 재입력*. PR #129·#138 결.
|
|
356
|
+
|
|
357
|
+
#### 1.2. *블랙잭 도메인 룰 자가 학습*
|
|
358
|
+
|
|
359
|
+
학생 *"실제 블랙잭 게임에서는 최소 베팅액이 주어진다"* 자가 학습 = *PR 본문 8 덱 룰 학습* 어휘 합류.
|
|
360
|
+
|
|
361
|
+
### 2. `getAllCards()` 위임 → `cards.take(count)` 직접 — Tell-Don't-Ask
|
|
362
|
+
|
|
363
|
+
reviewer (Thread 6):
|
|
364
|
+
|
|
365
|
+
> *"getAllCards() 함수를 거쳐야만 할까요? `cards.take(count)`"*
|
|
366
|
+
|
|
367
|
+
학생 자가 적용 (`Participant.takeCards(count: Int): List<TrumpCard> = cards.allCards.take(count)`).
|
|
368
|
+
|
|
369
|
+
→ **위임 메서드 줄임 + Tell-Don't-Ask 정공** — PR #87 (Participant.getName, getCards 위임 6개) 결의 *불필요 위임 메서드 줄임*.
|
|
370
|
+
|
|
371
|
+
다만 *현재 takeCards 도 cards.allCards.take 호출* = *2 단계 위임 여전*. **`cards.takeFirstN(count)`** 가 더 정공 — *ParticipantCards.takeFirstN 메시지*.
|
|
372
|
+
|
|
373
|
+
### 3. `choice` 로직 Player ↔ BlackJackGame 이동 — 학생 자가 토론
|
|
374
|
+
|
|
375
|
+
reviewer (Thread 7):
|
|
376
|
+
|
|
377
|
+
> *"이 로직들이 Paticipants -> BlackJackGame 으로 옮겨진 배경은 무엇일까요?"*
|
|
378
|
+
|
|
379
|
+
학생:
|
|
380
|
+
|
|
381
|
+
> *"`choice` 함수가 Player에 있을 때 `플레이어가 deck 자체를 아예 가지는 것이 아닌가?` 라는 의문이 들었고, 이는 블랙잭 게임에 어울리지 않는 상황이라 생각하여 옮기게 되었었습니다. 하지만 이번 리뷰를 반영하며 해당 로직이 Player와 Participants 내에 있어도 **Deck을 매개변수로 전달받아 필요할 때만 접근**하므로 Player가 Deck을 직접 소유하는 구조가 아니라는 것을 알게 되어 다시 수정하였습니다!"*
|
|
382
|
+
|
|
383
|
+
→ **메서드 위치 토론 + 학생 자가 의문 + reviewer 의문 + 학생 자가 재정정**:
|
|
384
|
+
|
|
385
|
+
#### 3.1. *책임 위치 토론*
|
|
386
|
+
|
|
387
|
+
- **Player.choice(deck, ...)** = *Player 가 자가 결정 + deck 인자 받음 (소유 X)*.
|
|
388
|
+
- **BlackJackGame.choice(player, deck, ...)** = *외부 조정 + 명시적 분리*.
|
|
389
|
+
- **Participants.choice(deck, ...)** = *Participants 일급 컬렉션이 자가 처리* (현재 최종).
|
|
390
|
+
|
|
391
|
+
학생의 자가 의문 = *"Player 가 deck 을 가지는 것 아닌가?"* → reviewer 의 *"deck 매개변수 전달 = 소유 X"* 깨달음. **객체 소유 vs 매개변수 전달 구분 자가 학습**.
|
|
392
|
+
|
|
393
|
+
**MCP 룰 `object-ownership-vs-parameter-passing` 후보** — *멤버 보유 vs 메서드 인자 = 소유 의미 구분*.
|
|
394
|
+
|
|
395
|
+
#### 3.2. *3 가지 트레이드오프*
|
|
396
|
+
|
|
397
|
+
| 안 | 장점 | 단점 |
|
|
398
|
+
|---|---|---|
|
|
399
|
+
| Player.choice(deck, ...) (학생 자가 재적용) | *Tell-Don't-Ask + 응집도* | *Player 가 deck 어휘 알아야 함* |
|
|
400
|
+
| Participants.choice(deck, ...) (중간 안) | *일급 컬렉션 + 위임 자연* | *Participants 가 각 Player 의 choice 호출* |
|
|
401
|
+
| BlackJackGame.processPlayerTurn(...) | *외부 조정 + 명시적 분리* | *Player 가 데이터 컨테이너 (god-object 위험)* |
|
|
402
|
+
|
|
403
|
+
reviewer 권유 = **Player.choice (Tell-Don't-Ask)**.
|
|
404
|
+
|
|
405
|
+
### 4. 인스턴스 변수 2개 묶음 — name + money vs name + cards (학생 자가 의문)
|
|
406
|
+
|
|
407
|
+
reviewer (Thread 15·20):
|
|
408
|
+
|
|
409
|
+
> *"기존처럼 money를 Player가 갖고 있게 된다면 BlackJackTable 객체도 없어질 수 있을까요? 다만, 비비가 인스턴스 변수에 대한 우려가 있으시다면 아래 처럼 해보는건 어떨까요?*
|
|
410
|
+
> *(...) 이렇게 비슷한 성격의 그룹으로 묶으면 어떤 이점이 있을까요?"*
|
|
411
|
+
|
|
412
|
+
> *"name과 money를 묶어보면 어떨까 싶었습니다. 이 둘은 유저의 종속적인 정보라고 판단 할 수 있다고 생각했어요. 비비의 생각은 어떠신가요?"*
|
|
413
|
+
|
|
414
|
+
학생 자가 의문:
|
|
415
|
+
|
|
416
|
+
> *"위처럼 묶으면 관련 데이터를 하나의 객체로 묶기 때문에 **의미를 명확하게** 할 수 있고, **가독성이 좋아진다**는 장점이 있습니다! (...) 하지만 이름과 베팅 금액, 카드 중에 2가지를 묶는다면 어떤 것들을 묶어야 할 지 잘 모르겠어요... 관련 데이터를 묶는다기엔 3가지 모두 플레이어가 가진 각각의 성격이 다른 데이터라는 생각이 들어요.*
|
|
417
|
+
>
|
|
418
|
+
> *`인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?` 라는 의문도 듭니다. 제이든은 어떻게 생각하시나요?? 🥲"*
|
|
419
|
+
|
|
420
|
+
→ **학생 자가 *형식 규칙 vs 도메인 의미* 의문** — **형식 규칙 부산물 인공 객체 인지 모범**:
|
|
421
|
+
|
|
422
|
+
#### 4.1. *학생 자가 의문 모범*
|
|
423
|
+
|
|
424
|
+
학생 *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?"* = **형식 규칙 부산물 인공 객체 자가 인지** — *MCP `oh-my-oop` 핵심 가치 (형식 규칙이 만든 인공 객체) 자가 발견*.
|
|
425
|
+
|
|
426
|
+
PR #87 (jaeyeongjo *ParticipantInfo* 자가 답변) 결의 *3 변수 제약 자가 학습* 와 **반대 시점** — *PR #87 = 학생 자가 적용 (regulation 따름) / PR #138 = 학생 자가 의문 (regulation 비판)*.
|
|
427
|
+
|
|
428
|
+
**MCP 룰 `form-rule-artificial-grouping-self-critique` 후보** — *형식 규칙 부산물 자가 비판*.
|
|
429
|
+
|
|
430
|
+
#### 4.2. *3 가지 대안 (가능)*
|
|
431
|
+
|
|
432
|
+
| 안 | 묶음 | 의미 |
|
|
433
|
+
|---|---|---|
|
|
434
|
+
| `Player(name, cards, money)` (현재) | *3 변수* | *형식 규칙 위반, 다만 cards = 객체* |
|
|
435
|
+
| `Player(playerInfo: PlayerInfo, cards)` | *(name+money) + cards = 2 변수* | *유저 종속 정보 묶음* |
|
|
436
|
+
| `Player(name, hand: Hand)` + `Hand(cards, money)` | *name + (cards+money)* | *손에 든 것 = 카드 + 베팅* (도메인 메타포 약함) |
|
|
437
|
+
|
|
438
|
+
reviewer 답변 보류 (DM 으로 토론) — **학생 자가 답변 가치 더 큼**.
|
|
439
|
+
|
|
440
|
+
### 5. `tailrec` 키워드 미적용
|
|
441
|
+
|
|
442
|
+
reviewer (Thread 11·18):
|
|
443
|
+
|
|
444
|
+
> *"kotlin의 [tailrec](https://kotlinlang.org/docs/functions.html#tail-recursive-functions) 에 대해 찾아보셔도 좋습니다!"*
|
|
445
|
+
|
|
446
|
+
> *"재귀로 잘 구현해주셨네요 👍 tailrec 에 대해서도 한번 살펴보시면 도움이 될 것 같아요!"*
|
|
447
|
+
|
|
448
|
+
→ **`tailrec` 키워드 = 컴파일러 최적화 (스택 오버플로우 방지)** — *Kotlin 어휘 추가 학습 권유*. 학생 자가 적용 X (다만 *문서 학습 권유*).
|
|
449
|
+
|
|
450
|
+
**MCP 룰 `tailrec-optimization-applicability` 후보** — *재귀 함수 + tailrec 의도 명시*.
|
|
451
|
+
|
|
452
|
+
### 6. `Participant.getResult` open + super 키워드 — 다형성 + 공통 로직
|
|
453
|
+
|
|
454
|
+
§6 참조. **`open` 키워드 + `super` 호출 = 부모 공통 로직 + 자식 확장**.
|
|
455
|
+
|
|
456
|
+
다만 *Participant.getResult 가 *복잡한 when 분기 6개* 보유* = *부모가 여전히 god-method*. reviewer (Thread 19) *"현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"* = *미션 종료 후 추가 학습 권유*.
|
|
457
|
+
|
|
458
|
+
#### 6.1. *2 가지 정공*
|
|
459
|
+
|
|
460
|
+
| 안 | 장점 | 단점 |
|
|
461
|
+
|---|---|---|
|
|
462
|
+
| Participant.getResult 공통 + 자식 override + super 호출 (현재) | *공통 로직 1 자리 + 자식 확장 간결* | *Participant 가 god-method (when 분기 ↑)* |
|
|
463
|
+
| 자식 모두 자가 override (Participant.getResult abstract) | *자식 별 명확 + 부모 부담 ↓* | *공통 로직 중복* |
|
|
464
|
+
| State 패턴 (sealed Result + Result.calculate(self, other)) | *Tell-Don't-Ask 정공* | *State/Result 객체 추가* |
|
|
465
|
+
|
|
466
|
+
reviewer 권유 = *현재 안 OK + 미션 종료 후 추가 학습*.
|
|
467
|
+
|
|
468
|
+
### 7. `Player.isDrawable() = cards.sumOfCards <= BUST_STANDARD` — 룰 와전 가능
|
|
469
|
+
|
|
470
|
+
```kotlin
|
|
471
|
+
override fun isDrawable(): Boolean = cards.sumOfCards <= BUST_STANDARD // ≤ 21
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
→ **Player 가 21 시점에도 hit 가능 (`≤`)** — *블랙잭 룰: 21 = 블랙잭 = stop, 21 미만 = hit 가능*.
|
|
475
|
+
|
|
476
|
+
다만 *Player.isDrawable = 21 시 true → 22 가능 → bust* = *룰 모호*. *실제 블랙잭 = 21 시 stop (자가)*.
|
|
477
|
+
|
|
478
|
+
대안: `cards.sumOfCards < BUST_STANDARD` — *21 미만 hit*.
|
|
479
|
+
|
|
480
|
+
학생의 *21 시 hit 가능 = 사용자 선택* → *사용자가 선택해서 22 = bust* = *룰 정합*. 다만 *명시적 stop 조건 X*.
|
|
481
|
+
|
|
482
|
+
**MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 11+ PR ⭐⭐⭐. *< vs ≤ 점검*.
|
|
483
|
+
|
|
484
|
+
### 8. `Dealer.DEALER_MAX_SCORE = 16` + `<=` 비교 — 16 시 hit?
|
|
485
|
+
|
|
486
|
+
```kotlin
|
|
487
|
+
override fun isDrawable(): Boolean {
|
|
488
|
+
if (cards.hasAce() && !cards.isBust(ACE_SOFT_SCORE)) {
|
|
489
|
+
return cards.sumOfCards + ACE_SOFT_SCORE <= DEALER_MAX_SCORE // ≤ 16
|
|
490
|
+
}
|
|
491
|
+
return cards.sumOfCards <= DEALER_MAX_SCORE // ≤ 16
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
→ **Dealer 16 시 hit (`<=`)** — *PR #129 결의 `<` 비교 (16 시 stay) 반대 시점*. **블랙잭 표준 = 16 이하 hit (16 시 hit)** — *현재 코드 정공*.
|
|
496
|
+
|
|
497
|
+
**PR #129 (`<` 16 시 stay = 룰 와전) vs PR #138 (`<=` 16 시 hit = 룰 정공) 반대 시점** = 학생 자가 정정. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화 + 학생 자가 학습 시간성**.
|
|
498
|
+
|
|
499
|
+
### 9. `ParticipantCards.isBlackJack` — 초기 2장 + 21 조건
|
|
500
|
+
|
|
501
|
+
```kotlin
|
|
502
|
+
fun isBlackJack(): Boolean = size == INITIAL_CARD_COUNT && finalScore() == BLACKJACK_SCORE
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
→ **블랙잭 = 초기 2장 + 21점 정확** — *PR #20·#64·#110·#28·#125·#147·#82·#36 결의 *Ace+10 두 장만 진짜 블랙잭* 룰 정공*. **MCP 룰 `blackjack-rule-fidelity` 강화** 누적 10+ PR ⭐⭐⭐.
|
|
506
|
+
|
|
507
|
+
다만 *`size` private + 호출자는 isBlackJack 만 호출* — *isBlackJack 책임 ParticipantCards 에 자가 적용*.
|
|
508
|
+
|
|
509
|
+
### 10. `getPlayerProfit(action: (String, Double) -> Unit)` — callback 람다 (PR #36 결)
|
|
510
|
+
|
|
511
|
+
```kotlin
|
|
512
|
+
fun getPlayerProfit(action: (String, Double) -> Unit) {
|
|
513
|
+
participants.players.forEach { player ->
|
|
514
|
+
val result = player.getResult(participants.dealer)
|
|
515
|
+
val profit = result.calculatePlayerProfit(player.money)
|
|
516
|
+
action(player.name, profit)
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
→ **callback 람다 = View 결합** (PR #36·#129 결).
|
|
522
|
+
|
|
523
|
+
대안: `getPlayerProfit(): List<Pair<String, Double>>` 반환 — *List 반환 후 Controller 가 View 처리*. **MCP 룰 `callback-action-for-result-aggregation` 강화** 누적 2+ PR (#129·#138).
|
|
524
|
+
|
|
525
|
+
### 11. `getDealerProfit(): Double` 반환 = 의미 누수 (PR #129 결)
|
|
526
|
+
|
|
527
|
+
```kotlin
|
|
528
|
+
fun getDealerProfit(): Double = ...
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
→ **`Double` 반환 = *수익 의미 누수***. *Money value class 활용 가능* (`Money(value)`).
|
|
532
|
+
|
|
533
|
+
대안: `getDealerProfit(): Money` — *도메인 어휘 + value class 활용*.
|
|
534
|
+
|
|
535
|
+
**MCP 룰 `primitive-return-without-domain-meaning` 강화** 누적 3+ PR (#36·#129·#138).
|
|
536
|
+
|
|
537
|
+
### 12. `Dealer.getResult` 의 `cards.isBust() && !other.cards.isBust() -> GameResult.LOSE` — 단일 경우만 처리
|
|
538
|
+
|
|
539
|
+
```kotlin
|
|
540
|
+
override fun getResult(other: Participant): GameResult =
|
|
541
|
+
when {
|
|
542
|
+
cards.isBust() && !other.cards.isBust() -> GameResult.LOSE
|
|
543
|
+
else -> super.getResult(other)
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
→ **Dealer 만 자가 처리 = *Dealer Bust + Player !Bust* 한 가지 경우** + *나머지는 super 위임*.
|
|
548
|
+
|
|
549
|
+
다만 *Player.getResult* 도 동일 패턴:
|
|
550
|
+
```kotlin
|
|
551
|
+
override fun getResult(other: Participant): GameResult =
|
|
552
|
+
when {
|
|
553
|
+
cards.isBust() -> GameResult.LOSE // ← Player Bust = 즉시 LOSE
|
|
554
|
+
else -> super.getResult(other)
|
|
555
|
+
}
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
→ **Player 는 자가 Bust = 즉시 LOSE** (모든 시점), **Dealer 는 자가 Bust + Player !Bust 만 LOSE**.
|
|
559
|
+
|
|
560
|
+
#### 12.1. *블랙잭 룰 정공*
|
|
561
|
+
|
|
562
|
+
- Player Bust: 무조건 Lose (자가).
|
|
563
|
+
- Dealer Bust: 모든 살아있는 Player Win → Dealer Lose. 다만 *Player 도 Bust = Player Lose (Dealer 의 Bust 와 무관)*.
|
|
564
|
+
|
|
565
|
+
→ *학생 코드 = 블랙잭 룰 정공*.
|
|
566
|
+
|
|
567
|
+
### 13. `BlackJackGame.processDealerTurn(): Int` 반환 = `Int` 의미 모호 (PR #129 결)
|
|
568
|
+
|
|
569
|
+
§11 참조.
|
|
570
|
+
|
|
571
|
+
### 14. `ParticipantCards.allCards: List<TrumpCard>` public getter — Tell-Don't-Ask 부분 누수
|
|
572
|
+
|
|
573
|
+
```kotlin
|
|
574
|
+
class ParticipantCards(private val _cards: MutableList<TrumpCard> = mutableListOf()) {
|
|
575
|
+
val allCards: List<TrumpCard> get() = _cards.toList()
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
→ **`allCards: List<TrumpCard>` public 노출** + *Participant.takeCards = cards.allCards.take(count)* = *외부 가져옴*. **Tell-Don't-Ask 부분 누수**.
|
|
580
|
+
|
|
581
|
+
대안: `ParticipantCards.takeFirstN(count: Int): List<TrumpCard>` — *메시지 던지기*.
|
|
582
|
+
|
|
583
|
+
PR #36·#87·#117·#129 결의 *Tell-Don't-Ask 정공* 어휘.
|
|
584
|
+
|
|
585
|
+
### 15. `Money(1000)` 최소 금액 `MINIMUM_BETTING_MONEY = 1000` — 도메인 룰 와전 가능
|
|
586
|
+
|
|
587
|
+
```kotlin
|
|
588
|
+
const val MINIMUM_BETTING_MONEY = 1000
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
→ **실제 블랙잭 = 최소 베팅액 카지노마다 다름** ($5, $10, $25). *1000원 = 임의 결정*. reviewer (Thread 2) 의문 어휘 일치: *"1000원 이상을 입력해야 하는 룰이 주어졌었나요?"*.
|
|
592
|
+
|
|
593
|
+
학생 자가 답변 = *블랙잭 룰 자가 학습 (실제 카지노 최소 베팅액)*.
|
|
594
|
+
|
|
595
|
+
**MCP 룰 `domain-rule-arbitrary-constant` 후보** — *도메인 룰 vs 임의 상수 구분*.
|
|
596
|
+
|
|
597
|
+
### 16. `Player.choice` 재귀 = `tailrec` 미적용
|
|
598
|
+
|
|
599
|
+
```kotlin
|
|
600
|
+
fun choice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
|
|
601
|
+
if (!isDrawable()) return
|
|
602
|
+
if (getPlayerChoice(name)) {
|
|
603
|
+
receiveCard(deck.pop())
|
|
604
|
+
onPlayerStateUpdated(this)
|
|
605
|
+
choice(deck, getPlayerChoice, onPlayerStateUpdated) // ← tailrec 미적용
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
→ **재귀 호출이 if 안에 있음 + 마지막 표현식** → `tailrec` 키워드 추가 가능. 다만 *조건부 재귀 (`if (drawable) recurse`)* = *tailrec 조건 만족 (마지막 표현식이 자가 호출)*.
|
|
611
|
+
|
|
612
|
+
§5 참조.
|
|
613
|
+
|
|
614
|
+
### 17. `ShuffledDeck.pop()` 재귀 + currentDeckIndex 변경 — 부작용 + 재귀
|
|
615
|
+
|
|
616
|
+
```kotlin
|
|
617
|
+
override fun pop(): TrumpCard {
|
|
618
|
+
val currentDeck = deckPool.getOrNull(currentDeckIndex) ?: throw ...
|
|
619
|
+
return if (currentDeck.isNotEmpty()) {
|
|
620
|
+
currentDeck.pop() // ← currentDeck 변경 (부작용)
|
|
621
|
+
} else {
|
|
622
|
+
currentDeckIndex++ // ← currentDeckIndex 변경 (부작용)
|
|
623
|
+
pop() // ← 재귀
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
→ **재귀 + 부작용 (currentDeckIndex 변경)** = *함수형 정공 X*. 다만 *Singleton Deck 객체 = mutable state 보유* → *부작용 불가피*.
|
|
629
|
+
|
|
630
|
+
대안: **immutable Deck + (Deck, TrumpCard) 반환** — *부작용 X*. 다만 *블랙잭 도메인 = mutable 자연 (카드 사용 후 사라짐)* → *현재 안 OK*.
|
|
631
|
+
|
|
632
|
+
**MCP 룰 `recursive-with-side-effect-vs-immutable` 후보**.
|
|
633
|
+
|
|
634
|
+
### 18. `Player.money` public val — 외부 노출
|
|
635
|
+
|
|
636
|
+
```kotlin
|
|
637
|
+
class Player(val name: String, cards: ParticipantCards, val money: Money) : Participant(cards)
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
→ **`money: Money` public val** = *외부에서 player.money 접근 가능* + *BlackJackGame.getDealerProfit = result.calculateDealerProfit(player.money)* 외부 호출. **Tell-Don't-Ask 부분 누수**.
|
|
641
|
+
|
|
642
|
+
대안: `Player.calculateProfit(other: Participant): Money` — *Player 가 자가 계산*.
|
|
643
|
+
|
|
644
|
+
PR #87·#129 결의 *Tell-Don't-Ask 정공*.
|
|
645
|
+
|
|
646
|
+
### 19. `Participants` 의 `getChoice` 위임만 — 단순 위임 (PR #129 결)
|
|
647
|
+
|
|
648
|
+
```kotlin
|
|
649
|
+
// Participants (PR #129 결 같은 단순 위임)
|
|
650
|
+
fun getChoice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
|
|
651
|
+
players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
|
|
652
|
+
}
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
→ **단순 위임 메서드 = 추가 책임 X = 메서드 인공** — PR #129 결 강화. **MCP 룰 `simple-delegation-method-unnecessary` 강화** 누적 3+ PR (#129·#87·#138).
|
|
656
|
+
|
|
657
|
+
### 20. `GameResult.WIN(1.0, 1.0)` 부호 양가성
|
|
658
|
+
|
|
659
|
+
§3.1 참조. **MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보**.
|
|
660
|
+
|
|
661
|
+
## 리뷰어 의견 요지
|
|
662
|
+
|
|
663
|
+
- **PR 본문 자가 의문 2개에 reviewer 답변** — *8 덱 도메인 룰 자가 학습 + ParticipantCards 책임 이동 자가 적용 (reviewer 선제 칭찬)*.
|
|
664
|
+
- **value class + @JvmInline = Kotlin 어휘 자가 학습** — *어떤 상황 / 어떤 이점 / 어떤 역할 3 질문*.
|
|
665
|
+
- **require 예외 vs runCatching 재입력 (유저 경험)** — *블랙잭 도메인 룰 학습*.
|
|
666
|
+
- **getResult 다형성 + super 키워드 = 공통 로직 + 자식 확장** — *4 스레드 학습 흐름*.
|
|
667
|
+
- **수익률 계산 = GameResult 책임 (BlackJackGame X)** — *로또 미션 결과 객체 결*.
|
|
668
|
+
- **재귀 함수 + tailrec 학습 권유** — *명령형 vs 함수형*.
|
|
669
|
+
- **getAllCards 위임 → cards.take 직접 (Tell-Don't-Ask)**.
|
|
670
|
+
- **choice 로직 위치 토론 + 학생 자가 정정** — *객체 소유 vs 매개변수 전달*.
|
|
671
|
+
- **BlackJackTable 형식 규칙 부산물 자가 인정** + **인스턴스 변수 2개 묶음 자가 의문** — *형식 규칙 vs 도메인 의미*.
|
|
672
|
+
- **디미터 법칙 + 외부글 (mangkyu.tistory) + 학생 자가 깨달음** (table.deck 깊이).
|
|
673
|
+
- **getOrNull = 논리오류 처리 (로또 미션 결)**.
|
|
674
|
+
- **캐싱 (companion lazy) + 트럼프 카드 효율 사용**.
|
|
675
|
+
- **Dealer/Player 한 가지 경우만 자가 override + super 호출** (Thread 13·14·19).
|
|
676
|
+
- **버스트 케이스 추가 학습 미션 종료 후 권유** — *학생 부담 최소화*.
|
|
677
|
+
|
|
678
|
+
## 대표 인용
|
|
679
|
+
|
|
680
|
+
> [rosemin928 PR 본문]
|
|
681
|
+
> *"1단계 merge하며 주신 리뷰 중 `deck을 전부 사용했을 때 어떻게 할 것인가?`를 고민하다가 **블랙잭의 최대 플레이 인원은 8명이다**, **블랙잭은 총 8개의 덱을 사용한다**라는 규칙이 있다는 것을 알게 되었습니다."*
|
|
682
|
+
|
|
683
|
+
→ **학생 자가 도메인 룰 학습 + 1단계 → 2단계 사이 학습**. *MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점*.
|
|
684
|
+
|
|
685
|
+
> [rosemin928 PR 본문]
|
|
686
|
+
> *"이번에 각 객체들의 역할과 책임에 대해 고민해보다가 `isBust`, `isBlackJack`, `finalScore` 이 세 가지 함수를 ParticipantCards로 옮기게 되었습니다."*
|
|
687
|
+
|
|
688
|
+
→ **학생 자가 책임 이동 = reviewer 권유 전 선제 적용** — 학습 가시화 정점.
|
|
689
|
+
|
|
690
|
+
> [KwonDae Thread 3]
|
|
691
|
+
> *"좋습니다 👍 2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요"*
|
|
692
|
+
|
|
693
|
+
→ **reviewer 가 학생 선제 적용 인정 + 학생 자가 학습 정점**.
|
|
694
|
+
|
|
695
|
+
> [KwonDae Thread 8]
|
|
696
|
+
> *"결과를 판단하는 로직이 게임 규칙상 굉장히 복잡하죠. 또한, 딜러와 플레이어 양쪽으로 중복되는 로직과 차이점이 동시에 존재합니다. 이런 상황에서 다형성을 활용해볼 수 있습니다."*
|
|
697
|
+
|
|
698
|
+
→ **다형성 활용 어휘 + 외부글 (위키)**.
|
|
699
|
+
|
|
700
|
+
> [KwonDae Thread 13]
|
|
701
|
+
> *"식으로 다형성을 활용해볼 수 있을거에요 (super 키워드 코드 예시). 여기서 다형성과 super 키워드에 대해 생각해보시면 좋습니다"*
|
|
702
|
+
|
|
703
|
+
→ **super 키워드 코드 힌트** — *학생 자가 적용 가능*.
|
|
704
|
+
|
|
705
|
+
> [rosemin928 Thread 15]
|
|
706
|
+
> *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나? 라는 의문도 듭니다. 제이든은 어떻게 생각하시나요?? 🥲"*
|
|
707
|
+
|
|
708
|
+
→ **학생 자가 형식 규칙 vs 도메인 의미 의문** — *MCP `oh-my-oop` 핵심 가치 자가 발견*.
|
|
709
|
+
|
|
710
|
+
> [KwonDae Thread 16]
|
|
711
|
+
> *"BlackJackTable 을 생성함으로써 어느 부분의 역할이 가벼워졌을까요? 처음 이 객체를 본 동료 개발자도 Table에 deck, bettingMoney만 있는걸 쉽게 알아차릴 수 있을까요? 🧐"*
|
|
712
|
+
|
|
713
|
+
→ **동료 개발자 시점 어휘** (maintainer perspective locator) + *학생 자가 부산물 인정 트리거*.
|
|
714
|
+
|
|
715
|
+
> [rosemin928 Thread 16]
|
|
716
|
+
> *"Table에 deck과 bettingMoney만 있는걸 쉽게 알아차리기는 어려울 것 같아요. 사실 인스턴스 변수를 2개를 유지하기 위해 BlackJackTable을 만들었었는데 Player에서 인스턴스 변수 2개를 유지할 수 있다는 장점을 제외하고는 스스로도 납득이 가는 장점이 크지는 않았던 것 같아요."*
|
|
717
|
+
|
|
718
|
+
→ **학생 자가 부산물 인정 + 자가 제거** 어휘 — *형식 규칙 비판 모범*.
|
|
719
|
+
|
|
720
|
+
> [KwonDae Thread 17]
|
|
721
|
+
> *"table이라는 객체가 생기면서 객체 지향 프로그래밍에서 이야기하는 디미터의 법칙에 대해 한번 찾아보셔도 도움이 될 것 같아요 🙂"*
|
|
722
|
+
|
|
723
|
+
→ **디미터 법칙 + 외부글** 어휘. PR #87·#129·#36 결.
|
|
724
|
+
|
|
725
|
+
> [rosemin928 Thread 17]
|
|
726
|
+
> *"table이 있을 때에는 table 내에서 deck을 가져와야 해서 응집도와 캡슐화를 해치게 되네요... 😢 앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*
|
|
727
|
+
|
|
728
|
+
→ **학생 자가 디미터 깨달음 + 미래 학습 의지**.
|
|
729
|
+
|
|
730
|
+
> [KwonDae Thread 19]
|
|
731
|
+
> *"이부분은 미션이 끝나고 한번 해보셔도 도움이 될 것 같아요. 현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"*
|
|
732
|
+
|
|
733
|
+
→ **미션 종료 후 추가 학습 권유** — *학생 부담 최소화*.
|
|
734
|
+
|
|
735
|
+
> [KwonDae Thread 20]
|
|
736
|
+
> *"이 질문이 이해를 잘 하지 못했는데, `인스턴스 변수 유지` 요구사항이 어떤 사항을 말씀하시는걸까요? DM으로 말씀주시면 좋을 것 같습니다 🙂"*
|
|
737
|
+
|
|
738
|
+
→ **DM 으로 추가 토론 + reviewer 가 사용자에게 자가 의문 명시** — *양방향 토론 깊이*. PR #129 (커뮤니케이션 메타) 결.
|
|
739
|
+
|
|
740
|
+
## 얻은 교훈 (보편)
|
|
741
|
+
|
|
742
|
+
1. **PR 본문 자가 의문 2개 + 1단계 → 2단계 사이 자가 도메인 학습** — *MCP `oh-my-oop` *학습 = 시간 두고 반복* 어휘 정점*. **MCP 룰 `multi-stage-domain-self-learning` 후보**.
|
|
743
|
+
|
|
744
|
+
2. **학생 자가 책임 이동 = reviewer 권유 전 선제 적용** — *학습 가시화 정점*. *reviewer 가 학생 선제 적용 인정* 어휘. 누적 3+ PR (#138·#147·#39).
|
|
745
|
+
|
|
746
|
+
3. **value class + @JvmInline = Kotlin 어휘 자가 학습 (어떤 상황 / 어떤 이점 / 어떤 역할 3 질문)** — *reviewer 가 *왜* 묻기 + 학생 자가 *답* 하기*. **MCP 룰 `value-class-application-and-rationale` 후보**.
|
|
747
|
+
|
|
748
|
+
4. **require 예외 vs runCatching 재입력 (유저 경험)** — **MCP 룰 `require-exception-vs-graceful-retry` 후보**.
|
|
749
|
+
|
|
750
|
+
5. **getResult 다형성 + super 키워드 = 공통 로직 + 자식 확장** — *4 스레드 학습 흐름 (의문 → 자가 의문 → 코드 힌트 → 자가 적용)*. **MCP 룰 `super-keyword-for-shared-logic` 후보**.
|
|
751
|
+
|
|
752
|
+
6. **수익률 계산 = GameResult 책임 (로또 미션 결)** — *enum 멤버 + 메서드 = 책임 강화*. PR #133·#108·#46·#39·#88·#90·#131 결.
|
|
753
|
+
|
|
754
|
+
7. **재귀 함수 + tailrec = 명령형 → 함수형** — **MCP 룰 `recursive-vs-while-functional` 후보** + **MCP 룰 `tailrec-optimization-applicability` 후보**.
|
|
755
|
+
|
|
756
|
+
8. **getAllCards 위임 → cards.take 직접 (Tell-Don't-Ask)** — *위임 메서드 줄임*. PR #87·#129·#36 결.
|
|
757
|
+
|
|
758
|
+
9. **객체 소유 vs 매개변수 전달 구분 (choice 위치 토론)** — *멤버 보유 vs 메서드 인자 = 소유 의미 구분*. **MCP 룰 `object-ownership-vs-parameter-passing` 후보**.
|
|
759
|
+
|
|
760
|
+
10. **형식 규칙 부산물 인공 객체 자가 비판 (BlackJackTable 자가 제거)** — *학생 자가 *인스턴스 변수 유지 요구사항이 묶지 않아도 될 것을 계속 묶고 있나?* 의문*. **MCP 룰 `form-rule-artificial-grouping-self-critique` 후보** + **MCP 룰 `instance-variable-limit-artificial-grouping` 강화** 누적 7+ PR.
|
|
761
|
+
|
|
762
|
+
11. **디미터 법칙 + table.deck 깊이 + 외부글** — **MCP 룰 `law-of-demeter-violation-depth` 강화** 누적 7+ PR.
|
|
763
|
+
|
|
764
|
+
12. **getOrNull = 논리오류 처리 (로또 미션 결)** — *Kotlin 어휘 + 즉시 감지*. **MCP 룰 `get-vs-getOrNull-exception-timing` 후보**.
|
|
765
|
+
|
|
766
|
+
13. **캐싱 (companion lazy)** — *Singleton 효율 사용*. **MCP 룰 `lazy-init-companion-vs-instance-pool` 후보**.
|
|
767
|
+
|
|
768
|
+
14. **enum 양쪽 시점 multiplier 묶음 = 부호 양가** — *Player vs Dealer 시점 명시 X*. **MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보**.
|
|
769
|
+
|
|
770
|
+
15. **미션 종료 후 추가 학습 권유** — *학생 부담 최소화*. PR #87·#129·#36·#117 결.
|
|
771
|
+
|
|
772
|
+
16. **DM 으로 추가 토론** — *양방향 토론 깊이 + reviewer 자가 의문 명시*. PR #129 (커뮤니케이션 메타) 결.
|
|
773
|
+
|
|
774
|
+
17. **학생 자가 도메인 룰 학습 (8 덱 / 최소 베팅액 1000원)** — *블랙잭 실제 카지노 룰 자가 학습*. **MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점**.
|
|
775
|
+
|
|
776
|
+
18. **재귀 + 부작용 (currentDeckIndex 변경)** — *immutable vs mutable 트레이드오프*. PR #87·#137·#148 결.
|
|
777
|
+
|
|
778
|
+
19. **단순 위임 메서드 = 추가 책임 X (PR #129·#87 결 강화)** — 누적 3+ PR.
|
|
779
|
+
|
|
780
|
+
20. **`<` vs `<=` 점검 (블랙잭 룰 정확성)** — *Dealer 16 시 hit 정공 (현재) vs PR #129 16 시 stay 와전 (자가 정정)*. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 11+ PR ⭐⭐⭐.
|
|
781
|
+
|
|
782
|
+
## 얻은 교훈 (도메인)
|
|
783
|
+
|
|
784
|
+
1. **블랙잭 8 덱 도메인 룰** — *최대 플레이 인원 8명 + 총 8개 덱*. 학생 자가 학습. **MCP 룰 `multi-deck-domain-rule` 강화** PR #58 (6덱 메타포) 결 + PR #138 (8덱 정공).
|
|
785
|
+
|
|
786
|
+
2. **블랙잭 최소 베팅액 = 카지노 도메인 룰 (1000원 임의)** — *블랙잭 카지노마다 다름 ($5-$25)*. 학생 자가 학습.
|
|
787
|
+
|
|
788
|
+
3. **`Dealer.isDrawable() = sum <= 16` (Soft Ace 적용)** — *블랙잭 표준 룰 정공*. PR #129 의 `<` 16 시 stay 자가 정정.
|
|
789
|
+
|
|
790
|
+
4. **`Player.isDrawable() = sum <= 21`** — *Player 21 시 hit 가능 (자가 결정)*. 블랙잭 룰 정합.
|
|
791
|
+
|
|
792
|
+
5. **`isBlackJack = size == 2 && finalScore == 21`** — *초기 2장 + 21점*. PR #20·#64·#110·#36·#26·#147·#88·#93·#136·#152·#133·#129 누적 결.
|
|
793
|
+
|
|
794
|
+
6. **`BLACKJACK(1.5, 1.0)` enum 멤버** — *블랙잭 1.5배 별도 멤버* 정공. 누적 11+ PR ⭐⭐⭐.
|
|
795
|
+
|
|
796
|
+
7. **`Ace Soft 1↔11 단일 +10 룰`** — PR #36·#129 결의 *Multi-Ace 한 가지 처리* 일치.
|
|
797
|
+
|
|
798
|
+
## MCP 룰 후보 신규 + 강화 (PR #138)
|
|
799
|
+
|
|
800
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
801
|
+
|---|---|---|
|
|
802
|
+
| `multi-stage-domain-self-learning` | 신규 | 1 (#138) — *1단계 → 2단계 사이 자가 도메인 학습* |
|
|
803
|
+
| `value-class-application-and-rationale` | 신규 | 1 (#138) |
|
|
804
|
+
| `require-exception-vs-graceful-retry` | 신규 | 2+ (#129·#138) |
|
|
805
|
+
| `super-keyword-for-shared-logic` | 신규 | 1 (#138) |
|
|
806
|
+
| `recursive-vs-while-functional` | 신규 | 1 (#138) |
|
|
807
|
+
| `tailrec-optimization-applicability` | 신규 | 1 (#138) |
|
|
808
|
+
| `object-ownership-vs-parameter-passing` | 신규 | 1 (#138) |
|
|
809
|
+
| `form-rule-artificial-grouping-self-critique` | 신규 | 1 (#138) |
|
|
810
|
+
| `instance-variable-limit-artificial-grouping` | 강화 | 7+ (#133·#88·#132·#136·#93·#87·#138) |
|
|
811
|
+
| `law-of-demeter-violation-depth` | 강화 | 7+ |
|
|
812
|
+
| `get-vs-getOrNull-exception-timing` | 신규 | 1 (#138) |
|
|
813
|
+
| `lazy-init-companion-vs-instance-pool` | 신규 | 1 (#138) |
|
|
814
|
+
| `enum-bidirectional-multiplier-ambiguity` | 신규 | 1 (#138) |
|
|
815
|
+
| `recursive-with-side-effect-vs-immutable` | 신규 | 1 (#138) |
|
|
816
|
+
| `multi-deck-domain-rule` | 강화 | 2+ (#58·#138) |
|
|
817
|
+
| `domain-rule-arbitrary-constant` | 신규 | 1 (#138) |
|
|
818
|
+
| `blackjack-rule-fidelity-comparison` | 강화 | 11+ ⭐⭐⭐ |
|
|
819
|
+
| `interface-for-test-substitution` | 강화 | 5+ |
|
|
820
|
+
| `simple-delegation-method-unnecessary` | 강화 | 3+ (#129·#87·#138) |
|
|
821
|
+
| `callback-action-for-result-aggregation` | 강화 | 2+ (#129·#138) |
|
|
822
|
+
| `primitive-return-without-domain-meaning` | 강화 | 3+ (#36·#129·#138) |
|
|
823
|
+
|
|
824
|
+
## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점 유지)
|
|
825
|
+
|
|
826
|
+
- ***학생 자가 책임 이동 + reviewer 권유 전 선제 적용*** — rosemin928 PR #138 — *reviewer 가 *2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요* 인정* — **학습 가시화 정점**.
|
|
827
|
+
- ***1단계 → 2단계 사이 자가 도메인 학습*** — rosemin928 PR #138 — *8 덱 룰 + 최소 베팅액 자가 학습*. **MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점**.
|
|
828
|
+
- ***학생 자가 형식 규칙 vs 도메인 의미 의문*** — rosemin928 PR #138 — *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?"* — **형식 규칙 부산물 자가 비판** = *MCP `oh-my-oop` 핵심 가치 자가 발견*.
|
|
829
|
+
- ***학생 자가 디미터 깨달음 + 미래 학습 의지*** — rosemin928 PR #138 — *"앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*.
|
|
830
|
+
- ***reviewer 가 *왜* 묻기 + 학생 자가 *답*하기 (Kotlin 어휘 자가 학습)*** — KwonDae/rosemin928 PR #138 — *value class / @JvmInline / getOrNull / tailrec 모두 *왜* 질문 형식*. **MCP `oop_propose_alternatives` 핵심 가치 (학생 자가 학습 권유)**.
|
|
831
|
+
- ***DM 으로 추가 토론*** — KwonDae PR #138 — *"DM으로 말씀주시면 좋을 것 같습니다 🙂"* — *공개 토론 + 사적 토론 분리 어휘*. **PR #129 (커뮤니케이션 메타) 결 강화**.
|
|
832
|
+
- ***모든 20 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 4+ 회*** — rosemin928 PR #138 — *학생 자가 학습 가시화 정점* (PR #117·#129 결 강화).
|
|
833
|
+
|
|
834
|
+
→ **13 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **batch 20 신규 발견 = *학생 자가 *선제 적용* + reviewer 인정* 패턴** (학습 가시화 정점).
|
|
835
|
+
|
|
836
|
+
## 비교 (PR #129 → #138 진화 — 사족 X, 안티패턴 명시만)
|
|
837
|
+
|
|
838
|
+
- **1단계 #129 학생 자가 의문 5+ 회 → 2단계 #138 PR 본문 자가 의문 2개 + 라인 자가 의문 4+ 회** — *학생 자가 학습 정점 유지*.
|
|
839
|
+
- **1단계 deck.pop 예외 처리 의문 → 2단계 8 덱 도메인 룰 자가 학습** — *1단계 → 2단계 사이 학습*.
|
|
840
|
+
- **1단계 추상화 활용 점검 (isDrawable) → 2단계 super 키워드 활용 (getResult)** — *추상화 학습 시간성*.
|
|
841
|
+
- **1단계 ParticipantCards 자가 생성 → 2단계 책임 이동 자가 적용 (isBust/isBlackJack/finalScore)** — *학습 가시화 정점*.
|
|
842
|
+
- **1단계 `<` 비교 16 시 stay 가능 → 2단계 `<=` 비교 16 시 hit 정공** — *블랙잭 룰 자가 정정*.
|
|
843
|
+
- **1단계 시간 압박 인정 → 2단계 자가 도메인 학습 + 자가 선제 적용** — *학생 학습 깊이 진화*.
|
|
844
|
+
|
|
845
|
+
→ *진화 비교 = 사족 아님 (안티패턴 코드 위치 명시)* + *학생 자가 학습 정점 진화 일관*.
|