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,348 @@
|
|
|
1
|
+
# PR #113 — [블랙잭 1단계] 포르 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@jiyuneel](https://github.com/jiyuneel)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/113
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 2025 코호트 전담 reviewer (PR #117·#126·#129·#138·#139·#142·#143·#109·#113 분석 reviewer)
|
|
7
|
+
- **라인 코멘트:** 22 스레드 — *2025 코호트 셀프 체크리스트 PR 본문 + 모든 22 스레드 학생 자가 답변 + commit SHA + 학생 자가 후속 의문 5+ 회 (Player.playGame 추상화 의문 + 인자 폭증 의문 + Controller 책임 의문) + Hit/Stay Boolean vs Action enum (PR #117·#126 결과 반대 시점) + Deck null vs 예외 + companion → 인스턴스 + 고차함수 활용 + canHit 추상화 자가 학습 + Result enum 도메인 vs 뷰 + abstract vs open vs interface 자가 학습 + Participants 일급 컬렉션 자가 적용 + playGame 추상화 → Participants 역할 (reviewer 자가 수정)*
|
|
8
|
+
- **신규 reviewee** (2025년 코호트 — 모바일 안드로이드 7기, PR #117·#129·#130·#126·#138·#142·#143·#109·#113 = **2025 코호트 9 PR 코퍼스 성장**).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 + 셀프 체크리스트 + 학생 자가 입장 명시 (2025 코호트 정점)
|
|
13
|
+
|
|
14
|
+
PR 본문 + 라인 자가 입장 (Thread 2 인용):
|
|
15
|
+
|
|
16
|
+
> *"`controller`를 게임의 중재자 또는 카지노라고 생각했습니다. 참가자가 처음에 뽑아야 하는 카드의 수(2장)는 게임의 룰에 해당하며, 이를 `controller`가 관리하는 것이 가장 바람직하다고 판단했습니다..!*
|
|
17
|
+
>
|
|
18
|
+
> *참가자에게 카드를 뽑으라는 메시지를 두 번씩 던져서 참가자는 카드 뽑기의 주체가 되지만, 몇 번 뽑아야 하는지는 게임의 흐름을 조율하는 `controller`가 결정하는 것이 적절하다고 생각했는데 어떻게 생각하시나요..?!"*
|
|
19
|
+
|
|
20
|
+
→ **학생 자가 입장 명시 + reviewer 의견 요청** = PR #35·#126 (hyemdooly·doabletuple *학생 자가 입장 명시*) 결 합류.
|
|
21
|
+
|
|
22
|
+
reviewer 후속 (Thread 15):
|
|
23
|
+
|
|
24
|
+
> *"BlackJackGame 이라는 도메인 모델이 존재한다면 보다 명확해질 수 있을까요?"*
|
|
25
|
+
|
|
26
|
+
학생 자가 적용 → *BlackjackGame 도메인 객체 자가 생성*.
|
|
27
|
+
|
|
28
|
+
**MCP 룰 `controller-as-game-mediator-vs-domain-game-object` 후보** — *Controller 가 게임 흐름 vs BlackjackGame 도메인 객체* 트레이드오프.
|
|
29
|
+
|
|
30
|
+
### 2. `Hit/Stay Boolean` vs `Action enum` — PR #117·#126 결과 반대 시점
|
|
31
|
+
|
|
32
|
+
reviewer (Thread 1):
|
|
33
|
+
|
|
34
|
+
> *"Hit or Stay를 Boolean으로 구분할 수 있지 않을까요? 처음에 Action 이라는 키워드를 보고 어떤 의미인지 판단하기 쉽지 않을 것 같습니다."*
|
|
35
|
+
|
|
36
|
+
학생 자가 적용: `readPlayerHit(player): Boolean`.
|
|
37
|
+
|
|
38
|
+
→ **`Action enum` (PR #117·#126) vs `Boolean` (PR #113)** = **2 reviewer 의 *반대 시점 자가 적용*** = *MCP `oop_propose_alternatives` 핵심 가치 합류*:
|
|
39
|
+
|
|
40
|
+
- **PR #117·#126** (reviewer KwonDae·woowahan-dino): *String → Action enum (Stringly-typed 회피)*.
|
|
41
|
+
- **PR #113** (reviewer KwonDae): *Action → Boolean (의미 직관)*.
|
|
42
|
+
|
|
43
|
+
→ **같은 reviewer (KwonDae) 의 *다른 학생에 다른 권유*** = *학생 컨텍스트 별 트레이드오프*.
|
|
44
|
+
|
|
45
|
+
**MCP 룰 `enum-vs-boolean-context-dependent` 후보** — *enum vs Boolean = 의미 명시 vs 직관성 트레이드오프*.
|
|
46
|
+
|
|
47
|
+
### 3. `BlackjackGame` 도메인 객체 자가 적용 + 룰 응집
|
|
48
|
+
|
|
49
|
+
reviewer (Thread 15): *"BlackJackGame 이라는 도메인 모델이 존재한다면 보다 명확해질 수 있을까요?"*
|
|
50
|
+
|
|
51
|
+
학생 자가 적용:
|
|
52
|
+
|
|
53
|
+
```kotlin
|
|
54
|
+
fun distributeInitialCards() {
|
|
55
|
+
repeat(INITIAL_CARD_COUNT) {
|
|
56
|
+
participants.drawCard(deck)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
→ **게임 룰 도메인 응집 + Controller 가벼움** = PR #129·#126·#142 결 합류.
|
|
62
|
+
|
|
63
|
+
### 4. 학생 자가 *현실 메타포 = Controller = 게임 중재자/카지노* (Thread 2)
|
|
64
|
+
|
|
65
|
+
§1 인용. 학생이 자가 *Controller = 카지노* 메타포 사용 → reviewer *Controller 가 흐름 조율 vs 참가자 자가 뽑기* 권유.
|
|
66
|
+
|
|
67
|
+
→ **현실 메타포 양가성** = PR #117·#129·#130·#143·#109 결의 *현실 메타포 정합* 어휘 누적 12+ PR ⭐⭐⭐.
|
|
68
|
+
|
|
69
|
+
다만 *PR #129 reviewer = 참가자 자가 / PR #113 학생 자가 = Controller 중재자* = **메타포 양가**.
|
|
70
|
+
|
|
71
|
+
### 5. `abstract class Participant` + canHit/getResult 추상 메서드 자가 학습
|
|
72
|
+
|
|
73
|
+
학생 자가 답변 (Thread 16):
|
|
74
|
+
|
|
75
|
+
> *"`interface`는 상태를 가질 수 없으며, `open class`는 하위 클래스에서 공통 메서드를 구현하도록 강제할 수 없습니다. 딜러와 플레이어의 공통된 상태와 역할을 제공하면서, 일부 구체적인 로직은 각 클래스에서 구현하도록 하기 위해 `abstract class`를 사용했습니다!"*
|
|
76
|
+
|
|
77
|
+
→ **abstract class vs open vs interface 3 분류 학생 자가 학습** = PR #129·#126·#138·#142·#143 결 합류 누적 6+ PR.
|
|
78
|
+
|
|
79
|
+
### 6. 학생 자가 후속 의문 + reviewer 자가 권유 수정 (Thread 20·21)
|
|
80
|
+
|
|
81
|
+
학생 자가 의문 (Thread 20):
|
|
82
|
+
|
|
83
|
+
> *"플레이어는 'y'를 입력하면 카드를 추가로 뽑을 수 있고, 딜러는 점수가 16 이하이면 카드를 추가로 뽑을 수 있습니다. 이처럼 카드를 뽑는 공통 역할이 있어 `Player`와 `Dealer`의 `playGame`를 추상화하고 싶었습니다.*
|
|
84
|
+
>
|
|
85
|
+
> *하지만 각 클래스의 `playGame`에서 필요로 하는 파라미터가 달라 다소 복잡해졌는데, 제이든이 보시기에는 어떠신지, 더 나은 추상화 방법이 있는지 피드백 부탁드립니다..! 🙏🏻"*
|
|
86
|
+
|
|
87
|
+
reviewer 자가 수정 (Thread 20):
|
|
88
|
+
|
|
89
|
+
> *"이 부분은 수정할게요. playGame의 내용은 각 참가자별로 게임을 진행하는 로직으로 Participant로의 추상화 보다는 Participants에서 역할을 할 수 있지 않을까 생각이 들었습니다. 현재 참가자의 결과를 계산하는 `getPlayerResults` 처럼 playGame은 Player 와 Dealer의 추상화 보다는 이미 추상화된 `canHit(), drawCard()` 를 사용하면 지금 하고 계신 고민들에 도움이 될 것 같아요"*
|
|
90
|
+
|
|
91
|
+
→ **시그니처 차이 추상화 한계 + reviewer 자가 권유 수정 + 이미 추상화된 메서드 활용 권유** = PR #126 (abstract-method-blocked-by-signature-divergence) 결 강화 + PR #142·#109 (reviewer 자가 한계 인정/수정) 결 합류.
|
|
92
|
+
|
|
93
|
+
**MCP 룰 `reviewer-self-suggestion-revision` 후보** — *reviewer 가 자가 권유 수정 + 더 나은 안 제시*.
|
|
94
|
+
|
|
95
|
+
### 7. 학생 자가 ShuffledCardGenerator + Deck(cards) DI 자가 적용
|
|
96
|
+
|
|
97
|
+
reviewer (Thread 8): *"Deck이 항상 랜덤으로 생성될 경우 해당 도메인은 테스트가 어려워집니다."*
|
|
98
|
+
|
|
99
|
+
학생 자가 적용:
|
|
100
|
+
|
|
101
|
+
```kotlin
|
|
102
|
+
class ShuffledCardGenerator {
|
|
103
|
+
fun generate(): List<Card> = ...
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
class Deck(cards: List<Card>) {
|
|
107
|
+
val cards: ArrayDeque<Card> = ArrayDeque(cards)
|
|
108
|
+
fun pick(): Card = cards.removeLast()
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
→ **DI + 카드 생성 분리** = PR #138·#143 (Deck DI) 결 합류. **MCP 룰 `interface-for-test-substitution` 강화** 누적 6+ PR.
|
|
113
|
+
|
|
114
|
+
### 8. 추가 칭찬
|
|
115
|
+
|
|
116
|
+
- Thread 19: *"공통 로직 추상화 잘해주셨어요 👍"*.
|
|
117
|
+
- Thread 22: *"참가자들을 관리하여 역할을 분리할 수 있게 되었네요! 👍"*.
|
|
118
|
+
|
|
119
|
+
## 못한 점 (설계 관점)
|
|
120
|
+
|
|
121
|
+
### 1. `Deck.pick(): Card?` nullable 반환 — null vs 예외
|
|
122
|
+
|
|
123
|
+
reviewer (Thread 4): *"만약 덱이 비어있으면 어떤 일이 발생할까요?"*
|
|
124
|
+
|
|
125
|
+
학생 자가 답변:
|
|
126
|
+
|
|
127
|
+
> *"덱이 비어있는 경우에 예외를 던질지 고민했는데, 카드가 없는 것도 정상적인 게임 상황이라고 판단하고 게임을 결과를 출력하도록 했습니다! 덱이 비어있으면 null을 반환하고, `controller`에서 null을 확인하여 프로그램을 종료하고 결과를 출력합니다."*
|
|
128
|
+
|
|
129
|
+
→ **null 반환 정공** = PR #35 (galcyurio Kotlin 예외 처리 4 원칙) 결의 *논리 오류 X = null 반환* 정공. **MCP 룰 `kotlin-exception-handling-strategy` 강화** 누적 4+ PR (#129·#138·#35·#113).
|
|
130
|
+
|
|
131
|
+
### 2. Deck companion → 인스턴스 변경 (학생 자가 자가 정정)
|
|
132
|
+
|
|
133
|
+
reviewer (Thread 5): *"Deck의 변수와 함수들을 모두 companion object에 구현한 배경은 무엇이었을까요? 🧐"*
|
|
134
|
+
|
|
135
|
+
학생: *"여기저기서 `Deck`에 접근할 수 있을 것 같아 현재는 인스턴스를 만들어 사용하도록 변경했습니다!"*
|
|
136
|
+
|
|
137
|
+
→ **Singleton 자가 회피 + 인스턴스 정공** = PR #130·#138·#143 (Singleton Deck 안티패턴) 결 누적 20+ PR ⭐⭐⭐.
|
|
138
|
+
|
|
139
|
+
### 3. Players 일급 컬렉션 사용자 입력 한계 학생 자가 의문
|
|
140
|
+
|
|
141
|
+
reviewer (Thread 7): *"만들어주신 Players 일급컬렉션의 역할을 제대로 하고 있는걸까요?"*
|
|
142
|
+
|
|
143
|
+
학생 자가 의문:
|
|
144
|
+
|
|
145
|
+
> *"`Players` 일급컬렉션을 활용하는 방법을 고민해보았지만, 플레이어는 매번 카드를 뽑을지 여부를 view에서 입력받아야 해서 해당 로직을 도메인으로 옮기는 것이 쉽지 않았습니다. 😢 현재 구조에서는 사용자의 입력이 필요한 부분이 존재하여 `Players` 내부에서 구현하기에 한계가 있는데, 이를 해결할 수 있는 방법이 있을까요..?"*
|
|
146
|
+
|
|
147
|
+
reviewer 답변 (Thread 14): *"입력받는 로직을 domain으로 옮겨야만 해결이 가능할까요? hint. kotlin에는 [고차함수](https://kotlinlang.org/docs/lambdas.html)라는게 존재합니다."*
|
|
148
|
+
|
|
149
|
+
학생 자가 적용 + 자가 한계 인정:
|
|
150
|
+
|
|
151
|
+
> *"고차함수를 활용하여 참가자들이 각자 게임을 진행하도록 변경해봤습니다! 다만, 아직 고차함수가 익숙하지 않아 적절하게 사용하였는지는 잘 모르겠습니다..! 😢"*
|
|
152
|
+
|
|
153
|
+
→ **사용자 입력 vs 도메인 = 고차함수 정공 + 학생 자가 학습 한계 인정** = PR #87·#129·#138·#126 결.
|
|
154
|
+
|
|
155
|
+
### 4. Result enum 도메인 vs 뷰 (PR #126·#143 결과 같은 어휘)
|
|
156
|
+
|
|
157
|
+
reviewer (Thread 10): *"승, 패, 무 는 도메인 로직일까요?"*
|
|
158
|
+
|
|
159
|
+
학생 자가 답변:
|
|
160
|
+
|
|
161
|
+
> *"해당 값은 출력을 할 때만 필요한 정보이므로 뷰 로직이라고 생각합니다! `OutputView`에서 처리하도록 수정했습니다."*
|
|
162
|
+
|
|
163
|
+
→ **String 출력 = View 책임** = PR #126·#130·#143 결 강화 누적 4+ PR.
|
|
164
|
+
|
|
165
|
+
### 5. Rank 기호 표시 = 도메인 vs 뷰 (변경 가능성 지표)
|
|
166
|
+
|
|
167
|
+
reviewer (Thread 12): *"만약 A 대신 기호로 표시해달라는 요구사항이 온다면 도메인 로직을 수정해야 할까요?"*
|
|
168
|
+
|
|
169
|
+
→ **변경 가능성 = View 책임 지표** = PR #126 (KwonDae 동일 어휘) 결 강화 누적 2+ PR.
|
|
170
|
+
|
|
171
|
+
### 6. 인자 폭증 (4 람다 인자) — 학생 자가 의문
|
|
172
|
+
|
|
173
|
+
학생 코드 (Thread 21):
|
|
174
|
+
|
|
175
|
+
```kotlin
|
|
176
|
+
fun playTurns(
|
|
177
|
+
onPlayerResponse: (Player) -> Boolean,
|
|
178
|
+
onPlayerDraw: (Player) -> Unit,
|
|
179
|
+
onDealerDraw: (Dealer) -> Unit,
|
|
180
|
+
) {
|
|
181
|
+
participants.playGame(deck, onPlayerResponse, onPlayerDraw, onDealerDraw)
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
학생 자가 의문:
|
|
186
|
+
|
|
187
|
+
> *"`participants`에게 메세지를 던지는 방식으로 변경했습니다! 다만, 이렇게 변경하니 인자를 너무 많이 넘겨주는 건 아닌가 싶긴 하네요.. 😅"*
|
|
188
|
+
|
|
189
|
+
→ **콜백 람다 폭증 학생 자가 인지** = PR #36·#142·#35 (`callback-lambda-explosion`) 결 합류.
|
|
190
|
+
|
|
191
|
+
### 7. 결과 계산 책임 분배 + 학생 자가 의문 2 가지 (Thread 11)
|
|
192
|
+
|
|
193
|
+
학생 자가 의문:
|
|
194
|
+
|
|
195
|
+
> *"1. 플레이어는 `승 or 패`의 결과가 나오는 반면, 딜러는 모든 플레이어와 비교하여 `n승 n패` 형식의 결과가 나옵니다. 그렇기에 controller에서 딜러의 결과를 계산하는 로직은 아직 남아있습니다.*
|
|
196
|
+
>
|
|
197
|
+
> *2. 변경되기 전의 코드는 모든 플레이어의 결과를 계산한 후, 그 결과를 바탕으로 딜러의 결과를 계산했습니다. 플레이어의 결과에 따라서 딜러의 결과가 결정된다고 생각해서 이렇게 구현했었습니다. 다른 참가자와 비교하여 결과를 계산하도록 변경하면서 동일한 비교를"*
|
|
198
|
+
|
|
199
|
+
→ **Player 1대1 결과 vs Dealer n승n패 형식 비대칭 + 동일 비교 반복** = PR #142 (doabletuple 자가 코드 예시 + 자가 의문) 결 합류. **MCP 룰 `symmetric-compare-bidirectional-call` 강화** 누적 3+ PR (#142·#143·#113).
|
|
200
|
+
|
|
201
|
+
### 8. `Players.players` 2 depth 일급 컬렉션 → Participants 자가 적용
|
|
202
|
+
|
|
203
|
+
reviewer (Thread 17): *"2 depth로 들어가는 `players.players` 으로도 일급컬렉션의 용도가 생기는 부분 같아요..!"*
|
|
204
|
+
|
|
205
|
+
학생 자가 적용: *Participants 클래스 추가 (딜러 + 플레이어 관리)*.
|
|
206
|
+
|
|
207
|
+
→ **PR #129 (compile-time-singleton + Participants 생성자 타입 분리) 결 합류**.
|
|
208
|
+
|
|
209
|
+
### 9. `Hand` 생성자 vs emptyList 기본값
|
|
210
|
+
|
|
211
|
+
reviewer (Thread 3): *"현재 생성자가 사용되는곳은 Participant 뿐이어서 생성자로 받지 않아도 차이는 없어보이네요!"*
|
|
212
|
+
|
|
213
|
+
학생 자가 적용: `Hand` 기본 `emptyList()`.
|
|
214
|
+
|
|
215
|
+
→ **불필요한 생성자 인자 제거** — PR #109·#138 (test fixture 생성자) 결과 같은 어휘.
|
|
216
|
+
|
|
217
|
+
### 10. 확장 함수 위치 (Controller 내부 vs Domain)
|
|
218
|
+
|
|
219
|
+
reviewer (Thread 18): *"Participant 확장함수가 Controller 내부에 있는게 자연스러울까요? 🧐"*
|
|
220
|
+
|
|
221
|
+
학생: *"덱에 카드가 비어있으면 다시 카드를 넣어주도록 변경하여 해당 확장함수는 삭제했습니다!"*
|
|
222
|
+
|
|
223
|
+
→ **확장 함수 위치 = 도메인 위치 정공**. **MCP 룰 `extension-function-locator` 후보**.
|
|
224
|
+
|
|
225
|
+
### 11. `Dealer.canHit() = score <= 16` + `Player.canHit() = score <= 21`
|
|
226
|
+
|
|
227
|
+
```kotlin
|
|
228
|
+
abstract fun canHit(): Boolean
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
→ **각자 다른 기준 자가 적용** = PR #129·#126·#138·#142·#143 결.
|
|
232
|
+
|
|
233
|
+
다만 *Player canHit `score <= 21`* — *21 시 hit 가능* = PR #129·#138·#139·#126·#130·#142·#143 결과 동일 (21 시 hit 가능 모델). PR #35 (21 시 stop) 반대 시점.
|
|
234
|
+
|
|
235
|
+
### 12. `getResult` 추상 메서드 + Player/Dealer override
|
|
236
|
+
|
|
237
|
+
```kotlin
|
|
238
|
+
abstract fun getResult(other: Participant): Result
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
→ **Tell-Don't-Ask 정공 + 양쪽 자가 비교** = PR #142·#143·#109 결.
|
|
242
|
+
|
|
243
|
+
### 13. 한 도메인 객체 (`BlackjackGame`) 다른 도메인 객체 (`Participants`) 동시 보유 — 책임 중첩
|
|
244
|
+
|
|
245
|
+
학생 코드: *BlackjackGame + Participants 동시 존재* = PR #142·#143 (Game/Scoreboard 분리) 결 합류. *Controller → BlackjackGame → Participants 3 단계 메시지*.
|
|
246
|
+
|
|
247
|
+
### 14. 모든 22 스레드 학생 자가 답변 + commit SHA + 자가 후속 의문 5+ 회 — 2025 코호트 정점
|
|
248
|
+
|
|
249
|
+
## 리뷰어 의견 요지
|
|
250
|
+
|
|
251
|
+
- **Hit/Stay Boolean 권유 (PR #117·#126 반대 시점)**.
|
|
252
|
+
- **Controller 흐름 vs 참가자 자가 분배 (학생 자가 입장 + reviewer 양방향)**.
|
|
253
|
+
- **Hand 생성자 제거 + emptyList 기본값**.
|
|
254
|
+
- **Deck null 반환 vs 예외**.
|
|
255
|
+
- **Deck companion → 인스턴스 변경**.
|
|
256
|
+
- **canHit 공통 로직 자가 학습**.
|
|
257
|
+
- **Players 일급 컬렉션 사용자 입력 한계 학생 자가 의문 + 고차함수 권유**.
|
|
258
|
+
- **테스트 가능성 = Deck DI + ShuffledCardGenerator 분리**.
|
|
259
|
+
- **Result enum 도메인 vs 뷰**.
|
|
260
|
+
- **getResult 추상 메서드 + 학생 자가 의문 2가지 (Player 1대1 vs Dealer n승n패)**.
|
|
261
|
+
- **Rank 기호 표시 = 도메인 vs 뷰 (변경 가능성)**.
|
|
262
|
+
- **고차함수 입력받기 + 학생 자가 한계 인정**.
|
|
263
|
+
- **BlackjackGame 도메인 객체 권유 + 학생 자가 적용**.
|
|
264
|
+
- **abstract vs open vs interface 자가 학습**.
|
|
265
|
+
- **Players.players 2 depth + Participants 일급 컬렉션 자가 적용**.
|
|
266
|
+
- **playGame 추상화 → Participants 역할 (reviewer 자가 수정)**.
|
|
267
|
+
- **확장 함수 위치 (Controller vs Domain)**.
|
|
268
|
+
|
|
269
|
+
## 대표 인용
|
|
270
|
+
|
|
271
|
+
> [KwonDae Thread 1]
|
|
272
|
+
> *"Hit or Stay를 Boolean으로 구분할 수 있지 않을까요? 처음에 Action 이라는 키워드를 보고 어떤 의미인지 판단하기 쉽지 않을 것 같습니다."*
|
|
273
|
+
|
|
274
|
+
→ **enum vs Boolean = 의미 명시 vs 직관성** — *PR #117·#126 정공 (enum) 반대 시점*.
|
|
275
|
+
|
|
276
|
+
> [jiyuneel Thread 2]
|
|
277
|
+
> *"`controller`를 게임의 중재자 또는 카지노라고 생각했습니다. 참가자가 처음에 뽑아야 하는 카드의 수(2장)는 게임의 룰에 해당하며, 이를 `controller`가 관리하는 것이 가장 바람직하다고 판단했습니다..!"*
|
|
278
|
+
|
|
279
|
+
→ **학생 자가 *Controller = 카지노* 현실 메타포** — *PR #129 (참가자 자가) 반대 시점 양가*.
|
|
280
|
+
|
|
281
|
+
> [KwonDae Thread 20]
|
|
282
|
+
> *"이 부분은 수정할게요. (...) playGame은 Player 와 Dealer의 추상화 보다는 이미 추상화된 `canHit(), drawCard()` 를 사용하면 지금 하고 계신 고민들에 도움이 될 것 같아요"*
|
|
283
|
+
|
|
284
|
+
→ **reviewer 자가 권유 수정 + 이미 추상화 활용** — *PR #142·#109 결 합류*.
|
|
285
|
+
|
|
286
|
+
> [jiyuneel Thread 21]
|
|
287
|
+
> *"`participants`에게 메세지를 던지는 방식으로 변경했습니다! 다만, 이렇게 변경하니 인자를 너무 많이 넘겨주는 건 아닌가 싶긴 하네요.. 😅"*
|
|
288
|
+
|
|
289
|
+
→ **학생 자가 콜백 람다 폭증 인지** — *PR #36·#142 결 합류*.
|
|
290
|
+
|
|
291
|
+
## 얻은 교훈 (보편)
|
|
292
|
+
|
|
293
|
+
1. **enum vs Boolean = 의미 명시 vs 직관성 트레이드오프 (PR #117·#126 반대 시점)** — **MCP 룰 `enum-vs-boolean-context-dependent` 후보**.
|
|
294
|
+
|
|
295
|
+
2. **Controller = 게임 중재자/카지노 vs 참가자 자가 (현실 메타포 양가)** — *PR #129 결과 반대 시점*. **MCP 룰 `controller-as-game-mediator-vs-domain-game-object` 후보**.
|
|
296
|
+
|
|
297
|
+
3. **reviewer 자가 권유 수정 + 이미 추상화 활용** — **MCP 룰 `reviewer-self-suggestion-revision` 후보**.
|
|
298
|
+
|
|
299
|
+
4. **사용자 입력 vs 도메인 = 고차함수 정공 + 학생 자가 한계 인정** — PR #87·#129·#138·#126 결.
|
|
300
|
+
|
|
301
|
+
5. **결과 비대칭 (Player 1대1 vs Dealer n승n패) + 동일 비교 반복** — **MCP 룰 `symmetric-compare-bidirectional-call` 강화** 누적 3+ PR.
|
|
302
|
+
|
|
303
|
+
6. **Players 일급 컬렉션 사용자 입력 한계 학생 자가 의문 + 고차함수 답변** — *학생 자가 학습 정점*.
|
|
304
|
+
|
|
305
|
+
7. **null 반환 = 정상 게임 상황 (Kotlin 예외 처리 4 원칙)** — **MCP 룰 `kotlin-exception-handling-strategy` 강화** 누적 4+ PR.
|
|
306
|
+
|
|
307
|
+
8. **현실 메타포 양가 (Controller 카지노 vs 참가자 자가)** — **MCP 룰 `metaphor-fidelity-locator` 강화** 누적 12+ PR ⭐⭐⭐.
|
|
308
|
+
|
|
309
|
+
9. **abstract vs open vs interface 학생 자가 3 분류** — *PR #129·#126·#138·#142·#143·#113 결 합류 누적 6+ PR*.
|
|
310
|
+
|
|
311
|
+
10. **확장 함수 위치 (Controller vs Domain)** — **MCP 룰 `extension-function-locator` 후보**.
|
|
312
|
+
|
|
313
|
+
11. **변경 가능성 = View 책임 지표 (PR #126 결)** — *Rank 기호 표시*.
|
|
314
|
+
|
|
315
|
+
12. **모든 22 스레드 학생 자가 답변 + commit SHA + 자가 후속 의문 5+ 회** — *2025 코호트 정점 유지*.
|
|
316
|
+
|
|
317
|
+
## 얻은 교훈 (도메인)
|
|
318
|
+
|
|
319
|
+
1. **Dealer canHit `score <= 16` + Player canHit `score <= 21`** — *각자 기준 자가 적용*.
|
|
320
|
+
|
|
321
|
+
2. **카드 N장 뽑기 = 도메인 룰 (학생 자가 *카지노* 메타포 + reviewer *참가자 자가* 메타포 양가)**.
|
|
322
|
+
|
|
323
|
+
3. **Player 1대1 결과 vs Dealer n승n패 결과 비대칭** — *학생 자가 의문*.
|
|
324
|
+
|
|
325
|
+
## MCP 룰 후보 신규 + 강화 (PR #113)
|
|
326
|
+
|
|
327
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
328
|
+
|---|---|---|
|
|
329
|
+
| `enum-vs-boolean-context-dependent` | 신규 | 1 (#113) |
|
|
330
|
+
| `controller-as-game-mediator-vs-domain-game-object` | 신규 | 1 (#113) |
|
|
331
|
+
| `reviewer-self-suggestion-revision` | 신규 | 1 (#113) |
|
|
332
|
+
| `symmetric-compare-bidirectional-call` | 강화 | 3+ (#142·#143·#113) |
|
|
333
|
+
| `metaphor-fidelity-locator` | 강화 | 12+ ⭐⭐⭐ |
|
|
334
|
+
| `kotlin-exception-handling-strategy` | 강화 | 4+ |
|
|
335
|
+
| `extension-function-locator` | 신규 | 1 (#113) |
|
|
336
|
+
| `interface-for-test-substitution` | 강화 | 6+ |
|
|
337
|
+
| `string-formatting-view-responsibility` | 강화 | 4+ |
|
|
338
|
+
| `singleton-deck-via-companion` | 강화 | 20+ ⭐⭐⭐ |
|
|
339
|
+
| `abstract-without-abstract-method` | 강화 | 6+ |
|
|
340
|
+
|
|
341
|
+
## 메타 어휘 (14 reviewer + MCP 핵심 가치 합류 정점 유지)
|
|
342
|
+
|
|
343
|
+
- ***학생 자가 *Controller = 카지노* 현실 메타포*** — jiyuneel PR #113 — *현실 메타포 양가성*.
|
|
344
|
+
- ***reviewer 자가 권유 수정 + 이미 추상화 활용*** — KwonDae PR #113 — *PR #142·#109 결 합류*.
|
|
345
|
+
- ***Hit/Stay enum vs Boolean = 같은 reviewer 의 다른 학생 다른 권유*** — KwonDae PR #117·#126 (enum) vs PR #113 (Boolean) — *학생 컨텍스트 별 트레이드오프*.
|
|
346
|
+
- ***학생 자가 콜백 람다 폭증 인지*** — jiyuneel PR #113 — *PR #36·#142 결 합류*.
|
|
347
|
+
|
|
348
|
+
→ **14 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **2025 코호트 9 PR 코퍼스 성장**.
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# PR #140 — [블랙잭 2단계] 포르 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@jiyuneel](https://github.com/jiyuneel)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/140
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 1단계 #113 동일 reviewer
|
|
7
|
+
- **라인 코멘트:** 16 스레드 — *PR 본문 자가 의문 + 학생 자가 의문 5+ 회 + 람다 4개 인자 폭증 자가 의문 (PR #142 결과 동일) + 고차함수 = View 의존 X 학생 자가 학습 + 다형성 compare 추상화 학생 자가 코드 예시 + 수익률 = GameResult 책임 (PR #142 결) + abstract → sealed class 학생 자가 변경 + sealed 라이브러리 배포 시 제약 reviewer 메타 어휘 + Profit 팩토리 메서드 자가 적용 + thisScore 외부 의존 → 본인 점수 자가 (Tell-Don't-Ask) + tailrec 자가 적용*
|
|
8
|
+
- **양 단계 완성 reviewee** (1단계 #113 batch 21 분석 완료 + 2단계 #140 = batch 22 추가).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 학습 의식 + 학생 자가 의문 5+ 회
|
|
13
|
+
|
|
14
|
+
PR 본문:
|
|
15
|
+
|
|
16
|
+
> *"제이든, 안녕하세요 :) 2단계 미션을 진행하면서 고민한 부분이 많아서 조금 늦어진 것 같아요 😂 이전 피드백도 #113 모두 반영하고자 노력했습니다!"*
|
|
17
|
+
|
|
18
|
+
→ **학생 자가 학습 적극성 + 1단계 → 2단계 사이 학습 시간성** = PR #138·#142·#143 결 합류.
|
|
19
|
+
|
|
20
|
+
### 2. 람다 4개 인자 폭증 학생 자가 의문 (PR #142 결과 동일)
|
|
21
|
+
|
|
22
|
+
학생 자가 의문 (Thread 1):
|
|
23
|
+
|
|
24
|
+
> *"하지만 변경해보니 고차함수를 `controller` → `BlackjackGame` → `Participants`로 넘기게 되었고, 너무 많이 넘겨주는 건 아닌가 싶어 해결할 방법도 고민해봤지만 방법을 찾지 못했습니다.. 😢 또한 4개의 매개변수도 많지 않나 싶었지만 플레이어와 딜러가 게임을 하려면 모두 필요한 정보여서 이렇게 구현하게 되었습니다."*
|
|
25
|
+
|
|
26
|
+
reviewer 답변 (Thread 5):
|
|
27
|
+
|
|
28
|
+
> *"여러 가지 방법이 있을 것 같아요*
|
|
29
|
+
> *- onDraw 를 하나의 람다로 사용할 수 없을까?*
|
|
30
|
+
> *- 불가능하다면 람다 매개변수를 묶어서 활용해볼 수 있을까?"*
|
|
31
|
+
|
|
32
|
+
학생 자가 적용:
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
// onPlayerDraw + onDealerDraw 통합
|
|
36
|
+
when (participant) {
|
|
37
|
+
is Player -> ...
|
|
38
|
+
is Dealer -> ...
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
→ **람다 통합 = 타입 체크로 분기** + **`abstract class` → `sealed class` 학생 자가 변경 (when exhaustive)**. PR #142 (lambda-multiple-args-tuple-leak) 결 합류.
|
|
43
|
+
|
|
44
|
+
### 3. 고차함수 = View 의존 X 학생 자가 학습
|
|
45
|
+
|
|
46
|
+
reviewer (Thread 2):
|
|
47
|
+
|
|
48
|
+
> *"고차함수는 View에 대한 직접적인 의존성을 제거하고, 추상화된 동작(람다)만을 전달받아 실행합니다. 따라서 도메인은 View의 구체적인 구현을 알 필요가 없기에 의존한다고 볼 수 없습니다. 고차함수를 사용함으로써 어떤 이점이 있었을까요?*
|
|
49
|
+
> *- 특정 행동 추상화*
|
|
50
|
+
> *- 전달받은 action 만 실행하므로 실제 내부 구현은 관심 X*
|
|
51
|
+
> *- 테스트"*
|
|
52
|
+
|
|
53
|
+
학생 자가 답변:
|
|
54
|
+
|
|
55
|
+
> *"고차함수를 사용하면 도메인은 추상화된 행동만 전달받기 때문에 구체적인 구현을 알 수 없습니다! `Participant`의 입장에서는 단순히 `카드를 뽑았을 때 어떠한 행동을 해야 돼` 정도만 알 뿐, 그 행동이 어떤 것인지는 알지 못합니다. 또한, 테스트 코드에서는 `{ true }`와 같이 전달하면 되므로 view와 무관하게 테스트를 할 수 있고 테스트가 비교적 용이해집니다!"*
|
|
56
|
+
|
|
57
|
+
→ **고차함수 = 추상화된 행동 + 테스트 용이성** = PR #109 (5 라운드 양방향 토론 + reviewer 자가 정정) 결 합류. **MCP 룰 `higher-order-function-as-domain-view-decoupling` 후보**.
|
|
58
|
+
|
|
59
|
+
### 4. `abstract class` → `sealed class` 학생 자가 변경 (when exhaustive)
|
|
60
|
+
|
|
61
|
+
학생 자가 적용 (Thread 5):
|
|
62
|
+
|
|
63
|
+
> *"또한 이 과정에서 when 문에서 모든 하위 클래스를 처리할 수 있도록 `abstract class`였던 `Participant` 클래스를 `sealed class`로 변경했습니다."*
|
|
64
|
+
|
|
65
|
+
reviewer (Thread 7): 외부글 (codestates 다형성 + stackoverflow interface/abstract/sealed 비교).
|
|
66
|
+
|
|
67
|
+
학생 자가 답변:
|
|
68
|
+
|
|
69
|
+
> *"`sealed class`로 구현하면 `Participant`를 상속하는 새로운 타입이 추가되었을 때, 컴파일 타임에 모든 하위 타입을 확인할 수 있어 더 안전하다고 생각했습니다..! 특히 `when` 문에서 모든 타입을 처리하도록 강제하고 예상치 못한 타입을 방지할 수 있다는 장점이 있다고 생각했는데, 혹시 제가 고려하지 못한 점이 있을까요..? 😯"*
|
|
70
|
+
|
|
71
|
+
reviewer 메타 어휘 (Thread 13):
|
|
72
|
+
|
|
73
|
+
> *"맞아요 sealed class 는 compiler 가 나머지 분기에 대해 처리하지 않아도 된다는 장점이 존재합니다. 그렇다면 포르가 이 블랙잭 미션을 라이브러리로 배포한다고 했을 때, 사용자들에게 Paricipant를 확장할 수 있도록 제공한다고 가정해본다면 어떤 일이 발생할 수 있을지 고민해볼까요?*
|
|
74
|
+
>
|
|
75
|
+
> *hint. 직접 패키지를 새로 만들어 Participant 를 확장해보기"*
|
|
76
|
+
|
|
77
|
+
→ **sealed class 라이브러리 배포 시 사용자 확장 제약** = *sealed = 모듈 한정 = 외부 확장 X*. **MCP 룰 `sealed-class-library-extension-constraint` 후보**.
|
|
78
|
+
|
|
79
|
+
PR #129·#126·#138·#142·#143·#113 결의 *sealed vs abstract vs open* 결 합류 정점.
|
|
80
|
+
|
|
81
|
+
### 5. `Profit` 팩토리 메서드 + 자가 계산 (PR #142 cashOut 결 합류)
|
|
82
|
+
|
|
83
|
+
```kotlin
|
|
84
|
+
fun from(bettingAmount: BettingAmount, gameResult: GameResult): Profit =
|
|
85
|
+
Profit(bettingAmount * gameResult.rate)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
→ **Profit 자가 계산 + 팩토리 메서드** = PR #142 `GameResult.cashOut(player)` 결 합류.
|
|
89
|
+
|
|
90
|
+
### 6. operator overloading `times` 자가 적용
|
|
91
|
+
|
|
92
|
+
```kotlin
|
|
93
|
+
operator fun times(rate: Double): Double = value * rate
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
→ **value class + operator times** = PR #142·#36 결 합류.
|
|
97
|
+
|
|
98
|
+
### 7. tailrec 자가 적용 + 학생 자가 어휘
|
|
99
|
+
|
|
100
|
+
학생 자가 답변 (Thread 10):
|
|
101
|
+
|
|
102
|
+
> *"새로 알게 된 `tailrec` 키워드를 활용하여 변경해보았습니다! 재귀로 호출하여 코드의 가독성을 높이면서, 컴파일 과정에서 while 문으로 변환하여 성능도 최적화할 수 있어 좋은 것 같습니다 👍🏻"*
|
|
103
|
+
|
|
104
|
+
```kotlin
|
|
105
|
+
tailrec fun playGame(draw: () -> Card, shouldContinue: ..., onDraw: ...) {
|
|
106
|
+
if (canHit() && shouldContinue(this)) {
|
|
107
|
+
receiveCard(draw())
|
|
108
|
+
onDraw(this)
|
|
109
|
+
playGame(draw, shouldContinue, onDraw)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
→ **`tailrec` 자가 학습 + 적용** = PR #138·#142 (rosemin928·doabletuple) 결 합류 누적 3+ PR.
|
|
115
|
+
|
|
116
|
+
### 8. compare 공통 로직 추상화 + 학생 자가 코드 예시 (Thread 3)
|
|
117
|
+
|
|
118
|
+
```kotlin
|
|
119
|
+
// Participant.kt
|
|
120
|
+
protected fun compare(thisScore: Score, otherScore: Score): GameResult =
|
|
121
|
+
when {
|
|
122
|
+
thisScore > otherScore -> GameResult.WIN
|
|
123
|
+
thisScore < otherScore -> GameResult.LOSE
|
|
124
|
+
else -> GameResult.DRAW
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
→ **공통 비교 로직 추출** = PR #142 (super 키워드) 결 합류.
|
|
129
|
+
|
|
130
|
+
### 9. 추가 칭찬
|
|
131
|
+
|
|
132
|
+
- Thread 8: *"중복 로직이 깔끔하게 없어졌네요 👍"*.
|
|
133
|
+
- Thread 14: *"연산자 오버로딩을 잘 활용해주셨어요 👍"*.
|
|
134
|
+
- Thread 15: *"입력받는 곳에서도 재귀를 잘 활용해주셨습니다 👍"*.
|
|
135
|
+
- 모든 16 스레드 학생 자가 답변 + commit SHA.
|
|
136
|
+
|
|
137
|
+
## 못한 점 (설계 관점)
|
|
138
|
+
|
|
139
|
+
### 1. `thisScore` 외부 의존 → 본인 점수 자가 (Tell-Don't-Ask)
|
|
140
|
+
|
|
141
|
+
reviewer (Thread 12):
|
|
142
|
+
|
|
143
|
+
> *"thisScore 라는 값을 외부로 부터 받아야 할까요? 참가자는 본인의 점수를 알고 있습니다. '나'의 점수와 '상대방' 점수를 비교하면 되는 로직일거에요. 그렇다면 나의 점수도 외부 값에 의존해야 할까요? 또는 비교해야 할 대상이 늘어난다면 그만큼 함수 또는 파라미터가 늘어나야 할까요?.?*
|
|
144
|
+
>
|
|
145
|
+
> *자식클래스는 다른 참가자를 받는데 왜 부모클래스는 두 참가자를 받아야만 하는걸까요?"*
|
|
146
|
+
|
|
147
|
+
→ **부모 클래스 두 점수 vs 본인 점수 자가** = *Tell-Don't-Ask 정공*. **MCP 룰 `parameter-vs-self-state-access` 후보**.
|
|
148
|
+
|
|
149
|
+
### 2. sealed class 라이브러리 확장 제약 — §4 참조
|
|
150
|
+
|
|
151
|
+
reviewer 의 메타 어휘 (Thread 13) = *sealed class 의 라이브러리 외부 확장 X 제약 = 사용자 확장 가능성 의식*.
|
|
152
|
+
|
|
153
|
+
→ **라이브러리 사용자 시점 어휘** = PR #87·#76·#107·#82 (maintainer perspective locator) 결 + **사용자 확장 의식** 어휘 합류.
|
|
154
|
+
|
|
155
|
+
**MCP 룰 `sealed-class-library-extension-constraint` 후보** — *sealed = 모듈 내부 + 라이브러리 배포 시 사용자 확장 X*.
|
|
156
|
+
|
|
157
|
+
### 3. else 분기 처리 = 논리 오류 (Thread 6)
|
|
158
|
+
|
|
159
|
+
reviewer (Thread 6):
|
|
160
|
+
|
|
161
|
+
> *"현재 else 분기처리로 들어온다는 것은 어떤 오류에 해당할까요? 또한 어떤 방법으로 오류 대응을 할 수 있을까요?"*
|
|
162
|
+
|
|
163
|
+
학생: *"추상 클래스를 사용했을 때 `else` 분기처리로 들어오는 상황은 예상하지 못한 타입이 들어왔을 때 발생하는 논리적 오류입니다. 이때 `IllegalArgumentException`와 같은 예외를 던져 대응할 수 있을 것입니다."*
|
|
164
|
+
|
|
165
|
+
→ **else 분기 = 논리 오류** = PR #35 (Kotlin 예외 처리 4 원칙 - 논리 오류 시 예외) 결 합류.
|
|
166
|
+
|
|
167
|
+
### 4. 테스트 범위 (Thread 16) — 역할 중심
|
|
168
|
+
|
|
169
|
+
학생 자가 의문:
|
|
170
|
+
|
|
171
|
+
> *"테스트 코드를 작성하는 과정에서, 어느 정도까지 테스트를 해야 하는지에 대한 의문이 생겼습니다. 현재 제 코드에서 게임 실행이 controller → BlackjackGame → Participants → Player 순서로 호출하여 진행됩니다. 테스트 코드를 전부 작성하지는 못했지만,, 각 클래스에서 게임 실행에 대한 테스트가 중복될 것 같은데, 어떤 범위까지 테스트를 작성해야 할지에 대한 조언을 구하고 싶습니다..!"*
|
|
172
|
+
|
|
173
|
+
reviewer 답변:
|
|
174
|
+
|
|
175
|
+
> *"먼저 각 클래스와 객체별로 역할을 중심으로 테스트를 작성하면 됩니다. (...) BlackjackGame: 게임 규칙과 진행을 관리하는 역할 → 게임 규칙과 주요 로직. Participants 및 Player: 개별 [...]"*
|
|
176
|
+
|
|
177
|
+
→ **테스트 = 역할 중심 (PR #87·#129·#142·#109 결 합류)** = *MCP `oh-my-oop` 핵심 가치 (역할·책임·협력) 어휘 정점*.
|
|
178
|
+
|
|
179
|
+
**MCP 룰 `test-by-role-not-by-flow` 후보** — *역할 중심 테스트 vs 흐름 중심 테스트*.
|
|
180
|
+
|
|
181
|
+
### 5. `super` 키워드 학생 자가 답변 (Thread 8)
|
|
182
|
+
|
|
183
|
+
reviewer: *"중복 로직이 깔끔하게 없어졌네요 👍 그렇다면 super 키워드에 대해 찾아보시면 더 도움이 될 것 같습니다 🙃"*
|
|
184
|
+
|
|
185
|
+
학생 자가 답변:
|
|
186
|
+
|
|
187
|
+
> *"부모 클래스인 `Participant`의 `compare` 함수는 두 참가자의 점수를 비교하는 연산을 하고, 자식 클래스의 `resultAgainst` 함수는 다른 참가자를 받아와 결과를 계산합니다. 두 함수의 함수 시그니처가 달라 super 키워드를 사용하지 않아도 되었던 것 같습니다..!"*
|
|
188
|
+
|
|
189
|
+
→ **시그니처 차이 = super 활용 불필요** + *PR #142 결의 *시그니처 차이 추상화 한계* 어휘 합류*.
|
|
190
|
+
|
|
191
|
+
### 6. `BlackjackResult` 클래스 - 게임 결과 + 수익 계산
|
|
192
|
+
|
|
193
|
+
```kotlin
|
|
194
|
+
// BlackjackResult - 수익 계산
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
→ **결과 통계 + 수익 계산 책임 분리** = PR #142 (Scoreboard) 결 합류. **MCP 룰 `result-aggregation-locator` 강화** 누적 3+ PR (#126·#142·#140).
|
|
198
|
+
|
|
199
|
+
### 7. 모든 16 스레드 학생 자가 답변 + commit SHA — 2025 코호트 정점 유지
|
|
200
|
+
|
|
201
|
+
## 대표 인용
|
|
202
|
+
|
|
203
|
+
> [KwonDae Thread 2]
|
|
204
|
+
> *"고차함수는 View에 대한 직접적인 의존성을 제거하고, 추상화된 동작(람다)만을 전달받아 실행합니다."*
|
|
205
|
+
|
|
206
|
+
→ **고차함수 = 도메인 ↔ View 의존 X** — PR #109 결과 합류.
|
|
207
|
+
|
|
208
|
+
> [KwonDae Thread 13]
|
|
209
|
+
> *"그렇다면 포르가 이 블랙잭 미션을 라이브러리로 배포한다고 했을 때, 사용자들에게 Paricipant를 확장할 수 있도록 제공한다고 가정해본다면 어떤 일이 발생할 수 있을지 고민해볼까요?"*
|
|
210
|
+
|
|
211
|
+
→ **라이브러리 배포 시점 메타 어휘** — *사용자 확장 의식*.
|
|
212
|
+
|
|
213
|
+
> [KwonDae Thread 12]
|
|
214
|
+
> *"thisScore 라는 값을 외부로 부터 받아야 할까요? 참가자는 본인의 점수를 알고 있습니다."*
|
|
215
|
+
|
|
216
|
+
→ **Tell-Don't-Ask 어휘**.
|
|
217
|
+
|
|
218
|
+
> [jiyuneel Thread 4]
|
|
219
|
+
> *"참가자는 각자의 승패를 판단하고, `BlackjackResult`는 게임 결과를 바탕으로 수익 계산을 함으로써 각 객체의 책임이 분리되었습니다!"*
|
|
220
|
+
|
|
221
|
+
→ **학생 자가 책임 분리 어휘**.
|
|
222
|
+
|
|
223
|
+
## 얻은 교훈 (보편)
|
|
224
|
+
|
|
225
|
+
1. **람다 4개 인자 폭증 학생 자가 의문 + reviewer 람다 통합 권유** — PR #142·#143 결 합류 + sealed class 변경.
|
|
226
|
+
|
|
227
|
+
2. **고차함수 = 도메인 ↔ View 의존 X** — **MCP 룰 `higher-order-function-as-domain-view-decoupling` 후보**.
|
|
228
|
+
|
|
229
|
+
3. **`abstract class` → `sealed class` 학생 자가 변경 (when exhaustive + 라이브러리 제약)** — **MCP 룰 `sealed-class-library-extension-constraint` 후보**.
|
|
230
|
+
|
|
231
|
+
4. **`thisScore` 외부 의존 → 본인 점수 자가 (Tell-Don't-Ask)** — **MCP 룰 `parameter-vs-self-state-access` 후보**.
|
|
232
|
+
|
|
233
|
+
5. **테스트 = 역할 중심** — **MCP 룰 `test-by-role-not-by-flow` 후보**.
|
|
234
|
+
|
|
235
|
+
6. **tailrec 자가 적용** — 누적 3+ PR.
|
|
236
|
+
|
|
237
|
+
7. **Profit 팩토리 메서드 자가 계산** — PR #142 결 합류.
|
|
238
|
+
|
|
239
|
+
8. **operator overloading 자가 활용** — PR #36·#142 결.
|
|
240
|
+
|
|
241
|
+
9. **else 분기 = 논리 오류** — PR #35 결.
|
|
242
|
+
|
|
243
|
+
10. **결과 통계 + 수익 계산 책임 분리 (BlackjackResult)** — **MCP 룰 `result-aggregation-locator` 강화** 누적 3+ PR.
|
|
244
|
+
|
|
245
|
+
## MCP 룰 후보 신규 + 강화 (PR #140)
|
|
246
|
+
|
|
247
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
248
|
+
|---|---|---|
|
|
249
|
+
| `higher-order-function-as-domain-view-decoupling` | 신규 | 1 (#140) |
|
|
250
|
+
| `sealed-class-library-extension-constraint` | 신규 | 1 (#140) |
|
|
251
|
+
| `parameter-vs-self-state-access` | 신규 | 1 (#140) |
|
|
252
|
+
| `test-by-role-not-by-flow` | 신규 | 1 (#140) |
|
|
253
|
+
| `tailrec-optimization-applicability` | 강화 | 3+ (#138·#142·#140) |
|
|
254
|
+
| `result-aggregation-locator` | 강화 | 3+ (#126·#142·#140) |
|
|
255
|
+
| `super-keyword-for-shared-logic` | 강화 | 3+ (#138·#142·#140) |
|
|
256
|
+
| `sealed-vs-abstract-vs-open-locator` | 강화 | 7+ |
|
|
257
|
+
| `kotlin-exception-handling-strategy` | 강화 | 5+ |
|
|
258
|
+
|
|
259
|
+
## 비교 (PR #113 → #140)
|
|
260
|
+
|
|
261
|
+
- **1단계 #113 22 thread → 2단계 #140 16 thread**.
|
|
262
|
+
- **1단계 #113 Hit/Stay Boolean → 2단계 #140 sealed class 학생 자가 변경**.
|
|
263
|
+
- **1단계 #113 Players 일급 컬렉션 사용자 입력 한계 자가 의문 → 2단계 #140 고차함수 자가 학습**.
|
|
264
|
+
- **1단계 #113 BlackjackGame 도메인 객체 자가 적용 → 2단계 #140 BlackjackResult + Profit 책임 분리**.
|
|
265
|
+
- **2단계 #140 학생 자가 학습 정점 유지** (commit SHA + 자가 의문 5+ 회).
|