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,465 @@
|
|
|
1
|
+
# PR #93 — [블랙잭 2단계] 에디 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@junjange](https://github.com/junjange)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/93
|
|
5
|
+
- **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 21 스레드 / 51 코멘트 — *State 패턴 + Demeter + sealed vs enum* 깊은 토론 + 학생 자가 학습 모범
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **State 패턴 정공 — `interface State` + `abstract Started(Hand)` + `Running (Hit) / Finished (Blackjack/Bust/Stay)` 계층** — *Tell-Don't-Ask 정공*. `Hit.draw(card)` 가 *21 초과 → Bust, 2장 21 → Blackjack, 21 도달 → Stay, else → Hit* 분기로 *다음 상태 결정*. **`Blackjack.calculate(opponent: State) = if (opponent is Blackjack) Draw else BlackjackWin` 같은 다형성 메시지**. PR #136 (밀러 2단계) 의 *sealed class BlackJackRule + Stay.compare* 와 같은 결.
|
|
12
|
+
- **`Finished.profit(betAmount, gameResult)` 다형성 + 메시지 응집** — *상태별 earningRate (Blackjack=1.5, Stay=1.0, Bust=-1.0) + 공통 profit 계산*. 호출자가 *isBust 분기* 없이 *state.profit(betAmount, result)* 한 줄.
|
|
13
|
+
- **`Started` 부모 클래스에 `calculateHand()` 응집 — Ace 점진적 보정** — *Ace 11 기본 + repeat(aceCount) { total += 10; if > 21 → -10 + return@repeat }* 패턴:
|
|
14
|
+
|
|
15
|
+
```kotlin
|
|
16
|
+
override fun calculateHand(): Int {
|
|
17
|
+
var total = hand.cards.sumOf { it.number.value } // Ace=1 기본
|
|
18
|
+
val aceCount = hand.cards.count { it.number == CardNumber.ACE }
|
|
19
|
+
repeat(aceCount) {
|
|
20
|
+
total += Hand.DIFF_ACE_TO_ONE // +10
|
|
21
|
+
if (total > Hand.BLACKJACK_NUMBER) {
|
|
22
|
+
total -= Hand.DIFF_ACE_TO_ONE
|
|
23
|
+
return@repeat // ⚠ break
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return total
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
*Ace 각각에 11 시도 + Bust면 -10 + 종료* — *Ace 다수 정확*. PR #128·#114·#108·#131 와 같은 결.
|
|
31
|
+
- **`sealed class CardHolder` + `Player` / `Dealer` 다형성** — 1단계 *open class* 자가 학습 후 *sealed* 정공. *외부 구현 차단 + 컴파일러 보장*. PR #136 (밀러 2단계) 의 *sealed class BlackJackRule* 와 같은 결.
|
|
32
|
+
- **`sealed interface GameResult` + `data object BlackjackWin / Win / Lose / Draw`** — *Kotlin `data object` 활용*. *닫힌 결과 계층 + 컴파일러 when exhaustive*. PR #132 (환노) 의 *GameResult enum + earningRate* 와 *반대 트레이드오프* — *enum 부가 속성* vs *sealed object*.
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
sealed interface GameResult {
|
|
36
|
+
data object BlackjackWin : GameResult
|
|
37
|
+
data object Win : GameResult
|
|
38
|
+
data object Lose : GameResult
|
|
39
|
+
data object Draw : GameResult
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- **`DeckManager` interface + `GameDeck` 구현체 — DIP** — *카드 한 장 가져오는 메서드 추상화*. 말리빈 권고 *"카드 한 장을 가져오는 메서드를 인터페이스로 만들어볼 수 있겠어요"* 후속 반영. *position 인자 추가로 결정적 카드 뽑기 가능* — 테스트 용이성.
|
|
44
|
+
- **`CardHolder.drawCard(card: () -> Card, shouldDrawCard: () -> Boolean, showPlayerCards: (CardHolder) -> Unit)` 고차함수** — *외부 입력 + 출력 콜백을 람다 인자로*. *Player/Dealer 가 자기 진행 자율성*. *Tell-Don't-Ask 정공*. PR #132 (환노 2단계) 의 *고차함수 시도 + 깊이 문제* 와 *비슷한 트레이드오프* — junjange 는 *적정 깊이로 안착*.
|
|
45
|
+
- **`Card.from(cards: List<Card>)` 팩토리 명명 자가 학습** — 말리빈의 *"from과 of는 어떤 의미 차이가 있나요? 어떤 것은 Card를, 다른 하나는 List\<Card>를 반환하는데, 다른 개발자들도 of 와 from 의 경계를 명확히 알아차릴 수 있을까요?"* 진단 후속 반영 (커밋 `b2f1b80`).
|
|
46
|
+
- **양방향 의존 자가 해소** — 말리빈 진단 *"부모가 자식을 알고 있는 형태이네요! 양방향 의존 관계가 생겨나기도 했구요"* + 학생 자가 답변 *"부모와 자식간에 결합도가 증가하여 유지보수가 힘들어질 것 같습니다! 단일 책임 원칙도 위반 될 것으로 보입니다! 의존성을 제거하고 코드를 간소화했습니다!"* (커밋 `efa1571`). **MCP 룰 후보 — `bidirectional-dependency` 변형**.
|
|
47
|
+
- **Demeter 학습 + 리팩토링** — 말리빈 *"디미터의 법칙에 대해 알아보셔도 좋겠어요"* 진단 → 학생 *"네네!! 디미터의 법칙을 준수하면서 리팩터링을 진행했습니다!"* (커밋 `98299dd`). PR #133·#88 와 같은 결.
|
|
48
|
+
- **타입 캐스팅 제거 자가 반영** — 말리빈 *"상태 패턴을 활용해주셨으니, 타입 캐스팅을 사용하지 않고 구현해주세요"* + 학생 자가 반영 (커밋 `15e1e77`). *다형성 활용 정공*.
|
|
49
|
+
- **let/run 함수 활용 함정 자가 학습** — 말리빈의 *"이런 형태를 잘못 사용하게 된다면 let 블럭과 run 블럭 모두가 실행되는 말도 안되는 상황이 발생할 수도 있어요. let 스코프 함수 내부에 잘못된 코드를 작성했을 때 발생하게 되겠는데요, 어떤 경우에 두 스코프가 다 실행 될 수 있을지 고민해보시면 좋겠어요!"* + 학생 자가 실험 (let에서 null 반환 시 두 블록 실행) + 자가 반영. **Kotlin scope function 함정 학습 모범**.
|
|
50
|
+
- **`UserInfo` 도입 — name + betAmount 묶음** — *3 변수 제약* 회피 + *Player/Dealer 공통 정보* 응집. PR #133 (시아 2단계) 의 *Items* 와 같은 결의 *제약 부산물 + 정당한 도메인 객체* 경계.
|
|
51
|
+
|
|
52
|
+
## 못한 점 (설계 관점)
|
|
53
|
+
|
|
54
|
+
### 1. `Hit.draw(card)` 에서 `hand.add(card)` 가변 변경 + 새 상태 반환 — *불변 표면 + 깊은 가변*
|
|
55
|
+
|
|
56
|
+
```kotlin
|
|
57
|
+
class Hit(private val hand: Hand = Hand()) : Running(hand) {
|
|
58
|
+
override fun draw(card: Card): State {
|
|
59
|
+
hand.add(card) // ⚠ 기존 hand 가변 변경
|
|
60
|
+
val sumOfCard = hand.calculate()
|
|
61
|
+
return when {
|
|
62
|
+
sumOfCard > THRESHOLD_BUST -> Bust(hand) // 새 상태 + 같은 hand 참조
|
|
63
|
+
sumOfCard == THRESHOLD_BUST && hand.cards.size == 2 -> Blackjack(hand)
|
|
64
|
+
sumOfCard == THRESHOLD_BUST -> Stay(hand)
|
|
65
|
+
else -> Hit(hand)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
...
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
→ **`hand.add(card)` = 기존 Hand 가변 변경 + 새 State 객체 반환 + 같은 hand 참조** — PR #85 (하디 2단계) 와 같은 결의 *불변 표면 + 깊은 가변* 함정. *Hit 상태 → Bust 상태 전이* 시 *같은 Hand 참조* 라서 *이전 Hit 객체 조회 시 이미 add 된 hand*.
|
|
73
|
+
|
|
74
|
+
*완전한 불변* = *`Hand(cards + card)`* 새 Hand 생성 + 새 State. *현재 `hand.add(card)`* 가변 호출.
|
|
75
|
+
|
|
76
|
+
### 2. `Running.calculate(opponent): GameResult = Lose` — *진행 중 상태가 결과 반환?*
|
|
77
|
+
|
|
78
|
+
```kotlin
|
|
79
|
+
abstract class Running(hand: Hand) : Started(hand) {
|
|
80
|
+
override fun isFinished(): Boolean = false
|
|
81
|
+
|
|
82
|
+
override fun calculate(opponent: State): GameResult {
|
|
83
|
+
return GameResult.Lose // ⚠ 진행 중이면 Lose?
|
|
84
|
+
}
|
|
85
|
+
...
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
→ **`Running.calculate(opponent) = Lose` = 진행 중 상태에서 결과 메서드 호출 시 무조건 Lose**. *State interface 의 `calculate` 가 모든 상태에 강제* → *Running 상태도 응답 필요*. *논리적으로는 calculate 가 호출 안 되어야 함*. *Lose 반환은 우회*. *PR #152 (모찌 2단계) 의 Hit.expectedProfit throw IllegalStateException* 와 *반대 트레이드오프*.
|
|
90
|
+
|
|
91
|
+
*throw 가 정공* — *진행 중 상태에서 calculate 호출은 도메인 invariant 위반*. *Lose 반환은 silent failure* — *호출자가 결과 잘못 사용 시 디버깅 어려움*.
|
|
92
|
+
|
|
93
|
+
### 3. `Running.profit(betAmount, gameResult) = 0.0` + `Finished.profit` 분기 — *책임 양분*
|
|
94
|
+
|
|
95
|
+
```kotlin
|
|
96
|
+
// Running
|
|
97
|
+
override fun profit(betAmount: BetAmount, gameResult: GameResult): Double = 0.0
|
|
98
|
+
|
|
99
|
+
// Finished
|
|
100
|
+
override fun profit(betAmount: BetAmount, gameResult: GameResult): Double {
|
|
101
|
+
val rate = earningRate()
|
|
102
|
+
return when (gameResult) {
|
|
103
|
+
is GameResult.Draw -> 0.0
|
|
104
|
+
is GameResult.Lose -> -betAmount.amount.toDouble()
|
|
105
|
+
else -> betAmount.amount * rate
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
→ **`Running.profit = 0.0` + Finished.profit 가 *gameResult 분기 + earningRate 곱*** — *Running 은 결과 부재 → 0*, *Finished 는 결과 + 배율*. 다만 *Bust.earningRate = -1.0* 인데 *Finished.profit 에서 `is Lose → -betAmount`* 별도 분기 — *Bust 의 earningRate(-1.0) 이 적용 안 됨*. *룰 정합* 인지 *중복* 인지 모호.
|
|
111
|
+
|
|
112
|
+
실제 사용 흐름:
|
|
113
|
+
- *Bust 상태 → calculate(opponent) = Lose 반환* → *Finished.profit 에 GameResult.Lose 인자 → `is Lose → -betAmount`*. *earningRate(-1.0) 미적용*.
|
|
114
|
+
- *Blackjack 상태 → calculate(opponent) = BlackjackWin 반환* → *Finished.profit 에 BlackjackWin 인자 → `else → betAmount * 1.5`*. *earningRate 적용*.
|
|
115
|
+
- *Stay 상태 → calculate(opponent) = Win/Lose/Draw* → *Finished.profit 분기*.
|
|
116
|
+
|
|
117
|
+
→ **Bust 의 earningRate(-1.0) 이 *실제로는 미사용***. *earningRate 추상 메서드*가 *Finished 의 일관 계약*이지만 *Bust는 항상 Lose 분기로 흡수*. *Dead code* 가능성. *earningRate 의 사용처 = `else → betAmount * rate`* — *Bust 의 earningRate 호출 시점 없음*.
|
|
118
|
+
|
|
119
|
+
### 4. `sealed interface GameResult` vs `enum class GameResult` 토론 — 학생 자가 학습
|
|
120
|
+
|
|
121
|
+
학생 초기 선택: *sealed interface*. 말리빈 진단: *"enum class와 어떤 점이 차이가 있었나요?"*. 학생 답변: *"profit 함수에서 sealed interface를 통해 패턴 매칭을 할 때, 컴파일러가 타입 안정성을 유지하면서 코드를 검증하여 개발 과정에서 실수를 안 할 수 있는 장점이 있었습니다!"*
|
|
122
|
+
|
|
123
|
+
말리빈 후속: *"enum은 말씀해주신 위 장점이 존재하지 않았나요?"*
|
|
124
|
+
|
|
125
|
+
학생: *"맞습니다ㅠㅠ 제가 잘못알고있었습니다 위에 sealed interface는 특별하게 장점을 살리고 있지는 않은 것 같습니다. 그러나 추후에 BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요할 것 같습니다!"*
|
|
126
|
+
|
|
127
|
+
말리빈: *"특별하게 장점을 살리고 있지 않다면, 저는 필요한 부분만 가져가는 것이 코드를 이해하는 데 불필요한 생각이 들지 않게 해준다 생각해요. 이렇게 할거면 왜 enum을 쓰지 않았지? 라는 의문을 들게하는 것 부터, 코드를 이해하는 데 벌써 한 번의 멈춤이 생겼다고 생각해요. 저는 최대한 필요에 의해 코드를 구성하는 것을 선호해요."*
|
|
128
|
+
|
|
129
|
+
학생: *"저도 말리빈처럼 왜라고 말했을 때 답하는 것을 중요시하는데 위 부분에서 sealed class의 장점을 살리지 못한다면 enum으로 수정해야할 것 같습니다!"*
|
|
130
|
+
|
|
131
|
+
→ **sealed vs enum = 도메인 차이가 있을 때만 sealed**. *현재 GameResult 4 멤버 모두 *데이터 없는 object* → enum 으로 충분*. *sealed = 멤버 별 다른 데이터 보유 가능*이 장점. *현재 도메인이 그 가능성 없음*. **MCP 룰 후보 — `sealed-without-differentiation`** *= sealed 의 멤버 별 데이터 차이 없으면 enum 권고*.
|
|
132
|
+
|
|
133
|
+
학생 자가 답변에서 *"BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요"* 도 *미래 가능성* 이지만 *YAGNI 위반*. 말리빈의 *"필요에 의해 코드를 구성"* 가르침.
|
|
134
|
+
|
|
135
|
+
### 5. `Hand.add(card)` 가변 변경 후 `cards.size` 검사
|
|
136
|
+
|
|
137
|
+
```kotlin
|
|
138
|
+
// Hit.draw
|
|
139
|
+
hand.add(card)
|
|
140
|
+
val sumOfCard = hand.calculate()
|
|
141
|
+
return when {
|
|
142
|
+
sumOfCard > THRESHOLD_BUST -> Bust(hand)
|
|
143
|
+
sumOfCard == THRESHOLD_BUST && hand.cards.size == 2 -> Blackjack(hand)
|
|
144
|
+
...
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
→ **`hand.cards.size == 2`** — *Hand 의 외부에서 size 직접 접근*. *Hand.isBlackjackEligible() = cards.size == 2 && score == 21* 같은 메서드 위임이 자연. Demeter 표면.
|
|
149
|
+
|
|
150
|
+
### 6. `Dealer.shouldDrawCard(): Boolean = calculateHand() <= 16` — *Dealer 자기 룰 메시지 (잘함) + Hand 알 필요 없음*
|
|
151
|
+
|
|
152
|
+
```kotlin
|
|
153
|
+
class Dealer(...) : CardHolder(...) {
|
|
154
|
+
fun shouldDrawCard(): Boolean = calculateHand() <= DEALER_CARD_DRAW_THRESHOLD
|
|
155
|
+
...
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
말리빈 (Dealer.kt — 미해결): *"shouldDrawCard() 이 친구는 CardHolder, Dealer, Player 모두가 갖고있는 듯한 느낌이 드네요! 공통으로 갖고있는 멤버지만, 실행했을 때 동작은 다르게 만드는 방법이 있을까요?"*
|
|
160
|
+
|
|
161
|
+
학생 자가 답변: *"흠 공통으로 갖고 있어서 interface를 통해 추상화하려고 했지만.. Dealer의 shouldDrawCard는 본인의 카드 점수 합에 따라서 값이 달라지고 Player의 shouldDrawCard는 사용자의 입력에 따라서 달라지기 때문에 추상화가 쉽지 않은 것 같습니다!"*
|
|
162
|
+
|
|
163
|
+
말리빈 후속: *"입력을 받아오기 위한 람다 등은 최대한 깊이를 깊게 가져가지 않았으면 했어요. 게임을 관제하는 객체를 하나 만들어둔다면 이런 람다를 도메인 깊이 알지 않을 수 있으니까요. ... 그렇다면 플레이어나 딜러나 그저 카드를 받기만 할 수 있는 객체가 되고, 줄 지 말 지는 게임 객체가 판단해줄 수도 있었겠지요!"*
|
|
164
|
+
|
|
165
|
+
→ **Player/Dealer shouldDrawCard 다형성 vs Game 객체 판단**. *현재 Dealer 만 shouldDrawCard 메서드 (Player 는 외부 람다)*. *완전 다형성* = *Player.shouldDrawCard(input) / Dealer.shouldDrawCard()* 같은 *인자 통일 + 다형성*. 또는 *Game 객체 = 모든 판단 + Player/Dealer 는 받기만*.
|
|
166
|
+
|
|
167
|
+
*트레이드오프*. PR #132·#136 와 같은 결의 *Participant 다형성* 가 정공.
|
|
168
|
+
|
|
169
|
+
### 7. `CardHolder.calculateProfit(opponent: State)` — *state 직접 인자*
|
|
170
|
+
|
|
171
|
+
```kotlin
|
|
172
|
+
fun calculateProfit(opponent: State): Double {
|
|
173
|
+
val gameResult = state.calculate(opponent)
|
|
174
|
+
return state.profit(betAmount = userInfo.betAmount, gameResult = gameResult)
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
→ **`opponent: State` 인자** = *Player가 다른 Player의 State 직접 받음*. *호출자 (BlackjackController)* 가 *`player.calculateProfit(dealer.state)`* 호출. *Tell-Don't-Ask*: *`player.calculateProfit(dealer)`* 가 더 자연 — *Player가 Dealer로부터 State 추출*. *State 인자 직접 노출*은 *내부 표현 의존*.
|
|
179
|
+
|
|
180
|
+
### 8. `BetAmount` 의 *문자열 파싱이 도메인 책임?* 자가 학습
|
|
181
|
+
|
|
182
|
+
학생 초기: *문자열 파싱이 도메인 책임*. 말리빈 진단: *"문자열을 파싱해서 BetAmount를 만든다는 것은 도메인의 역할일까요?"*. 학생 자가 답변: *"배팅 금액에 대한 유효성 검증 이후, 문자열을 파싱하는 것은 도메인의 역할이라고 생각했습니다! 그런데, 다시 생각해보니 view의 역할에 더 적합한 것 같습니다!"* (커밋 `7ada402`).
|
|
183
|
+
|
|
184
|
+
→ **도메인 vs View 책임 자가 학습**. *문자열 파싱 = View*, *유효성 검증 = 도메인*. *PR #132 (환노 2단계) 의 View가 사용자 의도 표현* 진단과 같은 결.
|
|
185
|
+
|
|
186
|
+
### 9. `BlackjackState` vs `Blackjack` naming 모호 → State 로 변경 시도 → 말리빈 reminder
|
|
187
|
+
|
|
188
|
+
학생 초기: `BlackjackState` 와 `Blackjack` 두 객체. 말리빈: *"BlackjackState 와 Blackjack은 처음 보는 개발자들이 서로 어떻게 다른 객체인지 내부 구현을 자세히 보지 않고 파악할 수 있을까요?"*. 학생: *"잘 모를 것 같습니다 BlackjackState를 State로 수정하겠습니다!"* (커밋 `5a66d0a`).
|
|
189
|
+
|
|
190
|
+
말리빈 후속: *"앗 ㅋㅋㅋ 아래 피드백을 다시 곱씹어볼까요 ?_?"* + 1단계 피드백 링크.
|
|
191
|
+
|
|
192
|
+
→ **이름 모호함 자가 해소 + 1단계 피드백 회귀 신호**. *학생이 이름 모호함 진단 받고 다시 변경했지만 이전 피드백 (`State` vs `Blackjack`) 와 같은 결*. *학습 가시화 + 재발견*.
|
|
193
|
+
|
|
194
|
+
### 10. `Card.create` 와 `companion object card` 중복 — 자가 발견
|
|
195
|
+
|
|
196
|
+
말리빈: *"create라는 이름으로 무언가 새로운 인스턴스를 생성할 것 처럼 느껴지네요. companion object 의 card를 직접 접근하는 것과 어떤 차이점이 있는지 모르겠어요. 전체적으로 필요하지 않은 코드들을 다듬어 덜어내는 연습을 해보세요"*
|
|
197
|
+
|
|
198
|
+
학생: *"헉 지금 다시보니 중복되는 내용이네요ㅠㅠ 감사합니다!"* (커밋 `0d2b950`).
|
|
199
|
+
|
|
200
|
+
→ **중복 코드 자가 발견 + 삭제**. *create / companion val card 둘 다 *기존 캐시 lookup**. *호출자가 둘 중 어느 것 호출하는지 모호*. *Kotlin 어휘 정공 = factory function 한 가지*.
|
|
201
|
+
|
|
202
|
+
### 11. `DeckManager.drawCard(position: Int)` — *position 의미*
|
|
203
|
+
|
|
204
|
+
```kotlin
|
|
205
|
+
interface DeckManager {
|
|
206
|
+
fun resetDeck(cards: List<Card>? = null)
|
|
207
|
+
fun drawCard(position: Int): Card
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
class GameDeck : DeckManager {
|
|
211
|
+
private val deck: MutableList<Card> = Card.cards.shuffled().toMutableList()
|
|
212
|
+
|
|
213
|
+
override fun drawCard(position: Int): Card {
|
|
214
|
+
if (position < deck.size) {
|
|
215
|
+
return deck.removeAt(position)
|
|
216
|
+
}
|
|
217
|
+
resetDeck()
|
|
218
|
+
return deck.removeAt(position)
|
|
219
|
+
}
|
|
220
|
+
...
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
말리빈 (DeckManager.kt:7 — 미해결): *"이전 피드백에 이어서, 기대한 인터페이스는 카드 단 한장만을 가져오는 메서드만 가진 인터페이스였어요. `interface ~ { fun getCard(): Card }`. 랜덤의 요소를 최소화해본다 라는 것에 가장 많이 고민해보세요. reset은 랜덤의 요소였을지, position은 랜덤의 요소였을지 연관지어서요! 1, 2 단계 미션에서 배운 것들을 완전히 자신의 것으로 만들어보세요"*
|
|
225
|
+
|
|
226
|
+
→ **`position: Int` 인자 = 랜덤 요소 외부 노출**. *덱이 랜덤이면 *어떤 position 카드든 랜덤** — *position 명시 의의 부재*. *카드 한 장만 받는 메서드*가 *최소 인터페이스*. *학생 의도*는 *테스트 시 결정적 카드* 였으나 *전략 패턴 (ShuffleStrategy)* 이 정공. *position 인자*는 *외부에서 덱 내부 구조 의존*.
|
|
227
|
+
|
|
228
|
+
학생 자가 답변: *"랜덤의 요소를 최소화하는 것에 대해서 좀 더 고민해보겠습니다!.."*
|
|
229
|
+
|
|
230
|
+
→ **인터페이스 추상화의 적정 수준 학습 진행 중**. *DeckManager 의 `resetDeck(cards: List<Card>? = null)` + `drawCard(position: Int)`* 가 *외부 제어 표면*. *진짜 인터페이스 = `fun draw(): Card` 한 메서드*. *resetDeck 도 외부 호출 불필요* — *덱이 비면 자동 셔플 + 새 덱*. PR #108·#133 (시아) 와 같은 결.
|
|
231
|
+
|
|
232
|
+
### 12. `Card.cards` 같은 *전역 카드 풀* — *Card 객체가 자기 풀 알고 있음*
|
|
233
|
+
|
|
234
|
+
```kotlin
|
|
235
|
+
private val deck: MutableList<Card> = Card.cards.shuffled().toMutableList()
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
→ **`Card.cards` companion val** = *52장 카드 list 전역*. PR #108·#133 (시아) 의 *`Card.SINGLE_DECK` 위치 모순* 과 같은 결. *Card = 1장* vs *Card.cards = 52장 모음* 의미 충돌. *DeckManager.STANDARD_DECK* 또는 *Deck.companion val* 이 자연.
|
|
239
|
+
|
|
240
|
+
### 13. `userInfo` naming — 만능 명사
|
|
241
|
+
|
|
242
|
+
```kotlin
|
|
243
|
+
sealed class CardHolder(val userInfo: UserInfo)
|
|
244
|
+
|
|
245
|
+
data class UserInfo(val nickname: Nickname, val betAmount: BetAmount = BetAmount())
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
→ **`UserInfo` = 만능 명사 (Information)** — PR #88·#114·#125 의 *vagueName 안티패턴* 변형. *블랙잭 도메인에서 `UserInfo` 가 자연한 어휘*인지 *3 변수 제약 부산물*인지 모호. *Player(nickname, betAmount)* 직접 인자 + *CardHolder 는 두 멤버 공통 보유*가 *명시적*.
|
|
249
|
+
|
|
250
|
+
다만 *Player + Dealer 가 공통 정보 (nickname, betAmount) 보유* + *Dealer 도 nickname/betAmount 필요* 라면 *UserInfo 응집* 정합. *Dealer 의 betAmount = 0 default* — *Dealer 가 베팅 안 하는 도메인 룰 vs UserInfo 일관성* 트레이드오프.
|
|
251
|
+
|
|
252
|
+
### 14. `Started.calculateHand` 의 *Ace 보정 후 return@repeat*
|
|
253
|
+
|
|
254
|
+
```kotlin
|
|
255
|
+
override fun calculateHand(): Int {
|
|
256
|
+
var total = hand.cards.sumOf { it.number.value }
|
|
257
|
+
val aceCount = hand.cards.count { it.number == CardNumber.ACE }
|
|
258
|
+
repeat(aceCount) {
|
|
259
|
+
total += Hand.DIFF_ACE_TO_ONE
|
|
260
|
+
if (total > Hand.BLACKJACK_NUMBER) {
|
|
261
|
+
total -= Hand.DIFF_ACE_TO_ONE
|
|
262
|
+
return@repeat // ⚠ break (Kotlin repeat의 continue)
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return total
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
→ **`return@repeat` = 단일 iteration 종료 (continue 의미)**. *Kotlin `repeat` 에 break 없음* — *continue 만 가능*. *while loop 변환*이 *break 의도 명시*. 현재 코드는:
|
|
270
|
+
- *iter 1: total += 10*. *if > 21 → total -= 10 + continue → iter 2*
|
|
271
|
+
- *iter 2: total += 10*. ...
|
|
272
|
+
|
|
273
|
+
*Ace 다수 정확 처리*. 다만 *return@repeat 의미가 *continue* 라 *Kotlin 어휘 미숙자에겐 함정**. *while loop* 이 *break 의도 명시*:
|
|
274
|
+
|
|
275
|
+
```kotlin
|
|
276
|
+
var aceCount = ...
|
|
277
|
+
while (aceCount > 0 && total > 21) {
|
|
278
|
+
total -= 10
|
|
279
|
+
aceCount--
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
PR #136·#108·#131 의 *while 패턴* 과 같은 결.
|
|
284
|
+
|
|
285
|
+
### 15. `Card.cards` 전역 + `GameDeck.drawCard` 가 *resetDeck* 호출 — *position 의미*
|
|
286
|
+
|
|
287
|
+
```kotlin
|
|
288
|
+
override fun drawCard(position: Int): Card {
|
|
289
|
+
if (position < deck.size) {
|
|
290
|
+
return deck.removeAt(position)
|
|
291
|
+
}
|
|
292
|
+
resetDeck()
|
|
293
|
+
return deck.removeAt(position)
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
→ **`position >= deck.size` 면 resetDeck + removeAt(position)** — *resetDeck 후 새 덱이 적어도 position+1 장*. *Card.cards.shuffled().toMutableList()* = *52장*. *position < 52* 면 정합. *position == 52* 같은 경계 케이스에서 *IndexOutOfBoundsException* 가능성. *position 인자 자체*가 *외부 책임 노출*. PR #108·#133 (시아) 의 *카드 부족 시 자동 셔플* 패턴과 다름.
|
|
298
|
+
|
|
299
|
+
### 16. `Bust.earningRate(): Double = -1.0` Dead code 가능성 — 못한 점 §3 보강
|
|
300
|
+
|
|
301
|
+
```kotlin
|
|
302
|
+
class Bust(hand: Hand) : Finished(hand) {
|
|
303
|
+
override fun earningRate(): Double = -1.0
|
|
304
|
+
|
|
305
|
+
override fun calculate(opponent: State): GameResult {
|
|
306
|
+
return Lose
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
→ **`Bust.earningRate(-1.0)` 추상 메서드 구현이지만 *호출 흐름에서 미사용***. *Bust.calculate → Lose → Finished.profit → `is Lose → -betAmount`* 분기 — *earningRate 호출 없음*. *추상 메서드 계약* + *실 사용 0* = *dead code*. *Finished.profit 의 `else -> betAmount * rate`* 가 *earningRate 사용처* 인데 *Bust 는 항상 Lose 분기*.
|
|
312
|
+
|
|
313
|
+
*해결*: *Finished.profit 의 `is Lose → betAmount * rate` (Bust 는 rate=-1 이므로 -betAmount)* 가 *통일*. 현재는 *분기 분리 + earningRate 일부 dead*.
|
|
314
|
+
|
|
315
|
+
### 17. `let / run` 함수 함정 학생 자가 검증
|
|
316
|
+
|
|
317
|
+
학생 자가 실험 코드:
|
|
318
|
+
```kotlin
|
|
319
|
+
fun main() {
|
|
320
|
+
var test: Int? = 1
|
|
321
|
+
test?.let {
|
|
322
|
+
println("let 실행됨")
|
|
323
|
+
test = null
|
|
324
|
+
null
|
|
325
|
+
} ?: run {
|
|
326
|
+
test = 1
|
|
327
|
+
println("run 실행됨")
|
|
328
|
+
}
|
|
329
|
+
println(test)
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
말리빈 답변: *"네! 맞아요. 생각보다 null을 반환하는 메서드들이 꽤나 많답니다. 특히 java의 메서드가 non-null 이라고 착각했을 때 자주 발생하게 되지요. 지금은 예시 코드를 작성하시면서 \"무슨 이런 말도안되는 일이 발생할까? 너무 방어적인것 아닐까?\" 하는 생각이 드실 수 있겠지만, 생각보다 자연스러운 코드인데도 이런 현상이 발생해버린다면, 디버깅할때 굉장히 골치아파진답니다. 코드는 자연스러운데, 실행은 비정상적이니, 원인을 찾아내는 데 굉장히 어려워지게돼요."*
|
|
334
|
+
|
|
335
|
+
→ **let / run 함수 함정 = null 반환 시 두 블록 실행**. *학생이 자가 검증 코드 작성 → 함정 확인 → 후속 반영*. *Kotlin scope function 학습 모범*. **MCP 룰 후보 — `let-run-elvis-pitfall`**.
|
|
336
|
+
|
|
337
|
+
## 리뷰어 의견 요지
|
|
338
|
+
|
|
339
|
+
- **State 패턴 정공 (Running/Finished + Blackjack/Bust/Stay)** + **타입 캐스팅 제거 = 다형성 활용**.
|
|
340
|
+
- **sealed vs enum = 필요한 만큼만**. *멤버 별 데이터 차이 없으면 enum*. *코드 이해 시 *왜 sealed 인가* 의문 = 인지 비용*.
|
|
341
|
+
- **bidirectional dependency = 부모-자식 결합도 증가 + SRP 위반** — 학생 자가 학습 + 해소.
|
|
342
|
+
- **Demeter + 위임 메서드** — *a.b.c.d 점 체인 회피*.
|
|
343
|
+
- **scope function 함정 — let의 null 반환 시 run 도 실행** — *디버깅 어려움*.
|
|
344
|
+
- **랜덤 요소 최소화 = 카드 한 장 가져오는 인터페이스** — *position 인자는 외부 책임 노출*. *현재 DeckManager.resetDeck + drawCard(position)* 는 *외부 제어 표면*. *진짜 인터페이스 = `fun draw(): Card`*.
|
|
345
|
+
- **명명 = 의미 표현** — *`newCardHolder` (print용 람다인지 알기 어려움)*, *`from / of` 경계 명료*, *BlackjackState vs Blackjack 모호*.
|
|
346
|
+
- **추상화 = 공통의 요소 뽑기** — *Player/Dealer 의 shouldDrawCard 공통 메서드 다형성 시도* + *Game 객체 분리 권고*.
|
|
347
|
+
- **`라면 끓이기` 비유 = 함수 이름이 *과정 설명* X, *결과/의도* O** — *카드의 합산 가져오기 / 손계산하기 한 단어*.
|
|
348
|
+
- **단일 책임 (`Card.create` vs `companion val card` 중복)** — *불필요한 코드 다듬기*.
|
|
349
|
+
|
|
350
|
+
## 대표 인용
|
|
351
|
+
|
|
352
|
+
**말리빈 (sealed vs enum, GameResult.kt:10):**
|
|
353
|
+
> enum은 말씀해주신 위 장점이 존재하지 않았나요?
|
|
354
|
+
> ...
|
|
355
|
+
> 특별하게 장점을 살리고 있지 않다면, 저는 필요한 부분만 가져가는 것이 코드를 이해하는 데 불필요한 생각이 들지 않게 해준다 생각해요.
|
|
356
|
+
> 이렇게 할거면 왜 enum을 쓰지 않았지? 라는 의문을 들게하는 것 부터, 코드를 이해하는 데 벌써 한 번의 멈춤이 생겼다고 생각해요.
|
|
357
|
+
> 저는 최대한 필요에 의해 코드를 구성하는 것을 선호해요 :)
|
|
358
|
+
|
|
359
|
+
**말리빈 (랜덤 요소 최소화 + 인터페이스 추상화, DeckManager.kt:7):**
|
|
360
|
+
> 이전 피드백에 이어서,
|
|
361
|
+
> 기대한 인터페이스는 카드 단 한장만을 가져오는 메서드만 가진 인터페이스였어요.
|
|
362
|
+
> ```kotlin
|
|
363
|
+
> interface ~ {
|
|
364
|
+
> fun getCard(): Card
|
|
365
|
+
> }
|
|
366
|
+
> ```
|
|
367
|
+
>
|
|
368
|
+
> 랜덤의 요소를 최소화해본다 라는 것에 가장 많이 고민해보세요.
|
|
369
|
+
> reset은 랜덤의 요소였을지, position은 랜덤의 요소였을지 연관지어서요!
|
|
370
|
+
>
|
|
371
|
+
> 1, 2 단계 미션에서 배운 것들을 완전히 자신의 것으로 만들어보세요 :)
|
|
372
|
+
> 미션을 모두다 다시 한 번 구현해보는 것도 좋은 방법이 될 거예요 🙂
|
|
373
|
+
|
|
374
|
+
**말리빈 (scope function 함정, GameDeck.kt):**
|
|
375
|
+
> if - else 를 활용하는 것이 가독성에 더욱 도움이 되는 경우가 많아요.
|
|
376
|
+
>
|
|
377
|
+
> 또, 이런 형태를 잘못 사용하게 된다면 let 블럭과 run 블럭 모두가 실행되는 말도 안되는 상황이 발생할 수도 있어요.
|
|
378
|
+
> let 스코프 함수 내부에 잘못된 코드를 작성했을 때 발생하게 되겠는데요,
|
|
379
|
+
> 어떤 경우에 두 스코프가 다 실행 될 수 있을지 고민해보시면 좋겠어요!
|
|
380
|
+
|
|
381
|
+
**말리빈 (라면 끓이기 비유, CardHolder.kt):**
|
|
382
|
+
> `카드의 합산 가져오기` `손계산하기` 이 둘에 대한 이름은 한 단어를 가리키기도 하네요.
|
|
383
|
+
>
|
|
384
|
+
> `냄비에물550ml를넣고빨간가루가들어있는손바닥만한봉투를뜯어물에뿌린다음100도씨까지올려서건조된밀가루무언가를넣고3분간기다린다`
|
|
385
|
+
> 라는 이름보다,
|
|
386
|
+
> `라면 끓이기`
|
|
387
|
+
> 라는 이름을 지어보는 연습을 해보세요 :)
|
|
388
|
+
|
|
389
|
+
**말리빈 (Player/Dealer 공통 추상화 + Game 객체 권고, Dealer.kt):**
|
|
390
|
+
> 입력을 받아오기 위한 람다 등은 최대한 깊이를 깊게 가져가지 않았으면 했어요.
|
|
391
|
+
> 게임을 관제하는 객체를 하나 만들어둔다면 이런 람다를 도메인 깊이 알지 않을 수 있으니까요.
|
|
392
|
+
> 그래서 처음에 달아둔, ... 이 피드백을 남겨두기도 했었지요!
|
|
393
|
+
> 그렇다면 플레이어나 딜러나 그저 카드를 받기만 할 수 있는 객체가 되고, 줄 지 말 지는 게임 객체가 판단해줄 수도 있었겠지요!
|
|
394
|
+
> 추상화를 활용한다면 최대한 공통의 요소를 뽑아내려 고민을 많이 해보세요.
|
|
395
|
+
|
|
396
|
+
**말리빈 (bidirectional dependency, CardHolder.kt):**
|
|
397
|
+
> 부모가 자식을 알고 있는 형태이네요!
|
|
398
|
+
> 양방향 의존 관계가 생겨나기도 했구요.
|
|
399
|
+
> 둘은 어떤 문제점이 생길 수 있을까요?
|
|
400
|
+
|
|
401
|
+
**학생 자가 학습 (let / run 함정 자가 실험, GameDeck.kt):**
|
|
402
|
+
> ```kotlin
|
|
403
|
+
> fun main() {
|
|
404
|
+
> var test: Int? = 1
|
|
405
|
+
> test?.let {
|
|
406
|
+
> println("let 실행됨")
|
|
407
|
+
> test = null
|
|
408
|
+
> null
|
|
409
|
+
> } ?: run {
|
|
410
|
+
> test = 1
|
|
411
|
+
> println("run 실행됨")
|
|
412
|
+
> }
|
|
413
|
+
> println(test)
|
|
414
|
+
> }
|
|
415
|
+
> ```
|
|
416
|
+
> let과 run 블럭 모두 실행되는 경우가 위 상황처럼 let에서 null을 반환하는 경우일까요?!
|
|
417
|
+
> 위 같은 오류가 발생할 수 있다고 판단하여 수정했습니다!
|
|
418
|
+
|
|
419
|
+
**학생 자가 답변 (sealed → enum 자가 후퇴, GameResult.kt:10):**
|
|
420
|
+
> 맞습니다ㅠㅠ 제가 잘못알고있었습니다 위에 sealed interface는 특별하게 장점을 살리고 있지는 않은 것 같습니다.
|
|
421
|
+
> 그러나 추후에 BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요할 것 같습니다!
|
|
422
|
+
> ...
|
|
423
|
+
> 저도 말리빈처럼 왜라고 말했을 때 답하는 것을 중요시하는데 위 부분에서 sealed class의 장점을 살리지 못한다면 enum으로 수정해야할 것 같습니다!
|
|
424
|
+
|
|
425
|
+
**학생 자가 답변 (bidirectional dependency 해소, CardHolder.kt):**
|
|
426
|
+
> 부모와 자식간에 결합도가 증가하여 유지보수가 힘들어질 것 같습니다! 단일 책임 원칙도 위반 될 것으로 보입니다! 의존성을 제거하고 코드를 간소화했습니다!
|
|
427
|
+
|
|
428
|
+
**학생 자가 답변 (Player/Dealer 추상화 한계 + 추가 학습 의지, Dealer.kt):**
|
|
429
|
+
> 흠 공통으로 갖고 있어서 interface를 통해 추상화하려고 했지만.. Dealer의 shouldDrawCard는 본인의 카드 점수 합에 따라서 값이 달라지고 Player의 shouldDrawCard는 사용자의 입력에 따라서 달라지기 때문에 추상화가 쉽지 않은 것 같습니다!
|
|
430
|
+
> ...
|
|
431
|
+
> 저도 그것에 대해서 고민이 많았고 해결하고 싶었지만 해결하지 못했네여ㅠㅠ 좀 더 고민해보겠습니다! 감사합니다!!
|
|
432
|
+
|
|
433
|
+
## 얻은 교훈
|
|
434
|
+
|
|
435
|
+
1. ***State 패턴 정공 = sealed + 다형성 + 외부 if 0개***. *Running (Hit) → Finished (Blackjack/Bust/Stay)* 계층 + *calculate/profit 메시지 다형성*. *호출자가 if (state is X) 분기 0개* 가 *State 패턴 핵심*. PR #136·#152·#133·#131 와 같은 결.
|
|
436
|
+
|
|
437
|
+
2. ***sealed vs enum = 필요한 만큼만***. *멤버 별 데이터 차이 없으면 enum 충분*. *sealed = 멤버 별 다른 데이터/메서드 가능*이 진짜 장점. *"왜 sealed?"* 의문 자체가 *코드 이해 비용*. **MCP 룰 후보 — `sealed-without-differentiation`**. PR #136 (밀러 2단계) 의 *sealed class 선택 근거 명시* 와 *반대 트레이드오프*.
|
|
438
|
+
|
|
439
|
+
3. ***bidirectional dependency = 부모-자식 결합도 증가 + SRP 위반***. *부모가 자식 알고 있는 형태* = *수정의 파급 범위 ↑*. *DIP* 위반 가능성. 학생 자가 학습 + 해소 모범. **MCP 룰 후보 — `bidirectional-dependency`**.
|
|
440
|
+
|
|
441
|
+
4. ***Kotlin scope function 함정 — `let의 null 반환 시 elvis run 도 실행`*** — *Java non-null 가정 오류 + 디버깅 어려움*. *학생 자가 실험 + 검증 모범*. **MCP 룰 후보 — `let-run-elvis-pitfall`** (Kotlin 한정).
|
|
442
|
+
|
|
443
|
+
5. ***랜덤 요소 최소화 = 카드 한 장 받는 인터페이스***. *`fun draw(): Card`* 단일 메서드. *position 인자, reset 메서드* 는 *외부 책임 노출 + 랜덤 요소 X*. *DeckManager 의 진짜 책임 = 카드 한 장 제공*. *진짜 추상화 = 가장 단순한 메시지*. PR #108·#133·#136 와 같은 결.
|
|
444
|
+
|
|
445
|
+
6. ***도메인 vs View 책임 = 문자열 파싱은 View, 검증은 도메인***. *PR #93 학생 자가 학습 + 후속 반영*. PR #132·#133·#88 와 같은 결의 *View 의도 표현*.
|
|
446
|
+
|
|
447
|
+
7. ***`라면 끓이기` 비유 = 함수 이름은 결과/의도, 과정 설명 X***. *`카드의 합산 가져오기` vs `손계산하기`* 한 단어 가리키면 *합치기*. *Kotlin 어휘에서 *짧고 의미 있는 이름** 정공. PR #128·#114 의 *vagueName 안티패턴* 과 *반대 방향*.
|
|
448
|
+
|
|
449
|
+
8. ***명명 모호함 (`BlackjackState` vs `Blackjack`)*** — *개발자가 내부 구현 봐야 차이 알면 명명 실패*. *State 로 변경* 자가 반영 → *1단계 피드백 회귀*. PR #128·#136·#88 와 같은 결의 *naming = 책임 표현*.
|
|
450
|
+
|
|
451
|
+
9. ***`UserInfo` 만능 명사 = vagueName 변형***. *Information* 어휘는 *책임이 안 잡힌 곳에 등장*. *Player(nickname, betAmount)* 직접 인자가 *명시*. 다만 *Player + Dealer 공통 정보 응집* 시 정당화 가능. PR #88·#125·#114 의 *vagueName 안티패턴 확장*.
|
|
452
|
+
|
|
453
|
+
10. ***`Running.calculate = Lose` silent failure***. *진행 중 상태에서 결과 메서드 호출 시 무조건 Lose 반환*. *throw IllegalStateException 가 정공*. *PR #152 (모찌 2단계) 의 Hit.profit throw* 와 *반대 트레이드오프*. *silent = 디버깅 어려움*.
|
|
454
|
+
|
|
455
|
+
11. ***`Bust.earningRate` Dead code 가능성 = State 추상 메서드 통일 부작용***. *Bust.calculate = Lose → Finished.profit 의 `is Lose → -betAmount` 분기 → earningRate 미사용*. *추상 메서드 계약 일관성 vs 실 사용 일치성* 트레이드오프.
|
|
456
|
+
|
|
457
|
+
12. ***고차함수 + 명시적 인터페이스 = 입력 콜백 추상화***. *`drawCard(card: () -> Card, shouldDrawCard: () -> Boolean, showPlayerCards: (CardHolder) -> Unit)`* 3 콜백 인자. *PR #132 (환노) 의 고차함수 시도 + 깊이 문제* 와 *비슷한 트레이드오프* — junjange 는 *적정 깊이로 안착*.
|
|
458
|
+
|
|
459
|
+
13. ***`Hit.draw(card)` 가변 변경 + 새 State 반환 = 불변 표면 + 깊은 가변***. PR #85 (하디 2단계) 와 같은 결. *완전 불변 = Hand(cards + card) 새 Hand 생성*. *현재 hand.add(card) 가변 호출 → 같은 hand 참조 새 State* = *호출자 혼란 가능성*.
|
|
460
|
+
|
|
461
|
+
14. ***`return@repeat` = continue 의미, Kotlin repeat 에는 break 없음***. *Ace 보정 패턴 정확*하지만 *break 의도 모호*. *while loop* 이 *break 의도 명시*. *Kotlin 어휘 미숙자 함정*.
|
|
462
|
+
|
|
463
|
+
15. ***Card.cards companion val = 전역 카드 풀 위치 모순***. *Card = 1장* 인데 *Card.cards = 52장 풀*. *DeckManager.STANDARD_DECK* 또는 *Deck companion val* 이 자연. PR #108·#133 와 같은 결.
|
|
464
|
+
|
|
465
|
+
16. ***학생 자가 학습 + 자가 실험 (let/run 검증 코드) + 자가 후퇴 (sealed → enum) = 학습 가시화 최고 수준***. *말리빈 깊은 진단 → 학생 자가 검증/실험 → 자가 결론 + 후속 반영* 흐름이 *모범 학습*. PR #128·#135·#108·#133·#136 와 같은 결의 학생 자가 토론 풍부 패턴.
|