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,739 @@
|
|
|
1
|
+
# PR #142 — [블랙잭 2단계] 디랙 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@doabletuple](https://github.com/doabletuple)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/142
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 1단계 #126 동일 reviewer
|
|
7
|
+
- **라인 코멘트:** 20 스레드 — *PR 본문 자가 의문 1개 (Game 책임 비대) + 1단계 reviewer 의도 자가 정정 (Thread 1) + reviewer 자가 사과 + 학생 자가 사과 + 다형성 학습 (학생 자가 코드 예시 + 4-5 라운드 양방향 토론) + Result Kotlin stdlib 충돌 → GameResult + tailrec 자가 적용 + 0 의미 상수 (MIN_BET_AMOUNT) + 패키지 분리 (participant/card/result) + 딜러 초기 핸드 = openInitialHand 분리 vs 상태 판단 (2 안 비교) + Bet (음수 X) vs Money (음수 OK) 분리*
|
|
8
|
+
- **양 단계 완성 reviewee** (1단계 #126 batch 20 분석 완료 + 2단계 #142 = batch 21 추가).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 + reviewer 자가 후퇴 + 학생 자가 사과 (Thread 1 학생 ↔ reviewer 양방향)
|
|
13
|
+
|
|
14
|
+
PR 본문:
|
|
15
|
+
|
|
16
|
+
> *"클래스가 비대해진만큼 다른 `Game`이 너무 많은 책임을 맡고 있는 것은 아닌지 의문이 들었지만, 그렇다고 `Game`이 맡고있는 책임 중 `Game`의 것이면 안 된다는 확신이 드는 부분도 없었습니다 😓"*
|
|
17
|
+
|
|
18
|
+
→ **Game god-object 자가 의문**.
|
|
19
|
+
|
|
20
|
+
reviewer (Thread 1) **1단계 의도 명료화 + 자가 사과**:
|
|
21
|
+
|
|
22
|
+
> *"잘 구현해주셨습니다 👍 다만 제가 혼란을 드린 것 같아 죄송하네요.. 🥲 코멘트의 의도는 Controller에서 데이터를 꺼내 OutputView로 개별로 전달하는 것에 대한 이야기였습니다. 같이 객체 자체를 넘기고 outputView 에서 알아서 출력하도록 유도를 하고 싶었어요! iteration 을 수행해야 하는지? 에 대해 고민해보기를 바라는 코멘트였습니다 ㅎㅎ. 명확하지 못한 코멘트가 view 관련 함수가 domain으로 들어오게 하는 혼란을 야기한것 같네요. 보다 명확하게 전달드릴 수 있도록 하겠습니다 🙇♂️"*
|
|
23
|
+
|
|
24
|
+
학생 자가 사과:
|
|
25
|
+
|
|
26
|
+
> *"제가 완전히 잘못 이해하고 있었네요 😭 헷갈리는 부분은 바로 질문을 드렸어야 하는데, 뒤늦게 여쭤봐서 죄송합니다 🙇♂️"*
|
|
27
|
+
|
|
28
|
+
→ **양방향 자가 사과 + reviewer 자가 명료화** = PR #130 (hyemdooly *"정말정말 미안해요!!"*) 결의 *reviewer 자가 한계 인정* 어휘 강화. **MCP 룰 `reviewer-self-clarification-explicit` 후보** — *reviewer 가 자가 의도 명료화 + 학생 오해 발생 자가 인정*.
|
|
29
|
+
|
|
30
|
+
### 2. 다형성 학습 = 딜러도 자가 비교 (학생 자가 코드 예시 + 4-5 라운드 양방향)
|
|
31
|
+
|
|
32
|
+
reviewer (Thread 10): *"공통점은 `내 카드의 점수가 상대방의 카드 점수보다 높다면 이긴다`. 차이점은 `bust 라는 로직에 대한 처리` 일겁니다. 이런 상황에서 다형성을 활용해볼 수 있습니다."*
|
|
33
|
+
|
|
34
|
+
reviewer 후속 (Thread 10): *"위 코멘트의 핵심은 - `딜러든 참가자든 상대방의 카드와 비교할 수 있어야 한다` - `참가자는 현재 추상클래스로 구현되어 있다` 가 포인트 입니다."*
|
|
35
|
+
|
|
36
|
+
학생 자가 코드 예시 + 자가 의문:
|
|
37
|
+
|
|
38
|
+
> *"다음 코드와 같은 구조를 말씀하시는 것이라고 이해하면 될까요? (코드 예시) 현실 세계를 생각하면 플레이어와 딜러 모두 자신과 상대방을 비교해 승패를 판단할 수 있어야 하지만, 제가 기존에 `compareAgainst()` 함수를 `Player`에만 구현한 이유는 다음과 같습니다.*
|
|
39
|
+
> *- 플레이어의 승패가 결정되면 딜러의 승패 또한 자동적으로 결정된다.*
|
|
40
|
+
> *- 때문에 플레이어들의 결과를 재사용하면 '플레이어 vs 딜러'와 '딜러 vs 플레이어'를 따로 비교하는 반복을 피할 수 있다.*
|
|
41
|
+
> *제가 기존 로직에 너무 매몰돼있는 것인지, 딜러가 `compareAgainst()` 함수를 가진다고 해도 중복 비교를 피하면서 해당 함수를 사용할 방법이 생각나지 않네요 😥"*
|
|
42
|
+
|
|
43
|
+
reviewer 답변 (Thread 15):
|
|
44
|
+
|
|
45
|
+
> *"디렉의 말씀하신 부분 중 `결과를 재상하여 비교 반복을 피할 수 있다` 도 맞습니다. 다만, 객체 지향적으로 생각해보면, 딜러와 플레이어 모두 독립적인 객체로서 자신의 상태를 판단하고 다른 객체와의 관계를 비교할 수 있는 책임을 가져야 합니다.*
|
|
46
|
+
> *- 객체 간 책임 분리(딜러는 현재 스스로 승패를 판단할 수 없습니다)*
|
|
47
|
+
> *- 딜러가 플레이어 외 다른 대상과 비교해야 하는 상황이 생긴다면 어떤 수정사항이 필요로 되는가?*
|
|
48
|
+
> *현재 우리는 다형성을 학습하고 있어요. 물론 하나의 객체에 로직을 부여해 판단하는 방법이 틀린게 아닙니다. 다만 객체 지향 프로그래밍에서 다형성 을 통해 어떤 이점을 얻을 수 있을지 깊게 고민해보셔도 좋을거에요"*
|
|
49
|
+
|
|
50
|
+
학생 자가 깨달음:
|
|
51
|
+
|
|
52
|
+
> *"비교 반복을 없에는 일에 한눈이 팔려서 학습 목표를 놓치고 있었네요 😅 지금처럼 딜러의 결과가 플레이어의 결과에 의존하는 방식은 말씀하신대로 비교해야 하는 상황이 더 복잡해졌을 때 대응하기 어려울 것 같습니다. 딜러 vs 플레이어 비교가 가능하도록 변경했습니다!"*
|
|
53
|
+
|
|
54
|
+
→ **5 라운드 양방향 토론 + 학생 자가 코드 예시 + 학생 자가 학습 목표 회수 + 변경 가능성 의식**:
|
|
55
|
+
|
|
56
|
+
#### 2.1. *학생 자가 코드 예시 = 학습 시각화*
|
|
57
|
+
|
|
58
|
+
학생이 *예시 코드 명시 + 자가 의문* = *PR #117·#129·#138 결의 *학생 자가 학습 가시화 정점* 강화*. **MCP 룰 `student-self-code-example-as-question` 후보**.
|
|
59
|
+
|
|
60
|
+
#### 2.2. *추상화 활용 점검 + 학습 목표 회수*
|
|
61
|
+
|
|
62
|
+
reviewer *"현재 우리는 다형성을 학습하고 있어요"* + 학생 *"학습 목표를 놓치고 있었네요"* = **MCP `oh-my-oop` 핵심 가치 (학습 의도 회수) 어휘**. PR #129 (KwonDae *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"*) 결 강화.
|
|
63
|
+
|
|
64
|
+
#### 2.3. *변경 가능성 = 다형성의 이점*
|
|
65
|
+
|
|
66
|
+
reviewer *"딜러가 플레이어 외 다른 대상과 비교해야 하는 상황이 생긴다면"* = *변경 가능성 의식*. PR #126 (변경 가능성 = View 책임) 결과 같은 어휘 (*변경 가능성 = 다형성*).
|
|
67
|
+
|
|
68
|
+
**MCP 룰 `polymorphism-as-change-tolerance` 후보** — *다형성 = 변경 가능성 대응*.
|
|
69
|
+
|
|
70
|
+
### 3. `tailrec` 키워드 자가 학습 + 적용
|
|
71
|
+
|
|
72
|
+
reviewer (Thread 16): *"이러한 반복되는 부분은 kotlin 의 tailrec 을 활용할 수 있는데요 어떤 기능을 하는지 한번 살펴보시고 적용가능한 부분들에 반영을 해볼까요?"*
|
|
73
|
+
|
|
74
|
+
학생 자가 적용:
|
|
75
|
+
|
|
76
|
+
```kotlin
|
|
77
|
+
tailrec fun processHits(deck: Deck, input: (Player) -> Action, output: (Player) -> Unit) {
|
|
78
|
+
if (!canHit()) return
|
|
79
|
+
if (input(this) == Action.STAND) {
|
|
80
|
+
if (openHand().size == Hand.STARTING_HAND_SIZE) output(this)
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
accept(deck.draw())
|
|
84
|
+
output(this)
|
|
85
|
+
processHits(deck, input, output)
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
reviewer (Thread 20): *"재귀함수에 tailrec을 붙이는것에 대해 어떤 역할을 하는지도 꼭 짚어보고 넘어가시면 좋습니다 👍"*
|
|
90
|
+
|
|
91
|
+
학생 자가 답변:
|
|
92
|
+
|
|
93
|
+
> *"함수의 마지막 줄이 재귀 호출로 끝날 경우 사용할 수 있고, 재귀를 `while` 문으로 변환해서 재귀 호출이 깊어져도 스택 오버플로우가 발생하지 않도록 방지해주는 기능으로 이해하고 있습니다. 바이트코드를 확인해보니 실제로 재귀 호출을 `while`로 바꿔주는 것이 신기하네요!"*
|
|
94
|
+
|
|
95
|
+
→ **`tailrec` 자가 학습 + 바이트코드 확인** = *Kotlin 어휘 깊은 자가 학습 정점*. PR #138 (rosemin928 *tailrec 학습 권유*) 결의 *학생 자가 적용 (#138 학생은 적용 X / #142 학생은 적용 + 바이트코드 확인)* 진화.
|
|
96
|
+
|
|
97
|
+
**MCP 룰 `tailrec-optimization-applicability` 강화** 누적 2+ PR (#138·#142).
|
|
98
|
+
|
|
99
|
+
### 4. `Result` → `GameResult` Kotlin stdlib 충돌 회피
|
|
100
|
+
|
|
101
|
+
reviewer (Thread 9):
|
|
102
|
+
|
|
103
|
+
> *"Kotlin 의 Result와 혼동이 될 수 있으니 보다 명시적인 네이밍으로 수정해볼까요?"*
|
|
104
|
+
|
|
105
|
+
학생 자가 적용: `Result` → `GameResult`.
|
|
106
|
+
|
|
107
|
+
→ **Kotlin stdlib 충돌 회피** = PR #130 (medAndro *Number vs kotlin.Number*) 결 강화. **MCP 룰 `class-name-vs-stdlib-collision` 강화** 누적 2+ PR (#130·#142).
|
|
108
|
+
|
|
109
|
+
### 5. `Bet` (음수 X invariant) vs `Money` (음수 OK) — value class 분리
|
|
110
|
+
|
|
111
|
+
```kotlin
|
|
112
|
+
class Bet(amount: Int) {
|
|
113
|
+
val amount = Money(amount)
|
|
114
|
+
init { require(this.amount >= Money(MIN_BET_AMOUNT)) { ... } }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@JvmInline
|
|
118
|
+
value class Money(val value: Int) {
|
|
119
|
+
operator fun compareTo(other: Money): Int = this.value.compareTo(other.value)
|
|
120
|
+
operator fun times(factor: Double): Money = Money((value * factor).toInt())
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
→ **`Bet` (invariant + Money 합성) vs `Money` (value class + operator)**:
|
|
125
|
+
|
|
126
|
+
학생 자가 답변 (Thread 13):
|
|
127
|
+
|
|
128
|
+
> *"`Bet`은 음수가 될 수 없도록 했기 때문에 마이너스가 될 수 있는 `profit`은 별도의 `Money` 클래스에 포장해보았습니다!"*
|
|
129
|
+
|
|
130
|
+
→ **invariant 다른 두 도메인 객체 = 별도 클래스 분리** = *PR #138 결의 *value class 단일 vs 도메인 invariant 분리* 트레이드오프 진화*.
|
|
131
|
+
|
|
132
|
+
#### 5.1. *2 가지 시점*
|
|
133
|
+
|
|
134
|
+
| 안 | 장점 | 단점 |
|
|
135
|
+
|---|---|---|
|
|
136
|
+
| `Money` 단일 + nullable invariant | *단일 value class* | *Bet 의 음수 X invariant 처리 외부* |
|
|
137
|
+
| `Bet` (Money 합성 + invariant) + `Money` (operator) | *각 도메인 invariant 명확* | *Bet ↔ Money 위임 ↑* |
|
|
138
|
+
|
|
139
|
+
**MCP 룰 `domain-specific-value-class-vs-shared` 후보** — *도메인 별 invariant = 별도 value class*.
|
|
140
|
+
|
|
141
|
+
### 6. `operator fun compareTo` + `operator fun times` — Kotlin 어휘 자가 활용
|
|
142
|
+
|
|
143
|
+
```kotlin
|
|
144
|
+
operator fun compareTo(other: Money): Int = this.value.compareTo(other.value)
|
|
145
|
+
operator fun times(factor: Double): Money = Money((value * factor).toInt())
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
→ **`compareTo` + `times` operator overloading**:
|
|
149
|
+
|
|
150
|
+
- `compareTo`: `bet.amount >= Money(MIN_BET_AMOUNT)` 가능.
|
|
151
|
+
- `times`: `bet.amount * profitRate` = Money 반환.
|
|
152
|
+
|
|
153
|
+
reviewer (Thread 19): *"연산자 오버로딩을 잘 활용해주셨네요 👍"*
|
|
154
|
+
|
|
155
|
+
→ **Kotlin operator overloading 자가 활용** = PR #36 (`operator fun not()` GameResult 반전) 결 합류.
|
|
156
|
+
|
|
157
|
+
### 7. 패키지 분리 (`participant/`, `card/`, `result/`)
|
|
158
|
+
|
|
159
|
+
reviewer (Thread 6·7): *"model 패키지 내부에서 participant 와 관련된 도메인은 따로 패키징이 가능할까요?"* + *"card 와 관련된 도메인은 별도로 묶어도 좋을 것 같습니다."*
|
|
160
|
+
|
|
161
|
+
학생 자가 적용:
|
|
162
|
+
- `model/participant/` (Participant, Player, Dealer).
|
|
163
|
+
- `model/card/` (Card, Hand, Deck, Rank, Suit).
|
|
164
|
+
- `model/result/` (GameResult, Scoreboard).
|
|
165
|
+
|
|
166
|
+
→ **도메인 별 패키지 분리** = PR #130 (medAndro PR 본문 자가 의문 *패키지 분리*) 결의 *시간 부족으로 미적용 → PR #142 학생 자가 적용 정공*.
|
|
167
|
+
|
|
168
|
+
**MCP 룰 `package-by-domain` 후보** — *도메인 별 패키지 분리*.
|
|
169
|
+
|
|
170
|
+
### 8. `enum GameResult` 5 멤버 + cashOut 메서드
|
|
171
|
+
|
|
172
|
+
```kotlin
|
|
173
|
+
enum class GameResult(private val profitRate: Double) {
|
|
174
|
+
WIN(1.0), LOSE(-1.0), PUSH(0.0),
|
|
175
|
+
BLACKJACK_WIN(0.5), BLACKJACK_LOSE(-0.5);
|
|
176
|
+
|
|
177
|
+
fun cashOut(player: Player): Money = (player.bet.amount * profitRate)
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
→ **블랙잭 5 결과 + 순수익 모델 (0.5 vs 1.5)** = *PR #35 (hyemdooly *순수익 모델 0.5*) 결 일관*. PR #36·#87·#138 (총 받음 모델 1.5) 와 *반대 시점*.
|
|
182
|
+
|
|
183
|
+
#### 8.1. *`BLACKJACK_LOSE(-0.5)` 멤버 = 도메인 정확성*
|
|
184
|
+
|
|
185
|
+
학생 자가 적용 = *Thread 9 (1단계 학생 자가 답변)* 와 PR #130 (Thread 9 reviewer 블랙잭 룰 인용 *"딜러가 블랙잭이고 플레이어가 블랙잭이 아니지만 합이 21인 경우에도 딜러 승리"*) 결의 *학생 자가 도메인 학습 적용*.
|
|
186
|
+
|
|
187
|
+
**MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 16+ PR ⭐⭐⭐.
|
|
188
|
+
|
|
189
|
+
#### 8.2. *`cashOut(player: Player)` 메서드 = enum 책임 강화*
|
|
190
|
+
|
|
191
|
+
`enum GameResult` 가 *결과 분류 + 수익 계산* 두 책임. **PR #138·#87·#35 결의 *enum 책임 강화* 어휘 합류**.
|
|
192
|
+
|
|
193
|
+
### 9. `Scoreboard` 객체 분리 — Game god-object 회피
|
|
194
|
+
|
|
195
|
+
```kotlin
|
|
196
|
+
class Scoreboard(val dealer: Dealer, val players: List<Player>) {
|
|
197
|
+
fun playersProfits(): Map<Player, Money> = ...
|
|
198
|
+
fun dealerProfit(players: List<Player>): Money = ...
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
→ **결과 통계 책임 분리** — *Game → Scoreboard 자가 이동*. reviewer (Thread 2·3·4) *상금 로직 Game ↔ Player 분산 → Result 응집* 권유 → 학생 자가 적용.
|
|
203
|
+
|
|
204
|
+
**MCP 룰 `result-aggregation-locator` 강화** 누적 2+ PR (#126·#142).
|
|
205
|
+
|
|
206
|
+
### 10. 추가 칭찬
|
|
207
|
+
|
|
208
|
+
- Thread 18: *"중복 로직이 굉장히 많이 줄어들었네요 👍"*.
|
|
209
|
+
- Thread 19: *"연산자 오버로딩을 잘 활용해주셨네요 👍"*.
|
|
210
|
+
- 모든 20 스레드 학생 자가 답변 + commit SHA + 자가 코드 예시 2+ 회 (Thread 10, 11) = *학생 자가 학습 가시화 정점 유지*.
|
|
211
|
+
|
|
212
|
+
## 못한 점 (설계 관점)
|
|
213
|
+
|
|
214
|
+
### 1. `Player.lateinit var bet: Bet` + `placeBet()` 호출 강제 X — 호출 순서 invariant
|
|
215
|
+
|
|
216
|
+
```kotlin
|
|
217
|
+
class Player(...) : Participant(name, cards) {
|
|
218
|
+
lateinit var bet: Bet
|
|
219
|
+
...
|
|
220
|
+
fun placeBet(input: (Player) -> Bet) {
|
|
221
|
+
bet = input(this)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
→ **`lateinit var bet` + `placeBet()` 호출 강제 X** = *PR #139 (parkjiminnnn *var betAmount + betting()*) 결과 같은 *호출 순서 invariant 부재* 패턴*.
|
|
227
|
+
|
|
228
|
+
대안:
|
|
229
|
+
- `Player(name, cards, bet: Bet)` 생성자 인자 (PR #139 1차 안 자가 거절 후 PR #142 재발).
|
|
230
|
+
- `Player.startRound(bet: Bet): RoundPlayer` (Round 객체).
|
|
231
|
+
|
|
232
|
+
**MCP 룰 `lateinit-var-call-order-invariant` 강화** 누적 10+ PR.
|
|
233
|
+
|
|
234
|
+
### 2. `Dealer.openInitialHand()` vs `Player.openInitialHand()` — 시그니처 동일 / 의미 차이
|
|
235
|
+
|
|
236
|
+
```kotlin
|
|
237
|
+
// Participant
|
|
238
|
+
abstract fun openInitialHand(): List<Card>
|
|
239
|
+
|
|
240
|
+
// Player
|
|
241
|
+
override fun openInitialHand(): List<Card> = openHand() // 2장 전체
|
|
242
|
+
|
|
243
|
+
// Dealer
|
|
244
|
+
override fun openInitialHand(): List<Card> = openHand().take(INITIAL_OPEN_SIZE) // 1장만
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
→ **`openInitialHand` 추상화 정공** — reviewer (Thread 14) *2 가지 대안 비교*:
|
|
248
|
+
|
|
249
|
+
| 안 | 장점 | 단점 |
|
|
250
|
+
|---|---|---|
|
|
251
|
+
| 별도 추상화 (학생 자가 적용 `openInitialHand`) | *명시적 호출 의도 + 호출 시점 학생 자가 제어* | *비즈니스 로직 = 외부 호출자가 단계 알아야 함* |
|
|
252
|
+
| 딜러 지역변수 (`initialHandShown: Boolean`) | *외부에서 신경 안 씀 + 자가 상태 관리* | *가변 상태 + 호출 횟수 invariant 부재* |
|
|
253
|
+
|
|
254
|
+
학생 자가 답변 (Thread 14):
|
|
255
|
+
|
|
256
|
+
> *"최초 오픈 시 별도의 `openInitialHand()` 함수를 사용하도록 변경해보았는데, 말씀하신 내용과 부합할까요? 지역변수로 관리하는 것에 비해 딜러의 행동을 보다 명시적으로 만들 수 있고, 추가적인 상태를 관리할 필요가 없어진다는 장점이 있을 것 같습니다."*
|
|
257
|
+
|
|
258
|
+
→ **2 안 비교 + 학생 자가 선택**:
|
|
259
|
+
|
|
260
|
+
- **명시적 호출 + 상태 X (정공)** = *Tell-Don't-Ask 정공 + 호출자가 단계 알아야 함*.
|
|
261
|
+
- **지역변수 + 자가 상태 관리** = *상태 ↑ 위험 (PR #126 결 `initialHandShown` 안티패턴)*.
|
|
262
|
+
|
|
263
|
+
학생의 선택 = *PR #126 결의 *상태 플래그 vs 도메인 상태 판단* 어휘 진화 + 정공 선택*. PR #126 1단계 reviewer 의 *지역변수 vs 도메인 상태* 의도가 *2단계에서 reviewer 자가 정정 (canHit() 시점 X)* 으로 진화.
|
|
264
|
+
|
|
265
|
+
#### 2.1. *학생 자가 의문 (Thread 11)*
|
|
266
|
+
|
|
267
|
+
> *"아하, 무슨 뜻인지 이해했습니다! 그런데 이렇게 된다면 딜러가 처음 뽑은 두 장이 16을 초과할 경우, `canHit()`가 `false`가 되어 처음부터 두 장을 보여줄 것 같은데 제가 놓치고 있는 것이 있을까요? 😵"*
|
|
268
|
+
|
|
269
|
+
reviewer 자가 정정 (Thread 14):
|
|
270
|
+
|
|
271
|
+
> *"맞습니다. 기존의 상태를 갖고 판단하게끔 설계하고 싶었지만 처음 뽑은 두장이 canHit() == false 가 될 상황이 생기겠네요."*
|
|
272
|
+
|
|
273
|
+
→ **reviewer 가 1단계 권유 (canHit() 활용) 의 *경계 케이스 자가 발견* 후 자가 정정** = *PR #130 (hyemdooly *"정말정말 미안해요!!"*) 결과 같은 *reviewer 자가 한계 인정* 어휘 정점*.
|
|
274
|
+
|
|
275
|
+
**MCP 룰 `state-flag-vs-domain-state-judgement` 강화** 누적 2+ PR (#126·#142). *학생/reviewer 양방향 토론 진화*.
|
|
276
|
+
|
|
277
|
+
### 3. Game ↔ OutputView 객체 자체 넘김 — 1단계 misunderstanding 자가 정정
|
|
278
|
+
|
|
279
|
+
Thread 1 §1 참조.
|
|
280
|
+
|
|
281
|
+
학생 자가 적용 (PR #142 60a159d 커밋):
|
|
282
|
+
|
|
283
|
+
```kotlin
|
|
284
|
+
// Game.showStatus
|
|
285
|
+
fun showStatus(output: (Participant) -> Unit) {
|
|
286
|
+
output(dealer)
|
|
287
|
+
players.forEach { player -> output(player) }
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
→ **`output: (Participant) -> Unit` 객체 자체 넘김** — *PR #126 1단계 `outputView.printParticipantStatus(participant)` 호출 vs PR #142 *Participant 객체 자체 넘기고 outputView 자가 출력* 진화*.
|
|
292
|
+
|
|
293
|
+
다만 *Game.showStatus 도 `forEach` 보유* = *외부에서 iteration 안 함*. **MCP 룰 `iteration-locator-domain-vs-view` 후보** — *iteration 위치 = Domain (current 정공) vs View vs Controller*.
|
|
294
|
+
|
|
295
|
+
### 4. 상금 로직 Game ↔ Player 분산 → Result/Scoreboard 응집
|
|
296
|
+
|
|
297
|
+
reviewer (Thread 2·3·4): *Game 비대 → Result 응집*.
|
|
298
|
+
|
|
299
|
+
학생 자가 적용:
|
|
300
|
+
- `enum GameResult.cashOut(player)` = 결과 별 수익 계산.
|
|
301
|
+
- `Scoreboard.playersProfits / dealerProfit` = 통계.
|
|
302
|
+
|
|
303
|
+
→ **god-object 회피 + 책임 응집** = PR #117·#129·#138·#126 결.
|
|
304
|
+
|
|
305
|
+
다만 **Game 가 아직 다음 책임 보유**:
|
|
306
|
+
- 참가자 invariant (이름 중복 X / 딜러 이름 X).
|
|
307
|
+
- 베팅 단계 진행 (`processBets`).
|
|
308
|
+
- 카드 분배 (`processPlayersHits`, `processDealerHits`).
|
|
309
|
+
- 상태 출력 위임 (`showStatus`).
|
|
310
|
+
|
|
311
|
+
→ *Game = 게임 진행 단계 책임 (controller-like) + Scoreboard = 결과 통계 책임*. **MCP 룰 `game-stages-vs-game-state` 후보**.
|
|
312
|
+
|
|
313
|
+
### 5. `Player.compareAgainst(other)` super + 자식 확장 (PR #138 결과 같은 패턴)
|
|
314
|
+
|
|
315
|
+
```kotlin
|
|
316
|
+
// Participant
|
|
317
|
+
open fun compareAgainst(other: Participant): GameResult { ... }
|
|
318
|
+
|
|
319
|
+
// Player
|
|
320
|
+
override fun compareAgainst(other: Participant): GameResult {
|
|
321
|
+
if (isBusted()) return GameResult.LOSE
|
|
322
|
+
if (other.isBusted()) return GameResult.WIN
|
|
323
|
+
return super.compareAgainst(other)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Dealer
|
|
327
|
+
override fun compareAgainst(other: Participant): GameResult {
|
|
328
|
+
if (other.isBusted()) return GameResult.WIN
|
|
329
|
+
if (!isBlackJack() && other.isBlackJack()) return GameResult.BLACKJACK_LOSE
|
|
330
|
+
return super.compareAgainst(other)
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
→ **`super` 키워드 활용 = 공통 로직 + 자식 확장** = PR #138 (rosemin928 결과 같은 패턴). **MCP 룰 `super-keyword-for-shared-logic` 강화** 누적 2+ PR (#138·#142).
|
|
335
|
+
|
|
336
|
+
#### 5.1. *Dealer 의 `BLACKJACK_LOSE` 분기*
|
|
337
|
+
|
|
338
|
+
블랙잭 표준 룰: *플레이어 21점 (3장 이상) vs 딜러 블랙잭 (2장 21점) = 딜러 승리*. PR #130 (medAndro Thread 9) 의 *블랙잭 룰 학생 자가 학습* → PR #142 (doabletuple) *학생 자가 적용 정공*.
|
|
339
|
+
|
|
340
|
+
다만 **`BLACKJACK_LOSE = -0.5`** = *0.5배 손실 (0.5 환불)* 의미 양가:
|
|
341
|
+
- *블랙잭 패배 = 0.5배 추가 손실?*
|
|
342
|
+
- *블랙잭 패배 = 베팅의 0.5배만 잃음?*
|
|
343
|
+
|
|
344
|
+
학생 코드 `GameResult.BLACKJACK_LOSE(-0.5)` = *Player 베팅 × -0.5 = Player -0.5 베팅 손실* = *Dealer +0.5 베팅 수익*. **블랙잭 표준 룰과 양가** — 표준은 *Player Bust + Dealer Bust = Player Lose 베팅 전부* / *블랙잭 vs 일반 = 베팅 전부 손실*.
|
|
345
|
+
|
|
346
|
+
**MCP 룰 `blackjack-payout-vs-profit-model` 강화** 누적 2+ PR (#35·#142).
|
|
347
|
+
|
|
348
|
+
### 6. `lateinit var bet` Player 호출 강제 X — §1 참조
|
|
349
|
+
|
|
350
|
+
### 7. 카드덱 효율 사용 — companion lazy + shuffled() 재호출
|
|
351
|
+
|
|
352
|
+
reviewer (Thread 17):
|
|
353
|
+
|
|
354
|
+
> *"현재 Suit, Rank를 조합하여 카드를 생성하고 있는데요. 플레잉카드는 정해진 모양과 숫자를 조합해 만들어지는데 카드덱에 있는 카드를 모두 사용하여 새로 추가를 해줘야 할 때, 다시. 카드 인스턴스를 모두 생성해주어야 할까요? 효율적으로 할 수 있는 방법이 있을까요?"*
|
|
355
|
+
|
|
356
|
+
학생: *"`companion object`에서 만들어두면 카드를 추가할 때 새로운 인스턴스가 만들어지지 않는다고 생각했는데, 제가 잘못 이해하고 있었던 것 같네요 😅 해당 부분을 더 공부해보고 적용하도록 하겠습니다 🙏"*
|
|
357
|
+
|
|
358
|
+
reviewer 후속:
|
|
359
|
+
|
|
360
|
+
> *"밑에 `Pack` 과 `cards` 키워드를 제가 헷갈린거 같네요 🥲*
|
|
361
|
+
> *처음엔 **suffled 된 카드 자체를 캐싱**하자는 의도를 갖고 코멘트를 남겼었지만, 현실 세계에 도입해보면 과할 수 있겠다는 생각이 한편으로는 드네요 ㅎㅎ..*
|
|
362
|
+
> *말씀주신 것 처럼 기존에 companion object로 선언된 `pack` 으로 캐싱 처리를 잘 해주셨어요. 다만, 카드가 부족할 때 부족한 카드덱으로 다시 shuffled() 를 진행하는것에 대해 이야기를 하고 싶었는데 잘 수정해주셨네요 💯"*
|
|
363
|
+
|
|
364
|
+
→ **reviewer 가 자가 혼동 + 학생이 *이미 적절히 구현* 인정** = *PR #130 결의 *reviewer 자가 한계 인정* 어휘 강화*.
|
|
365
|
+
|
|
366
|
+
**MCP 룰 `reviewer-self-confusion-explicit` 후보** — *reviewer 가 자가 코드 읽기 혼동 명시*.
|
|
367
|
+
|
|
368
|
+
### 8. 모델 → View 에러 메시지 위치 자가 의문
|
|
369
|
+
|
|
370
|
+
reviewer (Thread 5): *"이또한 outputView로 다시 이사를 해야겠네요 😂"* (학생 도메인 안에 String 메시지)
|
|
371
|
+
|
|
372
|
+
학생: *"앗, `Model`이 던지는 에러 메시지의 상수도 `OutputView`가 가지고 있는 것이 좋다고 이해하면 될까요?"*
|
|
373
|
+
|
|
374
|
+
reviewer (Thread 12) 자가 정정: *"에러에 관련된 문구였군요 ㅎㅎ 😂 위 상수는 Model에 위치하는게 맞습니다! 👍"*
|
|
375
|
+
|
|
376
|
+
→ **에러 메시지 = Model 위치 OK + reviewer 자가 정정** = *PR #126 (Verdict 문자열 = View 책임) 결과 *에러 메시지 = Model OK* 반대 시점 (변경 가능성 vs invariant 검증 어휘 차이)*.
|
|
377
|
+
|
|
378
|
+
#### 8.1. *에러 메시지 vs UI 메시지 구분*
|
|
379
|
+
|
|
380
|
+
- **에러 메시지 (Model)**: *invariant 검증 + 도메인 의미*.
|
|
381
|
+
- **UI 메시지 (View)**: *출력 + 사용자 표현*.
|
|
382
|
+
|
|
383
|
+
PR #126 (Verdict 출력 문자열 = View) vs PR #142 (Bet 에러 메시지 = Model) **반대 시점 = 차이 명시**.
|
|
384
|
+
|
|
385
|
+
**MCP 룰 `model-error-vs-view-message-locator` 후보** — *에러 메시지 vs UI 메시지 위치 구분*.
|
|
386
|
+
|
|
387
|
+
### 9. `Bet.MIN_BET_AMOUNT = 0` — 0 의미 부여
|
|
388
|
+
|
|
389
|
+
```kotlin
|
|
390
|
+
companion object {
|
|
391
|
+
private const val MIN_BET_AMOUNT = 0
|
|
392
|
+
private const val ERROR_MESSAGE_BET_NOT_POSITIVE = "베팅 금액은 ${MIN_BET_AMOUNT}보다 작을 수 없습니다."
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
reviewer (Thread 8): *"0 이라는 금액도 상수를 통해 의미를 부여할 수 있을거에요"*
|
|
397
|
+
|
|
398
|
+
학생 자가 적용.
|
|
399
|
+
|
|
400
|
+
→ **매직 넘버 (0) → 상수 명명** = PR #117 (16 매직 넘버) 결 합류. **MCP 룰 `magic-number-zero-as-named-constant` 후보**.
|
|
401
|
+
|
|
402
|
+
다만 **`MIN_BET_AMOUNT = 0` + `require(amount >= Money(0))`** = *베팅 0원 가능* 의미. *블랙잭 표준 = 최소 베팅 ≥ $5* (PR #138 결의 *1000원* vs PR #142 *0원* 양가).
|
|
403
|
+
|
|
404
|
+
PR #138·#129 결의 *블랙잭 베팅 최소 1000원* 와 *반대 시점*. **블랙잭 도메인 룰 양가성 = 임의 도메인 상수**.
|
|
405
|
+
|
|
406
|
+
**MCP 룰 `domain-rule-arbitrary-constant` 강화** 누적 3+ PR (#138·#35·#142).
|
|
407
|
+
|
|
408
|
+
### 10. `Player(name, cards)` + 부생성자 2개 (vararg) — 테스트 fixture 의도
|
|
409
|
+
|
|
410
|
+
```kotlin
|
|
411
|
+
class Player(name: String, cards: List<Card>) : Participant(name, cards) {
|
|
412
|
+
lateinit var bet: Bet
|
|
413
|
+
|
|
414
|
+
constructor(name: String, vararg cards: Card) : this(name, cards.toList())
|
|
415
|
+
constructor(name: String, betAmount: Int, vararg cards: Card) : this(name, cards.toList()) {
|
|
416
|
+
this.bet = Bet(betAmount)
|
|
417
|
+
}
|
|
418
|
+
...
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
→ **부생성자 2개 (vararg)** = PR #126·#130 (test-fixture-secondary-constructor) 결 강화 누적 3+ PR.
|
|
423
|
+
|
|
424
|
+
다만 **부생성자 2번째 가 `this.bet = Bet(betAmount)` lateinit 즉시 초기화** = *호출 순서 invariant 회피 가능 (테스트 한정)*.
|
|
425
|
+
|
|
426
|
+
### 11. `Player.placeBet(input: (Player) -> Bet)` — 람다 인자 = View 결합
|
|
427
|
+
|
|
428
|
+
```kotlin
|
|
429
|
+
fun placeBet(input: (Player) -> Bet) {
|
|
430
|
+
bet = input(this)
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
→ **`(Player) -> Bet` 람다 인자 = View 호출 람다** = PR #36·#129·#138 (callback-lambda-view-cost) 결.
|
|
435
|
+
|
|
436
|
+
대안: `Player.setBet(bet: Bet)` — *Player 가 *bet 객체 받음* + Controller 가 View 호출 + Player.setBet 호출*. **MCP 룰 `callback-lambda-vs-direct-setter` 후보**.
|
|
437
|
+
|
|
438
|
+
### 12. `processBets` `processPlayersHits` `processDealerHits` `showStatus` — Game 의 행동 메서드 4개
|
|
439
|
+
|
|
440
|
+
§4 참조. Game = 게임 진행 단계 책임 다수.
|
|
441
|
+
|
|
442
|
+
### 13. `Dealer.processHits(deck, output: (Dealer, Int) -> Unit)` — output 인자 `(Dealer, Int)`
|
|
443
|
+
|
|
444
|
+
```kotlin
|
|
445
|
+
tailrec fun processHits(deck: Deck, output: (Dealer, Int) -> Unit) {
|
|
446
|
+
if (!canHit()) return
|
|
447
|
+
output(this, HIT_THRESHOLD)
|
|
448
|
+
accept(deck.draw())
|
|
449
|
+
processHits(deck, output)
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
→ **`(Dealer, Int) -> Unit` 람다 인자 = Dealer 객체 + HIT_THRESHOLD 정수 둘 다 외부 전달** = *PR #36 결의 *Tuple 누수* 변형*.
|
|
454
|
+
|
|
455
|
+
대안: `output(this)` 만 (View 가 Dealer 의 hit 한계 직접 호출). **MCP 룰 `lambda-multiple-args-tuple-leak` 후보**.
|
|
456
|
+
|
|
457
|
+
### 14. `Scoreboard.dealerProfit(players: List<Player>)` — players 외부 인자 받음
|
|
458
|
+
|
|
459
|
+
```kotlin
|
|
460
|
+
fun dealerProfit(players: List<Player>): Money {
|
|
461
|
+
return Money(players.sumOf { player -> dealer.compareAgainst(player).cashOut(player).value })
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
→ **`players` 외부 인자 받음** = *Scoreboard 가 이미 `players` 멤버 보유 (constructor)* → *중복 인자*. **MCP 룰 `redundant-parameter-vs-member` 후보**.
|
|
466
|
+
|
|
467
|
+
대안:
|
|
468
|
+
```kotlin
|
|
469
|
+
fun dealerProfit(): Money {
|
|
470
|
+
return Money(players.sumOf { player -> dealer.compareAgainst(player).cashOut(player).value })
|
|
471
|
+
}
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### 15. `Game(deck, dealer, players)` 생성자 (3 변수) — 형식 규칙 vs 도메인 정합
|
|
475
|
+
|
|
476
|
+
```kotlin
|
|
477
|
+
class Game(
|
|
478
|
+
private val deck: Deck,
|
|
479
|
+
val dealer: Dealer,
|
|
480
|
+
val players: List<Player>,
|
|
481
|
+
) { ... }
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
→ **3 변수** = *형식 규칙 위반*. 다만 *deck + dealer + players = 도메인 정합 (블랙잭 게임 3 구성요소)* = *형식 규칙 위반 무의미*.
|
|
485
|
+
|
|
486
|
+
PR #138 (rosemin928 *형식 규칙 vs 도메인 의미 자가 의문*) 결의 *학생 자가 정공 선택* 일관.
|
|
487
|
+
|
|
488
|
+
### 16. `Game.players: List<Player>` (Participants 일급 컬렉션 X)
|
|
489
|
+
|
|
490
|
+
```kotlin
|
|
491
|
+
class Game(... val players: List<Player>)
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
→ **`List<Player>` 노출 (1단계 #126 `Participants` 일급 컬렉션 → 2단계 #142 *Game.players: List<Player>* 노출 회귀)** = *Participants 객체 제거 + Game 가 players 직접 보유*.
|
|
495
|
+
|
|
496
|
+
**MCP 룰 `first-class-collection-regression` 후보** — *1단계 일급 컬렉션 → 2단계 노출 회귀*.
|
|
497
|
+
|
|
498
|
+
다만 **Game 이 Participants 책임 흡수** = *책임 통합 시점* — PR #138 (rosemin928 *BlackJackTable 자가 제거*) 결의 *형식 규칙 부산물 제거* 어휘 일관.
|
|
499
|
+
|
|
500
|
+
### 17. `Money operator times(factor: Double)` `(value * factor).toInt()` 정밀도 손실
|
|
501
|
+
|
|
502
|
+
```kotlin
|
|
503
|
+
operator fun times(factor: Double): Money = Money((value * factor).toInt())
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
→ **`Double * Int → Double → toInt()`** = *소수점 손실*. *블랙잭 1.5배 = 100 × 1.5 = 150 (정공) / 100 × 0.5 = 50 (정공)* → *현재 안 OK*.
|
|
507
|
+
|
|
508
|
+
다만 **`factor: Double` 인자 받음** = *임의 비율 가능* = *블랙잭 도메인 5 멤버 한정 X*. **MCP 룰 `times-factor-overflow-risk` 후보**.
|
|
509
|
+
|
|
510
|
+
### 18. `Player.compareAgainst(other)` `super` 호출 — Dealer 의 BLACKJACK_LOSE 처리 X
|
|
511
|
+
|
|
512
|
+
```kotlin
|
|
513
|
+
// Player
|
|
514
|
+
override fun compareAgainst(other: Participant): GameResult {
|
|
515
|
+
if (isBusted()) return GameResult.LOSE
|
|
516
|
+
if (other.isBusted()) return GameResult.WIN
|
|
517
|
+
return super.compareAgainst(other)
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
→ **Player 시점 BLACKJACK_LOSE 처리 X** = *super 가 PUSH/BLACKJACK_WIN/WIN/LOSE/PUSH 만 반환 → Player 의 BLACKJACK_LOSE 케이스 미처리*.
|
|
522
|
+
|
|
523
|
+
학생 코드의 *Dealer.compareAgainst* 만 `BLACKJACK_LOSE` 분기. *Scoreboard.playersProfits = player.compareAgainst(dealer) 호출* → *Player 시점 → BLACKJACK_LOSE 결과 안 나옴*.
|
|
524
|
+
|
|
525
|
+
**대칭 깨짐** — *Player 결과 vs Dealer 결과 = 대칭 (부호 반전) 아님*.
|
|
526
|
+
|
|
527
|
+
#### 18.1. *Scoreboard 의 결과 호출*
|
|
528
|
+
|
|
529
|
+
```kotlin
|
|
530
|
+
fun playersProfits(): Map<Player, Money> =
|
|
531
|
+
players.associateWith { player -> player.compareAgainst(dealer).cashOut(player) }
|
|
532
|
+
|
|
533
|
+
fun dealerProfit(players: List<Player>): Money =
|
|
534
|
+
Money(players.sumOf { player -> dealer.compareAgainst(player).cashOut(player).value })
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
→ **Player.compareAgainst(dealer) + Dealer.compareAgainst(player) 둘 다 호출** = *반복 비교*. *PR #142 (학생 자가 인지 + reviewer 권유 정공)*.
|
|
538
|
+
|
|
539
|
+
다만 **결과 호출 양쪽 = 중복 평가 비용 + 도메인 일관성 유지 어려움**:
|
|
540
|
+
- Player.compareAgainst(dealer) 시 isBlackJack 분기.
|
|
541
|
+
- Dealer.compareAgainst(player) 시 BLACKJACK_LOSE 분기.
|
|
542
|
+
|
|
543
|
+
→ **각 시점 별 BLACKJACK 분기 양가** = *PR #87·#36 결의 *symmetric-getResult vs compareWith* 어휘 합류 + 진화*.
|
|
544
|
+
|
|
545
|
+
**MCP 룰 `symmetric-compare-bidirectional-call` 후보** — *양쪽 객체 모두 자가 비교 = 중복 평가*.
|
|
546
|
+
|
|
547
|
+
### 19. `Hand.STARTING_HAND_SIZE` 상수 — companion object
|
|
548
|
+
|
|
549
|
+
```kotlin
|
|
550
|
+
// in Hand (가정)
|
|
551
|
+
companion object { const val STARTING_HAND_SIZE = 2 }
|
|
552
|
+
|
|
553
|
+
// in Player.processHits
|
|
554
|
+
if (openHand().size == Hand.STARTING_HAND_SIZE) output(this)
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
→ **`Hand.STARTING_HAND_SIZE` 상수 외부 접근** = *도메인 룰 (초기 2장) Hand 에 위치 정공*. PR #130 (medAndro *초기 카드 장수 = 도메인 상수*) 결 강화.
|
|
558
|
+
|
|
559
|
+
### 20. `Bet ↔ Money` 합성 + Bet 미인스턴스 시 lateinit 의존
|
|
560
|
+
|
|
561
|
+
```kotlin
|
|
562
|
+
class Bet(amount: Int) {
|
|
563
|
+
val amount = Money(amount)
|
|
564
|
+
...
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
→ **Bet 합성: Bet 객체 안에 Money 객체** = *2 단계 위임 (`bet.amount.value`)*. PR #87 (디미터 법칙) 결의 *깊이 위반 가능*.
|
|
569
|
+
|
|
570
|
+
대안: `Bet(value: Int) extends Money` 또는 *Bet 이 Money 멤버 X + Money invariant 강화*. **MCP 룰 `composition-vs-extension-tradeoff` 후보**.
|
|
571
|
+
|
|
572
|
+
## 리뷰어 의견 요지
|
|
573
|
+
|
|
574
|
+
- **1단계 misunderstanding 자가 정정 + 양방향 사과** — *reviewer 자가 명료화 + 학생 자가 사과*.
|
|
575
|
+
- **다형성 학습 = 딜러도 자가 비교** — *학생 자가 코드 예시 + 5 라운드 양방향*.
|
|
576
|
+
- **`tailrec` Kotlin 어휘 자가 학습 + 바이트코드 확인**.
|
|
577
|
+
- **`Result` Kotlin stdlib 충돌 → `GameResult`** — 누적 2 PR.
|
|
578
|
+
- **`Bet` (음수 X) vs `Money` (음수 OK) 분리 + value class**.
|
|
579
|
+
- **operator overloading 활용 (compareTo, times)** — 칭찬.
|
|
580
|
+
- **패키지 분리 (participant/card/result)**.
|
|
581
|
+
- **상금 로직 Game ↔ Player 분산 → Result 응집** + **Scoreboard 객체 생성**.
|
|
582
|
+
- **`openInitialHand` 별도 추상화 vs 지역변수 (reviewer 자가 정정)**.
|
|
583
|
+
- **에러 메시지 = Model 위치 OK (reviewer 자가 정정)**.
|
|
584
|
+
- **`0` 매직 넘버 → MIN_BET_AMOUNT 상수**.
|
|
585
|
+
- **카드덱 효율 = companion + shuffled() (reviewer 자가 혼동 + 학생 정공)**.
|
|
586
|
+
- **수정 후 칭찬** — *중복 로직 줄어듦 + 연산자 오버로딩*.
|
|
587
|
+
|
|
588
|
+
## 대표 인용
|
|
589
|
+
|
|
590
|
+
> [KwonDae Thread 1]
|
|
591
|
+
> *"잘 구현해주셨습니다 👍 다만 제가 혼란을 드린 것 같아 죄송하네요.. 🥲 코멘트의 의도는 Controller에서 데이터를 꺼내 OutputView로 개별로 전달하는 것에 대한 이야기였습니다. (...) 명확하지 못한 코멘트가 view 관련 함수가 domain으로 들어오게 하는 혼란을 야기한것 같네요. 보다 명확하게 전달드릴 수 있도록 하겠습니다 🙇♂️"*
|
|
592
|
+
|
|
593
|
+
→ **reviewer 자가 의도 명료화 + 자가 사과** — **MCP 핵심 가치 정점**. PR #130 강화.
|
|
594
|
+
|
|
595
|
+
> [doabletuple Thread 1]
|
|
596
|
+
> *"제가 완전히 잘못 이해하고 있었네요 😭 헷갈리는 부분은 바로 질문을 드렸어야 하는데, 뒤늦게 여쭤봐서 죄송합니다 🙇♂️"*
|
|
597
|
+
|
|
598
|
+
→ **양방향 자가 사과** — *학습 가시화*.
|
|
599
|
+
|
|
600
|
+
> [KwonDae Thread 15]
|
|
601
|
+
> *"현재 우리는 다형성을 학습하고 있어요. 물론 하나의 객체에 로직을 부여해 판단하는 방법이 틀린게 아닙니다. 다만 객체 지향 프로그래밍에서 다형성 을 통해 어떤 이점을 얻을 수 있을지 깊게 고민해보셔도 좋을거에요"*
|
|
602
|
+
|
|
603
|
+
→ **학습 목표 회수 어휘** — *MCP `oh-my-oop` 핵심 가치 (학습 의도 회수)*.
|
|
604
|
+
|
|
605
|
+
> [doabletuple Thread 15]
|
|
606
|
+
> *"비교 반복을 없에는 일에 한눈이 팔려서 학습 목표를 놓치고 있었네요 😅"*
|
|
607
|
+
|
|
608
|
+
→ **학생 자가 학습 목표 회수**.
|
|
609
|
+
|
|
610
|
+
> [KwonDae Thread 14]
|
|
611
|
+
> *"맞습니다. 기존의 상태를 갖고 판단하게끔 설계하고 싶었지만 처음 뽑은 두장이 canHit() == false 가 될 상황이 생기겠네요."*
|
|
612
|
+
|
|
613
|
+
→ **reviewer 자가 경계 케이스 인정**.
|
|
614
|
+
|
|
615
|
+
> [doabletuple Thread 20]
|
|
616
|
+
> *"함수의 마지막 줄이 재귀 호출로 끝날 경우 사용할 수 있고, 재귀를 `while` 문으로 변환해서 재귀 호출이 깊어져도 스택 오버플로우가 발생하지 않도록 방지해주는 기능으로 이해하고 있습니다. 바이트코드를 확인해보니 실제로 재귀 호출을 `while`로 바꿔주는 것이 신기하네요!"*
|
|
617
|
+
|
|
618
|
+
→ **tailrec 자가 학습 + 바이트코드 확인** — *학생 자가 학습 깊이 정점*.
|
|
619
|
+
|
|
620
|
+
> [KwonDae Thread 17]
|
|
621
|
+
> *"밑에 `Pack` 과 `cards` 키워드를 제가 헷갈린거 같네요 🥲 (...) 말씀주신 것 처럼 기존에 companion object로 선언된 `pack` 으로 캐싱 처리를 잘 해주셨어요."*
|
|
622
|
+
|
|
623
|
+
→ **reviewer 자가 혼동 명시 + 학생 정공 인정**.
|
|
624
|
+
|
|
625
|
+
## 얻은 교훈 (보편)
|
|
626
|
+
|
|
627
|
+
1. **reviewer 자가 의도 명료화 + 자가 사과 (Thread 1)** — *PR #130 결의 *reviewer 자가 한계 인정* 강화*. **MCP 룰 `reviewer-self-clarification-explicit` 후보**.
|
|
628
|
+
|
|
629
|
+
2. **양방향 자가 사과 + 학생 자가 *바로 질문* 후회** — *학습 가시화 정점*.
|
|
630
|
+
|
|
631
|
+
3. **다형성 학습 = 변경 가능성 대응** — *학습 목표 회수 어휘*. **MCP 룰 `polymorphism-as-change-tolerance` 후보**.
|
|
632
|
+
|
|
633
|
+
4. **학생 자가 코드 예시 + 자가 의문 (Thread 10)** — *학습 가시화 정점*. **MCP 룰 `student-self-code-example-as-question` 후보**.
|
|
634
|
+
|
|
635
|
+
5. **`tailrec` 자가 학습 + 바이트코드 확인** — *Kotlin 어휘 깊은 자가 학습*. **MCP 룰 `tailrec-optimization-applicability` 강화** 누적 2+ PR.
|
|
636
|
+
|
|
637
|
+
6. **Kotlin stdlib 충돌 (Result/Number)** — **MCP 룰 `class-name-vs-stdlib-collision` 강화** 누적 2+ PR.
|
|
638
|
+
|
|
639
|
+
7. **`Bet` (invariant) vs `Money` (operator) 분리** — *도메인 별 invariant = 별도 value class*. **MCP 룰 `domain-specific-value-class-vs-shared` 후보**.
|
|
640
|
+
|
|
641
|
+
8. **패키지 분리 (도메인 별)** — **MCP 룰 `package-by-domain` 후보**.
|
|
642
|
+
|
|
643
|
+
9. **`openInitialHand` 별도 추상화 vs 지역변수 (reviewer 자가 정정)** — **MCP 룰 `state-flag-vs-domain-state-judgement` 강화** 누적 2+ PR.
|
|
644
|
+
|
|
645
|
+
10. **에러 메시지 = Model 위치 OK (변경 가능성 vs invariant 검증 어휘 차이)** — *PR #126 (Verdict 출력 = View) 반대 시점*. **MCP 룰 `model-error-vs-view-message-locator` 후보**.
|
|
646
|
+
|
|
647
|
+
11. **카드덱 효율 = companion + shuffled() (reviewer 자가 혼동)** — **MCP 룰 `reviewer-self-confusion-explicit` 후보**.
|
|
648
|
+
|
|
649
|
+
12. **`super` 키워드 = 공통 로직 + 자식 확장** — **MCP 룰 `super-keyword-for-shared-logic` 강화** 누적 2+ PR (#138·#142).
|
|
650
|
+
|
|
651
|
+
13. **`lateinit var bet` 호출 순서 invariant (PR #139 재발)** — **MCP 룰 `lateinit-var-call-order-invariant` 강화** 누적 10+ PR.
|
|
652
|
+
|
|
653
|
+
14. **양쪽 객체 자가 비교 + 중복 평가** — *symmetric-compare-bidirectional-call*. **MCP 룰 후보**.
|
|
654
|
+
|
|
655
|
+
15. **0 매직 넘버 → 상수 명명** — **MCP 룰 `magic-number-zero-as-named-constant` 후보**.
|
|
656
|
+
|
|
657
|
+
16. **`callback 람다` vs `setter` 트레이드오프** — **MCP 룰 `callback-lambda-vs-direct-setter` 후보**.
|
|
658
|
+
|
|
659
|
+
17. **iteration 위치 = Domain vs View vs Controller** — **MCP 룰 `iteration-locator-domain-vs-view` 후보**.
|
|
660
|
+
|
|
661
|
+
18. **부생성자 + lateinit 즉시 초기화 (테스트 fixture)** — **MCP 룰 `test-fixture-secondary-constructor` 강화** 누적 3+ PR.
|
|
662
|
+
|
|
663
|
+
19. **블랙잭 0.5 vs 1.5 모델 (PR #35·#142 0.5 모델 = 누적 2+ PR)** — **MCP 룰 `blackjack-payout-vs-profit-model` 강화**.
|
|
664
|
+
|
|
665
|
+
20. **블랙잭 5 멤버 (WIN/LOSE/PUSH/BLACKJACK_WIN/BLACKJACK_LOSE)** — *PR #130 학생 자가 학습 → PR #142 자가 적용 (1단계 → 2단계 학습 시간성)*.
|
|
666
|
+
|
|
667
|
+
21. **모든 20 스레드 학생 자가 답변 + commit SHA + 자가 코드 예시 2+ 회** — *2025 코호트 정점 유지*.
|
|
668
|
+
|
|
669
|
+
## 얻은 교훈 (도메인)
|
|
670
|
+
|
|
671
|
+
1. **블랙잭 5 결과 (WIN/LOSE/PUSH/BLACKJACK_WIN/BLACKJACK_LOSE)** — *PR #130 1단계 자가 학습 → PR #142 2단계 자가 적용*.
|
|
672
|
+
|
|
673
|
+
2. **블랙잭 0.5 모델 (순수익)** = *PR #35 결*.
|
|
674
|
+
|
|
675
|
+
3. **Dealer canHit = `<= 16` 정공** — PR #126·#138 결.
|
|
676
|
+
|
|
677
|
+
4. **블랙잭 = 초기 2장 + 21점 = isBlackJack** = PR #130·#138·#126 결.
|
|
678
|
+
|
|
679
|
+
5. **`tailrec` Kotlin 어휘 + 바이트코드** — 학생 자가 학습 정점.
|
|
680
|
+
|
|
681
|
+
6. **Bet 0원 가능 (`MIN_BET_AMOUNT = 0`)** — *PR #138 (1000원) / PR #129 (1원) 와 양가 = 임의 도메인 상수*.
|
|
682
|
+
|
|
683
|
+
7. **카드덱 caching (companion pack) + shuffled() 재호출** — *카드 부족 시 재 shuffled*.
|
|
684
|
+
|
|
685
|
+
## MCP 룰 후보 신규 + 강화 (PR #142)
|
|
686
|
+
|
|
687
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
688
|
+
|---|---|---|
|
|
689
|
+
| `reviewer-self-clarification-explicit` | 신규 | 1 (#142) |
|
|
690
|
+
| `polymorphism-as-change-tolerance` | 신규 | 1 (#142) |
|
|
691
|
+
| `student-self-code-example-as-question` | 신규 | 1 (#142) |
|
|
692
|
+
| `tailrec-optimization-applicability` | 강화 | 2+ (#138·#142) |
|
|
693
|
+
| `class-name-vs-stdlib-collision` | 강화 | 2+ (#130·#142) |
|
|
694
|
+
| `domain-specific-value-class-vs-shared` | 신규 | 1 (#142) |
|
|
695
|
+
| `package-by-domain` | 신규 | 1 (#142) |
|
|
696
|
+
| `state-flag-vs-domain-state-judgement` | 강화 | 2+ (#126·#142) |
|
|
697
|
+
| `model-error-vs-view-message-locator` | 신규 | 1 (#142) |
|
|
698
|
+
| `reviewer-self-confusion-explicit` | 신규 | 1 (#142) |
|
|
699
|
+
| `super-keyword-for-shared-logic` | 강화 | 2+ (#138·#142) |
|
|
700
|
+
| `lateinit-var-call-order-invariant` | 강화 | 10+ |
|
|
701
|
+
| `symmetric-compare-bidirectional-call` | 신규 | 1 (#142) |
|
|
702
|
+
| `magic-number-zero-as-named-constant` | 신규 | 1 (#142) |
|
|
703
|
+
| `callback-lambda-vs-direct-setter` | 신규 | 1 (#142) |
|
|
704
|
+
| `iteration-locator-domain-vs-view` | 신규 | 1 (#142) |
|
|
705
|
+
| `test-fixture-secondary-constructor` | 강화 | 3+ |
|
|
706
|
+
| `blackjack-payout-vs-profit-model` | 강화 | 2+ (#35·#142) |
|
|
707
|
+
| `blackjack-rule-fidelity-comparison` | 강화 | 16+ ⭐⭐⭐ |
|
|
708
|
+
| `domain-rule-arbitrary-constant` | 강화 | 3+ |
|
|
709
|
+
| `first-class-collection-regression` | 신규 | 1 (#142) |
|
|
710
|
+
| `times-factor-overflow-risk` | 신규 | 1 (#142) |
|
|
711
|
+
| `composition-vs-extension-tradeoff` | 신규 | 1 (#142) |
|
|
712
|
+
| `lambda-multiple-args-tuple-leak` | 신규 | 1 (#142) |
|
|
713
|
+
| `redundant-parameter-vs-member` | 신규 | 1 (#142) |
|
|
714
|
+
| `game-stages-vs-game-state` | 신규 | 1 (#142) |
|
|
715
|
+
| `result-aggregation-locator` | 강화 | 2+ (#126·#142) |
|
|
716
|
+
|
|
717
|
+
## 메타 어휘 (14 reviewer + MCP 핵심 가치 합류 정점 유지)
|
|
718
|
+
|
|
719
|
+
- ***reviewer 자가 의도 명료화 + 자가 사과*** — KwonDae PR #142 — *"제가 혼란을 드린 것 같아 죄송하네요.. 🥲"* — *PR #130 (hyemdooly *"정말정말 미안해요!!"*) 결 강화*.
|
|
720
|
+
- ***학습 목표 회수 어휘*** — KwonDae PR #142 — *"현재 우리는 다형성을 학습하고 있어요. (...) 어떤 이점을 얻을 수 있을지 깊게 고민해보셔도 좋을거에요"*.
|
|
721
|
+
- ***학생 자가 학습 목표 회수*** — doabletuple PR #142 — *"비교 반복을 없에는 일에 한눈이 팔려서 학습 목표를 놓치고 있었네요"*.
|
|
722
|
+
- ***학생 자가 코드 예시 + 자가 의문*** — doabletuple PR #142 — *학습 가시화 정점*.
|
|
723
|
+
- ***reviewer 자가 경계 케이스 인정*** — KwonDae PR #142 — *"맞습니다. 기존의 상태를 갖고 판단하게끔 설계하고 싶었지만 처음 뽑은 두장이 canHit() == false 가 될 상황이 생기겠네요."*.
|
|
724
|
+
- ***`tailrec` 자가 학습 + 바이트코드 확인*** — doabletuple PR #142 — *Kotlin 어휘 깊은 자가 학습 정점*.
|
|
725
|
+
- ***reviewer 자가 혼동 명시*** — KwonDae PR #142 — *"`Pack` 과 `cards` 키워드를 제가 헷갈린거 같네요 🥲"*.
|
|
726
|
+
|
|
727
|
+
→ **14 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **batch 21 신규 발견 = *학생 자가 코드 예시 + 자가 의문 + reviewer 자가 정정 4 자리*** (Thread 1·11·14·17) = **양방향 토론 깊이 정점**.
|
|
728
|
+
|
|
729
|
+
## 비교 (PR #126 → #142 진화 — 사족 X, 안티패턴 명시만)
|
|
730
|
+
|
|
731
|
+
- **1단계 #126 18 thread → 2단계 #142 20 thread** — *깊이 유지*.
|
|
732
|
+
- **1단계 #126 Verdict 출력 문자열 = View 책임 → 2단계 #142 GameResult enum 책임 강화 + cashOut 메서드** — *학습 시간성 정공*.
|
|
733
|
+
- **1단계 #126 `var initialHandShown` 가변 상태 → 2단계 #142 `openInitialHand` 별도 추상화 (학생 자가 정공 선택)** — *학습 시간성 정공*.
|
|
734
|
+
- **1단계 #126 Participants 일급 컬렉션 → 2단계 #142 Game.players: List<Player> 노출 회귀** — *Participants → Game 책임 통합*.
|
|
735
|
+
- **1단계 #126 Result enum → 2단계 #142 GameResult enum (Kotlin stdlib 충돌 자가 정정)** — *학습 시간성 정공*.
|
|
736
|
+
- **1단계 #126 카드 N장 공개 추상화 (`showHand`) → 2단계 #142 별도 `openInitialHand` 추상화 추가** — *추상화 진화*.
|
|
737
|
+
- **1단계 #126 학생 자가 4 안 분석 (`list`/`all`) → 2단계 #142 학생 자가 코드 예시 (Thread 10)** — *학생 자가 학습 가시화 진화*.
|
|
738
|
+
|
|
739
|
+
→ *진화 비교 = 사족 아님* + *학생 자가 학습 정점 진화 + reviewer 자가 한계 인정 어휘 합류*.
|