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,284 @@
|
|
|
1
|
+
# PR #10 โ [๋ธ๋์ญ 1๋จ๊ณ] ์ฐ๊ตฐ ๋ฏธ์
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@s9hn](https://github.com/s9hn)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/10
|
|
5
|
+
- **๋จ๊ณ:** 1๋จ๊ณ (ํ์ด)
|
|
6
|
+
- **๋ฆฌ๋ทฐ์ด:** @malibinYun (๋ง๋ฆฌ๋น)
|
|
7
|
+
- **๋ผ์ธ ์ฝ๋ฉํธ:** 30 (๋ฆฌ๋ทฐ์ด 17 / ๋ฆฌ๋ทฐ์ด 13)
|
|
8
|
+
|
|
9
|
+
## ์ํ ์ (์ค๊ณ ๊ด์ )
|
|
10
|
+
|
|
11
|
+
- **View ์ธ๋ถํ โ `LoginView`/`PlayGameView`/`GameResultView`** (LoginView ๋ช
๋ช
์ ๋ชปํ ์ ยง11์์ ํ ๋ก ).
|
|
12
|
+
- **`abstract class Player` + `Dealer`/`User` ์์** + ํ์์ *ํฉํ ๋ฆฌ ํจ์*๋ก ์์ฑ ํต์ผ.
|
|
13
|
+
- **`Referee` ๊ฐ์ฒด ๋ถ๋ฆฌ ์๋ + ํ์ ์๊ฐ ํ ๋ก ** (๋ชปํ ์ ยง10).
|
|
14
|
+
- **`Card private constructor + Card.valueOf(card)` ํฉํ ๋ฆฌ + ์ต๋ช
๊ฐ์ฒด๋ก ์ฌ์ฌ์ฉ (ํ์ ๋ฐ์)** โ Flyweight ํจํด.
|
|
15
|
+
- **`Deck` ์ผ๊ธ ์ปฌ๋ ์
๋์
(ํ์)** + ๋น ๋ฑ ๊ฒ์ฆ `require()`.
|
|
16
|
+
- **ํ์ ๋ฐ์ โ `getCardPair โ getCard(count)` ๋จ์ผ ๋ฉ์๋ + `Dealer.create()` ํฉํ ๋ฆฌ + `Hand` ์ผ๊ธ ์ปฌ๋ ์
+ ๋๋ฌ ๋ธ๋์ญ ๋ฃฐ (16 ์ดํ๋ผ๋ ์๊ธฐ ๋ธ๋์ญ์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ฐ์น)**.
|
|
17
|
+
|
|
18
|
+
## ๋ชปํ ์ (์ค๊ณ ๊ด์ )
|
|
19
|
+
|
|
20
|
+
### 1. `Answer("y"/"n")` ๋๋ฉ์ธ ๊ฐ์ฒด โ UI ์
๋ ฅ ํ์ ๋ณด์
|
|
21
|
+
|
|
22
|
+
```kotlin
|
|
23
|
+
class Answer(val value: String) {
|
|
24
|
+
init { require((value == YES) or (value == NO)) { ERROR_ANSWER_FORMAT } }
|
|
25
|
+
companion object { const val YES = "y"; const val NO = "n" }
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
๋ฆฌ๋ทฐ์ด: "Answer๋ฅผ *domain์ ๋ถ๋ฅ*ํด์ฃผ์
จ๋๋ฐ์, *ํด๋น ํญ๋ชฉ๋ค์ View์ ์์*๋ค์ :) *๋๋ฉ์ธ๊ณผ ๋ทฐ๋ฅผ ๊ผญ ๋ถ๋ฆฌ*ํด์ฃผ์ธ์!" โ *Y/N ์
๋ ฅ ํ์*์ UI. *enum Answer { YES, NO }* + InputView์์ ๋งคํ. PR #29ยท#63ยท#125ยท#128ยท#116๊ณผ ๊ฐ์ ๊ฒฐ.
|
|
30
|
+
|
|
31
|
+
### 2. `Card.Value` enum โ *Value*๋ผ๋ ๋ง๋ฅ ๋ช
์ฌ
|
|
32
|
+
|
|
33
|
+
```kotlin
|
|
34
|
+
class Card(val shape: Shape, val value: Value) {
|
|
35
|
+
enum class Value(val number: Int, val cardSign: String) { ... }
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
๋ฆฌ๋ทฐ์ด: "*Value๋ผ๋ ์ด๋ฆ์ ๋๋ฌด ๋ฒ์ฉ์ *์
๋๋ค. *๊ทธ ๋ฌด์๋ Value๋ผ๊ณ ์นญํ ์ ์์ด ๋ณด์ฌ์* :) *๋ ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ*์ ์ง์ด๋ณผ๊น์?" โ `Value` / `Information` / `Manager` / `Rule` ๋ง๋ฅ ๋ช
์ฌ ํจํด. `Rank` / `CardNumber` ๊ฐ์ *๋๋ฉ์ธ ์ดํ*. PR #92 `Information` ๋ณํ.
|
|
40
|
+
|
|
41
|
+
### 3. `Card.Shape.pattern` / `Card.Value.cardSign` UI ํํ
|
|
42
|
+
|
|
43
|
+
```kotlin
|
|
44
|
+
enum class Shape(val pattern: String) {
|
|
45
|
+
HEARTS("ํํธ"), DIAMONDS("๋ค์ด์๋ชฌ๋"), CLUBS("ํด๋ก๋ฒ"), SPADES("์คํ์ด๋"),
|
|
46
|
+
}
|
|
47
|
+
enum class Value(val number: Int, val cardSign: String) { ... }
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
๋ฆฌ๋ทฐ์ด๊ฐ ์ง์ ์ง์ ์ ์ ํ์ง๋ง PR ํ๋ฆ์ *Answer UI ๋ถ๋ฆฌ* ๊ถ๊ณ ์ ๋์ผ ๊ฒฐ. **enum UI value 9๊ฐ PR ์ฐ์**.
|
|
51
|
+
|
|
52
|
+
### 4. `CardMachine` ๊ฐ์ฒด โ Generator/Picker/Deck์ ๋ ๋ค๋ฅธ ๋ณํ
|
|
53
|
+
|
|
54
|
+
```kotlin
|
|
55
|
+
class CardMachine {
|
|
56
|
+
private val cards: MutableList<Card> = mutableListOf()
|
|
57
|
+
init { addCards(); cards.shuffle() }
|
|
58
|
+
fun getNewCard() = cards.removeFirst()
|
|
59
|
+
fun getCardPair(): List<Card> { ... }
|
|
60
|
+
fun getCardPairs(count: Int): List<List<Card>> { ... }
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
๋ฆฌ๋ทฐ์ด: "*์ดํ 3์ฅ, 4์ฅ, 5์ฅ์ ๋ฝ๋ ๊ท์น๋ค์ด ์๊ฒจ๋๋ค๋ฉด, ๋ฉ์๋์ ์์ด ๋๋ฌด ๋ง์์ง ๊ฒ์ด ์ฐ๋ ค*๋ผ์. `getCards(count)` ๋ฑ์ผ๋ก ์นด๋๋ฅผ ๋ฝ์๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?" / "*count๋ฅผ ๋ฐ์ List๋ฅผ ๋ฐํํ๋๋ฐ ๋ฉ์๋๋ช
์ด ๋จ์ ํํ์ธ ๊ฑด ์กฐ๊ธ ์ด์*ํด๋ณด์ด๋ค์." / "*CardMachine์ ๋๋ค์ ๋ํ ์์๋ฅผ ํฌํจํ ๊ธฐ๋ฅ์ ํ
์คํธ๋ฅผ ์์ฑํ ์ ์์๊น์?* ๋ก๋์ ์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์
์ ์ ๋์๊ฒจ๋ณด๋ฉด์, *๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ํ๊ฒฝ์ผ๋ก ๋ณ๊ฒฝ*ํด๋ณด์ธ์"
|
|
65
|
+
|
|
66
|
+
โ **`CardMachine`์ด๋ผ๋ ๋ช
์ฌ ์์ฒด = ๋ ๋ค๋ฅธ ๋ง๋ฅ ์ดํ**. `Deck`์ด ๋๋ฉ์ธ ์ดํ๋ก ์์ฐ. ํ์ ํ์: `getCard(count): List<Card>` ๋จ์ผ ๋ฉ์๋ + `Deck` ํด๋์ค ๋์
.
|
|
67
|
+
|
|
68
|
+
### 5. `Dealer(name, cards: MutableList<Card>)` โ ๋ฐฉ์ด์ ๋ณต์ฌ ๋๋ฝ + ์ธ๋ถ ์ฐธ์กฐ ๋์
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
class Dealer(name: String = DEALER_NAME, cards: MutableList<Card>) : Player(name, cards) { ... }
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
๋ฆฌ๋ทฐ์ด: "*๋ฐฉ์ด์ ๋ณต์ฌ์ ์๋ฏธ๊ฐ ์์ ์๋ ์๊ฒ ์ด์* :) ์๋ ์ฝ๋ ๊ฐ์ด ์คํํ๋ค๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง ์ ์์๊น์? ```val mutableList = mutableListOf(1, 2, 3); Dealer("", mutableList); mutableList.clear()```" โ PR #79ยท#65ยท#24ยท#28๊ณผ ๋์ผ *์ธ๋ถ ์ฐธ์กฐ ๋์* ํจํด. ํ์ ํ์: `private constructor` + ํฉํ ๋ฆฌ์์ `toMutableList()` ๋ณต์ฌ.
|
|
75
|
+
|
|
76
|
+
### 6. `Player.cards: List<Card> get() = _cards.toList()` โ ๋ฐฉ์ด์ ๋ณต์ฌ + ์ผ๊ธ ์ปฌ๋ ์
๋ฏธ๋์
|
|
77
|
+
|
|
78
|
+
```kotlin
|
|
79
|
+
abstract class Player(
|
|
80
|
+
val name: String,
|
|
81
|
+
private val _cards: MutableList<Card>,
|
|
82
|
+
) {
|
|
83
|
+
val cards: List<Card> get() = _cards.toList()
|
|
84
|
+
...
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
๋ฆฌ๋ทฐ์ด: "*์นด๋๋ค์ ์ผ๊ธ ์ปฌ๋ ์
์ผ๋ก ๊ตฌํ*ํด๋ณด์ธ์ :)" โ `Hand` ๋๋ `Cards` ์ผ๊ธ ์ปฌ๋ ์
. *๋ฐฉ์ด์ ๋ณต์ฌ + ์ผ๊ธ ์ปฌ๋ ์
*์ ๋ณ๊ฐ ๊ฐ๋
. *์ผ๊ธ ์ปฌ๋ ์
์ ๋น์ฆ๋์ค ๋์ ๋ณด์ + ๋ณ๊ฒฝ ์ ์ด*. ํ์ ํ์: `Hand` ๋์
.
|
|
89
|
+
|
|
90
|
+
### 7. `Player.validPlayerSum()` ํจ์๋ช
โ *๊ฒ์ฆ์ธ์ง ํฉ์ฐ์ธ์ง ๋ชจํธ*
|
|
91
|
+
|
|
92
|
+
```kotlin
|
|
93
|
+
fun validPlayerSum(): Int {
|
|
94
|
+
if ((calculateCardValueSum() < ACE_CARD_PLUS_TEN) and (countAce() != NO_ACE)) {
|
|
95
|
+
return calculateCardValueSum() + ACE_CARD_PLUS_TEN
|
|
96
|
+
}
|
|
97
|
+
return calculateCardValueSum()
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
๋ฆฌ๋ทฐ์ด: "๋ฉ์๋๋ช
๋ง ๋ณด๋ฉด, *player ํฉ๊ณ๊ฐ valid ํ์ง ๊ฒ์ฆ๋ง ์ํํ๋ ๋ฉ์๋*๋ก ๋ณด์ฌ์. *๋ ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ*์ ์ง์ด์ฃผ์ด ๋ณผ๊น์? ๐" โ `valid*` ์ ๋์ฌ๋ *๊ฒ์ฆ ๋์* ์ฐ์. ์ค์ ๋ *Ace ๋ณด์ ์ ์ฉ ํ ์ ์*. `scoreWithAceAdjusted()` ๋๋ `totalScore()` ๊ฐ์ *๊ฒฐ๊ณผ ๋์ฌ*.
|
|
102
|
+
|
|
103
|
+
### 8. `Player.countAce()` โ *๋ช ์ฅ ์
๊น* vs *์๋์ง๋ง*
|
|
104
|
+
|
|
105
|
+
```kotlin
|
|
106
|
+
private fun countAce(): Int = _cards.filter { it.value == Card.Value.ACE }.size
|
|
107
|
+
fun validPlayerSum(): Int {
|
|
108
|
+
if (... and (countAce() != NO_ACE)) { return ... + ACE_CARD_PLUS_TEN }
|
|
109
|
+
...
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
๋ฆฌ๋ทฐ์ด: "*์ ๋ง ACE๊ฐ ๋ช ์ฅ์ธ์ง ์ธ๋ ๊ฒ์ด ์ค์ํ ๊ธฐ๋ฅ์ผ ์ง ๊ณ ๋ฏผ*ํด๋ณด์ธ์ :)" โ *Ace๋ฅผ 11์ ์ผ๋ก ํ ๋ฒ๋ง ๋ณด์ *ํ๋ฉด *๋ช ์ฅ์ธ์ง ์
ํ์ ์์*. *์๋์ง(Boolean)*๋ง ๊ฒ์ฌ. PR #79 (ii2001) ๋ฆฌ๋ทฐ์ด ๊ถ๊ณ ์ ๋์ผ (*Ace ๋ ์ฅ = +20์ ํญ์ Bust*).
|
|
114
|
+
|
|
115
|
+
๋: ๋ฆฌ๋ทฐ์ด ๊ถ๊ณ "`count{}` ํ์ฅ ํจ์๋ฅผ ํ์ฉํด๋ณด์ธ์" โ `_cards.count { it.value == Card.Value.ACE }`๋ก ๋จ์ํ.
|
|
116
|
+
|
|
117
|
+
### 9. `Referee(dealerScore: Int, userScore: List<Int>)` โ Int ๋น๊ต + ์ ์ ๊ฐ์ฒด
|
|
118
|
+
|
|
119
|
+
```kotlin
|
|
120
|
+
class Referee(private val dealerScore: Int, private val userScore: List<Int>) {
|
|
121
|
+
fun getResult(): List<GameResult> = userScore.map { score ->
|
|
122
|
+
when {
|
|
123
|
+
score > BUST -> GameResult.LOSE
|
|
124
|
+
dealerScore > BUST -> GameResult.WIN
|
|
125
|
+
...
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
๋ฆฌ๋ทฐ์ด: "*์ฌํ ๊ฐ์ฒด๋ ์ ๋ง ํ์ํ ๊ฐ์ฒด์ผ๊น์?* *๊ฐ์ฒด ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋์ง๋ฉด์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฒ ๋ณ๊ฒฝ*ํด๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?" / "*๋ธ๋์ญ์ ํ๋ ์ดํ๋ ํ์ค ์ธ๊ณ๋ฅผ ๋ฐ์*ํด๋ณด์ธ์ :) *๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋ ์ฑ
์์ ๋๊ตฌ์๊ฒ ์์๊น์?* ๋๋ฌ์ ์ ์ ๋ฅผ *์์๊ด๊ณ๋ก ๊ตฌํํ์
จ์ผ๋, ๋ ๋ค Player๋ผ๋ ์ ์ ์์ง ๋ง์์* ๐"
|
|
132
|
+
|
|
133
|
+
ํ์ ์๊ฐ ํ ๋ก : "*Referee๊ฐ ํ์์๋ค๋ฉด, ์ ์๋น๊ต ๊ณ์ฐ์ ํด์ฃผ๋ ๋ก์ง์ ๋๊ฐ ์ํํด์ฃผ์ด์ผ ํ ๊น?* ํ์ฌ ๋ก์ง์(์ ์๊ฐ์) Dealer ํน์ User ํด๋์ค๊ฐ *๊ณ์ฐ์ ๋ํ ์์
์ ํด์ฃผ์ด์ผํ ๊ฒ ๊ฐ๋ค*. User(<-> Dealer) ๋ด๋ถ์์ ๋๋ฌ์ ์ ์์ ๋น๊ตํ๋ ๋ก์ง์ ์ํํ๋ค. - *์ ์ (ํน์ ๋๋ฌ)๋ ์ด๋ป๊ฒ ์๋์ ์ ์๋ฅผ ์ ์ ์๋๊ฐ?* - *์ธ๋ถ๋ก๋ถํฐ ์ฃผ์
๋ฐ๋๋ค -> ์ด๋ด๊ฑฐ๋ฉด Referee๊ฐ ๋ซ์ง์๋..?* ๋ผ๋ ์์์ ํ๋ฆ์ผ๋ก,, ๋์ฐฉํ์ผ๋, *๋ต์ ๋ด๋ฆฌ์ง ๋ชปํ๊ฒ ์ด์ ์ฌ์ญค๋ด
๋๋ค*..."
|
|
134
|
+
|
|
135
|
+
โ **ํ์์ด ์๊ฐ ํ ๋ก ์ผ๋ก ํต์ฌ ์๋ฌธ ๋๋ฌ**. *์๋ ์ ์๋ฅผ ๋ชจ๋ฅด๋๋ฐ ์ด๋ป๊ฒ ๋น๊ตํ๋๊ฐ*. ์ ๋ต: `player.match(other: Player): GameResult` โ *์๋ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก* ๋ฐ์. *์๋ ๊ฐ์ฒด ์์ฒด*๊ฐ ์๋์ ์ ์๋ฅผ ์๊ฒ ํจ. PR #28ยท#63ยท#125ยท#29ยท#24ยท#116๊ณผ ๊ฐ์ ๊ฒฐ. **Referee ๊ฐ์ฒด = ์ ์ ๋น๊ต์**๋ ์ด ์๊ฐ ํ ๋ก ์ ํด๊ฒฐํ์ง ๋ชปํจ.
|
|
136
|
+
|
|
137
|
+
### 10. `Card.valueOf(card: Card): Card.Value` ์ ์ ๋ฉ์๋ โ *์นด๋์ ์ ์๋ฅผ ์ธ๋ถ์์ ๋ณํ*
|
|
138
|
+
|
|
139
|
+
```kotlin
|
|
140
|
+
companion object {
|
|
141
|
+
fun valueOf(card: Card): Card.Value = card.value
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Player์์
|
|
145
|
+
fun calculateCardValueSum(): Int = _cards.sumOf { Card.valueOf(it) } // โ Card.valueOf(it).number ๋๋ฝ?
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
`Card.valueOf(card)`๋ *๊ทธ๋ฅ `card.value` ์ ๊ทผ์ wrapper*. *์ ์ ๋ฉ์๋*๊ฐ *getter ์ญํ ๋ง*. ์๋ฏธ ์๋ ์ฐํ.
|
|
149
|
+
|
|
150
|
+
### 11. `LoginView` ๋ช
๋ช
|
|
151
|
+
|
|
152
|
+
๋ฆฌ๋ทฐ์ด: "View์ ๊ฐ๊ธฐ ์ญํ ์ ๋ถ๋ฆฌํ ์ ์ด ์ธ์ ๊น๋ค์ ๐ *View๋ฅผ ์์ธํ๊ฒ ๋๋๋ค๋ณด๋, ์๋ช
์ด ์ด๋ ค์ ์ ๊ฒ๋ง ๊ฐ๋ค์* ๐ *LoginView๋ผ๋ ์ด๋ฆ์ ์กฐ๊ธ ํท๊ฐ๋ฆด ์ฌ์ง๊ฐ ์์ด๋ณด์ฌ์*" โ *Login*์ ์ธ์ฆ ์๋๋ฆฌ์ค ์ดํ. ๊ฒ์์์๋ *์ด๋ฆ ์
๋ ฅ*. `IntroView` / `GameIntroView` / `PlayerNameInputView` ๋ฑ *๋๋ฉ์ธ ์ดํ ํ์ฉ*. ํ์ ํ์: `GameIntroView`.
|
|
153
|
+
|
|
154
|
+
### 12. `Deck.addCard(card: List<Card>)` โ *๋ชจ๋ ์นด๋ vs ์ฒซ ์นด๋๋ง* ๋ถ์ผ์น
|
|
155
|
+
|
|
156
|
+
```kotlin
|
|
157
|
+
fun addCard(card: List<Card>) {
|
|
158
|
+
_cards.add(card.first()) // โ ์ธ์๋ List์ธ๋ฐ first()๋ง ์ฌ์ฉ
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
๋ฆฌ๋ทฐ์ด: "*๋ฉ์๋๋ช
์ผ๋ก๋ง ๋ณด๋ฉด, ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ๋ชจ๋ ์นด๋ List๋ฅผ ๋ฑ์ ์ถ๊ฐํ ๊ฒ์ด ๊ธฐ๋*๋๋๋ฐ, *์ค์ ๋ก ํ๋ ์ผ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์ฅ๋ง ์ถ๊ฐ*ํ๋ค์. *๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ ํ ๋ฒ์ ์์ธก ๊ฐ๋ฅํ ๋์*์ผ๊น์?" โ ํจ์๋ช
vs ๋์ ๋ถ์ผ์น. *cards: List* ๋ฐ์ผ๋ฉด `addAll`์ด ์์ฐ. `card: Card` ๋จ์๋ฉด `add`. **๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ํธ์ถ ์๋๋ฅผ ๊ฑฐ์ง๋ง**.
|
|
163
|
+
|
|
164
|
+
### 13. `Deck.require(_cards.size != EMPTY)` โ `isNotEmpty()` ํ์ฉ ๋ฏธํก
|
|
165
|
+
|
|
166
|
+
```kotlin
|
|
167
|
+
init { require(_cards.size != EMPTY) { ERROR_EMPTY_DECK } }
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
๋ฆฌ๋ทฐ์ด: "*List ๋ด๋ถ์ ๋น์ด ์์์ ์๋ฆฌ๋ ํจ์*๋ฅผ ํ์ฉํด๋ณด์ธ์ :)" โ `_cards.isNotEmpty()`๊ฐ *์๋ ๋ช
ํ*. *size != EMPTY (= 0)*๋ณด๋ค *์กฐ๊ฑด ์์ฒด๊ฐ ๊ฒ์ฆ์ ์๋ฏธ*.
|
|
171
|
+
|
|
172
|
+
### 14. `CardMachineTest`๊ฐ *size๋ง ๊ฒ์ฆ*
|
|
173
|
+
|
|
174
|
+
```kotlin
|
|
175
|
+
@Test fun `3๋ช
์ผ ๊ฒฝ์ฐ, ์นด๋ ์ธ ์์ ๋ฝ๋๋ค`() {
|
|
176
|
+
val cardMachine = CardMachine()
|
|
177
|
+
val actual = cardMachine.getCardPairs(3)
|
|
178
|
+
assertThat(actual).hasSize(3)
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
๋ฆฌ๋ทฐ์ด: "*์นด๋๋ฅผ ๋ฝ๋ ํ
์คํธ์์, ์ฌ์ด์ฆ๋ง ๊ฒ์ฆํ๋ ๊ฒ์ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ด๋ ค์์* :) *๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด์, ์นด๋๋ฅผ ๋ฝ์์ผ๋, ์ค์ ๋ค์ด์๋ ์นด๋๋ฅผ ์์ธกํ ์ ์์ด์ผ ํ
์คํธ์ ์๋ฏธ๋ฅผ ๋ถ์ฌ*ํ ์ ์์ต๋๋ค ๐"
|
|
183
|
+
|
|
184
|
+
ํ์ ์๊ฐ ์๋ฌธ: "1) *shuffle๋ ์นด๋๋ฅผ ๋ฝ๋ ํ
์คํธ์ธ๋ฐ.. ์ด๋ป๊ฒ ์ค์ ์นด๋๋ฅผ ์์ธกํ ์ ์๋์ง..?* 2) *์นด๋๋จธ์ ์ ์นด๋๋ฅผ ์์ฑํ๊ณ , ์์ด์ฃผ๊ณ , ๋ฝ์์ฃผ๋ ์ญํ *์ ์ํํ๋ฉฐ, getCard๋ ์นด๋๋ฅผ ๋ฝ์์ค๋๋ค. *getCard๋ฅผ ํ
์คํธํ๋ ค๋ ๋ชฉ์ ์, ์ ํด์ง count๋งํผ ์นด๋๊ฐ ์ ๋ฝํ๋ ์ง๋ฅผ ํ
์คํธ*ํ๋ ๋ฐ, *์ค์ ๋ค์ด์๋ ์นด๋๋ฅผ ์ ์์ธกํด์ผํ๋์ง ์ ์ดํด๊ฐ ๊ฐ์ง ์์ต๋๋ค*๐ข"
|
|
185
|
+
|
|
186
|
+
โ ๋ฆฌ๋ทฐ์ด ์๋๋ **์ธ๋ถ ๋น๊ฒฐ์ ์ฑ ๋ถ๋ฆฌ** (lotto/racingcar์ `non-newable` ํจํด). *์
ํ ์๊ณ ๋ฆฌ์ฆ ์์ฒด*๋ stdlib ์ฑ
์์ด๊ณ *์
ํ ํ ๊ฒฐ์ ์ ์์๋ฅผ ์ฃผ์
*ํ๋ฉด *์นด๋ X๊ฐ ์ฒซ ๋ฒ์งธ๋ผ๋ฉด draw ๊ฒฐ๊ณผ๋ X*. ํ์์ด *์ธ๋ถ ๋น๊ฒฐ์ ์ฑ ๋ถ๋ฆฌ ๊ฐ๋
*์ *์์ง ๋ฏธ๋ฐ๊ฒฌ*. (PR #65ยท#114ยท#28๊ณผ ๊ฐ์ ๊ฒฐ.)
|
|
187
|
+
|
|
188
|
+
### 15. `Controller`๊ฐ *Dealer ์นด๋ + User ์นด๋ zip*
|
|
189
|
+
|
|
190
|
+
```kotlin
|
|
191
|
+
private fun initUsers(userNames: List<String>, userCards: List<List<Card>>): List<User> {
|
|
192
|
+
val userNamesAndCards = userNames.zip(userCards)
|
|
193
|
+
return userNamesAndCards.map { userNameAndCard -> User.create(userNameAndCard) }
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
๋ฆฌ๋ทฐ์ด: "*์ด๋ฆ๊ณผ ์นด๋๋ค์ ๋ฐ๋ก ๋ฐ์์ Pair๋ก ์ฒ๋ฆฌํ๊ธฐ ๋ณด๋ค, ๋ฉ์๋ ์ฒด์ด๋์ผ๋ก ์ด๋ฆ๋ถํฐ, ์นด๋๊ฐ์ ธ์์ ์ ์ ๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฐฉ๋ฒ*์ ๊ณ ๋ฏผํด๋ณด์์ ๐" โ `userNames.map { name -> User.create(name, deck.draw(2)) }` ๊ฐ์ *์ฒด์ด๋*์ด *zip + Pair ๋ณํ*๋ณด๋ค ์์ฐ. *๋ฐ์ดํฐ ๋ณํ์ ๋จ๊ณ*๊ฐ *์ฝ๋ ๊ฐ๋
์ฑ*์ ์ํฅ.
|
|
198
|
+
|
|
199
|
+
### 16. `Controller`๊ฐ *๋ธ๋์ญ ๋ฃฐ ์ง์ ๋ถ๊ธฐ* โ ๋๋ฌ 16 ์ดํ + ๋ธ๋์ญ 21์ ๊ฒ์ฌ ๋๋ฝ
|
|
200
|
+
|
|
201
|
+
๋ฆฌ๋ทฐ์ด๊ฐ *์ค์ 6์ฅ ์นด๋๋ก ์๋ฎฌ๋ ์ด์
* ํ ๋ฒ๊ทธ ๋ฐ๊ฒฌ: "์์๋ก ์ฝ๋๋ฅผ ์กฐ์ํด์, *6์ฅ์ ์นด๋๋ก๋ง ๊ตฌ์ฑ๋ ๊ฒ์์์ ๋ชจ๋๊ฐ ๋ธ๋์ญ์ ๊ฐ๊ฒ ์คํ*ํด๋ณด์๋๋ฐ์, *๋๋ฌ์ ์ ์๊ฐ 16์ดํ์ธ ๊ฒฝ์ฐ*๊ฐ ๋์ต๋๋ค. ๋๋ฌ๊ฐ ๋ธ๋์ญ์ธ ๊ฒฝ์ฐ, *ํ๋ ์ด์ด๊ฐ ๋ธ๋์ญ์ด ์๋๋ฉด ๋ชจ๋ ํจ๋ฐฐ*ํ๋ ๋ฃฐ์ด ์๋๋ฐ์, *๋ธ๋์ญ์ ๋ํ ๋๋ฉ์ธ์ ๋ ํ์
ํ์๊ณ ๊ฒ์์ ๊ตฌํ*ํด๋ณด์๋ฉด ์ข๊ฒ ์ด์ :)"
|
|
202
|
+
|
|
203
|
+
โ **๋ฆฌ๋ทฐ์ด๊ฐ ์๋ฎฌ๋ ์ด์
์ผ๋ก ๋ฃฐ ๋๋ฝ ๋ฐ๊ฒฌ**. ํ์: "๋๋ฌ๊ฐ *A+ J/Q/K์ผ ๋, ๋ธ๋์ญ์ผ๋ก ๋ฌด์กฐ๊ฑด ์ฐ์นํ ์ ์๋๋ก ๋ฆฌํฉํ ๋ง*ํ์์ต๋๋ค!" โ *๋ธ๋์ญ ๋ฃฐ์ ํต์ฌ ๋ถ๊ธฐ*(๋๋ฌ ๋ธ๋์ญ ์ 16 ์ดํ๋ผ๋ ์ถ๊ฐ ๋ฝ๊ธฐ ์ ํจ). PR #128ยท#116 *๋ธ๋์ญ ๋ฃฐ ์คํด*์ ๊ฐ์ ๊ฒฐ.
|
|
204
|
+
|
|
205
|
+
### 17. `dealerPickNewCardIfNeed`์ *๊น์ if ์ค์ฒฉ*
|
|
206
|
+
|
|
207
|
+
```kotlin
|
|
208
|
+
private fun dealerPickNewCardIfNeed(dealer: Dealer) {
|
|
209
|
+
if (!dealer.isOverSumCondition()) {
|
|
210
|
+
if (dealer.addScoreTenIfHasAce() != 21) {
|
|
211
|
+
playGameView.printDealerPickNewCard()
|
|
212
|
+
val newCard = cardMachine.getCard(1)
|
|
213
|
+
dealer.addCard(newCard)
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
*if ์ค์ฒฉ + ๋งค์ง๋๋ฒ 21*. `if (!dealer.isOverSumCondition() && !dealer.isBlackjack())` ๋จ์ผ ์กฐ๊ฑด์ด ์์ฐ. *Bust ๋๋ BlackJack์ด๋ฉด ๋ ์ ๋ฝ๋๋ค*๊ฐ *๋๋ฉ์ธ ๋ฃฐ์ ํํ*.
|
|
220
|
+
|
|
221
|
+
### 18. ๋ฉ์๋ ๋ฆฌํด ํ์
๋ช
์ ํ ๋ก
|
|
222
|
+
|
|
223
|
+
```kotlin
|
|
224
|
+
class CardMachine {
|
|
225
|
+
fun getNewCard() = cards.removeFirst() // โ ๋ฆฌํด ํ์
์ถ๋ก
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
๋ฆฌ๋ทฐ์ด: "*๋ฉค๋ฒ๋ณ์์ ๋ฉ์๋์ ๋ฆฌํดํ์
์ ๋ชจ๋ ๋ช
์*ํด์ฃผ๋ ๊ฒ์ ์ด๋จ๊น์? *๋ช
์ํด์ฃผ๋ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์ ์ด๋ค ์ฐจ์ด์ ์ด ์๊ธธ๊น์?* ๋จผ์ ๊ณ ๋ฏผํด๋ณด์๊ณ , ์๋ Effective Kotlin ์์ ์ ์ฑํฐ๋ฅผ ์ฐธ๊ณ ํด์ ์ค์ค๋ก ์๊ฐํด๋ณธ ๊ฒ๊ณผ ๋น๊ตํด๋ณด์์ ๐ - *Item 4 : Inferred Type์ผ๋ก ๋ฆฌํดํ์ง ๋ง๋ผ* - *Item 14 : ๋ณ์ ํ์
์ด ๋ช
ํํ์ง ์์ ๊ฒฝ์ฐ ํ์คํ๊ฒ ์ง์ ํ๋ผ*" โ **๊ณต๊ฐ API์ ๋ฆฌํด ํ์
์ ๋ช
์ ๊ถ์ฅ**. *Inferred*๋ *๊ตฌํ ๋ณ๊ฒฝ ์ ์๊ทธ๋์ฒ๊ฐ ์๋์น ์๊ฒ ๋ณ๊ฒฝ*. PR #135 (ijh1298)์ *๋ชจ๋ ๋ณ์ ํ์
๋ช
์* ๊ณผ์๊ณผ๋ ๋ฐ๋ ๋ฐฉํฅ โ *๊ณต๊ฐ API๋ ๋ช
์, ์ง์ญ ๋ณ์๋ ์ถ๋ก *์ด ๊ท ํ.
|
|
230
|
+
|
|
231
|
+
## ๋ฆฌ๋ทฐ์ด ์๊ฒฌ ์์ง
|
|
232
|
+
|
|
233
|
+
- ***`Answer("y"/"n")` ๋๋ฉ์ธ = UI ํ์ ๋์***.
|
|
234
|
+
- ***`Value`/`CardMachine` = ๋ง๋ฅ ๋ช
์ฌ*** โ `Rank`/`Deck` ๊ฐ์ ๋๋ฉ์ธ ์ดํ.
|
|
235
|
+
- ***`Card ํ ๋ฒ ์์ฑ ํ ์ฌํ์ฉ*** = Flyweight (ํ์ ํ์ ๋ฐ์).
|
|
236
|
+
- ***Generator/Picker/Machine ํจํด ํญ์ฆ*** โ `Deck`์ด ๋๋ฉ์ธ ์ดํ.
|
|
237
|
+
- ***์ธ๋ถ ์ฐธ์กฐ ๋์ = ๋ฐฉ์ด์ ๋ณต์ฌ ๋๋ toMutableList()***.
|
|
238
|
+
- ***์ผ๊ธ ์ปฌ๋ ์
vs ๋ฐฉ์ด์ ๋ณต์ฌ๋ ๋ณ๊ฐ*** โ ์ผ๊ธ์ ๋น์ฆ๋์ค ๋์ ๋ณด์ .
|
|
239
|
+
- ***`validPlayerSum` ๊ฐ์ ๋ชจํธ ๋์ฌ*** โ *๊ฒฐ๊ณผ ๋์ฌ*.
|
|
240
|
+
- ***Ace ๋ช ์ฅ ์นด์ดํธ X*** โ *์๋์ง(Boolean)*๋ง + ํ ๋ฒ ๋ณด์ .
|
|
241
|
+
- ***Referee ์ ์ ๋น๊ต์ = ์์จ์ฑ ๋ถ์ฌ*** โ `player.match(other)` ๋ฉ์์ง.
|
|
242
|
+
- ***`LoginView` = ๋น๋๋ฉ์ธ ์ดํ***.
|
|
243
|
+
- ***`addCard(List<Card>)`์์ first()๋ง = ์๊ทธ๋์ฒ ๊ฑฐ์ง๋ง***.
|
|
244
|
+
- ***`isNotEmpty()` ํ์ฉ***.
|
|
245
|
+
- ***ํ
์คํธ๊ฐ size๋ง ๊ฒ์ฆ = ์ธ๋ถ ๋น๊ฒฐ์ ์ฑ ๋ฏธ๋ถ๋ฆฌ***.
|
|
246
|
+
- ***zip + Pair < ๋ฉ์๋ ์ฒด์ด๋*** (๊ฐ๋
์ฑ).
|
|
247
|
+
- ***๋๋ฌ ๋ธ๋์ญ ์ 16 ์ดํ๋ผ๋ ์ถ๊ฐ ๋ฝ๊ธฐ ์ ํจ*** โ ๋ธ๋์ญ ๋ฃฐ ํต์ฌ.
|
|
248
|
+
- ***๊ณต๊ฐ API ๋ฆฌํด ํ์
๋ช
์***.
|
|
249
|
+
|
|
250
|
+
## ๋ํ ์ธ์ฉ
|
|
251
|
+
|
|
252
|
+
> Answer๋ฅผ *domain์ ๋ถ๋ฅ*ํด์ฃผ์
จ๋๋ฐ์, *ํด๋น ํญ๋ชฉ๋ค์ View์ ์์*๋ค์ :)
|
|
253
|
+
> โ @malibinYun on `Answer.kt`
|
|
254
|
+
|
|
255
|
+
> *์ฌํ ๊ฐ์ฒด๋ ์ ๋ง ํ์ํ ๊ฐ์ฒด์ผ๊น์?* *๊ฐ์ฒด ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋์ง๋ฉด์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฒ ๋ณ๊ฒฝ*ํด๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?
|
|
256
|
+
> โ @malibinYun on `Referee.kt`
|
|
257
|
+
|
|
258
|
+
> *์นด๋๋ค์ ์ผ๊ธ ์ปฌ๋ ์
์ผ๋ก ๊ตฌํ*ํด๋ณด์ธ์ :)
|
|
259
|
+
> โ @malibinYun on `Player.kt`
|
|
260
|
+
|
|
261
|
+
> ์์๋ก ์ฝ๋๋ฅผ ์กฐ์ํด์, *6์ฅ์ ์นด๋๋ก๋ง ๊ตฌ์ฑ๋ ๊ฒ์์์ ๋ชจ๋๊ฐ ๋ธ๋์ญ์ ๊ฐ๊ฒ ์คํ*ํด๋ณด์๋๋ฐ์, *๋๋ฌ์ ์ ์๊ฐ 16์ดํ์ธ ๊ฒฝ์ฐ*๊ฐ ๋์ต๋๋ค. *๋๋ฌ๊ฐ ๋ธ๋์ญ์ธ ๊ฒฝ์ฐ, ํ๋ ์ด์ด๊ฐ ๋ธ๋์ญ์ด ์๋๋ฉด ๋ชจ๋ ํจ๋ฐฐํ๋ ๋ฃฐ*์ด ์๋๋ฐ์, *๋ธ๋์ญ์ ๋ํ ๋๋ฉ์ธ์ ๋ ํ์
*ํ์๊ณ ๊ฒ์์ ๊ตฌํํด๋ณด์๋ฉด ์ข๊ฒ ์ด์ :)
|
|
262
|
+
> โ @malibinYun on `Controller.kt` (์๋ฎฌ๋ ์ด์
์ผ๋ก ๋ฃฐ ๋๋ฝ ๋ฐ๊ฒฌ)
|
|
263
|
+
|
|
264
|
+
> ์นด๋๋ฅผ ๋ฝ๋ ํ
์คํธ์์, *์ฌ์ด์ฆ๋ง ๊ฒ์ฆํ๋ ๊ฒ์ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ด๋ ค์์* :) *๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ํ๊ฒฝ*์ ๋ง๋ค์ด์, ์นด๋๋ฅผ ๋ฝ์์ผ๋, *์ค์ ๋ค์ด์๋ ์นด๋๋ฅผ ์์ธกํ ์ ์์ด์ผ ํ
์คํธ์ ์๋ฏธ*๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค ๐
|
|
265
|
+
> โ @malibinYun on `CardMachineTest.kt`
|
|
266
|
+
|
|
267
|
+
## ์ป์ ๊ตํ
|
|
268
|
+
|
|
269
|
+
- ***`Answer("y"/"n")` ๋๋ฉ์ธ์ UI ์
๋ ฅ ํ์ ๋์*** โ 9๊ฐ+ PR ์ฐ์ ๋ฑ์ฅํ๋ *UI ํ์ ๋๋ฉ์ธ ๋ณด์ * ์ํฐํจํด.
|
|
270
|
+
- ***`Value`/`CardMachine` ๊ฐ์ ๋ง๋ฅ ๋ช
์ฌ*** โ `Rank`/`Deck` ๋๋ฉ์ธ ์ดํ๋ก. PR #92 `Information`ยท#29 `Rule`ยท#65 `Judge`์ ๊ฐ์ ๊ฒฐ.
|
|
271
|
+
- ***Card Flyweight ์บ์ฑ*** โ 52์ฅ + ์ต๋ช
๊ฐ์ฒด๋ก ์ฌ์ฌ์ฉ. PR #112ยท#128ยท#135์ ์ผ๊ด.
|
|
272
|
+
- ***Generator/Picker/Machine ํจํด ํญ์ฆ = ๋๋ฉ์ธ ์ดํ ํ๋ฆผ*** โ `Deck` ๋จ์ผ ๋ช
์ฌ๊ฐ ์์ฐ. PR #29ยท#24ยท#65์ ๊ฐ์ ๊ฒฐ.
|
|
273
|
+
- ***`Dealer(name, cards: MutableList<Card>)` = ์ธ๋ถ ์ฐธ์กฐ ๋์*** โ `toMutableList()` ๋๋ *์์ฑ์์ List<Card>* + ๋ด๋ถ ๋ณํ. PR #79ยท#65ยท#24ยท#28 ์ฌ์ถํ.
|
|
274
|
+
- ***์ผ๊ธ ์ปฌ๋ ์
โ ๋ฐฉ์ด์ ๋ณต์ฌ*** โ *์ผ๊ธ ์ปฌ๋ ์
์ ๋น์ฆ๋์ค ๋์ ๋ณด์ *๊ฐ ๋ณธ์ง. *๋ฐฉ์ด์ ๋ณต์ฌ*๋ *์ธ๋ถ ๋ณ๊ฒฝ ์ฐจ๋จ* ๋ณ๊ฐ.
|
|
275
|
+
- ***`validPlayerSum` ๊ฐ์ *๊ฒ์ฆ vs ํฉ์ฐ ๋ชจํธ ๋์ฌ*** โ *๊ฒฐ๊ณผ ๋์ฌ*๊ฐ ์ ํ. `scoreWithAceAdjusted()` / `totalScore()`.
|
|
276
|
+
- ***Ace ํ ๋ฒ๋ง ๋ณด์ + ์๋์ง(Boolean) ๊ฒ์ฌ*** โ *Ace ๋ ์ฅ = +20์ ํญ์ Bust*. PR #79 ๊ถ๊ณ ์ ์ผ๊ด.
|
|
277
|
+
- ***`Referee` ์ ์ ๋น๊ต์ = ์์จ์ฑ ๋ถ์ฌ*** โ `player.match(other: Player): GameResult` ๋ฉ์์ง. ํ์์ด *์๋ ์ ์๋ฅผ ์ด๋ป๊ฒ ์๋๊ฐ* ์๊ฐ ํ ๋ก ์ผ๋ก *ํต์ฌ ์๋ฌธ ๋๋ฌ*.
|
|
278
|
+
- ***`LoginView` = ๋น๋๋ฉ์ธ ์ดํ*** โ ๊ฒ์ ์ปจํ
์คํธ์ *Login*์ ์ด์. `GameIntroView` ๊ฐ์ *๋๋ฉ์ธ ์ดํ ํ์ฉ*.
|
|
279
|
+
- ***`addCard(List<Card>)`์์ `first()`๋ง = ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฑฐ์ง๋ง*** โ ํจ์๋ช
/์๊ทธ๋์ฒ/๋์ *3์ ์ผ์น* ์์น.
|
|
280
|
+
- ***`isNotEmpty()` ํ์ฉ*** โ *size != 0*๋ณด๋ค *์๋ ์์ฒด*๊ฐ ํจ์์.
|
|
281
|
+
- ***ํ
์คํธ๊ฐ size๋ง ๊ฒ์ฆ = ์ธ๋ถ ๋น๊ฒฐ์ ์ฑ ๋ฏธ๋ถ๋ฆฌ ์ ํธ*** โ ๊ฒฐ์ ์ fake/์ฃผ์
์ผ๋ก *์นด๋ ์์ฒด ๊ฒ์ฆ*. ํ์ ์๊ฐ *์ ์์ธกํด์ผ ํ๋์ง* ์๋ฌธ = *์ธ๋ถ ๋น๊ฒฐ์ ์ฑ ๋ถ๋ฆฌ ๊ฐ๋
๋ฏธ๋ฐ๊ฒฌ*.
|
|
282
|
+
- ***zip + Pair < ๋ฉ์๋ ์ฒด์ด๋*** โ *๋ฐ์ดํฐ ๋ณํ ๋จ๊ณ ๊ฐ์ํ*๊ฐ ๊ฐ๋
์ฑ.
|
|
283
|
+
- ***๋๋ฌ ๋ธ๋์ญ ์ 16 ์ดํ๋ผ๋ ์ถ๊ฐ ๋ฝ๊ธฐ X*** โ *๋ธ๋์ญ ๋ฃฐ ํต์ฌ*. ๋ฆฌ๋ทฐ์ด์ *์๋ฎฌ๋ ์ด์
*์ผ๋ก *๋ฃฐ ๋๋ฝ ๋ฐ๊ฒฌ*. PR #128ยท#116ยท#92์ ๊ฐ์ *๋ธ๋์ญ ๋ฃฐ ์คํด* ํจํด.
|
|
284
|
+
- ***๊ณต๊ฐ API๋ ๋ฆฌํด ํ์
๋ช
์ + ์ง์ญ ๋ณ์๋ ์ถ๋ก *** โ Effective Kotlin Item 4/14. PR #135 *๋ชจ๋ ๋ณ์ ๋ช
์ ๊ณผ์*๊ณผ ๊ท ํ ์กํ ์
์ฅ.
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# PR #75 โ [๋ธ๋์ญ 1๋จ๊ณ] ์ฌ์ง ๋ฏธ์
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@sh1mj1](https://github.com/sh1mj1)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/75
|
|
5
|
+
- **๋จ๊ณ:** 1๋จ๊ณ
|
|
6
|
+
- **๋ฆฌ๋ทฐ์ด:** @vagabond95 โ **์ด์ racingcar ๋ถ์์์ ์ง์ ์ธ์ฉ๋ reviewer (CLAUDE.md ์ `vagueName` ๋ฃฐ ์ธ์ฉ ์ถ์ฒ). ๋ณธ blackjack ๋ฏธ์
์ ์ง์ ๋ฑ์ฅ!**
|
|
7
|
+
- **๋ผ์ธ ์ฝ๋ฉํธ:** 28 ์ค๋ ๋ / ํ์ ์๊ฐ ํ ๋ก ๋งค์ฐ ํ๋ถ โ *State ํจํด ์๊ฐ ํ์ต + ๋์์ธ ํจํด = ์๋ฆฌ๋ฒ ๋น์ *
|
|
8
|
+
|
|
9
|
+
## ์ํ ์ (์ค๊ณ ๊ด์ )
|
|
10
|
+
|
|
11
|
+
- **State ํจํด ์๊ฐ ํ์ต + ์ฝ๋ ์ ์ฉ ์๋** โ ํ์ ์๊ฐ ํ์ต ์ธ์ฉ: *"์ ๋ฆฌ๊ฐ ์ด๋ ๊ฒ ๋ง์ํด์ฃผ์
จ์ง๋ง, ์ ๊ฐ ์ฐํ
์ฝ ์์
์์ ์ํ ํจํด์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์ง์ ๊ณต๋ถํ๊ณ ์ฝ๋๋ก ๊ตฌํ์ ํด๋ณด๊ณ ์ถ์ ์์ฌ์ ๋๊ปด์ ์ด์ฌํ ์ ์ฉํด๋ณด์์ต๋๋ค.."*. **์ฒซ ์๋ + ์ํ์ฐฉ์ค + ์๊ฐ ๋ถ์ ๋ชจ๋ฒ**. `sealed interface CardHandState + Running (Start/Decide/Hit) + Done (Bust/BlackJack/Stay)` ๊ณ์ธต ์๋. PR #136ยท#152ยท#93ยท#147 ์ ๊ฐ์ ๊ฒฐ.
|
|
12
|
+
- **`Decide` ์ค๊ฐ ์ํ ์๊ฐ ๋์ถ** โ *๋ธ๋์ญ/Bust ๊ฒฐ๊ณผ ์ํ + Hit/Stay ์งํ ์ํ + `Decide` (Hit/Stay ๊ฒฐ์ ์ ) ์ค๊ฐ ์ํ*. *vagabond95 ์ง๋จ "BLACKJACK, BURST ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ํ์ด๊ณ STAY, HIT ์ ์งํ๊ณผ์ ์ ๋ํ๋ด๋ ์ํ์ด๋ฏ๋ก ์ด๊ฒ๋ค์ด ๊ฐ์ enum ์ผ๋ก ๋ฌถ์ด๋ ๊ฒ์ด ์ ์ ํ์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข๊ฒ ์ต๋๋ค"* ํ์ ๋ฐ์. **์ํ ๋ถ๋ฅ ์๊ฐ ํ์ต ๋ชจ๋ฒ**.
|
|
13
|
+
- **๋ธ๋ก๊ทธ ๊ธ + ์๊ฐ ํ์ต ์๋ฃ ์ธ์ฉ** โ ํ์ ์๊ฐ ์ธ์ฉ: *"๊ณผ๊ฑฐ์ sealed class ๋ฅผ ๊ณต๋ถํ๊ธฐ ์ํด ์ฝํ๋ฆฐ ์ธ ์ก์
๊ณผ ์ดํํฐ๋ธ ์ฝํ๋ฆฐ์ ๋ณด๋ฉด์ ์ํ ํจํด์ ๊ณต๋ถํ์์ต๋๋ค.(https://sh1mj1-log.tistory.com/199)"* + *"์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์
์ ์งํํ๋ฉด์ ๋์์ธ ํจํด์ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฌ๊ณ ํ๊ณ , ์ค๊ณํ๋ฉด์ ๋ฐ๊ฒฌํด๋ด๊ณ ๊ณต๋ถํ๋ ๊ฒ์ด๋ผ๊ณ ๋๊ผ์ต๋๋ค. (https://sh1mj1-log.tistory.com/228)"*. **์ธ๋ถ ์๋ฃ + ์๊ฐ ์ ๋ฆฌ ๋ธ๋ก๊ทธ ๋ชจ๋ฒ**.
|
|
14
|
+
- **`runPhase(condition: () -> Boolean)` ๋๋ค ์ถ์ํ ์๋** โ Player (์
๋ ฅ ์์ง) / Dealer (์ ์ 16 ์ดํ) ๋ ์กฐ๊ฑด ํต์ผ์ ์ํ ๋๋ค ์ธ์. vagabond95 ํ๊ฐ: *"์ฐ์ ํ ์ฝ๋์์ ๊ฐ๋
์ฑ์ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค ๐ ... ์ด ๋ถ๋ถ์ 2๊ฐ์ง ๊ด์ ์ผ๋ก ์๊ฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. 1. ์ถ์ํด๋์ค์ ํ์ ํ์
์ ์๊ตฌ์ฌํญ์ ์ํด ์์ ํ์
์ API ๊ฐ ๋ณ๊ฒฝ๋์๋ค. -> ์ถ์ ํด๋์ค์ ์ญํ ์ ์๋ชป ์ ์ํ๋ค๋ ์ ํธ์ผ ์ ์์ต๋๋ค. 2. ๊ตฌํ์ ๋ฒ์ฉ์ฑ์ ๊ณ ๋ คํ์ฌ API ๋ฅผ ๊ตฌํํ์๋ค. -> ํ์ ํ์
์ ๊ตฌํ์ ์์ง ๋ชปํ๋ ์ํฉ์์ ๋ฒ์ฉ์ฑ์ ์ํ ์ ํ์ด๋ฏ๋ก ์ ์ ํ ์ ํ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ฌ์ง์ ๊ฒฝ์ฐ 1๋ฒ์ ์ผ์ด์ค๋ฅผ ๊ณ ๋ฏผํ๋ค๊ฐ 2๋ฒ์ ๊ฒฝ์ฐ์ ํด๋นํ๊ฒ ๋ ๊ฒ ๊ฐ์ ๋ณด์
๋๋ค."*. **์ถ์ํ ์ ๋นํ ์๋ฐฉํฅ ์ธ์ ๋ชจ๋ฒ**.
|
|
15
|
+
- **`PlayerWinning + DealerWinning` ๋ถ๋ฆฌ vs ํตํฉ ์๊ฐ ํ ๋ก ** โ ํ์ ์๊ฐ ๋ต๋ณ ๊น์: *"ํ์ง๋ง Dealer ์ ์น/ํจ/๋ฌด์น๋ถ ๋ ์ค์ง, Player ์ ์น/ํจ/๋ฌด์น๋ถ ์ฌ๋ถ๋ง์ ๊ฐ์ง๊ณ ์์๋ผ ์ ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ , ScoreBoard ์์ ๋๋ฌ์ ์น/ํจ/๋ฌด์น๋ถ ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ตฌ์ธ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์, **์ด๋ ํ ์ฑ
์์ ์ํ ์ ๋ณด๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง ํด๋์ค๊ฐ ์ฑ
์์ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ ์๋๊น์?**"*. vagabond95: *"๋ชจ๋ ๊ตฌํ์ trade-off ์์๊ฐ ์์ต๋๋ค. ์ป๋๊ฒ ์์ผ๋ฉด ๊ฑฐ์ ๋ฐ๋์ ํฌ์ํด์ผํ๋ ๋ถ๋ถ์ด ์๊ธฐ๊ฒ ๋ฉ๋๋ค."*. **ํธ๋ ์ด๋์คํ ์๋ฐฉํฅ ์ธ์ ๋ชจ๋ฒ**.
|
|
16
|
+
- **`Done.draw = throw` vs API ์ฌ์ฉ์ ์ฑ
์** โ vagabond95 ๋ต๋ณ: *"API ๋ฅผ ์ ์ค๊ณํ๋ค๋ฉด, ์๋ชป์ฌ์ฉํ์ ์ ๋ฐ์ํ๋ ์์ธ๋ API ์ฌ์ฉ์๊ฐ ๊ฐ์ํ๋ ๊ฒ์ด๋ฏ๋ก ๋ ์ ๊ฒฝ์ฐ์ง ์์ผ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ ๋ก ๋ง์ Android / kotlin ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ ๊ฒ ์์ธ๋ฅผ ๋์ง๋ ๊ตฌํ์ ํตํด ์ ๊ทผ์ ๋ง๋ ๋ฐฉ์์ ํํ๊ณ ์์ต๋๋ค."* โ ํ์ ์๊ฐ ํ์ต. PR #152ยท#147 ์ *throw vs self return* ํธ๋ ์ด๋์คํ ์ ๊ฐ์ ๊ฒฐ.
|
|
17
|
+
|
|
18
|
+
## ๋ชปํ ์ (์ค๊ณ ๊ด์ )
|
|
19
|
+
|
|
20
|
+
### 1. `runPhase` ๋ฉ์๋๋ช
โ *๊ณผ๋ํ๊ฒ ๋ชจํธ (vagabond95 ์ง๋จ ํต์ฌ)*
|
|
21
|
+
|
|
22
|
+
```kotlin
|
|
23
|
+
abstract class Role {
|
|
24
|
+
abstract fun runPhase(condition: () -> Boolean): Boolean
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
vagabond95: *"ํจ์ ์ด๋ฆ์ด ๋๋ฌด ๋ชจํธํฉ๋๋ค. ๋ฌด์์ run ํ๋ ๊ฒ์ด๊ณ phase ๋ ๋ฌด์์ผ๊น์? ์ด๋ค ๋ด์ฉ์ด ํด๋น ํจ์์ ๋ค์ด๊ฐ๋ ํฌ๊ฒ ์ด์ํ์ง ์๊ณ , ๋ค์ ๋งํ๋ฉด ํด๋น ํจ์๋ ์๋ง์ ์ญํ ์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ ๋ฐ์ ์ผ๋ก phase ๋ผ๋ ๋ค์ด๋ฐ์ด ๋ง์๋ฐ, ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ฆ์ ์ง์ด์ฃผ์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค."*
|
|
29
|
+
|
|
30
|
+
ํ์ ์๊ฐ ๋ต๋ณ: *"์ ๋ ์นด๋ ๊ฒ์์์ phase ๋ฅผ ์งํํ๋ค๋ ๊ฒ์ด ๊ฝค๋ ์ผ๋ฐ์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ์ฝํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ ๊ธฐ์ต์๋ ์ด๋ ธ์ ๋ ๋ดค๋ ๋งํ์์ phase ๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์์ต๋๋ค."*
|
|
31
|
+
|
|
32
|
+
vagabond95 ํ์ (๋ค์ด๋ฐ ๊ธฐ์ค ์ ๋ฆฌ): *"1. ๋ชจํธํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ์ด๋ฆ์ ์ง์ํ์. ์ง๋ฌธ ์ฃผ์
จ๋ runPhase ๋ฅผ ์๋ก ๋ค์ด๋ณด๋ฉด, ํ๋ก๊ทธ๋๋ฐ ํน์ฑ์ ๊ฑฐ์ ๋๋ถ๋ถ์ ํจ์๋ run ์ด๋ผ๋ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ ๋ ์ด์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ๊ฟ๋งํ๋ฉด ํด๋น ํจ์์ ์ด๋ค ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ ์ด์ํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 5๋ ์๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ SOLID ์์ SRP ๊ฐ ์ ๋๋ก ์ง์ผ์ง์ง ์๋ ๊ฒ์ด์ฃ . ใ
ใ
(๋น์ทํ ์ฌ๋ก๋ก executeXXX, doXXX ๋ฑ์ด ์์ต๋๋ค.) 2. ๋ง์ ์ฝ๋๋ฅผ ๋ณด๊ณ , ๋ค์ด๋ฐ์ ์ง๋ ๋ค์ํ ์ฌ๋ก๋ฅผ ์ตํ์. ... 3. ๋๋ฉ์ธ์ ๋ํ ์ดํด๋"*
|
|
33
|
+
|
|
34
|
+
โ **`runXX` / `executeXX` / `doXX` ๋ง๋ฅ ๋์ฌ ์ํฐํจํด**. *SRP ์๋ฐ ์ ํธ*. *vagueName ์ํฐํจํด ๋ณํ*. **MCP ๋ฃฐ ํ๋ณด โ `vagueVerb`** (vagueName + ๋ง๋ฅ ๋์ฌ). PR #125ยท#114ยท#10ยท#88 ์ ๊ฐ์ ๊ฒฐ.
|
|
35
|
+
|
|
36
|
+
### 2. `CardHandState enum` ์ *๊ฒฐ๊ณผ + ์งํ ์ํ ํผ์ฌ*
|
|
37
|
+
|
|
38
|
+
vagabond95: *"BLACKJACK, BURST ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ํ์ด๊ณ STAY, HIT ์ ์งํ๊ณผ์ ์ ๋ํ๋ด๋ ์ํ์ด๋ฏ๋ก ์ด๊ฒ๋ค์ด ๊ฐ์ enum ์ผ๋ก ๋ฌถ์ด๋ ๊ฒ์ด ์ ์ ํ์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข๊ฒ ์ต๋๋ค"*
|
|
39
|
+
|
|
40
|
+
โ **๊ฒฐ๊ณผ ์ํ vs ์งํ ์ํ ๋ถ๋ฆฌ ๋ถ์ฌ**. *ํ์ ์๊ฐ ํ์ ๋ฐ์ = sealed interface Running (Hit/Stay/Decide) + Done (Bust/BlackJack/Stay)*. PR #136ยท#147ยท#152 ์ ๊ฐ์ ๊ฒฐ์ *State ๋ถ๋ฅ*.
|
|
41
|
+
|
|
42
|
+
### 3. `output / shape` enum ๋ฉค๋ฒ = View ์์กด
|
|
43
|
+
|
|
44
|
+
vagabond95 ๋ค์ค ์ง๋จ (CardNumber/CardShape/WinningResultStatus): *"output ์ view ์์ ํ์ฉ๋๋ ๊ฐ์ผ๋ก model ์์ ์ ํ์๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋ณด์
๋๋ค!"* / *"shape ๋ view ์์ ํ์ฉ๋๋ ๊ฐ์ผ๋ก model ์์ ์ ํ์๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋ณด์
๋๋ค!"*
|
|
45
|
+
|
|
46
|
+
โ **enum ์ UI value ์ํฐํจํด**. PR #124ยท#28ยท#78ยท#112ยท#125ยท#128ยท#135ยท#137 ์ ๊ฐ์ ๊ฒฐ (๋ฉ์ด์ ์ํฐํจํด).
|
|
47
|
+
|
|
48
|
+
### 4. `BLACK_JACK = 21` ์์ ๋ค์ค ์ ์ธ
|
|
49
|
+
|
|
50
|
+
vagabond95: *"๋๋ฌด ๋ง์ ๊ณณ์์ BLACK_JACK ์ด๋ผ๋ ์์์ ๋ํ ์ ์ธ์ด ์์ต๋๋ค. ์์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋จ์ํ ํ๋์ฝ๋ฉ์ ๋ง๋ ๊ฒ์ธ์ ์ ์ญ์์ ๋ณ๊ฒฝ๋์ง ์๋ ์ํ๋ฅผ ์ผ๊ด๋๊ฒ ์ฐธ์กฐํ๋ ๊ฒ์ ํฐ ์์๊ฐ ์๋๋ฐ์, ์ด๋ ๊ฒ ์ฌ๋ฌ ๊ตฐ๋ฐ์ ์ ์ธํ์ฌ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์ผ๊ด๋๊ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ด๋ ค์์ง๊ฒ ๋ฉ๋๋ค."*
|
|
51
|
+
|
|
52
|
+
โ **์์ ๋ค์ค ์ ์ธ = ์ผ๊ด์ฑ invariant ๋ถ์ฌ**. *ํ ๊ณณ = ๋จ์ผ ์ง์
์ *. PR #146ยท#114ยท#125 ์ ๊ฐ์ ๊ฒฐ.
|
|
53
|
+
|
|
54
|
+
### 5. `CardDeck object + index ๊ฐ๋ณ` + ์์ธ ์ฒ๋ฆฌ ๋ถ์ฌ
|
|
55
|
+
|
|
56
|
+
vagabond95: *"object ๋ก ๊ตฌํ๋๋ค๋ฉด, index ๋ฅผ reset ํ๋ ๊ธฐ๋ฅ๋ ํ์ํ์ง ์์๊น์?"* + *"index ๊ฐ ๋ฒ์๋ฅผ ๋์์ ๊ฒฝ์ฐ์ ๋ํ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํด๋ณด์
๋๋ค."*
|
|
57
|
+
|
|
58
|
+
โ **Singleton + ๊ฐ๋ณ index = ํ
์คํธ ๊ฐ๋ฅ์ฑ โ + ์ฌ์ฌ์ฉ ๋ถ๊ฐ**. PR #108ยท#28ยท#112ยท#125 (Singleton Deck) ์ ๊ฐ์ ๊ฒฐ. **MCP ๋ฃฐ ํ๋ณด โ `singleton-deck-testability`** ๋ฉ์ด์ ํจํด.
|
|
59
|
+
|
|
60
|
+
### 6. `setFirstTurnCards` ๊ฐ public + ํธ์ถ ์์ ๊ฐ์ ๋ถ์ฌ
|
|
61
|
+
|
|
62
|
+
vagabond95: *"ํด๋น ํจ์๋ ์ต์ด์๋ง ํธ์ถ๋๊ธฐ๋ฅผ ๊ธฐ๋ํ๊ณ ์๋๋ฐ์, public ์ผ๋ก ์ ์ธ์ด ๋์ด์์ผ๋ฏ๋ก N ๋ฒ ํธ์ถํ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. ์์๊ฐ ์ค์ํ๊ฑฐ๋ ์ต์ด์ ํธ์ถ๋๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค๋ฉด ๋ค๋ฅธ ํํ๋ก ๋ฆฌํํ ๋ง์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค."*
|
|
63
|
+
|
|
64
|
+
โ **ํธ์ถ ์์ invariant ๋ถ์ฌ**. *์์ฑ์ ๋๋ internal*. PR #146ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
65
|
+
|
|
66
|
+
### 7. `Referee object` ๊ฐ๋ฅ์ฑ
|
|
67
|
+
|
|
68
|
+
vagabond95: *"object ๋ก ์ ์ธ๋์ด๋ ๊ด์ฐฎ์ง ์์๊น์?"*
|
|
69
|
+
|
|
70
|
+
โ **Referee = ์ํ ์์ โ object** = *Kotlin ์ดํ*. *PR #131ยท#108ยท#146 ์ *ResultCalculator object** ์ ๊ฐ์ ๊ฒฐ.
|
|
71
|
+
|
|
72
|
+
### 8. `BLACKJACK` ๊ฒฐ๊ณผ ์ *PlayerWinning ๋ง PlayerName ๋ณด์ * โ *View ์ ์๊ตฌ์ฌํญ ๋์*
|
|
73
|
+
|
|
74
|
+
vagabond95: *"PlayerWinning ์๋ง PlayerName ์ด ํฌํจ๋๋ ์ด์ ๋ View ์ ์๊ตฌ์ฌํญ ๋๋ฌธ ์๋๊น์?"*
|
|
75
|
+
|
|
76
|
+
โ **View ์ ์๊ตฌ์ฌํญ = ๋๋ฉ์ธ ๊ฐ์ฒด ๋ฉค๋ฒ ๋์**. *PlayerName ์ Player ์ ์ ๋ณด โ PlayerWinning ์ด ๋ณ๋ ๋ณด์ *๋ *Player ์ ๊ฒฐ๊ณผ์ ๊ฒฐํฉ*. PR #49ยท#88ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
77
|
+
|
|
78
|
+
### 9. `Participants` ์ *player ์ค์ค๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ ๋ฉ์๋ ์ธ๋ถ ์ถ์ถ*
|
|
79
|
+
|
|
80
|
+
vagabond95: *"player ๊ฐ ์ค์ค๋ก ์ฒ๋ฆฌํ ์ ์์ง ์์๊น์?"*
|
|
81
|
+
|
|
82
|
+
โ **Player ์๊ธฐ ์ฑ
์์ Participants ๊ฐ ํก์**. *Tell-Don't-Ask*.
|
|
83
|
+
|
|
84
|
+
### 10. `Controller โ model ๋ด๋ถ ๋ํ
์ผ ์ง์ ์ ๊ทผ` = Demeter ์๋ฐ
|
|
85
|
+
|
|
86
|
+
vagabond95 (BlackJackController.kt:61): *"Controller ๊ฐ Model ์ ์ธ๋ถ์ฌํญ๊น์ง ๋๋ฌด ์์ธํ๊ฒ ์๊ณ ์์ ํ์๊ฐ ์์ด๋ณด์ฌ์. ์ธ๋ถ์ฌํญ์ ์จ๊ฒจ๋ณผ ์ ์์๊น์? hint : `๋๋ฏธํฐ ๋ฒ์น`"*
|
|
87
|
+
|
|
88
|
+
โ **Controller ๊ฐ model ๊น์ด ์ ๊ทผ = Demeter ์๋ฐ**. PR #133ยท#88ยท#137ยท#146ยท#93 ์ ๊ฐ์ ๊ฒฐ.
|
|
89
|
+
|
|
90
|
+
### 11. `showCards` ๋๋ฉ์ธ์ View ์์กด ์ดํ
|
|
91
|
+
|
|
92
|
+
vagabond95 (Role.kt:22): *"showCards ๋ view ์ ์์กด์ ์ธ ๋ค์ด๋ฐ์ด๋ผ๊ณ ์๊ฐ๋ผ์. ๋ณ๊ฒฝํด๋ณผ ์ ์์๊น์?"*
|
|
93
|
+
|
|
94
|
+
โ **`showXX` / `printXX` ๋๋ฉ์ธ ์ดํ X**. PR #58ยท#88ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
95
|
+
|
|
96
|
+
### 12. `Score.determineWinning(dealerScore: Int)` ํ์
๊ฐ์ ๋ถ์ฌ
|
|
97
|
+
|
|
98
|
+
vagabond95: *"Score ์๋ dealer ์ player ๋ชจ๋ ๊ฐ์ง ์ ์๋ ๋ชจ๋ธ์ธ๋ฐ, ๋๋ฌ score ๋ง์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์๋ ์กฐ๊ธ ์ด์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๊ตฐ๋ค๋, determineWinning ์ ํ๋ผ๋ฏธํฐ๋ ๋ค์ด๋ฐ๋ง dealerScore ์ผ ๋ฟ ํ์
์ผ๋ก ๊ฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์, dealer score ์์ dealer score ๋ฅผ ๋ฃ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค."*
|
|
99
|
+
|
|
100
|
+
โ **`Int` ์ธ์ = ํ์
์์ ์ฑ ๋ถ์ฌ**. *DealerScore value class* ๋๋ *Participant ์ธ์*๋ก *ํ์
๊ฐ์ *. PR #137ยท#90 ์ ๊ฐ์ ๊ฒฐ์ *์์๊ฐ ํฌ์ฅ*.
|
|
101
|
+
|
|
102
|
+
### 13. `BlackJack` ์ปจํธ๋กค๋ฌ ๋ค์ด๋ฐ model ํผ๋
|
|
103
|
+
|
|
104
|
+
vagabond95: *"์ปจํธ๋กค๋ฌ๋ผ๋ฉด model ๊ณผ ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์ด๋ฐ์ ๋ช
์ํด์ฃผ๋ ๊ฑด ์ด๋จ๊น์?"*
|
|
105
|
+
|
|
106
|
+
โ **BlackJack = model ์ด๋ฆ vs Controller**. *BlackJackController* ๋ช
์. PR #58 ์ ๊ฐ์ ๊ฒฐ.
|
|
107
|
+
|
|
108
|
+
### 14. `CardHand.sum()` naming ๋ชจํธ
|
|
109
|
+
|
|
110
|
+
vagabond95: *"๋ฌด์์ sum ํ๋ค๋ ๊ฒ์ธ์ง ๋ด์ฉ์ด ๊ตฌ์ฒด์ ์ผ๋ก ๋๋ฌ๋์ผ ํ ๊ฒ ๊ฐ์์."*
|
|
111
|
+
|
|
112
|
+
โ **`sum()` = ๋ชจํธ (์ ์? ์นด๋ ์?)**. *`totalScore()` / `cardCount()`* ๋ช
์. PR #146ยท#136 ์ ๊ฐ์ ๊ฒฐ.
|
|
113
|
+
|
|
114
|
+
### 15. `dealer.sum` / `player.result` ๊ฐ์ ๊ฒฐ๊ณผ ๋ค์ด๋ฐ ๋น์ผ์น
|
|
115
|
+
|
|
116
|
+
vagabond95: *"๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋๋ฐ, dealer ๋ sum / player ๋ result ๋ก ํํ๋๊ณ ์๋๋ฐ์. ๋ค์ด๋ฐ์ ์ผ์น์ํฌ ํ์๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค."*
|
|
117
|
+
|
|
118
|
+
โ **๊ฐ์ ์๋ฏธ ๋ค๋ฅธ ๋ค์ด๋ฐ = ์ผ๊ด์ฑ ๋ถ์ฌ**. PR #146ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
119
|
+
|
|
120
|
+
### 16. `Done.draw / Done.stay` ๊ฐ *๋ฌด์๋ฏธํ ๋ฉ์๋* โ ํ์ ์๊ฐ ์๋ฌธ
|
|
121
|
+
|
|
122
|
+
ํ์ ์๊ฐ ์ธ์ฉ: *"ํ์ง๋ง ํ์ฌ ๊ตฌํ์ `Done` ์ด๋ผ๋ ์ถ์ ํด๋์ค์์ `draw` ์ `stay` ๋ผ๋ ๋ฉ์๋๊ฐ ๋จ์ํ ์์ธ๋ฅผ ๋์ง๋๋ก ํ๊ณ ์์ต๋๋ค. ์ด ๋ถ๋ถ์์ ๋ถํธํจ์ด ๋๊ปด์ง๋๋ผ๊ตฌ์.. ์ด๋ ๊ฒ ๋๋ฉด `Done` ์ ๊ตฌํ์ฒด์ธ `BlackJack`, `Bust`, `Stay` ์์ ์๋ฌด ์๋ฏธ ์๋ ๋ฉ์๋ `draw` ๋ `stay` ๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก ๋
ผ๋ฆฌ ์์ผ๋ก ์ด๋ฅผ ๊ตฌํํ ์ผ์ด ์๊ฒ ์ง๋ง, ๊ฐ๋ฐ์๊ฐ `Bust(CardHand()).draw()` ์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ ์ฌ์ฉํ์ ๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋, ๊ฒฝ๊ณ ๋ฅผ ๋์์ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์?"*
|
|
123
|
+
|
|
124
|
+
โ **์ธํฐํ์ด์ค ๋ฉ์๋ ์ผ๊ด์ฑ vs ๋๋ฉ์ธ invariant ํธ๋ ์ด๋์คํ**. *State interface = draw/stay ๋ชจ๋ ์ํ์ ๊ฐ์ *. *Done ์ํ = ์๋ฏธ ๋ถ์ฌ*. PR #152ยท#147 ์ ๊ฐ์ ๊ฒฐ.
|
|
125
|
+
|
|
126
|
+
### 17. `enum CardHandState` ์ `output: String` ํ๋ โ *View ์์กด*
|
|
127
|
+
|
|
128
|
+
(๋ชปํ ์ ยง3 ์ ์ฐ์ฅ).
|
|
129
|
+
|
|
130
|
+
### 18. CardDeck ์
ํ ์๋ โ *์ธ๋ถ ์์ ๊ฐ๋ฅ*
|
|
131
|
+
|
|
132
|
+
vagabond95: *"์นด๋๋ฅผ ์ฌ์ฌ์ฉ ์ฒ๋ฆฌ ๐ ๊ทธ๋ฐ๋ฐ, ์
ํ๊น์ง๋ ์ํด๋ ๊ด์ฐฎ์ง ์์๊น์? ์นด๋ ์ธํธ๋ง ์ ๊ณตํ๊ณ ๊ทธ ์ดํ ์ฒ๋ฆฌ๋ ๋๋จธ์ง ํจ์์๊ฒ ์์ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ถํ๋ผ๋ ์์๊ฐ ์ ๋ ฌ๋ ์๋ณธ ์นด๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ์์์ง ๋ชจ๋ฅด๋๊น์ :)"*
|
|
133
|
+
|
|
134
|
+
โ **์
ํ = ์ธ๋ถ ์ฑ
์ ์์**. *์ ๋ต ํจํด (ShuffleStrategy)* ๋๋ *Deck ์ธ๋ถ์์ shuffle* ๋ถ๋ฆฌ. PR #108ยท#133ยท#136 ์ ๊ฐ์ ๊ฒฐ.
|
|
135
|
+
|
|
136
|
+
## ๋ฆฌ๋ทฐ์ด ์๊ฒฌ ์์ง
|
|
137
|
+
|
|
138
|
+
- **`runXX` / `executeXX` / `doXX` ๋ง๋ฅ ๋์ฌ = SRP ์๋ฐ ์ ํธ** โ vagabond95 ๋ช
์.
|
|
139
|
+
- **๊ฒฐ๊ณผ ์ํ vs ์งํ ์ํ ๋ถ๋ฆฌ** โ *enum ํผ์ฌ ํํผ*.
|
|
140
|
+
- **enum UI value = model ๋์** โ *output/shape ์ดํ ๋๋ฉ์ธ X*.
|
|
141
|
+
- **์์ ๋ค์ค ์ ์ธ = ์ผ๊ด์ฑ invariant ๋ถ์ฌ** โ *๋จ์ผ ์ง์
์ *.
|
|
142
|
+
- **Singleton + ๊ฐ๋ณ = ํ
์คํธ โ + ์ฌ์ฌ์ฉ ๋ถ๊ฐ** โ *Strategy ์ฃผ์
์ ๊ณต*.
|
|
143
|
+
- **ํธ์ถ ์์ invariant = public ๋
ธ์ถ ์ํ** โ *internal ๋๋ ์์ฑ์*.
|
|
144
|
+
- **๊ฐ์ฒด vs object Kotlin ์ดํ** โ *์ํ ์์ โ object*.
|
|
145
|
+
- **View ์ดํ (showXX/printXX) ๋๋ฉ์ธ X**.
|
|
146
|
+
- **ํ์
๊ฐ์ = `Int` ์ธ์ ํํผ โ value class** โ *PR #90ยท#137 ์ ๊ฐ์ ๊ฒฐ*.
|
|
147
|
+
- **์ถ์ ํด๋์ค = "๊ณ ์ฅ๋ ํด๋์ค"** (๋ง๋ฆฌ๋น๋ ๋์ผ) โ *abstract method ๊ฐ ๊ฐ์ *.
|
|
148
|
+
- **๋์์ธ ํจํด = ์๋ฆฌ๋ฒ ๋น์ โ ์๊ฐ + ๊ฒฝํ + ์๊ฐ ํ์ต*** โ vagabond95 ์ธ์ฉ.
|
|
149
|
+
- **ํธ๋ ์ด๋์คํ ์๋ฐฉํฅ ์ธ์ = ๋ชจ๋ ๊ตฌํ์ trade-off**.
|
|
150
|
+
|
|
151
|
+
## ๋ํ ์ธ์ฉ
|
|
152
|
+
|
|
153
|
+
**vagabond95 (๋์์ธ ํจํด = ์๋ฆฌ๋ฒ ๋น์ , CardHandState.kt:1):**
|
|
154
|
+
> ๋์์ธ ํจํด์ ์ผ์ข
์ ์๋ฆฌ๋ฒ์ ์ตํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค.
|
|
155
|
+
> ์๋ฆฌ๋ฒ์ ํ๋ฒ ๋ณธ๋ค๊ณ ํด์, ์๋ฆฌ๋ฅผ ์ํ๊ฒ ๋๋ ๊ฒ์ ์๋๋๋ค. ํ์ง๋ง ์ต์ํ ์ด ์๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์งํ๋์ด์ผํ ์ง์ ๋ํ ๊ฐ์ด๋๋ ์ป์ ์ ์๊ฒ ์ฃ . ๋ํ, ์๋ฆฌ๋ฒ์ ๋ํ ๋ด์ฉ์ด ๋ชจ๋ ํ๋ฒ์ ์ดํด๊ฐ ๋๋ ๊ฒ์ด ์๋๋๋ค.
|
|
156
|
+
>
|
|
157
|
+
> ์ฌ๋ฌ ์๋ฆฌ์ ์๋ฆฌ๋ฒ์ ์ ์ฉํด๋ณด๋ฉด์ ์ฅ/๋จ์ ์ ์ตํ๊ณ ์ฌ๋ก๋ฅผ ์์๋๊ฐ๋ฉด์, ์๋ฆฌ๋ฒ์ ์ ํ ๋ด์ฉ์ ์ง์ ํ ์ดํดํ๊ณ ๋ ์ ์ ํ ์ทจ์ฌ์ ํํ๋ ์๊ธฐ๊ฐ ์ค๊ฒ ๋ฉ๋๋ค.
|
|
158
|
+
>
|
|
159
|
+
> ๋์์ธํจํด๋ ์ด์ ๊ฐ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒ์๋ถํฐ ๋๋ฌด ์๋ฒฝํ๊ฒ ์ตํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋์ ๊ทธ๋ ๊ฒ ๋์ง ์์ ๋ถ๋ถ์ ๋ํด ํฐ ์คํธ๋ ์ค ์๋ฐ์ผ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํจํด์ ๋ํด ์์๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ํ ์์ ์๋ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
|
|
160
|
+
|
|
161
|
+
**vagabond95 (๋ค์ด๋ฐ 3 ๊ธฐ์ค, Role.kt):**
|
|
162
|
+
> 1. ๋ชจํธํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ์ด๋ฆ์ ์ง์ํ์.
|
|
163
|
+
> ์ง๋ฌธ ์ฃผ์
จ๋ `runPhase` ๋ฅผ ์๋ก ๋ค์ด๋ณด๋ฉด, ํ๋ก๊ทธ๋๋ฐ ํน์ฑ์ ๊ฑฐ์ ๋๋ถ๋ถ์ ํจ์๋ run ์ด๋ผ๋ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ ๋ ์ด์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ๊ฟ๋งํ๋ฉด ํด๋น ํจ์์ ์ด๋ค ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ ์ด์ํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
|
|
164
|
+
> ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 5๋ ์๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ SOLID ์์ SRP ๊ฐ ์ ๋๋ก ์ง์ผ์ง์ง ์๋ ๊ฒ์ด์ฃ . ใ
ใ
|
|
165
|
+
> (๋น์ทํ ์ฌ๋ก๋ก executeXXX, doXXX ๋ฑ์ด ์์ต๋๋ค.)
|
|
166
|
+
>
|
|
167
|
+
> 2. ๋ง์ ์ฝ๋๋ฅผ ๋ณด๊ณ , ๋ค์ด๋ฐ์ ์ง๋ ๋ค์ํ ์ฌ๋ก๋ฅผ ์ตํ์.
|
|
168
|
+
> ์ฝ๋๋ฅผ ๊ณ์ ์ ํ๋ค๋ณด๋ฉด, ์ ์ฌํ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ค์ด๋ฐ๋ค์ด ์์ต๋๋ค.
|
|
169
|
+
> ๊ฐ๋ น, ์ด๋ฆ์ ๊ธธ์ด๋ฅผ ๊ฒ์ฆํ๋ ํจ์๊ฐ ์๋ค๋ฉด ์์ฃผ ํ์ฉ ๋๋ verifty ๋ผ๋ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ `verifyNameLength()` ๋ผ๊ณ ์ง์ด๋ณผ ์ ์๊ฒ ์ต๋๋ค.
|
|
170
|
+
>
|
|
171
|
+
> 3. ๋๋ฉ์ธ์ ๋ํ ์ดํด๋
|
|
172
|
+
> ๋๋ฌด ๋น์ฐํ ๋ง์ด์ง๋ง ^^; ๋๋ฉ์ธ์ ๋ํ ์ดํด๋๋ ๋ฌด์ฒ ์ค์ํฉ๋๋ค.
|
|
173
|
+
|
|
174
|
+
**vagabond95 (์ถ์ ํด๋์ค API ํธ๋ ์ด๋์คํ, Role.kt):**
|
|
175
|
+
> ์ด ๋ถ๋ถ์ 2๊ฐ์ง ๊ด์ ์ผ๋ก ์๊ฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
|
|
176
|
+
> 1. ์ถ์ํด๋์ค์ ํ์ ํ์
์ ์๊ตฌ์ฌํญ์ ์ํด ์์ ํ์
์ API ๊ฐ ๋ณ๊ฒฝ๋์๋ค. -> ์ถ์ ํด๋์ค์ ์ญํ ์ ์๋ชป ์ ์ํ๋ค๋ ์ ํธ์ผ ์ ์์ต๋๋ค.
|
|
177
|
+
> 2. ๊ตฌํ์ ๋ฒ์ฉ์ฑ์ ๊ณ ๋ คํ์ฌ API ๋ฅผ ๊ตฌํํ์๋ค. -> ํ์ ํ์
์ ๊ตฌํ์ ์์ง ๋ชปํ๋ ์ํฉ์์ ๋ฒ์ฉ์ฑ์ ์ํ ์ ํ์ด๋ฏ๋ก ์ ์ ํ ์ ํ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
|
|
178
|
+
|
|
179
|
+
**vagabond95 (API ์ฌ์ฉ์ ์ฑ
์, Done.kt:10):**
|
|
180
|
+
> ์ ๋ ์ด๋ ๊ฒ ์์ธ๋ฅผ ๋์ ธ์ฃผ๋๊ฒ ๊ต์ฅํ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค. ์ด๋
ธํ
์ด์
์ ํ์ฉํ๋ฉด, ์ปดํ์ผ ํ์์ ๊ฒฝ๊ณ ๋ฅผ ์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง ๋ถํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
|
|
181
|
+
>
|
|
182
|
+
> API ๋ฅผ ์ ์ค๊ณํ๋ค๋ฉด, ์๋ชป์ฌ์ฉํ์ ์ ๋ฐ์ํ๋ ์์ธ๋ API ์ฌ์ฉ์๊ฐ ๊ฐ์ํ๋ ๊ฒ์ด๋ฏ๋ก ๋ ์ ๊ฒฝ์ฐ์ง ์์ผ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
|
|
183
|
+
|
|
184
|
+
**vagabond95 (BLACKJACK/BURST ๊ฒฐ๊ณผ vs HIT/STAY ์งํ ๋ถ๋ฆฌ, CardHandState.kt):**
|
|
185
|
+
> BLACKJACK, BURST ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ํ์ด๊ณ
|
|
186
|
+
> STAY, HIT ์ ์งํ๊ณผ์ ์ ๋ํ๋ด๋ ์ํ์ด๋ฏ๋ก ์ด๊ฒ๋ค์ด ๊ฐ์ enum ์ผ๋ก ๋ฌถ์ด๋ ๊ฒ์ด ์ ์ ํ์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข๊ฒ ์ต๋๋ค.
|
|
187
|
+
|
|
188
|
+
**ํ์ ์๊ฐ ํ์ต (State ํจํด ์์ฌ, CardHandState.kt:1):**
|
|
189
|
+
> ์ ๋ฆฌ๊ฐ ์ด๋ ๊ฒ ๋ง์ํด์ฃผ์
จ์ง๋ง, ์ ๊ฐ ์ฐํ
์ฝ ์์
์์ ์ํ ํจํด์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์ง์ ๊ณต๋ถํ๊ณ ์ฝ๋๋ก ๊ตฌํ์ ํด๋ณด๊ณ ์ถ์ ์์ฌ์ ๋๊ปด์ ์ด์ฌํ ์ ์ฉํด๋ณด์์ต๋๋ค..
|
|
190
|
+
|
|
191
|
+
**ํ์ ์๊ฐ ํ์ต (์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์
์ธ์ฉ + ์๊ธฐ ๋ธ๋ก๊ทธ, CardHandState.kt:1):**
|
|
192
|
+
> ์ฌ์ค 2์ฃผ ์ ์ ์ฝ์น๋์ด ๋ธ๋์ญ ๋ฏธ์
์ ํ๋ฉด, ์ํ ํจํด์ด๋ผ๋ ๋์์ธ ํจํด์ ๋ฐฐ์ธ ๊ฒ์ด๋ผ๊ณ ๋ฏธ๋ฆฌ ์ด์ผ๊ธฐ๋ ํด์ฃผ์
จ๊ณ ,
|
|
193
|
+
> ๋ ๊ณผ๊ฑฐ์ sealed class ๋ฅผ ๊ณต๋ถํ๊ธฐ ์ํด ์ฝํ๋ฆฐ ์ธ ์ก์
๊ณผ ์ดํํฐ๋ธ ์ฝํ๋ฆฐ์ ๋ณด๋ฉด์ ์ํ ํจํด์ ๊ณต๋ถํ์์ต๋๋ค.(https://sh1mj1-log.tistory.com/199)
|
|
194
|
+
>
|
|
195
|
+
> ์ ๋ ์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์
์ ์งํํ๋ฉด์ ๋์์ธ ํจํด์ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฌ๊ณ ํ๊ณ , ์ค๊ณํ๋ฉด์ ๋ฐ๊ฒฌํด๋ด๊ณ ๊ณต๋ถํ๋ ๊ฒ์ด๋ผ๊ณ ๋๊ผ์ต๋๋ค. (https://sh1mj1-log.tistory.com/228)
|
|
196
|
+
|
|
197
|
+
**ํ์ ์๊ฐ ํ์ต (ํธ๋ ์ด๋์คํ ์๋ฌธ, PlayerWinning.kt:1):**
|
|
198
|
+
> ํ์ง๋ง Dealer ์ ์น/ํจ/๋ฌด์น๋ถ ๋ ์ค์ง, Player ์ ์น/ํจ/๋ฌด์น๋ถ ์ฌ๋ถ๋ง์ ๊ฐ์ง๊ณ ์์๋ผ ์ ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ , ScoreBoard ์์ ๋๋ฌ์ ์น/ํจ/๋ฌด์น๋ถ ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ตฌ์ธ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์, **์ด๋ ํ ์ฑ
์์ ์ํ ์ ๋ณด๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง ํด๋์ค๊ฐ ์ฑ
์์ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ ์๋๊น์?**
|
|
199
|
+
|
|
200
|
+
## ์ป์ ๊ตํ
|
|
201
|
+
|
|
202
|
+
1. ***`runXX` / `executeXX` / `doXX` ๋ง๋ฅ ๋์ฌ = SRP ์๋ฐ ์ ํธ***. *ํจ์ ์ด๋ฆ์ ์ด๋ค ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ ์ด์ํ์ง ์์ผ๋ฉด ๋จ์ผ ์ฑ
์ ๋ถ์ฌ*. **MCP ๋ฃฐ ํ๋ณด โ `vagueVerb` (vagueName ๋ณํ)**. PR #125ยท#114ยท#10ยท#88ยท#58 ์ ๊ฐ์ ๊ฒฐ.
|
|
203
|
+
|
|
204
|
+
2. ***๊ฒฐ๊ณผ ์ํ (BLACKJACK/BUST) vs ์งํ ์ํ (HIT/STAY) ๋ถ๋ฆฌ***. *๊ฐ์ enum ํตํฉ X*. *sealed Running / Done ํ์ ๋ถ๋ฆฌ*. PR #136ยท#147ยท#152ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
205
|
+
|
|
206
|
+
3. ***๋์์ธ ํจํด = ์๋ฆฌ๋ฒ ๋น์ (vagabond95)*** โ *ํ ๋ฒ ๋ณธ๋ค๊ณ ์ํ์ง X, ์ฌ๋ฌ ์ฌ๋ก ์ ์ฉ + ์ฅ๋จ์ ์ตํ๊ธฐ*. *ํ์ ์๊ฐ ํ์ต ๊ฐ์น ์ธ์ *.
|
|
207
|
+
|
|
208
|
+
4. ***`Done.draw / Done.stay = throw` API ์ฌ์ฉ์ ์ฑ
์ vs ์ปดํ์ผ ํ์ ๊ฒฝ๊ณ ํธ๋ ์ด๋์คํ***. *API ์ ์ค๊ณ ์ ์๋ชป ์ฌ์ฉ = ์ฌ์ฉ์ ๊ฐ์*. *Android/Kotlin stdlib ๋ ๋์ผ ํจํด*. PR #152ยท#147ยท#85 ์ ๊ฐ์ ๊ฒฐ.
|
|
209
|
+
|
|
210
|
+
5. ***`enum UI value` ๋ฉ์ด์ ์ํฐํจํด***. *output/shape/koreanText ๋ฉค๋ฒ = model ๋์*. PR #124ยท#28ยท#78ยท#112ยท#125ยท#128ยท#135ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
211
|
+
|
|
212
|
+
6. ***`BLACK_JACK = 21` ์์ ๋ค์ค ์ ์ธ = ์ผ๊ด์ฑ invariant ๋ถ์ฌ***. *๋จ์ผ ์ง์
์ + ์์ ํ ๊ณณ*. PR #146ยท#114ยท#125 ์ ๊ฐ์ ๊ฒฐ.
|
|
213
|
+
|
|
214
|
+
7. ***Singleton CardDeck + ๊ฐ๋ณ index = ํ
์คํธ โ + ์ฌ์ฌ์ฉ ๋ถ๊ฐ***. *Strategy ํจํด + ์์ฑ์ ์ฃผ์
์ ๊ณต*. **MCP ๋ฃฐ ํ๋ณด โ `singleton-deck-testability`** ๋ฉ์ด์ . PR #108ยท#28ยท#112ยท#125 ์ ๊ฐ์ ๊ฒฐ.
|
|
215
|
+
|
|
216
|
+
8. ***`Int` ์ธ์ = ํ์
์์ ์ฑ ๋ถ์ฌ***. *DealerScore value class* / *Participant ์ธ์* ๊ฐ *ํ์
๊ฐ์ *. PR #137ยท#90ยท#108ยท#133ยท#132ยท#136ยท#49 ์ ๊ฐ์ ๊ฒฐ.
|
|
217
|
+
|
|
218
|
+
9. ***`showXX` / `printXX` ๋๋ฉ์ธ ์ดํ X***. PR #58ยท#88ยท#137 ์ ๊ฐ์ ๊ฒฐ.
|
|
219
|
+
|
|
220
|
+
10. ***ํ์ ์๊ฐ ํ์ต = "์ถ์ ํด๋์ค ์ฌ์ฉ ์ํด ์ฑ
์์ ๊ฐ์ง ํด๋์ค๊ฐ ์ ๋ณด๋ฅผ ๋ ๊ฐ์ง?"*** = *ํธ๋ ์ด๋์คํ ์๊ฐ ์ธ์ ๋ชจ๋ฒ*. *vagabond95 ๋ต๋ณ = "๋ชจ๋ ๊ตฌํ์ trade-off"* ์๋ฐฉํฅ ํ์ต. PR #137ยท#148ยท#151ยท#146 ์ ๊ฐ์ ๊ฒฐ.
|
|
221
|
+
|
|
222
|
+
11. ***vagabond95 = racingcar ์ธ์ฉ reviewer ์ง์ ๋ฑ์ฅ***. *CLAUDE.md ์ vagueName ๋ฃฐ ์ธ์ฉ ์ถ์ฒ๊ฐ ๋ณธ blackjack ๋ฏธ์
์๋ ๋ฑ์ฅ* โ **reviewer ๋์ ์ธ์ฉ ๋ณด๊ฐ**.
|
|
223
|
+
|
|
224
|
+
12. ***ํ์ ์๊ฐ ๋ต๋ณ์ ์๊ธฐ ๋ธ๋ก๊ทธ ๊ธ + ์ธ๋ถ ์๋ฃ ์ธ์ฉ (์ฝํ๋ฆฐ ์ธ ์ก์
, ์ดํํฐ๋ธ ์ฝํ๋ฆฐ) + ์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์
์ธ์ฉ = ํ์ต ๊ฐ์ํ ์ต๊ณ ์์ค***. *์ธ๋ถ ์๋ฃ + ์๊ฐ ์ ๋ฆฌ + ๋ณธ์ธ ์ฝ๋ ์ ์ฉ* ํ๋ฆ. PR #128ยท#135ยท#108ยท#133ยท#136ยท#137ยท#146ยท#41ยท#148ยท#151 ์ ๊ฐ์ ๊ฒฐ.
|