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,459 @@
|
|
|
1
|
+
# PR #137 — [블랙잭 2단계] 미플 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@HamBeomJoon](https://github.com/HamBeomJoon)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/137
|
|
5
|
+
- **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
|
|
6
|
+
- **리뷰어:** @lee-ji-hoon (지훈) — *신규 리뷰어*. 학생 자가 답변 + 커밋 SHA 첨부 풍부.
|
|
7
|
+
- **라인 코멘트:** 21 스레드 / 42 코멘트 — *원시값 포장 + 도메인-뷰 분리 + ResultType enum 부가속성* 깊은 토론
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`ResultType enum + profit: Double 부가속성`** — 지훈 권고: *"게임 결과에 따른 이익률을 게임 결과가 알고 있어도 되지 않을까? `enum class ResultType(val profit: Double) { WIN(1.0), TIE(0.0), LOSS(-1.0), BLACKJACK(1.5); }` 그렇게 되면 `calucateProfit` 함수도 조금 더 간결하게 표현이 됐을 것 같네요!"* 후속 반영 (커밋 `f1a40f9`). 학생 자가 답변: *"와..😲 enum class에 대해 좀 더 공부해보겠습니다!"*. PR #132·#90 와 같은 결의 *enum 부가 속성 응집*.
|
|
12
|
+
- **`BetAmount @JvmInline value class` + `value` 멤버 명명 자가 반영** — 지훈 권고: *"저는 value class에서는 그냥 value라고 해두는 편입니다. `val amount = BetAmount(value = 10.0); amount.value`"* 후속 반영 (커밋 `0b30903`). *Kotlin value class 어휘 학습 모범*.
|
|
13
|
+
- **`WinningMoney value class` + `BetAmount value class` 분리** — 지훈 권고 *"저희는 원시값을 가능한 다 포장을 해보는 연습을 해보기로 했습니다. 모르는 사람이 봤을 때 이 Double이 무엇을 의미하는지 알기가 어렵기도 하죠"* 후속 반영 (커밋 `8a673e0`). PR #49·#90·#132·#136 와 같은 결.
|
|
14
|
+
- **`Profit(participant, winningMoney)` 결과 객체 응집** — `Profit` 클래스 도입으로 *Map<Player, WinningMoney>* 우회. *PR #132 (환노 2단계) 의 Map<X,X> 지양* 와 같은 결.
|
|
15
|
+
- **`ResultCalculator.judgeState(dealer, player)` `when` 절 변환** — 지훈 권고 *"하나의 함수에서 많은 if문이 열리게 될 경우 가독성이 떨어지게 됩니다. 이렇게 한 번 바꿔볼까요?"* 후속 반영 (커밋 `2eac33b`). *if 분기 → when 패턴 매칭* Kotlin 어휘 정공.
|
|
16
|
+
- **`Participant.cards = _cards.toList()` 방어적 복사 자가 학습** — 지훈 메타 질문 *"여기서 map으로 `it.copy` 를 한 대상이 `Card` 객체인데요! 이렇게 했을 때 어떤 이점이 있다고 판단을 해서 수정을 하신걸까요?"* + 학생 자가 학습 답변: *"`_cards.toList`와 `val cards: List<Card> get() = _cards.map { it.copy() }.toList()` 여러 테스트를 해보면서도 무슨 차이지..하고 차이를 못 느꼈지만 ... 좀 더 공부해보니 cards안에 있는 내부 객체 Card가 변하게 될 때 두 코드의 차이가 있는 것 같습니다. 현재는 Card의 shape, Number 둘다 val이어서 변할 일이 없기때문에, it.copy()를 하면 괜히 복사비용만 추가된다 생각해 _cards.toList()로 바꿨습니다"* (커밋 `13cf13a`). **불변 객체에 deepCopy 강박 자가 인식 + 후속 반영 모범**. PR #124 (모찌 1단계) 의 *Card.copy 강박* 와 *반대 방향 학습*.
|
|
17
|
+
- **`BlackjackGame.startGame(wantsToDraw, onEndPlayerTurn, onEndDealerTurn, printAllHands)` 콜백 인터페이스 자가 학습** — 지훈 진단: *"`BlackjackGame` 이 View의 역할도 하고 있습니다. `println`을 호출하고 있기도 하고 간접적으로나마 print라는 lambda으로 인해서 간접적으로라도 알고 있는 느낌이기도 하죠. lambda 이름들을 이런 형태로 바꿔보면 어떨까요? `onEndDelaerTurn` 이런 형태로 지금 어떠한 행위가 끝났는지를 명시하고 그 행위를 사용하는 곳에서 무엇을 할지를 선택을 하는 것인데요."* 후속 반영 (커밋 `e90b497`). **콜백 = 행위 명시 (`onXX`) 표준 어휘 학습**. PR #132 (환노 2단계) 의 *고차함수 + 인터페이스* 와 같은 결.
|
|
18
|
+
- **View 계산 로직 → GameManager 이전 자가 반영** — 지훈 진단 *"갑자기 View에서 계산하는 로직을 하고 있는데요! 딜러의 수익도 게임 결과를 합산할 때 처리하고 들어와야 하지 않을까요?"* 후속 반영 (커밋 `f8f3b9a`). PR #132·#90·#88·#41·#53 와 같은 결.
|
|
19
|
+
- **`println` View 이전 자가 반영** — 지훈 진단 *"println을 직접 호출하는 것도 고민해볼만한 포인트입니다."* + 학생: *"println을 view로 이동시켰습니다."* (커밋 `4bff807`). **도메인 = println X 정공**. PR #58 와 같은 결.
|
|
20
|
+
- **`mark` 자가 학습 표현 + 학생 자가 답변 풍부** — 지훈 권고 *"마음에 안 드는 이유를 이야기를 해줬으면 좋겠어요!"* + 학생 자가 답변 *"단순히 메서드 줄 수가 늘어나서 그랬던 것 같습니다. 상태를 먼저 판단하고 그뒤에 점수비교를 하도록 분리를 해봤습니다"* (커밋 `d1b51e8`). **메타 토론 + 자가 의도 명시 학습 모범**.
|
|
21
|
+
- **`BetAmount value class + 확장 함수 → BetAmount Double 직접` 자가 학습** — 지훈 메타 질문: *"BetAmount 자체가 Int가 아닌 Double을 받는다고 생각했을 때 어색할까요?"* + 학생 자가 답변: *"BetAmount를 Double로 받도록 했는데, 결국 확장함수를 없애니 player.betAmount.amount로 코드길이는 그대로 유지 되는 것 같습니다😅"* + 지훈: *"네 코드 길이는 유지가 되지만 굳이 필요 없던 `toDouble()` 확장 함수는 사라졌으니 유의미하지 않았을까요!.."* (커밋 `970fcb9`). **YAGNI + 도메인 타입 직접 Double 자가 학습**.
|
|
22
|
+
- **테스트 명세 정확성 자가 반영** — 지훈 진단 *"단순히 `딜러의 점수보다 크면 이긴다`라는 조건은 아닐 것 같아요! 이 테스트 함수명만 봤을 때는 아래와 같은 조건에서도 이긴다는 것 같아요 플레이어 : 24 / 딜러 : 19"* + 학생: *"구체적으로 명시해줬습니다!"* (커밋 `0e6ab44`). **테스트 명세 = 도메인 룰 정확** 학습.
|
|
23
|
+
- **이익 vs 수익 어휘 자가 학습** — 지훈 메타 질문 + 학생 자가 답변: *"이익과 수익을 잘 모르고 사용한 것 같습니다."* + 추가 자가 질문: *"그러면 그냥 승리했을 때는 `승리했을때 수익은 배팅 금액의 0%이다`라고 작성을 해야 하나요??"* — 지훈 자가 인정: *"아니네요 😂 제가 잘못 오해했었네요"*. **상호 학습 = 학생/리뷰어 양방향**. PR #128·#135 와 같은 결의 *학생-리뷰어 양방향 학습*.
|
|
24
|
+
- **`BlackjackGame` 통합 테스트 자가 추가** — 지훈 권고 *"게임의 전체 흐름이 정상적으로 진행되는지 통합 테스트를 작성하는 것이 좋습니다."* 후속 반영 (커밋 `24ca825`).
|
|
25
|
+
|
|
26
|
+
## 못한 점 (설계 관점)
|
|
27
|
+
|
|
28
|
+
### 1. `BlackjackGame.dealerDrawPhase` — *while 안에 print 콜백 + condition 이중 검사*
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
private fun dealerDrawPhase(printDealerHandStatus: (Boolean) -> Unit) {
|
|
32
|
+
val condition = dealer.isMoreCard()
|
|
33
|
+
if (!condition) {
|
|
34
|
+
printDealerHandStatus(false)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
while (dealer.isMoreCard()) {
|
|
38
|
+
printDealerHandStatus(true)
|
|
39
|
+
gameManager.drawCard(dealer)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
→ **`isMoreCard()` 호출 + condition 변수 + while 다시 호출**. *condition 사용 한 번 + while 재호출*. *Kotlin 어휘 = `if (dealer.isMoreCard()) { while (...) } else { printDealerHandStatus(false) }` 또는 `while + 첫 iteration 출력 분리`*. *변수 1회 사용 + while 동일 메서드 호출* 가 *함수 호출 중복*.
|
|
45
|
+
|
|
46
|
+
또한 `dealer.score < DEALER_MORE_CARD_MINIMUM (17)` 조건이 *17 미만이면 hit* — 정확. 다만 *Bust 도달 시 dealer.score = > 21* 도 *17 미만 아니므로 while 종료* — 정합.
|
|
47
|
+
|
|
48
|
+
### 2. `Player.getInitialCard(): List<Card> = cards` — *Player 전체 카드 노출*
|
|
49
|
+
|
|
50
|
+
```kotlin
|
|
51
|
+
class Player(...) : Participant(name) {
|
|
52
|
+
override fun getInitialCard(): List<Card> = cards // ⚠ 전체 카드
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
class Dealer(...) : Participant(name) {
|
|
56
|
+
override fun getInitialCard(): List<Card> = listOf(cards.first()) // 딜러 1장
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
→ **`Player.getInitialCard` = *전체 cards 반환*** — *블랙잭 공개 룰 = 플레이어 2장 공개, 딜러 1장 공개*. *Player 가 *모든 카드* 반환* = *플레이어 손패 수 무관 모두 공개*. *초기 2장 공개* 의도면 `cards.take(2)`. *현재 cards = 초기 + 추가 hit 모두 포함* → *Player 의 모든 카드 공개*.
|
|
61
|
+
|
|
62
|
+
학생 의도 = *Player 는 모든 카드 공개* + *Dealer 만 첫 1장*. *블랙잭 룰 정합* (플레이어 손패 전부 공개). 다만 *naming `getInitialCard` = 초기 카드* 어휘 — *Player 의 경우 전체 카드 반환*은 *naming 부정확*. PR #132 (환노) 의 *Player.getInitCard = cards.take(2)* 와 *다른 트레이드오프*.
|
|
63
|
+
|
|
64
|
+
### 3. `ResultCalculator object` 정적 헬퍼 — *Tell-Don't-Ask 미달*
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
object ResultCalculator {
|
|
68
|
+
const val BLACKJACK_NUMBER = 21
|
|
69
|
+
...
|
|
70
|
+
fun calculate(cards: List<Card>): Int { ... }
|
|
71
|
+
fun judgeScore(dealer: Dealer, player: Player): ResultType { ... }
|
|
72
|
+
private fun judgeState(dealer: Dealer, player: Player): ResultType? { ... }
|
|
73
|
+
...
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
지훈 (ResultCalculator.kt — 미해결): *"여기는 그래도 리뷰를 남겨보면, 블랙잭의 특성상 딜러의 점수를 플레이어가 비교를 해서 승패가 나눠지는데요. 그런 관점에서 봤을 때 `참가자 스스로가 다른 참가자의 점수를 비교해서 본인이 어떠한 상태인지 반환하는 게 객체지향적으로 그렇게 이상한 일일까? 본인의 점수를 이미 알고 있는데?` 이 부분을 고민해 봐도 좋을 것 같네요!"*
|
|
78
|
+
|
|
79
|
+
→ **`ResultCalculator object` = 정적 헬퍼**. *Player.compareScores(dealer)* 같은 *Player 메시지* 가 *Tell-Don't-Ask 정공*. *PR #132·#136·#152·#108·#133·#49 의 *참가자 자기 비교 메서드** 와 같은 결의 *반대 트레이드오프*. 미플은 *Calculator 응집* 선택. **MCP 룰 후보 — `judge-as-static-helper`** 변형.
|
|
80
|
+
|
|
81
|
+
### 4. `Participant.score: Int get() = ResultCalculator.calculate(cards)` — *매 호출 재계산*
|
|
82
|
+
|
|
83
|
+
```kotlin
|
|
84
|
+
val score: Int
|
|
85
|
+
get() = ResultCalculator.calculate(cards)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
→ **`score` getter 가 매 호출 `calculate(cards)` 재계산**. *Hand 변경 안 되면 같은 score* — *캐싱 가능*. *PR #136 (밀러 2단계) 의 *Score.value get() = calculateTotalSum()* 와 같은 결*. *순수 함수면 by lazy 적용 가능 — Participant 의 cards 가 가변 (addCard)* 이라 *by lazy 불가*. *score 계산 비용 작음 + 매 호출 정확성 보장*. 미세 비효율.
|
|
89
|
+
|
|
90
|
+
### 5. `Player.betAmount: BetAmount` + `Player.getInitialCard()` 책임 모호
|
|
91
|
+
|
|
92
|
+
```kotlin
|
|
93
|
+
class Player(name: String, val betAmount: BetAmount) : Participant(name) { ... }
|
|
94
|
+
|
|
95
|
+
class Dealer(name: String = DEALER_NAME) : Participant(name) { ... }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
→ **Player 만 betAmount 보유, Dealer 베팅 안 함**. PR #103·#85·#136 와 같은 결의 *Dealer ≠ Player*. **정공**.
|
|
99
|
+
|
|
100
|
+
### 6. `Player.cards` 가 *외부 변경 불가능* — *방어적 복사 정공*
|
|
101
|
+
|
|
102
|
+
```kotlin
|
|
103
|
+
private val _cards: MutableList<Card> = mutableListOf()
|
|
104
|
+
val cards get() = _cards.toList()
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
→ **`_cards.toList()` = immutable view**. *외부 변경 차단*. *PR #58 (수달) 의 _cards.toList* 와 같은 결 + *학생 자가 학습 (Card.copy 강박 회피)* 모범.
|
|
108
|
+
|
|
109
|
+
### 7. `BlackjackGame.startGame` 의 *4 콜백 인자* — *고차함수 + 책임 분산*
|
|
110
|
+
|
|
111
|
+
```kotlin
|
|
112
|
+
fun startGame(
|
|
113
|
+
wantsToDraw: (Player) -> DrawChoice,
|
|
114
|
+
onEndPlayerTurn: (Player) -> Unit,
|
|
115
|
+
onEndDealerTurn: (Boolean) -> Unit,
|
|
116
|
+
printAllHands: () -> Unit,
|
|
117
|
+
) {
|
|
118
|
+
gameManager.dealInitialCards()
|
|
119
|
+
printAllHands()
|
|
120
|
+
if (!dealer.isBlackjack()) {
|
|
121
|
+
players.forEach { playerDrawPhase(it, wantsToDraw, onEndPlayerTurn) }
|
|
122
|
+
dealerDrawPhase(onEndDealerTurn)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
→ **4 람다 인자 = 고차함수 패턴**. *Tell-Don't-Ask 정공 + 도메인 자기 진행*. 다만 *4 람다 = 호출자 부담 ↑*. PR #132 (환노 2단계) 의 *고차함수 시도 + 깊이 문제* 와 같은 결.
|
|
128
|
+
|
|
129
|
+
지훈 진단 (BlackjackGame.kt — 미해결): *"지금은 `BlackjackGame` 이 View의 역할도 하고 있습니다. `println`을 호출하고 있기도 하고 간접적으로나마 print라는 lambda으로 인해서 간접적으로라도 알고 있는 느낌이기도 하죠. lambda 이름들을 이런 형태로 바꿔보면 어떨까요? `onEndDelaerTurn` 이런 형태로 지금 어떠한 행위가 끝났는지를 명시하고 그 행위를 사용하는 곳에서 무엇을 할지를 선택을 하는 것인데요."*
|
|
130
|
+
|
|
131
|
+
→ **콜백 = 행위 명시 (`onXX`) 패턴**. *`printPlayerHands` (행위)* → *`onEndPlayerTurn` (행위 끝)* 변환. *호출자가 무엇을 할지 결정*. *Inversion of Control* 패턴.
|
|
132
|
+
|
|
133
|
+
### 8. `BlackjackGame.calculateResults(): List<Profit> = gameManager.gameResult(gameManager.calculateResultMap())` — *Profit 합산 + 나중에 분리*
|
|
134
|
+
|
|
135
|
+
```kotlin
|
|
136
|
+
fun calculateResults(): List<Profit> = gameManager.gameResult(gameManager.calculateResultMap())
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
학생 자가 답변 (OutputView 토론): *"profitResults에는 GameManager.gameResult에서 만들어준 playerProfits + dealerProfit순서로 저장된 List<Profit>이 저장되어있습니다. 출력에서 딜러수익을 먼저 출력하고 플레이어들의 수익을 출력해야해서 이렇게 했습니다. 우선 지금의 출력순서를 위해 gameResult()를 dealerProfit + playerProfits 순서로 변경해서 forEach만 써서 돌아가게했습니다만, 수익출력 순서가 또 바뀌면 gameResult에서 리스트 순서를 바꿔줘야할 것 같아서 outputview에서 처리를 하는 것이 좋아보입니다!"*
|
|
140
|
+
|
|
141
|
+
→ **`List<Profit> = 딜러 + 플레이어들 통합 리스트** — *순서 의존*. *Map<Participant, WinningMoney>* 또는 *별도 BlackjackResult(dealer: Profit, players: List<Profit>)* 객체가 *순서 의존 회피*. PR #132 (환노 2단계) 의 *BlackjackResult* / PR #49 (써니) 의 *ParticipantsProfitResult* 와 같은 결.
|
|
142
|
+
|
|
143
|
+
### 9. `GameManager.dealInitialCards + dealInitialCardWithCount` — *두 메서드 책임 모호*
|
|
144
|
+
|
|
145
|
+
```kotlin
|
|
146
|
+
fun dealInitialCards() {
|
|
147
|
+
deck = Deck() // ⚠ 매 호출 새 Deck (재할당)
|
|
148
|
+
dealInitialCardWithCount()
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
fun dealInitialCardWithCount() {
|
|
152
|
+
repeat(INITIAL_HAND_OUT_CARD_COUNT) {
|
|
153
|
+
dealer.addCard(deck.draw())
|
|
154
|
+
players.forEach { player -> player.addCard(deck.draw()) }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
→ **`dealInitialCards` 가 *Deck 재할당 + dealInitialCardWithCount 호출***. *Deck 재할당이 매 라운드 시작 시 = 새 카드 풀*. *var deck* — 가변. *PR #133 (시아 2단계) 의 BlackjackEngine.cardDeck 직접 생성* 과 같은 결.
|
|
160
|
+
|
|
161
|
+
또한 두 메서드의 *책임 분리*가 *재할당 + 분배*. *dealInitialCardWithCount* 가 *internal*이지만 *public + Suffix `WithCount`* — *Kotlin 어휘 어색*.
|
|
162
|
+
|
|
163
|
+
### 10. `BlackjackGame.startGame` 의 *Dealer 블랙잭 조기 종료* — *룰 정확성 신호*
|
|
164
|
+
|
|
165
|
+
```kotlin
|
|
166
|
+
gameManager.dealInitialCards()
|
|
167
|
+
printAllHands()
|
|
168
|
+
if (!dealer.isBlackjack()) { // ⚠ 딜러 블랙잭 시 플레이어 턴 + 딜러 턴 모두 skip
|
|
169
|
+
players.forEach { playerDrawPhase(it, ...) }
|
|
170
|
+
dealerDrawPhase(...)
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
→ **딜러 블랙잭 시 모든 진행 skip**. *카지노 룰 = 딜러 블랙잭 시 플레이어 블랙잭 만 무승부, 나머지 패배*. *플레이어 hit 기회 없음* 정확. 다만 *플레이어 자기 블랙잭 vs 딜러 블랙잭 = TIE 처리* 가 *ResultCalculator.judgeState 에서*. *룰 정확성*.
|
|
175
|
+
|
|
176
|
+
PR #136 (밀러 2단계) 의 *Pair → Hand` 전략* 과 다른 트레이드오프.
|
|
177
|
+
|
|
178
|
+
### 11. `ResultCalculator.calculate` 의 *`while (countAce-- > 0)` Ace 처리* — *Kotlin 어휘*
|
|
179
|
+
|
|
180
|
+
```kotlin
|
|
181
|
+
fun calculate(cards: List<Card>): Int {
|
|
182
|
+
var sumScore = calculateTotalScore(cards)
|
|
183
|
+
var countAce = countAce(cards)
|
|
184
|
+
while (countAce-- > 0) {
|
|
185
|
+
if (sumScore + ADJUST_ACE_NUMBER > BLACKJACK_NUMBER) {
|
|
186
|
+
break
|
|
187
|
+
}
|
|
188
|
+
sumScore += ADJUST_ACE_NUMBER
|
|
189
|
+
}
|
|
190
|
+
return sumScore
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
→ **`countAce-- > 0`** = *Java/C 어휘*. *Kotlin = `repeat(countAce)` 또는 `for (i in 1..countAce)`* 가 *어휘 정공*. 다만 *break 활용 시 repeat 어색* — *while + countdown* 트레이드오프. PR #58·#93·#108 와 같은 결.
|
|
195
|
+
|
|
196
|
+
또한 *`+= ADJUST_ACE_NUMBER` 안에 break* — *Ace 처리 패턴 정확*. *Ace 1 기본 + 가능한 만큼 +10*. PR #128·#114·#125·#108·#131·#136 와 같은 결의 *Ace 처리*.
|
|
197
|
+
|
|
198
|
+
### 12. `Player(name, betAmount)` 생성 시점 = *베팅 + 이름* — *카드 미보유*
|
|
199
|
+
|
|
200
|
+
```kotlin
|
|
201
|
+
class Player(
|
|
202
|
+
name: String,
|
|
203
|
+
val betAmount: BetAmount,
|
|
204
|
+
) : Participant(name) { ... }
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
→ **Player 생성 시점 = 이름 + 베팅 만**. *카드는 GameManager.dealInitialCards 에서 별도 분배*. *lotto empty-object-external-fill 변형* — *Player 생성 후 외부에서 카드 채움*. PR #132·#124·#108 와 같은 결.
|
|
208
|
+
|
|
209
|
+
다만 *블랙잭 도메인 = 베팅 → 카드 분배 순서* 라 *2 단계 생성* 자연. *학생 PR 본문*: *베팅 + 이름 입력 후 분배*. **PR #103·#85·#88·#136 와 같은 결의 *플레이어 + 베팅 동시 입력 자가 반영***.
|
|
210
|
+
|
|
211
|
+
### 13. `Profit class` — *data class 아님 = equals/copy 자동 X*
|
|
212
|
+
|
|
213
|
+
```kotlin
|
|
214
|
+
class Profit(val participant: Participant, val winningMoney: WinningMoney)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
→ **`class` (data 아님)** — *equals/hashCode/copy/toString 자동 X*. *동등성 의미 명시 부재*. *데이터 보유 객체 = data class* 가 *Kotlin 어휘 표준*. PR #88 (채드 2단계) 의 *Revenue toString override* 와 같은 결의 *데이터 클래스 vs 일반 class*.
|
|
218
|
+
|
|
219
|
+
### 14. `GameManager.DEALER_PROFIT_MULTIPLIER = -1.0` — 상수 활용
|
|
220
|
+
|
|
221
|
+
```kotlin
|
|
222
|
+
companion object {
|
|
223
|
+
const val INITIAL_HAND_OUT_CARD_COUNT = 2
|
|
224
|
+
const val DEALER_PROFIT_MULTIPLIER = -1.0
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
→ **`DEALER_PROFIT_MULTIPLIER = -1.0` companion** — *딜러 수익 = 플레이어 합 × -1* 룰 명시 상수. *룰 명료성 정공*. PR #131·#132·#133·#49 와 같은 결.
|
|
229
|
+
|
|
230
|
+
### 15. `GameManager.gameResult(result: Map<Player, ResultType>): List<Profit>` — *Profit List 통합 반환*
|
|
231
|
+
|
|
232
|
+
```kotlin
|
|
233
|
+
fun gameResult(result: Map<Player, ResultType>): List<Profit> {
|
|
234
|
+
val playerProfits = result.map { (player, resultType) ->
|
|
235
|
+
Profit(player, calculateProfit(resultType, player))
|
|
236
|
+
}
|
|
237
|
+
val dealerProfit = calculateDealerProfit(playerProfits)
|
|
238
|
+
return listOf(dealerProfit) + playerProfits
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
→ **`listOf(dealerProfit) + playerProfits`** = *딜러 먼저 + 플레이어들*. *출력 순서 고정*. *호출자가 forEach 만 호출*. 다만 *호출자가 *딜러는 첫 번째* invariant 알아야*. PR #49·#132 의 *별도 dealer + players 객체* 보다 *비대칭*. 트레이드오프.
|
|
243
|
+
|
|
244
|
+
### 16. `printAllHands: () -> Unit` 인자 없음 — *콜백 인자 부재 = 호출자 책임*
|
|
245
|
+
|
|
246
|
+
```kotlin
|
|
247
|
+
fun startGame(
|
|
248
|
+
...
|
|
249
|
+
printAllHands: () -> Unit,
|
|
250
|
+
) { ... }
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
지훈 (BlackjackGame.kt — 미해결, 보조 코멘트): *"그리고 printAllHands 에는 어떤 이유로 Dealer왜 List<Player> 를 넘기고 있는 상황일까요? ... 실제로는 사용이 안 되고 있는 것 같아서 어떤 의도였는지가 이해가 조금 안 되긴 하네요"*
|
|
254
|
+
|
|
255
|
+
→ **`printAllHands: (Dealer, List<Player>) -> Unit` → `printAllHands: () -> Unit`** 변환 자가 반영. 다만 *호출자가 dealer + players 정보 알아야 출력 가능* — *호출자가 BlackjackGame 외부에서 dealer + players 보유* 가정. *Closure capture* 패턴.
|
|
256
|
+
|
|
257
|
+
페로로 추가 진단 (구현 일치 안 됨): *"printAllHands 은 반영 안 된 것 같네요 ㅠㅠ.."*. **자가 반영 누락 신호**.
|
|
258
|
+
|
|
259
|
+
### 17. `ResultType.LOSS` vs `LOSE` 어휘 — *영어 표준 어휘 모호*
|
|
260
|
+
|
|
261
|
+
```kotlin
|
|
262
|
+
enum class ResultType(val profit: Double) {
|
|
263
|
+
WIN(1.0), TIE(0.0), LOSS(-1.0), BLACKJACK(1.5),
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
→ **`LOSS` = *손실 명사* vs `LOSE` = *동사***. *enum 멤버 = 명사형 표준*. *PR #131·#132·#136·#49 의 LOSE/LOSS* 와 *어휘 혼재*. *LOSS 정공* 이지만 *프로젝트 내 일관성*.
|
|
268
|
+
|
|
269
|
+
### 18. `BetAmount.value: Double` 도입 (확장함수 제거) — 학생 자가 학습 모범
|
|
270
|
+
|
|
271
|
+
학생 자가 답변 + 자가 의문: *"BetAmount를 Double로 받도록 했는데, 결국 확장함수를 없애니 player.betAmount.amount로 코드길이는 그대로 유지 되는 것 같습니다😅"* + 지훈 자가 답변: *"네 코드 길이는 유지가 되지만 굳이 필요 없던 `toDouble()` 확장 함수는 사라졌으니 유의미하지 않았을까요!.."*
|
|
272
|
+
|
|
273
|
+
→ **YAGNI + 도메인 타입 직접 Double 자가 학습**. *불필요한 확장함수 = 인지 비용*. *value class Double 직접* 이 *간결*. 학습 모범.
|
|
274
|
+
|
|
275
|
+
### 19. `Profit / WinningMoney / BetAmount` 세 도메인 객체 — *과도한 분리?*
|
|
276
|
+
|
|
277
|
+
→ **3 value class = Profit (참가자 + 수익), WinningMoney (수익 금액), BetAmount (베팅 금액)**. *PR #49 (써니) 의 Profit + Money + EarningRate* 와 *비슷한 분리*. *책임 명료 + 인지 비용 트레이드오프*. *지훈 권고 = 원시값 최대한 포장* 후속 반영.
|
|
278
|
+
|
|
279
|
+
### 20. `Dealer.isMoreCard()` naming — *Boolean 메서드 = is/has 어휘 정합*
|
|
280
|
+
|
|
281
|
+
```kotlin
|
|
282
|
+
fun isMoreCard() = score < DEALER_MORE_CARD_MINIMUM
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
→ **`isMoreCard()`** = *더 카드 받을 수 있는가*. *is + 명사* 형식 — *Kotlin Boolean 표준*. 다만 *`canDraw()` / `needsMore()` 가 더 명료*. PR #131·#132·#152·#136 의 *canDraw / canHit* 와 *비슷한 결*.
|
|
286
|
+
|
|
287
|
+
### 21. `BetAmount value > 0` invariant — 정공
|
|
288
|
+
|
|
289
|
+
```kotlin
|
|
290
|
+
@JvmInline
|
|
291
|
+
value class BetAmount(val value: Double) {
|
|
292
|
+
init {
|
|
293
|
+
require(value > 0) { ERROR_BET_AMOUNT_VALUE }
|
|
294
|
+
}
|
|
295
|
+
...
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
→ **`value > 0` 강제** — *베팅 = 최소 1원 (Double)*. *PR #131·#132 의 MIN = 0 허용* 와 *반대 트레이드오프*. *베팅 = 1원 이상 = 도메인 정합*. PR #136 (밀러) 의 *bettingAmount > 0* 와 같은 결.
|
|
300
|
+
|
|
301
|
+
## 리뷰어 의견 요지
|
|
302
|
+
|
|
303
|
+
- **원시값 최대한 포장** — *Double 의미 모름*. *WinningMoney / BetAmount / Profit value class 분리*.
|
|
304
|
+
- **`ResultType enum + profit: Double` = 게임 결과가 이익률 알 수 있음** — *상수 응집*.
|
|
305
|
+
- **`Map<X, X>` 회피 — Profit class 응집** — PR #132 와 같은 결.
|
|
306
|
+
- **`it.copy()` 방어적 복사 = 불변 객체엔 복사 비용만 추가** — 학생 자가 학습 모범.
|
|
307
|
+
- **`println` 도메인 X = View 책임** — *간접 lambda 도 View 결합*.
|
|
308
|
+
- **콜백 = `onXX` 행위 명시** — *Inversion of Control + 의도 명료*.
|
|
309
|
+
- **`when` 절 = if 다중 분기 가독성 ↑** — *Kotlin 패턴 매칭*.
|
|
310
|
+
- **테스트 명세 = 도메인 룰 정확** — *플레이어 24 / 딜러 19 → WIN?* 함정.
|
|
311
|
+
- **BlackjackGame 통합 테스트 = 흐름 검증** — *각 객체 단위 테스트 + 통합 흐름*.
|
|
312
|
+
- **이익 vs 수익 어휘 혼란 → 학생/리뷰어 양방향 학습** — *지훈도 자가 인정*.
|
|
313
|
+
- **확장함수 vs Double 직접 = YAGNI** — *불필요한 확장함수 제거*.
|
|
314
|
+
- **`value class.value` 명명 = 어색하지 않은 표현** — *value 표준 어휘*.
|
|
315
|
+
- **`Builder` 필수값 = 진입 함수 인자** — *Builder의 본질 = 선택적 속성*. *필수 = 인자 우선*.
|
|
316
|
+
|
|
317
|
+
## 대표 인용
|
|
318
|
+
|
|
319
|
+
**지훈 (원시값 포장, GameManager.kt):**
|
|
320
|
+
> 저희는 원시값을 가능한 다 포장을 해보는 연습을 해보기로 했습니다.
|
|
321
|
+
> 모르는 사람이 봤을 때 이 Double이 무엇을 의미하는지 알기가 어렵기도 하죠
|
|
322
|
+
|
|
323
|
+
**지훈 (Tell-Don't-Ask, ResultCalculator.kt):**
|
|
324
|
+
> 여기는 그래도 리뷰를 남겨보면, 블랙잭의 특성상 딜러의 점수를 플레이어가 비교를 해서 승패가 나눠지는데요. 그런 관점에서 봤을 때
|
|
325
|
+
>
|
|
326
|
+
> ```
|
|
327
|
+
> 참가자 스스로가 다른 참가자의 점수를 비교해서 본인이 어떠한 상태인지 반환하는 게
|
|
328
|
+
> 객체지향적으로 그렇게 이상한 일일까? 본인의 점수를 이미 알고 있는데?
|
|
329
|
+
> ```
|
|
330
|
+
>
|
|
331
|
+
> 이 부분을 고민해 봐도 좋을 것 같네요!
|
|
332
|
+
|
|
333
|
+
**지훈 (`onXX` 콜백 어휘, BlackjackGame.kt):**
|
|
334
|
+
> 지금은 `BlackjackGame` 이 View의 역할도 하고 있습니다. `println`을 호출하고 있기도 하고 간접적으로나마 print라는 lambda으로 인해서 간접적으로라도 알고 있는 느낌이기도 하죠.
|
|
335
|
+
>
|
|
336
|
+
> lambda 이름들을 이런 형태로 바꿔보면 어떨까요?
|
|
337
|
+
>
|
|
338
|
+
> `onEndDelaerTurn` 이런 형태로 지금 어떠한 행위가 끝났는지를 명시하고 그 행위를 사용하는 곳에서 무엇을 할지를 선택을 하는 것인데요. 이런 형태가 된다면 더 좋았을 것 같네요.
|
|
339
|
+
|
|
340
|
+
**지훈 (enum 부가속성, ResultType.kt):**
|
|
341
|
+
> 음 ResultType의 동반 객체로 들어가게 되었군요.
|
|
342
|
+
>
|
|
343
|
+
> 그런데
|
|
344
|
+
>
|
|
345
|
+
> ```
|
|
346
|
+
> 게임 결과에 따른 이익률을 게임 결과가 알고 있어도 되지 않을까?
|
|
347
|
+
> ```
|
|
348
|
+
>
|
|
349
|
+
> 즉 그렇게 된다면 아래와 같이 구현이 됐을 것 같아요.
|
|
350
|
+
>
|
|
351
|
+
> ```kotlin
|
|
352
|
+
> enum class ResultType(val profit: Double) {
|
|
353
|
+
> WIN(1.0),
|
|
354
|
+
> TIE(0.0),
|
|
355
|
+
> LOSS(-1.0),
|
|
356
|
+
> BLACKJACK(1.5) ;
|
|
357
|
+
> }
|
|
358
|
+
> ```
|
|
359
|
+
>
|
|
360
|
+
> 그렇게 되면 `calucateProfit` 함수도 조금 더 간결하게 표현이 됐을 것 같네요!
|
|
361
|
+
|
|
362
|
+
**지훈 (when 절 변환, ResultCalculator.kt):**
|
|
363
|
+
> 하나의 함수에서 많은 if문이 열리게 될 경우 가독성이 떨어지게 됩니다.
|
|
364
|
+
> ...
|
|
365
|
+
> 이렇게 한 번 바꿔볼까요?
|
|
366
|
+
|
|
367
|
+
**지훈 (테스트 명세 정확, ResultCalculatorTest.kt):**
|
|
368
|
+
> 단순히 `딜러의 점수보다 크면 이긴다`라는 조건은 아닐 것 같아요!
|
|
369
|
+
>
|
|
370
|
+
> 이 테스트 함수명만 봤을 때는 아래와 같은 조건에서도 이긴다는 것 같아요
|
|
371
|
+
>
|
|
372
|
+
> ```
|
|
373
|
+
> 플레이어 : 24
|
|
374
|
+
> 딜러 : 19
|
|
375
|
+
> ```
|
|
376
|
+
|
|
377
|
+
**지훈 (마음에 안 드는 이유 명시 권고, GameManager.kt):**
|
|
378
|
+
> 마음에 안 드는 이유를 이야기를 해줬으면 좋겠어요!
|
|
379
|
+
>
|
|
380
|
+
> 단순히 마음에 안 들어서 어떻게 바꾸는 게 좋을까요? 라고 하면 어떤 부분을 인지했는지 제가 모르니 제 의견을 전부 말하는 수밖에 없다 보니 미플이 의견을 남겨주면 좋을 것 같네요.
|
|
381
|
+
|
|
382
|
+
**지훈 (BetAmount value=Double 트레이드오프, GameManager.kt):**
|
|
383
|
+
> 이 부분은 한 번 고민만 해보고 넘어가도 됩니다.
|
|
384
|
+
>
|
|
385
|
+
> `로또` 미션 때를 떠올려보면 LottoNumber들을 갖고 있는 객체를 아래와 같이 만들었을 거예요
|
|
386
|
+
>
|
|
387
|
+
> ```kotlin
|
|
388
|
+
> data class LottoGame(val lottoNumber: List<LottoNumber>)
|
|
389
|
+
> ```
|
|
390
|
+
>
|
|
391
|
+
> ```
|
|
392
|
+
> 그러면 BetAmount 자체가 Int가 아닌 Double을 받는다고 생각했을 때 어색할까요?
|
|
393
|
+
> ```
|
|
394
|
+
|
|
395
|
+
**학생 자가 학습 (it.copy 방어적 복사 자가 인식, Participant.kt):**
|
|
396
|
+
> `_cards.toList`와 `val cards: List<Card> get() = _cards.map { it.copy() }.toList()` 여러 테스트를 해보면서도 무슨 차이지..하고 차이를 못 느꼈지만 수업시간에 이런식으로 방어적 복사를 했다는 걸 배워서 그때 이걸 사용하라고 의도하신 것 같아서 사용했습니다.
|
|
397
|
+
>
|
|
398
|
+
> 좀 더 공부해보니 cards안에 있는 내부 객체 Card가 변하게 될 때 두 코드의 차이가 있는 것 같습니다.
|
|
399
|
+
>
|
|
400
|
+
> 현재는 Card의 shape, Number 둘다 val이어서 변할 일이 없기때문에, it.copy()를 하면 괜히 복사비용만 추가된다 생각해 _cards.toList()로 바꿨습니다
|
|
401
|
+
|
|
402
|
+
**학생 자가 학습 (enum class 학습 의지, ResultType.kt):**
|
|
403
|
+
> 와..😲 enum class에 대해 좀 더 공부해보겠습니다!
|
|
404
|
+
|
|
405
|
+
**학생 자가 학습 (이익 vs 수익 어휘, GameManagerTest.kt:41):**
|
|
406
|
+
> 이익과 수익을 잘 모르고 사용한 것 같습니다.
|
|
407
|
+
> ...
|
|
408
|
+
> + 그러면 그냥 승리했을 때는 `승리했을때 수익은 배팅 금액의 0%이다`라고 작성을 해야 하나요??
|
|
409
|
+
|
|
410
|
+
**지훈 자가 인정 (어휘 혼란):**
|
|
411
|
+
> 아니네요 😂 제가 잘못 오해했었네요
|
|
412
|
+
>
|
|
413
|
+
> 기존 150%와 100%(승리)가 맞는 말이었습니다!..
|
|
414
|
+
>
|
|
415
|
+
> 블랙잭은 1.5배니 150%가 맞았습니다!..
|
|
416
|
+
>
|
|
417
|
+
> > 최근에 주식을 공부하면서 이것저것 공부하다가 순간 저도 헷갈려서 잘못 말을 해버렸네요 🫠
|
|
418
|
+
|
|
419
|
+
## 얻은 교훈
|
|
420
|
+
|
|
421
|
+
1. ***원시값 최대한 포장 = Double 의미 모름***. *WinningMoney / BetAmount / Profit value class 분리* = *호출자가 *Double 이 무엇인지* 알 수 있음*. PR #131·#132·#136·#90·#49 와 같은 결.
|
|
422
|
+
|
|
423
|
+
2. ***`ResultType enum + profit: Double` = 게임 결과가 이익률 응집***. *상수 = enum 멤버 부가속성*. *룰 변경 시 enum 한 곳 수정*. PR #132 (환노) 의 *GameResult earningRate* 와 같은 결.
|
|
424
|
+
|
|
425
|
+
3. ***Tell-Don't-Ask = "본인의 점수를 이미 알고 있는데?" 메시지 정공***. *ResultCalculator object* 정적 헬퍼 → *Player.compareScores(dealer) 메시지* 가 정공. PR #132·#136·#152·#108·#133·#49 와 같은 결.
|
|
426
|
+
|
|
427
|
+
4. ***`it.copy()` 방어적 복사 = 불변 객체엔 복사 비용만 추가***. *Card 불변 (val rank + val shape)* 이면 *`_cards.toList()` 만으로 충분*. *PR #124 (모찌 1단계) 의 Card.copy 강박* 진단 + *학생 자가 학습 모범*. **MCP 룰 후보 — `defensive-copy-on-immutable`** 변형.
|
|
428
|
+
|
|
429
|
+
5. ***`onXX` 콜백 어휘 = Inversion of Control***. *람다 이름 = 행위 끝 알림*. *호출자가 무엇을 할지 결정*. *PR #132 (환노) 의 고차함수* 와 같은 결.
|
|
430
|
+
|
|
431
|
+
6. ***`println` 도메인 X = View 책임***. *간접 lambda 도 도메인 → View 결합*. *println 명시적 사용 + 람다 인자 = 도메인이 print 의도 인지*. PR #58·#88·#132 와 같은 결.
|
|
432
|
+
|
|
433
|
+
7. ***`when` 절 = if 다중 분기 가독성 ↑***. *Kotlin 패턴 매칭* + *exhaustive 검사 (enum)*. *if 4-5 단계 분기 → when 한 줄씩* 변환 정공.
|
|
434
|
+
|
|
435
|
+
8. ***테스트 명세 = 도메인 룰 정확***. *`딜러 점수보다 크면 WIN`* 은 *Bust 케이스 미반영*. *`플레이어 24 / 딜러 19 → 잘못 WIN`*. *명세 구체화*. PR #93·#90·#136·#88 와 같은 결.
|
|
436
|
+
|
|
437
|
+
9. ***학생 "마음에 안 드는 이유" 명시 = 학습 가시화 정공***. *지훈 권고 = 자기 의도 명시 → 리뷰 효율*. *학생/리뷰어 양방향 학습*. PR #128·#135·#108·#133·#136 와 같은 결의 *학생 자가 토론 풍부 패턴*.
|
|
438
|
+
|
|
439
|
+
10. ***이익 vs 수익 어휘 혼란 = 학생/리뷰어 양방향 학습***. *지훈도 잘못 이해 → 자가 인정*. *상호 학습 + 인간적 모범*. *학생 의문 → reviewer 자가 검증 → 양방향 합의* 흐름.
|
|
440
|
+
|
|
441
|
+
11. ***`BetAmount.value: Double` 직접 vs `toDouble()` 확장함수 = YAGNI***. *불필요한 확장함수 = 인지 비용*. *value class 의 도메인 타입 직접 사용* 정공. *학생 자가 학습 모범*.
|
|
442
|
+
|
|
443
|
+
12. ***`value class` 멤버 명 = `value` 표준***. *지훈 권고*. *`BetAmount(value = 10.0); amount.value` vs `BetAmount(amount = 10.0); amount.amount` 의 어색함*. *Kotlin value class 표준 어휘*.
|
|
444
|
+
|
|
445
|
+
13. ***Builder 필수값 = 진입 함수 인자***. *지훈 권고 = `Builder(name = name).build()`*. *Builder 의 본질 = 선택적 속성*. *필수 = 인자 우선*. PR #124·#128·#135 의 *DSL Builder 필수 속성 미강제* 와 같은 결.
|
|
446
|
+
|
|
447
|
+
14. ***`Profit class` vs `data class` 트레이드오프***. *동등성 의미 명시* 시 *data class*. *데이터 보유 + equals/copy 자동* 표준. *non-data class = 명시적 의도 부재 신호*. PR #88·#136 와 같은 결.
|
|
448
|
+
|
|
449
|
+
15. ***딜러 블랙잭 시 모든 진행 skip = 블랙잭 룰 정확성***. *플레이어 hit 기회 없음 + ResultCalculator 의 TIE/LOSS 분기 처리*. PR #136·#132·#108·#133 와 같은 결의 *블랙잭 룰 정확성*.
|
|
450
|
+
|
|
451
|
+
16. ***학생 자가 답변에 커밋 SHA 첨부 일관성 (`a357234`, `b4763a1`, `e2840307`, `8a673e0`, `9f12c19`, `13cf13a`, `2eac33b`, `a0b52af`, `f1a40f9`, `0b30903` 등 다수) = 학습 가시화 모범***. PR #128·#135·#108·#133·#136·#124·#152 와 같은 결.
|
|
452
|
+
|
|
453
|
+
17. ***`Player.getInitialCard() = cards` vs `Dealer.getInitialCard() = cards.first()` 비대칭 = 도메인 룰 표현***. *블랙잭 공개 룰 = 플레이어 모든 카드 공개, 딜러 1장*. *Player.getInitialCard naming 이 *초기* 가 아닌 *공개 카드* 의미* — *naming `getOpenedCards()` 가 명료*.
|
|
454
|
+
|
|
455
|
+
18. ***Player(name, betAmount) + 카드 미보유 = lotto empty-object-external-fill 변형***. *생성 후 GameManager.dealInitialCards 에서 외부 채움*. PR #132·#124·#108 와 같은 결.
|
|
456
|
+
|
|
457
|
+
19. ***신규 reviewer 지훈 = 깊은 메타 질문 + 자가 인정 + 학생 자가 토론 풍부 유도***. *PR #131·#136·#88 (두루)* / *PR #41·#53 (잭슨)* / *PR #93·#108·#133 (말리빈)* / *PR #124·#85·#103·#58·#49·#152 (페로로)* 외 **새 reviewer 스타일 분석** = *프로젝트 reviewer 다양성 명시*.
|
|
458
|
+
|
|
459
|
+
20. ***BlackjackGame 통합 테스트 = 흐름 검증***. *각 객체 단위 테스트 + 통합 흐름 별도*. *지훈 예시 코드 + 학생 후속 반영* 모범.
|