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,248 @@
|
|
|
1
|
+
# PR #125 — [블랙잭 1단계] 제리 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@jerry8282](https://github.com/jerry8282)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/125
|
|
5
|
+
- **단계:** 1단계 (페어, *딜러의 두 역할* 토론 출발점)
|
|
6
|
+
- **리뷰어:** @krrong (크롱)
|
|
7
|
+
- **라인 코멘트:** 30 (리뷰어 17 / 리뷰이 13)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Blackjack` 진행자 객체 분리 — 딜러의 *카드 배부 역할*을 떼냄** (PR 본문 학생 자가 결정).
|
|
12
|
+
- **`Participants` 추상 클래스 + `Dealer`/`Player` 상속** — interface가 아닌 `abstract class`로 상태 공유 (PR #123 학생의 후속 결론과 같은 결).
|
|
13
|
+
- **`CardShuffler` 인터페이스 + `FalseShuffle` fake** — Deck 셔플을 *주입형 전략*으로 (lotto의 `non-newable` 패턴 재현).
|
|
14
|
+
- **`ActionType` enum (Hit/Stay)** — 행동을 도메인 어휘로.
|
|
15
|
+
- **`BeforeEach` test fixture 적극 활용** — 후속 반영.
|
|
16
|
+
- **`Deck`에 `ArrayDeque`** — *위에서 한 장씩* 자료구조 일치.
|
|
17
|
+
- **후속 반영 — `protected`/`protected set`으로 *외부 변경 차단*** — `dealer.cards.clear()` / `dealer.status = Win` 같은 외부 변경 위험을 봉인.
|
|
18
|
+
- **후속 반영 — `Shape`의 영문 출력 제거 + OutputView 이관** + **`CardShuffler` 폐기 → Deck이 카드 인수로 받음** (Strategy 과잉 폐기).
|
|
19
|
+
|
|
20
|
+
## 못한 점 (설계 관점)
|
|
21
|
+
|
|
22
|
+
### 1. PR 본문에서 학생 자가 의문 — *카드 배부 진행자가 누구인가*
|
|
23
|
+
|
|
24
|
+
학생 PR 본문: "실제 블랙잭에서는 카드를 나누어주는 역할이 딜러의 역할입니다. 하지만, 이번 블랙잭 미션에서는 딜러에게 *카드를 나누어주는 진행자의 역할*과 *게임 참여자의 역할, 두 가지를 하게 될 거 같아* Blackjack 객체를 따로 생성하여 카드를 배부해주는 역할을 주었습니다."
|
|
25
|
+
|
|
26
|
+
리뷰어: "딜러의 역할이 게임 참여자와 진행자의 역할, 두 가지를 하게 될 거 같다는 점에 동의해요 👍 [...] 하지만 지금은 카드를 배부하는 역할 외에도 다른 역할을 하고 있는 것처럼 보여요. 역할을 잘 정했으니 그 역할에 맞는 일만 하도록 구성해볼까요? 🤠" — *역할 분리*는 옳았으나 *Blackjack*이라는 진행자가 *점수 비교*, *Hit/Stay 판정*, *결과 계산* 등 *진행 외 역할*까지 떠안음. *Blackjack = 카드 배부*만으로 좁히기.
|
|
27
|
+
|
|
28
|
+
### 2. `Shape`/`ParticipantStatus` enum에 *UI 출력 문자열* 보유
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
enum class Shape(val symbol: String) {
|
|
32
|
+
Spade("♠"), Heart("♥"), ...
|
|
33
|
+
}
|
|
34
|
+
enum class ParticipantStatus {
|
|
35
|
+
None, Win, Lose, Bust, Draw,
|
|
36
|
+
}
|
|
37
|
+
// + Player.toString() 오버라이드 검토 중
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
학생 자가 토론: "출력 정보를 enum에서 관리할지, view에서 확장함수로 관리할지도 많이 고민했는데요 🤔 enum을 적용할 시, `리팩터링 시 변경 범위가 최소화된다` 라는 장점이 있습니다. 만약에 영문 출력이 생길 경우, enum 의 프로퍼티에만 추가하면 되므로, 출력문을 enum에서 관리하는 것이 유지보수 측면에서 합당하다고 판단하였습니다."
|
|
41
|
+
|
|
42
|
+
리뷰어: "출력 정보가 도메인일까? 에 대해 고민해보면 좋을 것 같은데요 🤔 언급하신대로 enum에 영문을 추가하는 것으로 변경사항이 적어질거에요. 같은 이유로 `ParticipantStatus` 역시도 승, 패, 무 String을 가질 수 있고, 플레이어의 이름과 카드를 출력하기 위해 `Player`의 `toString`을 오버라이드 할 수 있습니다. 점점 도메인과 뷰의 경계가 무너지게 되고 구분할 수 없는 형태가 되어버릴거에요." — *변경 최소화*라는 단기 이익이 *도메인-뷰 경계 붕괴*라는 장기 비용. lotto `side-effect-in-holder` 룰과 동일 결.
|
|
43
|
+
|
|
44
|
+
### 3. `Participants.cards: MutableList<Card>`가 abstract public — 외부 변경 위험
|
|
45
|
+
|
|
46
|
+
```kotlin
|
|
47
|
+
abstract class Participants() {
|
|
48
|
+
abstract val name: String
|
|
49
|
+
abstract val cards: MutableList<Card> // 외부에서 .clear() 가능
|
|
50
|
+
abstract var status: ParticipantStatus // 외부에서 .status = Win 가능
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
리뷰어: "```kotlin val dealer = Dealer(); dealer.cards.clear() ``` 어떤 일이 발생할까요? 🤔" / "```kotlin val dealer = Dealer(); dealer.status = ParticipantStatus.Win ``` 어떤 일이 발생할까요? 🤔🤔" — *공개 mutable 컬렉션 + var setter*는 *invariant 무방비*. 학생 후속 반영: `protected set` + `protected val _cards`로 캡슐화. (그러나 *왜 처음부터 protected가 자연*인지가 학습 포인트.)
|
|
55
|
+
|
|
56
|
+
### 4. `Deck(cardShuffler: CardShuffler)` + `Deck.deck: ArrayDeque<Card>` — 자기 이름 보유
|
|
57
|
+
|
|
58
|
+
```kotlin
|
|
59
|
+
class Deck(cardShuffler: CardShuffler) {
|
|
60
|
+
private val deck: ArrayDeque<Card> = initCard(cardShuffler) // Deck 안에 deck
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
리뷰어: "`Deck`이 `deck`을 가지고 있네요. 함께 일하는 동료 개발자가 헷갈리지 않을까요?" — *클래스 == 속성*이면 *의미*가 동어반복. `cards` / `remaining`이 자연.
|
|
65
|
+
|
|
66
|
+
리뷰어: "덱을 생성할 때 52장의 카드가 들어있을 것이라고 예상할 수 있을까요? 카드를 명시적으로 넣어주는 것은 어떤가요? 🤔" — *Deck 생성자가 52장 자동 생성 + 셔플*은 *외부에서 보이지 않는 부작용*. `Deck(cards: List<Card>)`로 *명시적 주입*하면 *Strategy 패턴* 자체가 불필요. 학생 후속: Strategy 폐기 + `Deck(cards)` 채택.
|
|
67
|
+
|
|
68
|
+
### 5. `FalseShuffle`이 *프로덕션 패키지*에 위치
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
// src/main/kotlin/blackjack/model/strategy/FalseShuffle.kt
|
|
72
|
+
class FalseShuffle : CardShuffler { ... }
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
리뷰어: "테스트 코드를 위한 클래스는 테스트 패키지에 있는 것이 좋아요 🤠" — *fake 구현*은 `src/test/kotlin/`에. 프로덕션 패키지에 두면 *프로덕션 빌드에 fake가 노출* + *Strategy 인터페이스가 fake 때문에 존재*하는 구조가 됨.
|
|
76
|
+
|
|
77
|
+
### 6. `Dealer.overThreshold()` 함수명 모호
|
|
78
|
+
|
|
79
|
+
```kotlin
|
|
80
|
+
class Dealer(override val name: String = DEALER_NAME) : Participants() {
|
|
81
|
+
fun overThreshold(): Boolean = sumCardNumber > THRESHOLD
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
리뷰어: "딜러가 Hit이 가능한 상태인지를 확인하는 일을 하는 것처럼 보이는데, 메서드명만보고 이를 쉽게 알 수 있을까요? 🤔" — `overThreshold`는 *비교 동작*이고 *결과의 의미*(Hit 가능 / 종료 가능)가 함수명에 없음. `mustHit()`, `canDraw()`, `shouldStop()` 같이 *결과 동사*.
|
|
86
|
+
|
|
87
|
+
### 7. `Player.compareScores(number: Int)` — Tell-Don't-Ask 부분 위반
|
|
88
|
+
|
|
89
|
+
```kotlin
|
|
90
|
+
class Player(override val name: String) : Participants() {
|
|
91
|
+
fun compareScores(number: Int) {
|
|
92
|
+
if (status != ParticipantStatus.Bust) {
|
|
93
|
+
status = ParticipantStatus.compare(sumCardNumber, number)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
리뷰어: "현실 세계에서는 딜러와 플레이어 간의 점수를 비교하지만, 객체 관점에서는 모두 동일한 참가자 역할을 가지는데요, 이는 참가자가 다른 참가자와 점수를 비교할 수 있다는 의미입니다. 예를 들면, `플레이어 vs 플레이어` 또는 `딜러 vs 플레이어` 도 가능하겠죠 🤠"
|
|
100
|
+
|
|
101
|
+
학생 응답: "해당 프로젝트에서는 플레이어와 딜러를 비교하여 플레이어의 상태 변경을 하기 때문에 딜러는 플레이어의 상태에 따라 승패를 판단하게 하였습니다. 따라서, 딜러의 입장에서의 비교 로직은 필요없다고 판단하였고 플레이어에만 비교로직을 사용하였습니다." — `compareScores(number: Int)`는 *상대를 Int로 받음* = *상대 객체에 메시지 못 보냄*. `compete(other: Participant)`로 *동일 추상*에 메시지 보내는 것이 자연. PR #63의 *상대가 누구라도 상관없는 비교*와 같은 결.
|
|
102
|
+
|
|
103
|
+
### 8. `ParticipantStatus`에 *게임 결과 상태*와 *플레이어 상태* 혼재
|
|
104
|
+
|
|
105
|
+
```kotlin
|
|
106
|
+
enum class ParticipantStatus() {
|
|
107
|
+
None, // 초기
|
|
108
|
+
Win, // 게임 결과
|
|
109
|
+
Lose, // 게임 결과
|
|
110
|
+
Draw, // 게임 결과
|
|
111
|
+
Bust, // 플레이어 상태 (카드 합 > 21)
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
리뷰어: "게임 결과에 대한 상태(`Win, Lose, Draw`)와 플레이어의 상태(`Bust`)가 혼재되어 있는 것처럼 느껴져요. 둘은 성격이 다른 것처럼 느껴지는데 제리는 어떻게 생각하나요? 🤔" — *게임 진행 상태*(Ready/Hit/Stay/Bust/BlackJack)와 *결과 판정*(Win/Lose/Draw)은 *다른 축*. 한 enum에 합치면 *생애주기 혼란* + *불가능한 전이*(예: `Bust → Win`인지 `Bust → Lose`인지). PR #78 (dpcks0509)의 `State` sealed interface가 이 문제를 해결하는 모델.
|
|
116
|
+
|
|
117
|
+
### 9. `service/Blackjack` vs `domain/` 구분 — Spring 어휘 차용
|
|
118
|
+
|
|
119
|
+
리뷰어: "service와 domain은 무엇이 다른지 설명해주세요 🤔"
|
|
120
|
+
학생: "**domain**은 객체의 정보를 저장하고 해당 객체가 스스로 데이터를 가공하고 처리한다고 생각하고, **service**는 여러 domain에 있는 객체에게 메시지를 주고 받게 하고 각 객체들 간의 협력을 조정해주는 역할을 한다고 생각합니다."
|
|
121
|
+
|
|
122
|
+
학생 설명은 *교과서적 정의*지만 *콘솔 게임*에서 *Service 레이어*는 *Controller와 중복 가능성 ↑*. *Service*가 *프레임워크 어휘*(Spring)인지 *도메인 어휘*인지 판단 필요. 콘솔에선 `model/` 안에 `Game` 단일 진행자로 충분.
|
|
123
|
+
|
|
124
|
+
### 10. `Blackjack.shouldStopDrawing(action, player)`가 *두 일* 수행
|
|
125
|
+
|
|
126
|
+
```kotlin
|
|
127
|
+
fun shouldStopDrawing(playerAction: ActionType, player: Player): Boolean {
|
|
128
|
+
when (playerAction) {
|
|
129
|
+
ActionType.Hit -> hitAction(player) // 부작용: 카드 추가
|
|
130
|
+
ActionType.Stay -> return true
|
|
131
|
+
}
|
|
132
|
+
return false
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
리뷰어: "`shouldStopDrawing`은 Hit일 경우 `hitAction`을 호출하고, Stay일 경우 true를 반환하고 있는데요, 하나의 함수안에서 두 가지 일을 하고 있습니다. 하나의 일만 하도록 변경해볼까요? 🤔" — *Boolean 질문*과 *상태 변경*이 같은 메서드. *Command-Query Separation* 위반. 학생 후속 반영: `shouldStopDrawing`을 *순수 질의*로, `hitAction`은 별도 호출.
|
|
137
|
+
|
|
138
|
+
### 11. `Participants.sumCardNumber`에 *Ace 보정 로직 직접 박힘*
|
|
139
|
+
|
|
140
|
+
```kotlin
|
|
141
|
+
abstract class Participants() {
|
|
142
|
+
val sumCardNumber: Int get() = getSumNumber()
|
|
143
|
+
private fun getSumNumber(): Int {
|
|
144
|
+
var sum = cards.sumOf { it.cardNumber.number }
|
|
145
|
+
val aCount: Int = cards.count { it.cardNumber == CardNumber.Ace }
|
|
146
|
+
repeat(aCount) {
|
|
147
|
+
if (sum + CardNumber.OTHER_ACE > BUST_STANDARD) return@repeat
|
|
148
|
+
sum += CardNumber.OTHER_ACE
|
|
149
|
+
}
|
|
150
|
+
return sum
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
리뷰어: "ACE가 포함된 카드의 총합을 구하는 방법을 다시 한 번 고민해볼까요? 🤔" — *Ace 1↔11*은 *Card 자체의 동작*인데 `Participants`에서 *합산하면서 결정*하는 패턴. `Card.value(currentSum: Int)`나 `Hand.score()`에 *룰 캡슐화*가 자연. PR #63의 `changeAceScore` 복잡도와 유사. + `OTHER_ACE` 같은 모호명(`ACE_BONUS = 10`이 명확).
|
|
156
|
+
|
|
157
|
+
### 12. `BlackjackTest`에 *클래스 필드 직접 초기화* — 테스트 격리 깨짐
|
|
158
|
+
|
|
159
|
+
```kotlin
|
|
160
|
+
class BlackjackTest {
|
|
161
|
+
private val player1 = Player("제리")
|
|
162
|
+
private val player2 = Player("환노")
|
|
163
|
+
private val dealer = Dealer()
|
|
164
|
+
private val deck = Deck(FalseShuffle())
|
|
165
|
+
private val game = Blackjack(deck)
|
|
166
|
+
// @Test 들이 같은 인스턴스 공유 — 한 테스트가 carded면 다른 테스트에도 영향
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
리뷰어: "이처럼 만들어두면 어떤 문제가 발생할 수 있을까요? 🤔"
|
|
171
|
+
학생: "위처럼 만들게 되면 각 테스트가 서로에게 영향을 줄 수 있을 것 같습니다. 따라서 각 테스트 실행마다 객체를 초기화할 수 있도록 BeforeEach를 사용할 것 같습니다!" — JUnit5는 *기본 PER_METHOD* 격리지만, *mutable 멤버*가 *생성자에서 초기화*되면 *각 테스트 fresh 인스턴스*임에도 *생성자가 동일 부작용*을 만들어 *Deck.spreadCard() 순서가 누적되는 효과*. `@BeforeEach`로 *명시적 초기화*가 안전.
|
|
172
|
+
|
|
173
|
+
### 13. `DeckTest`에서 *enum 순서 의존 테스트*
|
|
174
|
+
|
|
175
|
+
```kotlin
|
|
176
|
+
class DeckTest {
|
|
177
|
+
private val deck: Deck = Deck(FalseShuffle())
|
|
178
|
+
@Test
|
|
179
|
+
fun `카드를 셔플해서 첫번째 장에 있는 카드를 나누어준다`() {
|
|
180
|
+
val card = deck.spreadCard()
|
|
181
|
+
assertThat(card).isEqualTo(Card(Shape.Diamond, CardNumber.Ace)) // Shape/CardNumber 순서 의존
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
리뷰어: "`Shape` 혹은 `CardNumber`의 순서가 변경되면 어떻게 될까요? 🤔" — `FalseShuffle`이 *원본 순서 유지* → 첫 카드는 *Shape.entries[0] × CardNumber.entries[0]*. enum 순서가 *테스트 결과의 진실*이 됨. *순서 변경 = 테스트 깨짐*. Named argument로 *어떤 카드인지 명시*하거나 fake가 *명시적 카드 목록*을 받도록.
|
|
187
|
+
|
|
188
|
+
### 14. `Player`가 `compareScores`로 *자기 status를 mutate*
|
|
189
|
+
|
|
190
|
+
```kotlin
|
|
191
|
+
fun compareScores(number: Int) {
|
|
192
|
+
if (status != ParticipantStatus.Bust) {
|
|
193
|
+
status = ParticipantStatus.compare(sumCardNumber, number)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`Player.status`가 `var`이고 `compareScores`가 *비교 + setter*. *결과를 반환*하는 것이 자연한데 *부작용*으로 처리. + `if (status != Bust)` 가드가 *상위에서 누가 책임*인지 모호 (이미 Bust면 *비교하지 않는다*는 룰).
|
|
199
|
+
|
|
200
|
+
## 리뷰어 의견 요지
|
|
201
|
+
|
|
202
|
+
- ***딜러 = 진행자 + 참여자* 분리는 옳다 — 그러나 `Blackjack`이 또 비대해지지 않게.**
|
|
203
|
+
- ***enum이 UI 문자열 보유*는 도메인-뷰 경계 붕괴.**
|
|
204
|
+
- ***public mutable 컬렉션 + var setter*는 외부 변경 위험** — protected/private 캡슐화.
|
|
205
|
+
- **`Deck`이 `deck`을 갖는 동어반복 명명.**
|
|
206
|
+
- **`Deck` 생성자에 *카드 명시 주입*하면 Strategy 자체 불필요.**
|
|
207
|
+
- ***Test fake는 test 패키지***.
|
|
208
|
+
- ***결과 동사 함수명*** — `overThreshold` vs `mustHit`/`canDraw`.
|
|
209
|
+
- ***Tell-Don't-Ask*** — `compareScores(number)`보다 `compete(other)`로 *동일 추상* 메시지.
|
|
210
|
+
- ***게임 진행 상태*와 *결과 상태* 분리** — 한 enum에 합치면 생애주기 혼란.
|
|
211
|
+
- ***Service vs Domain*** — Spring 어휘 차용의 *콘솔 게임 적합성* 점검.
|
|
212
|
+
- ***CQS 위반*** — `shouldStop`이 부작용도 일으키면 안 됨.
|
|
213
|
+
- ***Ace 보정*은 `Card`/`Hand`** — `Participants`에 두면 책임 누수.
|
|
214
|
+
- ***테스트 격리*** — 멤버 직접 초기화는 *생성자 부작용* 누적.
|
|
215
|
+
|
|
216
|
+
## 대표 인용
|
|
217
|
+
|
|
218
|
+
> 출력 정보가 도메인일까? 에 대해 고민해보면 좋을 것 같은데요 🤔 [...] 점점 도메인과 뷰의 경계가 무너지게 되고 구분할 수 없는 형태가 되어버릴거에요.
|
|
219
|
+
> — @krrong on `src/main/kotlin/blackjack/model/domain/Shape.kt`
|
|
220
|
+
|
|
221
|
+
> ```val dealer = Dealer(); dealer.cards.clear()``` 어떤 일이 발생할까요? 🤔
|
|
222
|
+
> — @krrong on `src/main/kotlin/blackjack/model/domain/Participants.kt`
|
|
223
|
+
|
|
224
|
+
> 객체 관점에서는 모두 동일한 참가자 역할을 가지는데요, 이는 참가자가 다른 참가자와 점수를 비교할 수 있다는 의미입니다. 예를 들면, `플레이어 vs 플레이어` 또는 `딜러 vs 플레이어` 도 가능하겠죠 🤠
|
|
225
|
+
> — @krrong on `src/main/kotlin/blackjack/model/domain/Player.kt`
|
|
226
|
+
|
|
227
|
+
> 게임 결과에 대한 상태(`Win, Lose, Draw`)와 플레이어의 상태(`Bust`)가 혼재되어 있는 것처럼 느껴져요. 둘은 성격이 다른 것처럼 느껴지는데 제리는 어떻게 생각하나요? 🤔
|
|
228
|
+
> — @krrong on `src/main/kotlin/blackjack/model/domain/ParticipantStatus.kt`
|
|
229
|
+
|
|
230
|
+
> 역할을 잘 정했으니 그 역할에 맞는 일만 하도록 구성해볼까요? 🤠
|
|
231
|
+
> — @krrong on `src/main/kotlin/blackjack/model/service/Blackjack.kt`
|
|
232
|
+
|
|
233
|
+
## 얻은 교훈
|
|
234
|
+
|
|
235
|
+
- **"딜러 = 참가자 + 진행자" 분리는 옳음 — 그러나 *진행자*에게 *또 다른 비대화*가 들어오기 쉬움** — 진행자의 책임을 *카드 배부* / *입력 처리* / *점수 비교* / *결과 누적*으로 *더 잘게 쪼개기* 검토 필요.
|
|
236
|
+
- **enum에 UI 출력 문자열 두기 = *변경 범위 최소화*는 단기, *도메인-뷰 경계 붕괴*는 장기** — *변경 비용 절감*이 *역할 혼합*의 핑계가 되지 않게.
|
|
237
|
+
- **`abstract val cards: MutableList<Card>` + `abstract var status` = invariant 무방비** — *기본을 protected*로. 처음부터 *외부에서 mutate 가능한가*를 자문.
|
|
238
|
+
- **`Deck`에 `deck` 속성 = 동어반복** — *클래스 == 속성*이면 *의미가 없음*. `cards`/`remaining`.
|
|
239
|
+
- **`Deck(cards: List<Card>)` 명시 주입으로 Strategy 폐기** — *생성자 부작용*(셔플)을 *외부에서 주입*하면 Strategy 인터페이스 자체가 *fake 위해서만 존재*하던 코드를 제거 가능.
|
|
240
|
+
- **test fake는 *test 패키지에*** — `src/main/.../FalseShuffle`은 *프로덕션 빌드에 fake 포함*.
|
|
241
|
+
- ***결과 동사 함수명*** — `overThreshold()` vs `mustHit()`. *비교 동작*이 아니라 *반환값의 의미*가 함수명에.
|
|
242
|
+
- ***Tell-Don't-Ask*: `compareScores(other.score)`보다 `compete(other)`** — *상대를 Int로 받기* 시작하면 *동일 추상*에 메시지를 못 보내고 *알고리즘 노출*.
|
|
243
|
+
- ***게임 진행 상태*(Ready/Hit/Stay/Bust)와 *결과 상태*(Win/Lose/Draw) 분리** — 한 enum에 합치면 *불가능한 전이*(Bust → Win?) + *생애주기 혼란*. sealed interface 두 개로 표현.
|
|
244
|
+
- ***Service vs Domain*** — Spring 어휘를 *콘솔 게임*에 그대로 가져오면 *Controller와 중복*. *콘솔 진행자*는 보통 `Game` 하나로 충분.
|
|
245
|
+
- ***CQS*** — `shouldStopDrawing(action, player): Boolean`이 *부작용*도 일으키면 *함수명-동작 불일치* + *호출자 의도 불명*.
|
|
246
|
+
- ***Ace 보정 = Card/Hand의 책임*** — `Participants.sumCardNumber`에 *룰을 박으면* 책임 누수. *Card.value(currentSum)* 또는 *Hand.score()*에.
|
|
247
|
+
- ***테스트 멤버 직접 초기화는 위험*** — *생성자 부작용 누적*. `@BeforeEach`로 *명시 초기화*.
|
|
248
|
+
- ***enum 순서 의존 테스트*** — `entries[0]`이 *테스트의 진실*이 되면 *enum 재배열 = 테스트 깨짐*.
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# PR #151 — [블랙잭 2단계] 제리 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@jerry8282](https://github.com/jerry8282)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/151
|
|
5
|
+
- **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
|
|
6
|
+
- **리뷰어:** @krrong (크롱)
|
|
7
|
+
- **라인 코멘트:** 15 스레드 / 33 코멘트 — *Controller 재사용 + View 검증 범위 + Hand 상태 객체 메시지* 깊은 토론
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`BlackjackController` 재사용 가능 구조 자가 반영** — 크롱 진단 *"블랙잭 게임을 여러번 진행하기 위해 `BlackjackController`를 재사용할 수 있을텐데요. 현재 구조는 재사용하기에는 어려운 구조라고 생각이 듭니다. 새로운 플레이어와 블랙잭 게임을 진행하기 위해 `BlackjackController`를 재사용할 수 있도록 만들어보면 어떨까요?"* + 학생 자가 반영: *"controller의 인스턴스 변수를 삭제하여 재사용을 할 수 있도록 수정하였습니다."* (커밋 `e5c4043`). **Controller stateless 자가 학습**. PR #133 (시아 2단계) 의 *BlackjackEngine.setParticipantCard (in-place 핸드 교체)* 와 *반대 트레이드오프* — *시아 = 같은 Engine 객체 재사용, 제리 = stateless Controller 재사용*.
|
|
12
|
+
- **`init → Start` naming 자가 반영** — 크롱 진단 *"`init`은 값을 세팅하거나 초기화하는 느낌을 줄 수 있기 때문에 네이밍을 변경해보면 더욱 가독성이 좋아질 것 같아요."* + 학생 자가 반영 (커밋 `81e6298`): *"초기화 하거나 세팅하는 느낌을 주는 init대신에 Start를 사용하여 게임 시작 시 보여주는 카드로 네이밍을 변경하였습니다."*. **naming = 의미 표현 자가 학습**.
|
|
13
|
+
- **`BUST_STANDARD` private 가시성 자가 반영** — 크롱 진단 *"위치만 옮기는 것이 아니라 가시성도 함께 변경해주세요."* + 학생: *"BUST_STANDARD 뿐만 아니라 다른 객체들의 상수값들을 private으로 변경하였습니다.🥲"* (커밋 `7f6a714`). **캡슐화 일관성 자가 학습**.
|
|
14
|
+
- **블랙잭 = 2장 + 21 자가 학습** — 크롱 진단 *"합계가 21이라고 무조건 블랙잭인것은 아닙니다. 도메인을 다시 한 번 공부해보세요."* + 학생 자가 답변: *"그 전에는 합계가 21이면 블랙잭 상태로 바꾸는 것이였습니다. 따라서, Blackjack 객체에서 카드를 처음 나누어주는 메소드에서만 판단하기만 하면 되었기 때문에 합계가 21이면 무조건 블랙잭으로 되도록 하였습니다.😅 하지만, Hand객체의 status변수가 없어진 지금은 카드의 size가 두장임을 판단하여 블랙잭이 되도록 수정하였습니다!💪"* (커밋 `279a8f3`). PR #148·#128·#108·#125·#114·#131·#136·#137 와 같은 결.
|
|
15
|
+
- **`Hand` 가 자기 Bust/Blackjack 판단 자가 학습** — 크롱 진단 *"카드가 들어올 때 버스트인가, 블랙잭인가를 판단해서 상태를 변경하는 것을 외부에서 예측할 수 있을까요? 카드가 손에 들어올 때마다 **정말 상태를 변경해야만 하는가?** **다른 방법은 없을까?** 에 대해 고민해보면 좋겠습니다. 조금 힌트를 드리자면, `Hand`는 자신이 버스트인지, 블랙잭인지를 판단하는 일을 할 수 있었습니다. `Participants` 역시 자신이 카드를 받을 수 있는지를 판단할 수 있었구요. 객체들의 협력을 잘 이끌어내면 상태를 갖지 않아도 될 것처럼 보입니다."* + 학생 자가 반영 (커밋 `279a8f3`): *"Hand에게 버스트 인지 블랙잭인지 판단을 하는 메소드만 주고 Participants가 Hand에게 메시지를 던져 블랙잭인지 판단을 하여 블랙잭 승리로 끝나도록 수정하였습니다!😊"*. **상태 변경 X + 메시지 패턴 자가 학습 모범**.
|
|
16
|
+
- **`canHit` 의미 명확화 자가 학습** — 크롱 진단 *"nit: 뭔가 이상하지 않나요? canHit -> True: Hit을 할 수 있는 상태 / 버스트인가? -> True: Hit을 하지 못하는 상태"* + 학생 자가 인용: *"이 로직에서 계속 위화감이 들었는데 크롱이 말씀해주시니 확 와닿았습니다! 바로 로직을 수정하였습니다!😂"* (커밋 `f713f4c`). **부울 메시지 의미 일관성 자가 학습**.
|
|
17
|
+
- **배수별 메서드 폭증 자가 해소** — 크롱 진단 *"1배 ~ 1000배까지 모든 배수가 생긴다면 1000개의 메서드가 필요한 것처럼 보입니다."* + 학생 자가 반영: *"PlayerBetAmount 객체에서 배수를 파라미터로 받아 계산을 하도록 수정하였습니다."* PR #148·#147 와 같은 결의 *배수별 메서드 → 파라미터 인자*.
|
|
18
|
+
- **`Hand.cards` Backing Property + 가독성 자가 학습** — 크롱 진단 *"1. 어디는 `_cards`를 어디는 `card`를 사용하고 있네요. 이러한 모습이 꽤 자주 보이는 것 같습니다. 2. `sum`을 var로 선언하는 것이 아닌 val로 선언하는 것이 더 좋지 않을까요? 3. `return if ~` 처럼 작성할 수도 있습니다."* + 학생 자가 답변: *"빽킹 프로퍼티로 전부 수정을 하고 getter인 cards는 반환만 하도록 수정하였습니다. ... sum을 val로 선언을 하고 반환값을 sum + 10으로 반환하도록 수정하였습니다. ... 객체 지향 생활 체조 원칙에 더 올바른 방법이라고 생각을 하였습니다.."* (커밋 `dc83ab1`). **Kotlin 어휘 + 객체 지향 생활 체조 원칙 자가 학습**.
|
|
19
|
+
- **참가자 점수 비교 추상화 자가 학습** — 크롱 진단 *"점수를 비교하는 것은 플레이어만 가능한 것일까요? 저는 블랙잭이 추상화 기법을 공부해볼 수 있는 미션이라고 생각합니다. 참가자는 상대방과의 점수를 비교하여 결과를 내올 수 있는데요, 이는 다음과 같은 경우도 모두 판단이 가능해야 한다는 것입니다. 플레이어 vs 플레이어 / 플레이어 vs 딜러 / 딜러 vs 딜러"* + 학생 자가 답변: *"현재 프로젝트에서는 플레이어만 판단하면 된다고 생각하여 저는 Player객체에만 사용을 하였습니다. 하지만, 확장성을 생각한다고 하면 Participants객체에 위치하는 것이 더 올바른 방법인 것 같습니다.😊"* + 크롱 자가 인정: *"제리 의견도 맞아요. 확장성을 고민하면 어디까지 생각해봐야 하는가 고민하다 중요한 것들을 놓치기 쉽습니다. 또한 고민한다고 모든 경우의 수를 예상하고 대비할 수는 없으니까요."*. **확장성 vs 현재 책임 트레이드오프 양방향 인식 모범**.
|
|
20
|
+
- **테스트 추가 자가 반영** — 크롱 진단 *"딜러는 다양한 일을 하고 있는데요. 테스트를 꼼꼼하게 작성했는지 확인해주세요. 2단계에서 새로 추가된 클래스와 기존에 있던 다른 모든 클래스들도 동일합니다."* 후속 반영.
|
|
21
|
+
- **`MethodSource` 사용 자가 회의** — 크롱 진단 *"`@MethodSource`를 활용한 장점이 보이질 않는 것 같네요😅"* + 학생 자가 답변: *"MethodSource를 사용하지 않아도 단순히 Jack, King, Queen을 카드로 넣으면 되었군요..😅"*. **테스트 어휘 자가 학습**.
|
|
22
|
+
- **View vs 도메인 검증 자가 토론 (반란군 비유)** — 학생 자가 답변: *"저번 로또 미션과 블랙잭 미션에서 제일 고민되는 문제는 View에서 어디까지 validate인가 였습니다. 결국 내린 결론은 **null값과 타입과 마지막으로 해당 View반환값을 쓰는 도메인의 형식은 View에서 처리하자**였습니다.🥹 만약, 사용자가 `www.a.com`을 입력했을 때 해당 사이트가 실제로 존재하는지는 도메인에서 검증해야 한다고 생각합니다. 반면, `ww.a.com`처럼 www의 형식을 어긴 입력은 View에서 처리하는 것이 맞다고 생각합니다. 따라서, 이번 구현도 `베팅 금액의 형식은 당연히 양수이다`는 형식이라고 생각이 되어 View로직에 넣었습니다. 제가 생각하는 도메인 로직은 `최소 베팅금액을 1000원으로 제한한다.` 라는 것이 도메인 로직이고 모든 사람들이 당연하게 생각하는 `베팅금액은 0보다 크다`를 View에서 판단하는 것이 맞다고 생각합니다."* — *학생 깊은 자가 토론*. 크롱 반박: *"베팅금액이 0보다 커야한다는 것은 사용자 입력 형식이 아니라, 게임 진행을 위한 기본적인 전제 조건이며 이는 비즈니스 규칙에 해당한다고 볼 수 있습니다. 현재 블랙잭 게임을 콘솔이 아닌 다른 UI로 가져간다면 어떻게 될까요? 콘솔 뷰에서 처리하고 있는 검증 로직은 새로운 UI에는 존재하지 않을겁니다. 따라서 0보다 큰 값이 들어왔는지는 검증할 수 없어지겠죠."*. **View vs 도메인 검증 경계 양방향 토론 모범**. PR #41 (핑구 2단계 잭슨 답변) 와 같은 결.
|
|
23
|
+
|
|
24
|
+
## 못한 점 (설계 관점)
|
|
25
|
+
|
|
26
|
+
### 1. `PlayerBetAmount(amounts: Map<Player, BettingMoney>)` — *Map 자료구조 + 인스턴스 변수 제약*
|
|
27
|
+
|
|
28
|
+
학생 자가 답변: *"그런데 인스턴스 변수를 2개 이하로 유지해야 한다는 조건을 맞추려다 보니, 결국 Map을 써야 하는 상황이 생겼습니다."*
|
|
29
|
+
|
|
30
|
+
크롱 답변: *"플레이어가 베팅 금액을 들고 있는 것이 적절하다고 판단이 되면 그렇게 구현해도 괜찮습니다. 요구사항을 지켜야 하지만 좋은 설계라고 생각하면 가끔은 부숴도... ~~제리는 포비가 키우는 반란군이니까요ㅋㅋ~~ 제리가 원래 그리던 꿈을 펼쳐주세요."* + *"이번 미션에서는 가능한 한 Map 사용을 지양하는 것을 목표로 삼았습니다. 적절한 자료구조의 사용은 설계와 더불어 자료구조가 제공하는 이점들을 활용할 수 있겠습니다. 가령 아래처럼 클래스를 설계할 수도 있을겁니다. `class PlayerBetAmount(val amounts: Map<Player, BettingMoney>)`"*
|
|
31
|
+
|
|
32
|
+
학생 자가 답변: *"저도 포비가 키우는 반란군이 되고 싶지만, 객체 지향을 향한 한 걸음은 결국 요구사항을 제대로 이해하고 따르는 것이라고 생각했습니다. 따라서, 이번에는 요구사항에 맞춰 코드를 구현하였습니다..🥲 하지만, 코틀린과 객체 지향에 대해 공부를 좀 더 하고 저만의 가치관이 확립되면 그때는 제대로 된 반란군이 되어 볼 생각입니다!!💪"*
|
|
33
|
+
|
|
34
|
+
→ **`Map<Player, BettingMoney>` = 3 변수 제약 우회 자료구조**. *`PlayerBetAmount(player, bettingMoney)` 단일 객체 + List 보유* 가 *PR #137·#90·#49 의 정공*. *`Map<X, X>` 자료구조 = *Pair 우회 (PR #132 페로로 진단 와 같은 결)***. *학생 자가 회의 + 크롱 메시지 (반란군 비유) = 양방향 트레이드오프 인식 모범*. PR #133·#88·#132·#136·#41·#49·#146 와 같은 결의 *3 변수 제약 = 연습 도구*.
|
|
35
|
+
|
|
36
|
+
### 2. `BlackjackController` 재사용 → *Controller stateless* — *상태 vs 무상태 트레이드오프*
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
// 학생 자가 반영 (e5c4043) 후
|
|
40
|
+
class BlackjackController(...) {
|
|
41
|
+
// 인스턴스 변수 삭제 → stateless 재사용 가능
|
|
42
|
+
fun run() { ... }
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
→ **stateless Controller = 재사용 가능 + 의존성 주입만**. *상태 보유 = 한 게임 = 재사용 불가*. *PR #133 (시아 2단계) 의 BlackjackEngine.setParticipantCard (in-place 핸드 교체)* 는 *같은 객체 재사용*. *둘 다 합리 — *stateless Controller + new 도메인 객체 매 라운드** vs *재사용 Engine + in-place 변경**. 트레이드오프.
|
|
47
|
+
|
|
48
|
+
### 3. `Player.compareScores` 만 — *Participants 다형성 부재 → 자가 학습*
|
|
49
|
+
|
|
50
|
+
크롱 진단 (Player.kt — 미해결): *"점수를 비교하는 것은 플레이어만 가능한 것일까요?"*
|
|
51
|
+
|
|
52
|
+
학생 자가 답변: *"현재 프로젝트에서는 플레이어만 판단하면 된다고 생각하여 저는 Player객체에만 사용을 하였습니다. 하지만, 확장성을 생각한다고 하면 Participants객체에 위치하는 것이 더 올바른 방법인 것 같습니다.😊"*
|
|
53
|
+
|
|
54
|
+
크롱 자가 인정: *"제리 의견도 맞아요. 확장성을 고민하면 어디까지 생각해봐야 하는가 고민하다 중요한 것들을 놓치기 쉽습니다. 또한 고민한다고 모든 경우의 수를 예상하고 대비할 수는 없으니까요."*
|
|
55
|
+
|
|
56
|
+
→ **확장성 vs 현재 책임 트레이드오프**. *Participants 다형성 (모든 vs 모든) = 미래 가능성*. *Player only = 현재 충분*. *YAGNI vs 추상화*. *양방향 인식 모범*. PR #146 (채넛 = YAGNI 인용) / PR #148 (타마 = Participant 다형성) 와 *비슷한 결*. *제리는 현재 책임 우선* 선택.
|
|
57
|
+
|
|
58
|
+
### 4. `BettingMoney 1배 ~ 1000배 메서드` 폭증 (자가 해소 전)
|
|
59
|
+
|
|
60
|
+
크롱 진단 (BettingMoney.kt — 미해결): *"1배 ~ 1000배까지 모든 배수가 생긴다면 1000개의 메서드가 필요한 것처럼 보입니다."*
|
|
61
|
+
|
|
62
|
+
학생: *"PlayerBetAmount 객체에서 배수를 파라미터로 받아 계산을 하도록 수정하였습니다."*
|
|
63
|
+
|
|
64
|
+
→ **배수별 메서드 폭증 안티패턴**. *`bettingMoney.times1() / times1_5() / times2()` 같은 *메서드 폭증***. *파라미터로 배수 받기* 정공. PR #148·#147 와 같은 결.
|
|
65
|
+
|
|
66
|
+
### 5. `View vs 도메인 검증 경계` — *학생 자가 토론 깊이*
|
|
67
|
+
|
|
68
|
+
학생 자가 인용: *"저번 로또 미션과 블랙잭 미션에서 제일 고민되는 문제는 View에서 어디까지 validate인가 였습니다. 결국 내린 결론은 **null값과 타입과 마지막으로 해당 View반환값을 쓰는 도메인의 형식은 View에서 처리하자**였습니다."*
|
|
69
|
+
|
|
70
|
+
학생 추가 인용: *"제가 생각하는 도메인 로직은 `최소 베팅금액을 1000원으로 제한한다.` 라는 것이 도메인 로직이고 모든 사람들이 당연하게 생각하는 `베팅금액은 0보다 크다`를 View에서 판단하는 것이 맞다고 생각합니다. 크롱은 이 접근 방식에 대해 어떻게 생각하시나요? 🤔"*
|
|
71
|
+
|
|
72
|
+
크롱 답변: *"베팅금액이 0보다 커야한다는 것은 사용자 입력 형식이 아니라, 게임 진행을 위한 기본적인 전제 조건이며 이는 비즈니스 규칙에 해당한다고 볼 수 있습니다. 현재 블랙잭 게임을 콘솔이 아닌 다른 UI로 가져간다면 어떻게 될까요? 콘솔 뷰에서 처리하고 있는 검증 로직은 새로운 UI에는 존재하지 않을겁니다. 따라서 0보다 큰 값이 들어왔는지는 검증할 수 없어지겠죠."*
|
|
73
|
+
|
|
74
|
+
→ **View vs 도메인 검증 경계 양방향 토론**. *학생 = "당연한 형식은 View"* / *크롱 = "비즈니스 규칙 = 도메인"*. *Multi-platform UI 시 도메인 검증 필수*. *PR #41 (핑구 + 잭슨) 의 동일 트레이드오프* / *PR #148 (타마 + 크롱) 의 베팅금 도메인 이전* 와 같은 결. **MCP 룰 후보 — `view-only-validation-cross-ui-fragility`**.
|
|
75
|
+
|
|
76
|
+
### 6. `Hand` 가 *상태 변경 (status var)* → 메시지 패턴 자가 학습
|
|
77
|
+
|
|
78
|
+
학생 자가 답변 인용: *"그 전에는 합계가 21이면 블랙잭 상태로 바꾸는 것이였습니다. 따라서, Blackjack 객체에서 카드를 처음 나누어주는 메소드에서만 판단하기만 하면 되었기 때문에 합계가 21이면 무조건 블랙잭으로 되도록 하였습니다.😅 하지만, Hand객체의 status변수가 없어진 지금은 카드의 size가 두장임을 판단하여 블랙잭이 되도록 수정하였습니다!💪"*
|
|
79
|
+
|
|
80
|
+
→ **`Hand.status var` → 메시지 패턴 (`Hand.isBlackjack()`)**. *상태 변경 vs 메시지 (derived)* 트레이드오프. *상태 = 캐시 + 변경 가능성*. *메시지 = 매 호출 derived + 시점 무관*. *PR #146·#131·#137·#136 의 derived 상태 (`get() = ...`)* 와 같은 결.
|
|
81
|
+
|
|
82
|
+
### 7. `canHit` vs `isBust` 의미 일관성
|
|
83
|
+
|
|
84
|
+
크롱 진단 (Player.kt — 미해결): *"nit: 뭔가 이상하지 않나요? canHit -> True: Hit을 할 수 있는 상태 / 버스트인가? -> True: Hit을 하지 못하는 상태"*
|
|
85
|
+
|
|
86
|
+
학생 자가 답변: *"이 로직에서 계속 위화감이 들었는데 크롱이 말씀해주시니 확 와닿았습니다!"*
|
|
87
|
+
|
|
88
|
+
→ **부울 메시지 의미 = True 방향 일관**. *canHit = Hit 가능* vs *isBust = Hit 불가능*. *호출자가 분기 시 헷갈림*. *둘 다 *긍정 방향* 또는 *부정 방향* 통일*. *Kotlin 어휘 = `!isBust && canHit`* 보다 *`canDraw()` 한 메서드*가 *의미 일관*.
|
|
89
|
+
|
|
90
|
+
### 8. `Hand` 의 *`return if ~` Kotlin 어휘* + `객체 지향 생활 체조 원칙` 토론
|
|
91
|
+
|
|
92
|
+
크롱 진단: *"`return if ~` 처럼 작성할 수도 있습니다."*
|
|
93
|
+
|
|
94
|
+
학생 자가 답변: *"이 부분이 고민이였는데 크롱이 말씀하신대로 return if로 사용을 한다고 하면 else가 사용되는데 ... 이렇게 사용을 하여 else를 없애는 것이 객체 지향 생활 체조 원칙에 더 올바른 방법이라고 생각을 하였습니다.. 이에 대해 크롱의 생각이 궁금합니다.🤔"*
|
|
95
|
+
|
|
96
|
+
크롱 답변: *"이상적으로 생각하면 제리의 의견이 타당하다고 생각하지만, 사실 이 부분에 정답은 없다고 생각합니다. 가독성의 영역이고 가독성은 개인의 취향이 반영되니까요."*
|
|
97
|
+
|
|
98
|
+
→ **`return if-else` vs `if-return; return` 트레이드오프**. *객체 지향 생활 체조 원칙 = else 회피* (학생 인용). *Kotlin 어휘 = if-else 양쪽 합리*. *가독성 = 개인 취향* (크롱 자가 인정). **양방향 트레이드오프 인식 모범**.
|
|
99
|
+
|
|
100
|
+
### 9. `init` naming → `Start` — 함수명 의미 표현
|
|
101
|
+
|
|
102
|
+
크롱 진단 (Participants.kt — 미해결): *"`init`은 값을 세팅하거나 초기화하는 느낌을 줄 수 있기 때문에 네이밍을 변경해보면 더욱 가독성이 좋아질 것 같아요."*
|
|
103
|
+
|
|
104
|
+
→ **`init` = 초기화 어휘**. *Kotlin `init` 블록과 의미 충돌*. *`start` / `show` 등 명시적 어휘*가 *의미 명료*. PR #136·#137·#88·#146 와 같은 결의 *naming = 책임 표현*.
|
|
105
|
+
|
|
106
|
+
### 10. `Dealer` 다양한 일 = 테스트 부족 신호
|
|
107
|
+
|
|
108
|
+
크롱 (Dealer.kt:6 — 미해결): *"딜러는 다양한 일을 하고 있는데요. 테스트를 꼼꼼하게 작성했는지 확인해주세요🙏. 2단계에서 새로 추가된 클래스와 기존에 있던 다른 모든 클래스들도 동일합니다."*
|
|
109
|
+
|
|
110
|
+
학생: *"딜러의 메소드 별 테스트와 따로 테스트가 없었던 객체들의 테스트를 추가하였습니다.🥲"* (커밋 `2c9f136`).
|
|
111
|
+
|
|
112
|
+
→ **클래스 = 여러 일 시 테스트 필수**. *Dealer 의 다중 책임 신호 + 테스트 커버리지*. *PR #137·#103·#147·#148 와 같은 결의 *테스트 자가 추가 모범**.
|
|
113
|
+
|
|
114
|
+
### 11. `친절한 프로그램` UX 권고
|
|
115
|
+
|
|
116
|
+
크롱 (BlackjackController.kt:1 — 미해결): *"nit: 게임을 진행할 때 버스트가 되면 카드를 뽑을 수 없는데요. 사용자에게 이를 알려주는 것이 더 친절한 프로그램이지 않을까요😅"*
|
|
117
|
+
|
|
118
|
+
→ **UX = 도메인 룰 + 사용자 친화 메시지**. *Bust 후 카드 못 뽑음 → 명시적 안내*. *PR #103·#137 와 같은 결의 *사용자 피드백*.
|
|
119
|
+
|
|
120
|
+
### 12. `BettingMoney 0보다 큰 검증` → View vs 도메인 학생 자가 토론
|
|
121
|
+
|
|
122
|
+
학생 자가 답변 (View 검증 후) → 크롱 권고 후 도메인 이전. *학생 자가 표현 시점 어휘 = "당연한 형식"* — 학생 사고의 한계 명시 (View 검증 = 콘솔 가정).
|
|
123
|
+
|
|
124
|
+
→ **`당연한 형식` 인식 = 현재 UI 가정 함정**. *Multi-platform 고려*에선 *도메인이 자기 invariant 강제*. PR #41·#148 와 같은 결.
|
|
125
|
+
|
|
126
|
+
### 13. `Hand` 상태 var 제거 = 자가 학습 핵심
|
|
127
|
+
|
|
128
|
+
크롱 진단 (Hand.kt — 미해결): *"카드가 손에 들어올 때마다 **정말 상태를 변경해야만 하는가?** **다른 방법은 없을까?**"*
|
|
129
|
+
|
|
130
|
+
→ **상태 var → derived 메시지 패턴 전환**. *학생 자가 학습 핵심*. *`Hand.status` 보유 + 변경* 대신 *`Hand.isBlackjack()`, `Hand.isBust()` 메서드*. *시점 무관 + 외부 예측 가능성*. PR #146·#131·#137·#136·#148 와 같은 결.
|
|
131
|
+
|
|
132
|
+
## 리뷰어 의견 요지
|
|
133
|
+
|
|
134
|
+
- **Controller 재사용 = stateless** — *인스턴스 변수 제거*. *PR #133 의 in-place vs 제리 = stateless* 트레이드오프.
|
|
135
|
+
- **Map 자료구조 우회 = 인스턴스 변수 제약 부산물** — *PlayerBetAmount 클래스 응집*이 정공.
|
|
136
|
+
- **반란군 비유 = 요구사항 vs 좋은 설계 자유** — *학생의 요구사항 준수 결정 인정*.
|
|
137
|
+
- **Hand = 상태 변경 X + 자기 판단 메시지** — *Tell-Don't-Ask*.
|
|
138
|
+
- **`canHit` vs `isBust` 부울 의미 일관** — *True 방향 통일*.
|
|
139
|
+
- **참가자 vs 참가자 추상화 + YAGNI vs 추상화 트레이드오프** — 양방향 인식.
|
|
140
|
+
- **View vs 도메인 검증 = 비즈니스 규칙은 도메인** — *Multi-platform 고려*.
|
|
141
|
+
- **`init` naming = Kotlin 의미 충돌** — *Start 어휘*.
|
|
142
|
+
- **블랙잭 = 2장 + 21** — *학생 자가 학습*.
|
|
143
|
+
- **배수별 메서드 폭증 = 파라미터 인자**.
|
|
144
|
+
- **테스트 꼼꼼함 = 다중 책임 클래스 필수**.
|
|
145
|
+
|
|
146
|
+
## 대표 인용
|
|
147
|
+
|
|
148
|
+
**크롱 (반란군 비유 + 요구사항 vs 설계, PlayerBetAmount.kt):**
|
|
149
|
+
> 플레이어가 베팅 금액을 들고 있는 것이 적절하다고 판단이 되면 그렇게 구현해도 괜찮습니다.
|
|
150
|
+
> 요구사항을 지켜야 하지만 좋은 설계라고 생각하면 가끔은 부숴도... ~~제리는 포비가 키우는 반란군이니까요ㅋㅋ~~
|
|
151
|
+
>
|
|
152
|
+
> 제리가 원래 그리던 꿈을 펼쳐주세요.
|
|
153
|
+
>
|
|
154
|
+
> > 이번 미션에서는 가능한 한 Map 사용을 지양하는 것을 목표로 삼았습니다.
|
|
155
|
+
>
|
|
156
|
+
> 적절한 자료구조의 사용은 설계와 더불어 자료구조가 제공하는 이점들을 활용할 수 있겠습니다.
|
|
157
|
+
|
|
158
|
+
**크롱 (Hand 상태 변경 X 메시지 패턴, Hand.kt):**
|
|
159
|
+
> 카드가 들어올 때 버스트인가, 블랙잭인가를 판단해서 상태를 변경하는 것을 외부에서 예측할 수 있을까요?
|
|
160
|
+
> 카드가 손에 들어올 때마다 **정말 상태를 변경해야만 하는가?** **다른 방법은 없을까?** 에 대해 고민해보면 좋겠습니다.
|
|
161
|
+
>
|
|
162
|
+
> 조금 힌트를 드리자면,
|
|
163
|
+
> `Hand`는 자신이 버스트인지, 블랙잭인지를 판단하는 일을 할 수 있었습니다.
|
|
164
|
+
> `Participants` 역시 자신이 카드를 받을 수 있는지를 판단할 수 있었구요.
|
|
165
|
+
> 객체들의 협력을 잘 이끌어내면 상태를 갖지 않아도 될 것처럼 보입니다.
|
|
166
|
+
|
|
167
|
+
**크롱 (View vs 도메인 검증, InputView.kt):**
|
|
168
|
+
> 베팅금액이 0보다 커야한다는 것은 사용자 입력 형식이 아니라, 게임 진행을 위한 기본적인 전제 조건이며 이는 비즈니스 규칙에 해당한다고 볼 수 있습니다.
|
|
169
|
+
> 현재 블랙잭 게임을 콘솔이 아닌 다른 UI로 가져간다면 어떻게 될까요? 콘솔 뷰에서 처리하고 있는 검증 로직은 새로운 UI에는 존재하지 않을겁니다. 따라서 0보다 큰 값이 들어왔는지는 검증할 수 없어지겠죠.
|
|
170
|
+
|
|
171
|
+
**크롱 (canHit vs isBust 의미 일관, Player.kt):**
|
|
172
|
+
> nit: 뭔가 이상하지 않나요?
|
|
173
|
+
> canHit -> True: Hit을 할 수 있는 상태
|
|
174
|
+
> 버스트인가? -> True: Hit을 하지 못하는 상태
|
|
175
|
+
|
|
176
|
+
**크롱 (확장성 vs 현재 책임 양방향, Player.kt):**
|
|
177
|
+
> 제리 의견도 맞아요.
|
|
178
|
+
> 확장성을 고민하면 어디까지 생각해봐야 하는가 고민하다 중요한 것들을 놓치기 쉽습니다.
|
|
179
|
+
> 또한 고민한다고 모든 경우의 수를 예상하고 대비할 수는 없으니까요.
|
|
180
|
+
|
|
181
|
+
**학생 자가 학습 (요구사항 우선 결정, PlayerBetAmount.kt):**
|
|
182
|
+
> 저도 포비가 키우는 반란군이 되고 싶지만, 객체 지향을 향한 한 걸음은
|
|
183
|
+
> 결국 요구사항을 제대로 이해하고 따르는 것이라고 생각했습니다.
|
|
184
|
+
> 따라서, 이번에는 요구사항에 맞춰 코드를 구현하였습니다..🥲
|
|
185
|
+
>
|
|
186
|
+
> 하지만, 코틀린과 객체 지향에 대해 공부를 좀 더 하고 저만의 가치관이 확립되면
|
|
187
|
+
> 그때는 제대로 된 반란군이 되어 볼 생각입니다!!💪
|
|
188
|
+
|
|
189
|
+
**학생 자가 학습 (View vs 도메인 검증 자가 토론, InputView.kt):**
|
|
190
|
+
> 저번 로또 미션과 블랙잭 미션에서 제일 고민되는 문제는 View에서 어디까지 validate인가 였습니다.
|
|
191
|
+
> 결국 내린 결론은 **null값과 타입과 마지막으로 해당 View반환값을 쓰는 도메인의 형식은 View에서 처리하자**였습니다. 🥹
|
|
192
|
+
>
|
|
193
|
+
> 만약, 사용자가 `www.a.com`을 입력했을 때 해당 사이트가 실제로 존재하는지는 도메인에서 검증해야 한다고 생각합니다.
|
|
194
|
+
> 반면, `ww.a.com`처럼 www의 형식을 어긴 입력은 View에서 처리하는 것이 맞다고 생각합니다.
|
|
195
|
+
>
|
|
196
|
+
> 따라서, 이번 구현도 `베팅 금액의 형식은 당연히 양수이다`는 형식이라고 생각이 되어 View로직에 넣었습니다.
|
|
197
|
+
>
|
|
198
|
+
> 제가 생각하는 도메인 로직은 `최소 베팅금액을 1000원으로 제한한다.` 라는 것이 도메인 로직이고
|
|
199
|
+
> 모든 사람들이 당연하게 생각하는 `베팅금액은 0보다 크다`를 View에서 판단하는 것이 맞다고 생각합니다.
|
|
200
|
+
|
|
201
|
+
**학생 자가 학습 (canHit 위화감 자가 인식, Player.kt):**
|
|
202
|
+
> 이 로직에서 계속 위화감이 들었는데 크롱이 말씀해주시니 확 와닿았습니다!
|
|
203
|
+
> 바로 로직을 수정하였습니다!😂
|
|
204
|
+
|
|
205
|
+
**학생 자가 학습 (객체 지향 생활 체조 원칙 인용, Hand.kt:8):**
|
|
206
|
+
> 이 부분이 고민이였는데 크롱이 말씀하신대로 return if로 사용을 한다고 하면 else가 사용되는데
|
|
207
|
+
> ...
|
|
208
|
+
> 이렇게 사용을 하여 else를 없애는 것이 객체 지향 생활 체조 원칙에 더 올바른 방법이라고 생각을 하였습니다..
|
|
209
|
+
> 이에 대해 크롱의 생각이 궁금합니다.🤔
|
|
210
|
+
|
|
211
|
+
## 얻은 교훈
|
|
212
|
+
|
|
213
|
+
1. ***Controller 재사용 = stateless = 인스턴스 변수 제거***. *PR #133 (시아) in-place 변경 vs PR #151 (제리) stateless 재사용* 트레이드오프. *둘 다 합리 — 도메인 메타포 의존*.
|
|
214
|
+
|
|
215
|
+
2. ***`Map<X, X>` 자료구조 = 3 변수 제약 부산물 (반란군 비유 = 요구사항 vs 설계 자유)***. *크롱 인용: "좋은 설계라고 생각하면 가끔은 부숴도..."* + *학생 결정 = 요구사항 우선*. *학습 + 자유 + 트레이드오프 명시 모범*. PR #133·#88·#132·#136·#146·#41·#49 와 같은 결.
|
|
216
|
+
|
|
217
|
+
3. ***`Hand` 상태 변경 X + derived 메시지 패턴 = Tell-Don't-Ask 정공***. *`Hand.status var` 변경 → `Hand.isBlackjack()` 메서드*. *시점 무관 + 외부 예측 가능성*. PR #146·#131·#137·#136·#148 와 같은 결의 *derived 상태*.
|
|
218
|
+
|
|
219
|
+
4. ***View vs 도메인 검증 = 비즈니스 규칙 = 도메인***. *Multi-platform UI 시 View 검증만 = 새 UI 에서 누락*. *학생 의 "당연한 형식" 어휘 = 콘솔 UI 가정 함정*. *크롱 = 비즈니스 규칙 = 도메인 강제*. PR #41·#148 와 같은 결. **MCP 룰 후보 — `view-only-validation-cross-ui-fragility`**.
|
|
220
|
+
|
|
221
|
+
5. ***`canHit` vs `isBust` 부울 의미 일관 = True 방향 통일***. *canHit True = Hit 가능* / *isBust True = Hit 불가능* 의 *방향 충돌*. *둘 다 긍정 방향 또는 부정 방향 통일*. *`canDraw()` 한 메서드*가 *의미 일관*. PR #41·#148 와 같은 결.
|
|
222
|
+
|
|
223
|
+
6. ***`init` naming = Kotlin 의미 충돌***. *Kotlin `init` 블록 = 객체 초기화*. *`init` 메서드명 = 의미 충돌*. *`start` / `show` 등 명시적 어휘*. PR #136·#137·#88·#146 와 같은 결.
|
|
224
|
+
|
|
225
|
+
7. ***확장성 vs 현재 책임 양방향 트레이드오프 = 어디까지 추상화***. *Participants 다형성 (플레이어 vs 플레이어, ...) = 미래 가능성*. *Player only = 현재 충분*. *크롱 자가 인정 ("확장성 고민하면 ... 중요한 것들 놓치기 쉽습니다")*. PR #146·#148 와 같은 결.
|
|
226
|
+
|
|
227
|
+
8. ***`MethodSource` 활용 X = 단순 카드 인자 충분***. *Jack/King/Queen 카드 인자만으로 테스트 가능*. *@MethodSource 오버엔지니어링*. *학생 자가 학습 모범*. PR #146·#136·#90 와 같은 결.
|
|
228
|
+
|
|
229
|
+
9. ***`객체 지향 생활 체조 원칙` 인용 = else 회피 vs Kotlin if-else 어휘***. *원칙 = else 회피*. *Kotlin = if-else 양쪽 합리*. *크롱 = 가독성 = 개인 취향*. **양방향 트레이드오프 인식 모범**.
|
|
230
|
+
|
|
231
|
+
10. ***친절한 프로그램 UX = 도메인 룰 + 사용자 피드백***. *Bust 후 카드 못 뽑음 → 명시적 안내*. *도메인 정확성 + UX 완성도*. PR #103·#137 와 같은 결.
|
|
232
|
+
|
|
233
|
+
11. ***Dealer 다양한 일 = 다중 책임 신호 + 테스트 부족***. *클래스 책임 분배 + 테스트 커버리지*. *PR #137·#103·#147·#148 와 같은 결*.
|
|
234
|
+
|
|
235
|
+
12. ***배수별 메서드 폭증 = 파라미터 인자***. *1배 ~ 1000배 메서드 X*. *`calculate(multiplier: Double)` 한 메서드*. PR #148·#147 와 같은 결.
|
|
236
|
+
|
|
237
|
+
13. ***`반란군 비유` (크롱) + 학생 결정 (요구사항 우선) = reviewer/학생 양방향 자유 + 가치관 명시 모범***. *Reviewer 가 *학생 자유* 명시 인정* + *학생이 *현재 우선 + 미래 가치관 확립 의지** = *학습 + 가치관 발달 + 양방향 존중* 모범. PR #137·#148 와 같은 결의 *학생/리뷰어 양방향 학습*.
|
|
238
|
+
|
|
239
|
+
14. ***Backing Property + val 활용 자가 학습***. *`_cards` private + `cards` getter`* + *`var sum` → `val sum` + `sum + 10` 반환*. *Kotlin 어휘 + 불변 정공*. PR #146·#137·#133 와 같은 결.
|
|
240
|
+
|
|
241
|
+
15. ***`Hand.size == 2 + 21 = 블랙잭` 자가 학습***. *학생 자가 의식 + 후속 반영*. *블랙잭 룰 정확성*. PR #148·#128·#108·#125·#114·#131·#136·#137 와 같은 결.
|
|
242
|
+
|
|
243
|
+
16. ***학생 자가 학습 + 자가 토론 깊이 + reviewer 양방향 인정 = 학습 가시화 최고 수준***. *View 검증 자가 토론 + 객체 지향 생활 체조 원칙 인용 + 확장성 vs 현재 책임 트레이드오프*. PR #146·#148·#137·#41 와 같은 결.
|