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,726 @@
|
|
|
1
|
+
# PR #129 — [블랙잭 1단계] 비비 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@rosemin928](https://github.com/rosemin928)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/129
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 기존 reviewer (batch 12 신규 합류)
|
|
7
|
+
- **라인 코멘트:** 22 스레드 — *Tell-Don't-Ask + 현실 메타포 정공 (게임 승패 = 외부 장치 X, 참가자 자가 결정) + 추상화 활용 점검 (개별 객체에 책임 위임 시 공통 사항 자가 발견) + sealed interface vs abstract class vs open class 학생 자가 학습 + Deck 테스트 가능성 + interface 분리 + 모든 22 스레드 학생 자가 답변 + 커밋 SHA 첨부 + 커뮤니케이션 메타 (줄글 vs 핵심 내용)*
|
|
8
|
+
- **신규 reviewee** (2025년 코호트 — 모바일 안드로이드 7기, PR #117 와 동일 코호트).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 + 셀프 체크리스트 + 집중 리뷰 영역 명시 (2025 코호트 스타일)
|
|
13
|
+
|
|
14
|
+
PR 본문 구조:
|
|
15
|
+
- **셀프 체크리스트 7항목** (PR #117 와 동일).
|
|
16
|
+
- **집중 리뷰 영역 자가 명시** *"인덴트 depth를 신경 써보면서 작성을 했지만 여전히 여러 부분에서 depth가 2를 넘겼습니다... 특히 BlackJackGame 클래스에서 playGame 함수에서 depth가 깊어지게 됐는데 이를 어떻게 분리해야 할 지 모르겠어서 수정하지 못했습니다."*
|
|
17
|
+
|
|
18
|
+
→ **체계화된 PR 본문 모범 + 학생 자가 한계 인정** — *학습 적극성*. PR #117 결의 *2025 코호트 스타일*. PR #95·#98·#46·#73·#36·#87·#117 결의 *학생 자가 한계 인정* 어휘 합류.
|
|
19
|
+
|
|
20
|
+
### 2. 모든 22 스레드 학생 자가 답변 + 커밋 SHA 첨부 + 자가 후속 의문
|
|
21
|
+
|
|
22
|
+
22 스레드 전부 학생이 *반영 커밋 링크 (commit SHA)* 첨부 + **자가 후속 의문 5+ 회**:
|
|
23
|
+
|
|
24
|
+
- Thread 1: *deal 여러 명 = `first()` vs `single()` vs `List<Dealer>` 자가 의문*.
|
|
25
|
+
- Thread 5: *Participants 객체 생성 자가 적용 + Player ↔ Participants 분리 자가 설명*.
|
|
26
|
+
- Thread 7: *승패 로직 Player 이동 자가 의문 (Participant vs Player 위치 토론)*.
|
|
27
|
+
- Thread 10: *검증 코드 함수 분리 vs require 자가 의문 + Reviewer 답변 받음*.
|
|
28
|
+
- Thread 22: *결과 로직 ResultCalculator 분리 자가 의문* (PR 본문 외 추가 의문).
|
|
29
|
+
|
|
30
|
+
→ **학생 자가 학습 가시화 정점** + **자가 후속 의문 풍부** = *PR #117 (parkjiminnnn) 결의 *모든 스레드 commit 첨부* + *PR #133·#137·#148·#151·#146·#147 결의 *학생 자가 의문*** 결합.
|
|
31
|
+
|
|
32
|
+
### 3. `Participants(dealer: Dealer, players: List<Player>)` 생성자 타입 분리
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
class Participants(
|
|
36
|
+
val dealer: Dealer,
|
|
37
|
+
val players: List<Player>,
|
|
38
|
+
) {
|
|
39
|
+
fun getChoice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
|
|
40
|
+
players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
→ **딜러/플레이어 생성자 타입 분리 = 컴파일러 강제** — *List<Participant> + first() 분리 vs 생성자 타입 분리*. **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보**.
|
|
46
|
+
|
|
47
|
+
학생 자가 적용 (Thread 11·12):
|
|
48
|
+
- `Participants(participants: List<Participant>)` → `filter { it is Dealer }.first()` (학생 초안)
|
|
49
|
+
- `Participants(dealer: Dealer, players: List<Player>)` (학생 자가 적용)
|
|
50
|
+
|
|
51
|
+
reviewer 후속 (Thread 12): *"생성자 프로퍼티 선언이 현재 유의미하게 사용되고 있을까요?"* → 학생 자가 깨달음: *"불필요한 변수가 된다는 것을 깨달았습니다"*.
|
|
52
|
+
|
|
53
|
+
### 4. `ParticipantCards` 객체 분리 — Participant god-object 회피
|
|
54
|
+
|
|
55
|
+
```kotlin
|
|
56
|
+
class ParticipantCards(private val _cards: MutableList<TrumpCard> = mutableListOf()) {
|
|
57
|
+
val allCards: List<TrumpCard> get() = _cards.toList()
|
|
58
|
+
val sumOfCards: Int get() = _cards.sumOf { it.tier.values }
|
|
59
|
+
|
|
60
|
+
fun add(card: TrumpCard) { _cards.add(card) }
|
|
61
|
+
fun hasAce(): Boolean = _cards.any { it.tier == CardTier.ACE }
|
|
62
|
+
fun size(): Int = _cards.size
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
→ **카드 책임 객체 분리** — reviewer (Thread 6) *"Participant가 하는 일이 다소 많아 보이네요..! 딜러, 참가자 모두 자신들의 카드를 들고 있으니 이 또한 객체로 취급해볼 수 있을까요?"* → 학생 자가 적용.
|
|
67
|
+
|
|
68
|
+
**god-object 회피 + 책임 분리** PR #145·#80·#76·#82·#107·#46·#16·#73·#36·#87 결.
|
|
69
|
+
|
|
70
|
+
다만 **`val allCards: List<TrumpCard> get() = _cards.toList()` 외부 노출** + **`Participant.getAllCards(): List<TrumpCard> = cards.allCards`** = *2단계 위임 + 외부 노출* → §디미터 법칙 가능.
|
|
71
|
+
|
|
72
|
+
### 5. `Participant abstract class` + Dealer/Player 추상 메서드 3개
|
|
73
|
+
|
|
74
|
+
```kotlin
|
|
75
|
+
abstract class Participant(val cards: ParticipantCards) {
|
|
76
|
+
abstract fun showInitialCards(): List<TrumpCard>
|
|
77
|
+
abstract fun isDrawable(): Boolean
|
|
78
|
+
abstract fun getResult(other: Participant): GameResult
|
|
79
|
+
|
|
80
|
+
fun receiveCard(card: TrumpCard) { cards.add(card) }
|
|
81
|
+
fun isBust(extraScore: Int = ACE_HARD_SCORE): Boolean = cards.sumOfCards + extraScore > BUST_STANDARD
|
|
82
|
+
fun finalScore(): Int = ...
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
→ **추상 메서드 3종 + 공통 로직 finalScore/isBust/receiveCard** — *진정한 추상화*:
|
|
87
|
+
|
|
88
|
+
#### 5.1. *3 추상 메서드 = 다형성*
|
|
89
|
+
|
|
90
|
+
- `showInitialCards()`: *Dealer 1장 / Player 2장 (도메인 룰)*.
|
|
91
|
+
- `isDrawable()`: *Dealer 16 이하 / Player 21 이하 (도메인 룰)*.
|
|
92
|
+
- `getResult(other)`: *Dealer 관점 / Player 관점 (대칭 역방향)*.
|
|
93
|
+
|
|
94
|
+
학생 자가 학습 (Thread 8·15·16): *abstract class 선택 + Dealer/Player 공통 로직 추출*.
|
|
95
|
+
|
|
96
|
+
#### 5.2. *공통 로직 finalScore/isBust/receiveCard = 부모 클래스*
|
|
97
|
+
|
|
98
|
+
부모 클래스가 *공통 로직 보유 + 자식이 *추상 메서드* 만 차이*. **추상화 정공**.
|
|
99
|
+
|
|
100
|
+
PR #87·#36·#16·#73·#80·#82·#107 결.
|
|
101
|
+
|
|
102
|
+
### 6. 카드 공개 (`showInitialCards`) = 비즈니스 로직 자가 이동
|
|
103
|
+
|
|
104
|
+
reviewer (Thread 13):
|
|
105
|
+
|
|
106
|
+
> *"이부분을 깊게 고민해볼 필요가 있어요 🧐 `딜러는 첫번째 카드를 공개해야 한다` 는 비즈니스 로직일까요 Controller 로직일까요? 참가자와 딜러가 `카드를 공개한다` 라는 공통 로직에 대해 지금까지 구현한 것 처럼 참가자와 딜러의 행동을 추상화가 가능할겁니다"*
|
|
107
|
+
|
|
108
|
+
학생 자가 적용: *"카드를 N장 공개한다는 로직은 비즈니스 로직이라고 생각하여 Participant 내로 옮겼습니다! 첫 카드를 공개할 때 플레이어는 2장을, 딜러는 1장을 공개하도록 수정했습니다!"*
|
|
109
|
+
|
|
110
|
+
→ **비즈니스 로직 vs Controller 로직 구분 + 자가 추상화** — *Controller 가 *Dealer.cards.take(1) + Player.cards.take(2)* 외부 처리 → *Participant.showInitialCards() 다형성*.
|
|
111
|
+
|
|
112
|
+
**MCP 룰 `business-logic-vs-controller-logic` 후보** — *비즈니스 vs 컨트롤러 위치 트레이드오프*.
|
|
113
|
+
|
|
114
|
+
### 7. 추가 칭찬
|
|
115
|
+
|
|
116
|
+
- *Thread 4*: *"View로직을 갖지 않게 enum 을 잘 구성해주셨네요"* (Shape).
|
|
117
|
+
- *Thread 17*: *"고차함수 활용 👍"* (Player.choice).
|
|
118
|
+
- *Thread 19*: *"명시적인 테스트명과 세세하게 테스트를 항목을 구성해주셨네요 👍"*.
|
|
119
|
+
- *Thread 21*: *"추상화 👍"*.
|
|
120
|
+
|
|
121
|
+
## 못한 점 (설계 관점)
|
|
122
|
+
|
|
123
|
+
### 1. 딜러 여러 명 논리오류 + `first()` vs `single()` vs 생성자 타입 분리
|
|
124
|
+
|
|
125
|
+
reviewer (Thread 1·11):
|
|
126
|
+
|
|
127
|
+
> *"이렇게 되면 딜러가 여러명일 때 논리오류 대응이 가능할까요?"*
|
|
128
|
+
|
|
129
|
+
학생 자가 답변:
|
|
130
|
+
|
|
131
|
+
> *"게임에서 딜러가 여러 명일 경우는 없을거라고 생각해서 다음과 같이 작성했었습니다…! 실제 게임에서는 딜러가 한 명이어도 만약의 경우를 생각해서 List<Dealer>로 코드를 작성하는게 좋을까요? 또, 이번에 이에 대해 고민해보면서 `first()` 대신 `single()`을 사용해서 딜러가 한 명인 것을 강제하고 그렇지 않을 때는 예외를 던지는 방법도 있다는 것을 알게 되었습니다."*
|
|
132
|
+
|
|
133
|
+
reviewer (Thread 11):
|
|
134
|
+
|
|
135
|
+
> *"지난 로또 미션에서도 로또 번호는 중복이 될 수 없기에 어떻게 처리를 해줘야 하는지 기억하시나요? 지금 구조에서는 그와 동일한 상황이라고 생각했어요!*
|
|
136
|
+
>
|
|
137
|
+
> *두가지 방법이 있을 것 같아요. - Paricipants 생성자에서 타입 분리(dealer, player) - 내부 프로퍼티에서 검증(예외던지기? singleOrNull?) 어느 방법이 좋을지 고민해보시고 알려주세요!"*
|
|
138
|
+
|
|
139
|
+
학생 자가 적용: *생성자 타입 분리*.
|
|
140
|
+
|
|
141
|
+
→ **invariant 강제 시점 3 가지**:
|
|
142
|
+
|
|
143
|
+
| 안 | 시점 | 장점 | 단점 |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
| `List<Participant>.first()` (학생 초안) | *호출 시* | *간결* | *invariant 위반 시 silent + 의미 누수* |
|
|
146
|
+
| `List<Participant>.single()` | *호출 시 + 예외* | *invariant 명시 + 예외 던짐* | *런타임 검증 + 호출 매번 비용* |
|
|
147
|
+
| 생성자 타입 분리 (`Participants(dealer, players)`) | *컴파일 시* | *invariant 강제 + 호출자가 의미 알기 쉬움* | *Participant 추상화 일부 약화* |
|
|
148
|
+
|
|
149
|
+
→ **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보** — *invariant 강제 시점 트레이드오프*. PR #79·#92·#48·#39 결의 *invariant 강제 시점*.
|
|
150
|
+
|
|
151
|
+
### 2. ktlint 통과 X — 도구 안내
|
|
152
|
+
|
|
153
|
+
reviewer (Thread 2):
|
|
154
|
+
|
|
155
|
+
> *"ktlint 확인해주세요!"* (이미지 첨부)
|
|
156
|
+
|
|
157
|
+
학생: *"넵 감사합니다!!"*
|
|
158
|
+
|
|
159
|
+
→ **CI 도구 자가 점검**. PR #87 결 강화.
|
|
160
|
+
|
|
161
|
+
### 3. `String` → `UserChoice` enum 반환
|
|
162
|
+
|
|
163
|
+
reviewer (Thread 3):
|
|
164
|
+
|
|
165
|
+
> *"String대신 UserChoice 를 반환하는건 어떨까요?"*
|
|
166
|
+
|
|
167
|
+
학생 자가 적용.
|
|
168
|
+
|
|
169
|
+
→ **Stringly-typed → enum 변환** — *컴파일러 강제 + 의미 명시*. PR #117·#20·#28·#125 결.
|
|
170
|
+
|
|
171
|
+
### 4. `Players` 일급 컬렉션 + 자가 행동 — depth 깊이 분리
|
|
172
|
+
|
|
173
|
+
reviewer (Thread 5):
|
|
174
|
+
|
|
175
|
+
> *"현재 객체들을 잘 생성해주시고 분리를 해주셨는데 만약 Players 라는 일급컬렉션이 존재한다면 해당 객체 내에서 스스로 행동할 수 있지 않을까요?"*
|
|
176
|
+
|
|
177
|
+
학생 자가 적용: *Participants 객체 생성 + 로직 분리*.
|
|
178
|
+
|
|
179
|
+
→ **일급 컬렉션 = depth 분리 + Tell-Don't-Ask** — *playGame 함수 depth = Players/Participants 가 자가 처리*. PR #21·#74·#108·#46·#36·#117 결.
|
|
180
|
+
|
|
181
|
+
### 5. 게임 승패 = 외부 장치 vs 참가자 자가 결정 — Tell-Don't-Ask + 현실 메타포
|
|
182
|
+
|
|
183
|
+
reviewer (Thread 7):
|
|
184
|
+
|
|
185
|
+
> *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요?*
|
|
186
|
+
> *실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다.*
|
|
187
|
+
> *`Participant 가 힌트가 되겠네요!`"*
|
|
188
|
+
|
|
189
|
+
학생 자가 적용: *Player 로 승패 로직 이동* (다만 *Player 가 자가 결정 + Dealer 가 반대 받음* 자가 의문 발생).
|
|
190
|
+
|
|
191
|
+
reviewer 후속 (Thread 14):
|
|
192
|
+
|
|
193
|
+
> *"`내 점수와 상대 점수를 비교하여 결과를 판단한다`는 참가자와 딜러의 공통 로직입니다. 다만, 그 기준이 다를뿐일거에요. 지금까지 추상화를 진행한 이유에 대해 고민해보시죠!*
|
|
194
|
+
>
|
|
195
|
+
> *추상화를 진행하게 된다면 Controller입장에서는 `Participant` 가 참가자인지, 딜러인지 알 필요없이 `Participant` 에게 결과를 판단하라고 메세지만 던지면 됩니다"*
|
|
196
|
+
|
|
197
|
+
학생 자가 적용: *각각 참가자가 승패를 계산* (Dealer.getResult / Player.getResult 추상 메서드).
|
|
198
|
+
|
|
199
|
+
→ **Tell-Don't-Ask + 현실 메타포 + 추상화 활용 점검**:
|
|
200
|
+
|
|
201
|
+
#### 5.1. *3 단계 학습*
|
|
202
|
+
|
|
203
|
+
1. **외부 장치 (GameResultDecider) → Player 로 이동** (학생 1차 자가 적용).
|
|
204
|
+
2. **Player 만 자가 결정 + Dealer 반대 받음 → 복잡 자가 의문**.
|
|
205
|
+
3. **Player + Dealer 모두 자가 결정 (`Participant.getResult` 추상)** (학생 2차 자가 적용).
|
|
206
|
+
|
|
207
|
+
#### 5.2. *현실 메타포 어휘*
|
|
208
|
+
|
|
209
|
+
reviewer *"외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다"* = **현실 메타포 정합**. PR #117·#31·#21 결.
|
|
210
|
+
|
|
211
|
+
**MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ — 누적 9+ PR.
|
|
212
|
+
|
|
213
|
+
#### 5.3. *추상화 활용 점검 어휘*
|
|
214
|
+
|
|
215
|
+
reviewer *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* = **학습 의도 회수 어휘**.
|
|
216
|
+
|
|
217
|
+
**MCP 룰 `abstraction-purpose-revisit` 후보** — *추상화를 진행한 이유 회수*.
|
|
218
|
+
|
|
219
|
+
### 6. `sealed interface vs abstract class vs open class` — Kotlin 어휘
|
|
220
|
+
|
|
221
|
+
reviewer (Thread 8):
|
|
222
|
+
|
|
223
|
+
> *"- sealed interface*
|
|
224
|
+
> *- abstract class*
|
|
225
|
+
> *- open class*
|
|
226
|
+
> *이 세가지의 차이점과 용도는 어떻게 될까요? 고민해보시고 블랙잭 미션에서는 어떤 키워드가 어울릴지 고민해보시고 저에게도 공유해주세요!"*
|
|
227
|
+
|
|
228
|
+
학생 자가 답변:
|
|
229
|
+
|
|
230
|
+
> *"abstract class와 sealed interface 모두 추상화를 제공하지만, abstract class는 공통된 로직을 미리 구현하여 하위 클래스에서 재사용할 수 있도록 강제하는 반면, interface는 구현해야 할 틀만 제공하고, 모든 로직을 하위 클래스에서 직접 작성해야 한다는 차이가 있습니다. open class는 일반 클래스를 어디서든 상속 가능하도록 하지만 그렇기 때문에 의도를 잘못 이해했다면 잘못된 방식으로 기능이 변경될 위험이 있다고 알고 있습니다."*
|
|
231
|
+
|
|
232
|
+
→ **Kotlin 어휘 3 가지 트레이드오프**:
|
|
233
|
+
|
|
234
|
+
| 키워드 | 의도 | 적합 시점 |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| `sealed interface` | *알려진 자식 한정 + 다형성 분기 (when exhaustive)* | *자식이 한정 + 상태/이벤트 표현* (Bust/Normal/Blackjack 같은 State) |
|
|
237
|
+
| `abstract class` | *공통 로직 + 추상 메서드* | *자식 공통 로직 + 차이는 추상 메서드 (Participant)* |
|
|
238
|
+
| `open class` | *상속 허용 (의도 약함)* | *드물게 사용 + Java 호환* |
|
|
239
|
+
|
|
240
|
+
학생 최종 선택: **`abstract class Participant`** — *공통 로직 (finalScore, isBust, receiveCard) + 추상 메서드 (showInitialCards, isDrawable, getResult)*. **정확한 의도 매핑**.
|
|
241
|
+
|
|
242
|
+
**MCP 룰 `sealed-vs-abstract-vs-open-locator` 후보** — *Kotlin 키워드 선택 트레이드오프*. PR #98·#36·#147·#93·#136 결의 *sealed vs enum vs abstract* 변형.
|
|
243
|
+
|
|
244
|
+
### 7. `Deck` 테스트 가능성 + `interface` 분리
|
|
245
|
+
|
|
246
|
+
reviewer (Thread 9):
|
|
247
|
+
|
|
248
|
+
> *"현재 Deck의 비즈니스 로직은 테스트가 가능할까요? 예를 들어, `특정 순서의 카드의 덱에서 순서대로 뽑으면 의도한 카드가 나와야한다` 를 테스트가 가능할까요?"*
|
|
249
|
+
|
|
250
|
+
학생 자가 답변: *"전부 private으로 처리되어 있어서 테스트가 불가하네요... interface로 랜덤으로 섞인 카드와 테스트용으로 순서대로 카드 뭉치를 생성하도록 하여 테스트가 가능하도록 했습니다!"*
|
|
251
|
+
|
|
252
|
+
→ **테스트 가능성 = 객체 설계 지표** (PR #87 *테스트 = 객체 설계 명세서* 결 강화):
|
|
253
|
+
|
|
254
|
+
#### 7.1. *Deck = interface 분리*
|
|
255
|
+
|
|
256
|
+
```kotlin
|
|
257
|
+
interface Deck { fun pop(): TrumpCard }
|
|
258
|
+
class RandomDeck : Deck { ... } // production
|
|
259
|
+
class FixedDeck : Deck { ... } // test (순서대로)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
→ **테스트 가능성을 위한 interface 분리** + **production vs test 의 별도 구현**. *의존성 역전 (DIP)*.
|
|
263
|
+
|
|
264
|
+
**MCP 룰 `interface-for-test-substitution` 후보** — *테스트 가능성을 위한 interface 분리*. 누적 4+ PR.
|
|
265
|
+
|
|
266
|
+
#### 7.2. *Singleton Deck 회피 vs interface 분리 양가*
|
|
267
|
+
|
|
268
|
+
PR #20·#28·#125·#65·#92·#108 결의 *Singleton Deck (companion object MutableSet)* 안티패턴 회피 → *interface + DI 정공*.
|
|
269
|
+
|
|
270
|
+
### 8. `if (names.contains(EMPTY))` true/false 의미 → 직관 로직
|
|
271
|
+
|
|
272
|
+
reviewer (Thread 10):
|
|
273
|
+
|
|
274
|
+
> *"비비의 의도는 함수를 사용해 가독성을 높이는걸로 이해했는데요, 해당 함수가 갖는 true/false의 의미를 찾기보다 직관적으로 이해할 수 있게 로직 구성도 가능합니다!"*
|
|
275
|
+
|
|
276
|
+
학생 자가 적용 + 자가 후속 의문 (검증 코드 함수 분리 vs require + 줄글 vs 핵심).
|
|
277
|
+
|
|
278
|
+
reviewer 후속 답변:
|
|
279
|
+
|
|
280
|
+
> *"- 검증코드를 함수로 분리하는게 좋을지?*
|
|
281
|
+
> *- 도메인에서 검증할 때 require 로 검증할지? or 함수로 분리할지?*
|
|
282
|
+
> *로 정리가 될 것 같은데요 🥲*
|
|
283
|
+
> *일단, 첫번째 질문은 함수를 읽을 때 내부 구현까지 알 필요가 없다면 직관성이 좋은 함수로 분리하는게 좋다고 생각해요. 사실 내부에서 어떤 규칙으로 검증하는지 까진 관심이 없어도 된다면, 함수로 ~~검증을 한다 정도만 알려줘도 무방하기 때문입니다.*
|
|
284
|
+
>
|
|
285
|
+
> *두번째는 require 에서 검증할 때는 로직의 복잡도에 따라 다를 것 같은데요, 굳이 함수로 분리해야 하나? 싶기도 합니다. 보통 require에서는 하나의 로직에 대해 검증하기에 여러 로직이 합쳐지지 않을거라고 생각되네요"*
|
|
286
|
+
|
|
287
|
+
→ **검증 코드 분리 트레이드오프 + 도메인 require 어휘**:
|
|
288
|
+
|
|
289
|
+
#### 8.1. *검증 함수 분리 시점*
|
|
290
|
+
|
|
291
|
+
- 함수 분리: *내부 구현 알 필요 X + 의도 명시* (예: `validateNonEmpty(names)`).
|
|
292
|
+
- inline: *간결 + 로직 1 가지만 + require 자가 적용*.
|
|
293
|
+
|
|
294
|
+
#### 8.2. *Boolean 함수명 = true/false 의미*
|
|
295
|
+
|
|
296
|
+
학생 초안 (예시):
|
|
297
|
+
```kotlin
|
|
298
|
+
if (validateNames(names)) {
|
|
299
|
+
return names
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
→ *`validateNames` 가 true/false 어느 것을 의미? = 가독성 모호*. **MCP 룰 `boolean-function-name-ambiguity` 후보** — *Boolean 함수명 = true/false 의미 명시*.
|
|
304
|
+
|
|
305
|
+
### 9. 커뮤니케이션 메타 (줄글 vs 핵심 내용) — reviewer 메타 어휘
|
|
306
|
+
|
|
307
|
+
reviewer (Thread 10 후속):
|
|
308
|
+
|
|
309
|
+
> *"조금 도움이 되었으면 하는 마음에 조심스럽게 말씀드려봅니다 🙃*
|
|
310
|
+
> *우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요.*
|
|
311
|
+
> *예를 들어, 비비가 주신 질문을 줄글로 주셔도 좋지만, 핵심 내용을 간략하게 전달하는 것 또한 중요하다고 생각해요.*
|
|
312
|
+
> *앞으로 리뷰어들과 많은 소통을 하실 때 이부분도 함께 고려하신다면 비비의 커뮤니케이션 능력 또한 향상될겁니다!"*
|
|
313
|
+
|
|
314
|
+
학생: *"앞으로의 리뷰에서 피드백 주신 점 반영하여 핵심 내용을 보기 좋게 적어보도록 하겠습니다!"*
|
|
315
|
+
|
|
316
|
+
→ **reviewer 가 커뮤니케이션 메타 어휘 명시** = *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP `oh-my-oop` 핵심 가치 합류 (커뮤니케이션 비용)**.
|
|
317
|
+
|
|
318
|
+
PR #87 *"동료 개발자가 이런 부분을 궁금해할 수도 있구나"* 결 + PR #76·#80·#107 결의 *동료 개발자 시점* 어휘 합류.
|
|
319
|
+
|
|
320
|
+
### 10. `참가자는 본인 스스로 Hit 가능한지 알 수 있다` — 추상화 활용 점검
|
|
321
|
+
|
|
322
|
+
reviewer (Thread 15):
|
|
323
|
+
|
|
324
|
+
> *"`참가자는 본인 스스로 Hit 가능한지 알 수 있다` 는 Player, Dealer 의 공통 사항이 아닐까요? 단지 Hitable 한지 기준이 다를뿐입니다. 추상화 활용에 대해 고민해보시죠 🧐"*
|
|
325
|
+
|
|
326
|
+
학생 자가 적용 (`isDrawable` 추상 메서드 추가):
|
|
327
|
+
|
|
328
|
+
```kotlin
|
|
329
|
+
abstract class Participant {
|
|
330
|
+
abstract fun isDrawable(): Boolean
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
class Dealer : Participant {
|
|
334
|
+
override fun isDrawable(): Boolean = ... // 16 이하
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
class Player : Participant {
|
|
338
|
+
override fun isDrawable(): Boolean = ... // 21 이하
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
학생 자가 깨달음: *"플레이어의 hitable 여부는 `isBust`가 아니라 `!isBust`여서 사용되는 방식이 아예 반대라는 것을 알았습니다... 시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"*
|
|
343
|
+
|
|
344
|
+
→ **추상화 활용 = 공통 사항 → 추상 메서드** + **학생 자가 한계 인정** (시간 압박 인정).
|
|
345
|
+
|
|
346
|
+
**MCP 룰 `abstraction-as-shared-behavior-discovery` 후보** — *공통 사항 → 추상 메서드 변환*.
|
|
347
|
+
|
|
348
|
+
### 11. `open class` vs `abstract class` 의미 점검 (추상 메서드 없을 시)
|
|
349
|
+
|
|
350
|
+
reviewer (Thread 16):
|
|
351
|
+
|
|
352
|
+
> *"`Dealer, Player` 클래스 의 코멘트들과 이어지는 코멘트입니다.*
|
|
353
|
+
> *현재 구조에서 open class 로 선언해도 달라지는게 없는 이유가 무엇일까요?"*
|
|
354
|
+
|
|
355
|
+
학생 자가 답변:
|
|
356
|
+
|
|
357
|
+
> *"현재 Participant는 추상 메서드를 포함하고 있지 않아 추상화는 이루어지지 않고, 단순히 공통된 로직을 플레이어와 딜러에서 재사용하도록 만든 구조이기 때문에 실질적으로는 open class로 선언한 것과 다른게 없는 것 같아요...!*
|
|
358
|
+
>
|
|
359
|
+
> *로직 중 추상화를 통해 가지고 있을 수 있는 부분이 충분히 많은데도 잘 활용하고 있지 못했던 것 같습니다. 이 부분을 abstract class를 좀 더 활용할 수 있도록 이번 리뷰들을 반영하여 수정했습니다!"*
|
|
360
|
+
|
|
361
|
+
→ **`abstract class` vs `open class` = 추상 메서드 유무**. *추상 메서드 없는 abstract class = open class 와 사실상 동치*.
|
|
362
|
+
|
|
363
|
+
**Kotlin 어휘 깊은 학생 자가 깨달음**. PR #117 *property val vs computed property* 결의 *Kotlin 어휘 자가 학습* 변형.
|
|
364
|
+
|
|
365
|
+
**MCP 룰 `abstract-without-abstract-method` 강화** — 누적 5+ PR (#95·#36·#117·#129·#147).
|
|
366
|
+
|
|
367
|
+
### 12. `Deck.pop` 예외 처리 — 게임 종료 흐름
|
|
368
|
+
|
|
369
|
+
reviewer (Thread 20):
|
|
370
|
+
|
|
371
|
+
> *"그럴 확률은 적겠지만, 만약 더이상 카드를 뽑지 못한다면 Exception이 발생하여 프로그램이 그대로 종료될거에요. 현실에서 게임을 구현한다면 게임을 끝내 중간 결과를 출력하거나, 안내문구를 출력하고 프로그램을 로직상 종료하는 흐름은 어떨까요?"*
|
|
372
|
+
|
|
373
|
+
reviewer 후속:
|
|
374
|
+
|
|
375
|
+
> *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*
|
|
376
|
+
|
|
377
|
+
→ **예외 처리 vs 로직 종료 흐름** — *Exception 던지기 = 프로그램 종료* vs *Exception 잡아서 게임 끝내 + 안내문구*. **MCP 룰 `exception-vs-graceful-shutdown` 후보**.
|
|
378
|
+
|
|
379
|
+
### 13. `Player.allCards 에 직접 접근` — Tell-Don't-Ask
|
|
380
|
+
|
|
381
|
+
reviewer (Thread 18):
|
|
382
|
+
|
|
383
|
+
> *"allCards 에 직접 접근하기보다 `참가자의 덱에서 몇장 꺼내올 수 있다` 로직을 수행해보는건 어떨까요?"*
|
|
384
|
+
|
|
385
|
+
→ **Tell-Don't-Ask** — *Participant.cards.allCards.take(N) 외부 처리* → *Participant.takeFirstN(n: Int) 메시지*. **MCP 룰 `external-take-vs-domain-method` 후보**.
|
|
386
|
+
|
|
387
|
+
다만 *`showInitialCards()` 자가 적용* (Player 2장 / Dealer 1장) = *이미 정공*. reviewer 의 *추가 시점*.
|
|
388
|
+
|
|
389
|
+
### 14. `Dealer.isDrawable()` `Player.isDrawable()` 의미 반대 — 추상화 의도 약함
|
|
390
|
+
|
|
391
|
+
```kotlin
|
|
392
|
+
// Dealer.isDrawable() = sum < 16 (draw 가능 = 16 미만)
|
|
393
|
+
// Player.isDrawable() = sum <= 21 (draw 가능 = 21 이하)
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
→ *조건 의미는 *공통: hit 가능 시 true* + *기준만 차이*. 다만 **`isDrawable` 와 `!isBust` 양가성**:
|
|
397
|
+
|
|
398
|
+
- Dealer.isDrawable() ≠ !isBust() (16 < score ≤ 21 도 isBust X, isDrawable X).
|
|
399
|
+
- Player.isDrawable() ≈ !isBust() (소프트 21 한정).
|
|
400
|
+
|
|
401
|
+
학생 자가 깨달음 (Thread 15) = *Player.isDrawable = !isBust ≠ isBust*. **이름과 의미 일관성**.
|
|
402
|
+
|
|
403
|
+
PR #117 (isHit → canHit) 결의 *이름 의미 정확성* 변형.
|
|
404
|
+
|
|
405
|
+
### 15. `Dealer.getResult` vs `Player.getResult` — 대칭 코드 + 양방향 호출 위험
|
|
406
|
+
|
|
407
|
+
```kotlin
|
|
408
|
+
// Player.getResult(other: Participant): GameResult
|
|
409
|
+
override fun getResult(other: Participant): GameResult = when {
|
|
410
|
+
this.isBust() -> GameResult.LOSE
|
|
411
|
+
other.isBust() && !this.isBust() -> GameResult.WIN
|
|
412
|
+
myScore > otherScore -> GameResult.WIN
|
|
413
|
+
...
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Dealer.getResult(other: Participant): GameResult
|
|
417
|
+
override fun getResult(other: Participant): GameResult = when {
|
|
418
|
+
other.isBust() -> GameResult.WIN
|
|
419
|
+
this.isBust() && !other.isBust() -> GameResult.LOSE
|
|
420
|
+
...
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
→ **대칭 코드 = Dealer 와 Player 각자 *자가 결정***. 다만 **`isBust` 양가성**:
|
|
425
|
+
|
|
426
|
+
- Dealer.getResult(player): *other (Player) isBust → Dealer WIN*.
|
|
427
|
+
- Player.getResult(dealer): *other (Dealer) isBust + !this.isBust → Player WIN*.
|
|
428
|
+
|
|
429
|
+
→ *각자 자가 결정 = Tell-Don't-Ask 정공*. 다만 *`participant1.getResult(participant2)` 와 `participant2.getResult(participant1)` 양방향 호출 가능* → *항상 부호 반전 인지 필요*.
|
|
430
|
+
|
|
431
|
+
대안: **`Participant.compareWith(other): GameResult`** 추상 + *부호 반전 1 자리* (PR #36 `operator fun not()` 결).
|
|
432
|
+
|
|
433
|
+
**MCP 룰 `symmetric-getResult-vs-compareWith` 후보**.
|
|
434
|
+
|
|
435
|
+
### 16. 결과 계산 책임 + 현실 메타포 (학생 자가 의문)
|
|
436
|
+
|
|
437
|
+
학생 자가 의문 (Thread 22):
|
|
438
|
+
|
|
439
|
+
> *"그래서 관련 로직을 또 다른 객체로 분리하여 (예를 들면 결과 로직을 모아서 resultCalculator) 가지게 하는게 좋을까? 하는 고민을 했었습니다. 이에 대해 제이든은 어떻게 생각하시는지 궁금합니다!"*
|
|
440
|
+
|
|
441
|
+
reviewer:
|
|
442
|
+
|
|
443
|
+
> *"결국에 결과를 계산하는건 누구의 역할일까? 를 고민해보시면 좋을 것 같아요. 또한, 현실세계에 도입해서 블랙잭 게임을 할 때 외부 장치로 결과를 계산하는가를 생각해보셔도 좋습니다. 충분히 고민해보시고 해결이 안되는 부분이 있다면 말씀주세요 :)"*
|
|
444
|
+
|
|
445
|
+
→ **현실 메타포 + 학생 자가 학습 권유** — *§5 결의 *외부 장치 X = 참가자 자가 결정* 일관*. **MCP `oh-my-oop` 핵심 가치 합류 정점**.
|
|
446
|
+
|
|
447
|
+
### 17. `BlackJackGame.calculateDealerResult` + `calculatePlayerResult` Controller-like 누수
|
|
448
|
+
|
|
449
|
+
```kotlin
|
|
450
|
+
fun calculateDealerResult(action: (Map<GameResult, Int>) -> Unit) {
|
|
451
|
+
val dealerMap = GameResult.entries.associateWith { 0 }.toMutableMap()
|
|
452
|
+
participants.players.forEach { player ->
|
|
453
|
+
val result = participants.dealer.getResult(player)
|
|
454
|
+
dealerMap[result] = dealerMap.getOrDefault(result, 0) + 1
|
|
455
|
+
}
|
|
456
|
+
action(dealerMap)
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
→ **BlackJackGame 이 `Map<GameResult, Int>` 누적 + 외부 action 호출** = *callback 람다 = View 결합* (PR #36·#137 결).
|
|
461
|
+
|
|
462
|
+
대안: **`Participants.calculateDealerResults(): Map<GameResult, Int>` 메서드 + Controller 가 결과 받아서 View 처리** — *callback 람다 X*.
|
|
463
|
+
|
|
464
|
+
**MCP 룰 `callback-action-for-result-aggregation` 후보** — *결과 누적 callback vs return*. PR #36 (callback-lambda-view-cost) 결.
|
|
465
|
+
|
|
466
|
+
### 18. `processDealerTurn(): Int` `count` 반환 — 의미 모호
|
|
467
|
+
|
|
468
|
+
```kotlin
|
|
469
|
+
fun processDealerTurn(): Int {
|
|
470
|
+
var count = 0
|
|
471
|
+
while (participants.dealer.isDrawable()) {
|
|
472
|
+
participants.dealer.receiveCard(deck.pop())
|
|
473
|
+
count++
|
|
474
|
+
}
|
|
475
|
+
return count
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
→ **`Int` 반환 = 의미 모호**. *processDealerTurn 의 결과가 *카드 뽑은 횟수* 임을 인지 어려움*.
|
|
480
|
+
|
|
481
|
+
대안:
|
|
482
|
+
- `data class DealerTurnResult(val drawCount: Int)`.
|
|
483
|
+
- `fun processDealerTurn(onDrawn: () -> Unit)` (callback).
|
|
484
|
+
|
|
485
|
+
**MCP 룰 `primitive-return-without-domain-meaning` 후보** — *원시 타입 반환 = 의미 누수*. PR #36·#21 결.
|
|
486
|
+
|
|
487
|
+
### 19. `BlackJackGame.handOutInitializedCards(initializedCardCount: Int = INITIAL_CARD_COUNT)` 기본 인자 양가
|
|
488
|
+
|
|
489
|
+
```kotlin
|
|
490
|
+
fun handOutInitializedCards(initializedCardCount: Int = INITIAL_CARD_COUNT) {
|
|
491
|
+
(participants.players + participants.dealer).forEach { player ->
|
|
492
|
+
repeat(initializedCardCount) { player.receiveCard(deck.pop()) }
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
→ **기본 인자 + 호출 시 외부 인자 (테스트 한정?)** = *production 호출 시 인자 생략 + 테스트 시 인자 전달*. **production vs test 의 양방향 인터페이스**.
|
|
498
|
+
|
|
499
|
+
다만 *Dealer 도 2장 받음* = *Dealer 의 도메인 룰 = 첫 카드만 공개 (showInitialCards)* 의 *카드 수신 = 모두 2장* 와 *공개 = 1장* 분리.
|
|
500
|
+
|
|
501
|
+
학생의 분리 시점:
|
|
502
|
+
- 카드 수신: 모두 2장 (`handOutInitializedCards`).
|
|
503
|
+
- 공개: Dealer 1장 / Player 2장 (`showInitialCards`).
|
|
504
|
+
|
|
505
|
+
→ **수신 vs 공개 분리 = 도메인 룰 정확**. PR #117 결의 *카드뭉치에서 꺼내서 플레이어 받는다* 결.
|
|
506
|
+
|
|
507
|
+
### 20. `Dealer.DEALER_MAX_SCORE = 16` — 16 매직 넘버 회피
|
|
508
|
+
|
|
509
|
+
```kotlin
|
|
510
|
+
companion object {
|
|
511
|
+
private const val DEALER_MAX_SCORE = 16
|
|
512
|
+
private const val DEALER_INITIAL_CARD_COUNT = 1
|
|
513
|
+
}
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
→ **매직 넘버 16 → 상수 명명**. PR #117 (DEALER_HIT_LIMIT) 결.
|
|
517
|
+
|
|
518
|
+
다만 *`DEALER_MAX_SCORE = 16` 명명 양가* = *Dealer 최대 점수 = 16? Dealer hit 한계 = 16?*. **이름 의미 정확성**:
|
|
519
|
+
|
|
520
|
+
- `DEALER_HIT_THRESHOLD = 16` (16 이하 hit).
|
|
521
|
+
- `DEALER_STAY_THRESHOLD = 17` (17 이상 stay).
|
|
522
|
+
|
|
523
|
+
학생의 `<` 비교 (`cards.sumOfCards < DEALER_MAX_SCORE`) = *16 미만 hit* → *17 = stay* (블랙잭 룰).
|
|
524
|
+
|
|
525
|
+
다만 `<` 시 *16 시 stay* → *블랙잭 룰 = 16 시 hit 인지 stay 인지 도메인 확인 필요*.
|
|
526
|
+
|
|
527
|
+
**블랙잭 표준 룰**: Dealer 16 이하 hit (16 시 hit). → 학생 코드 `cards.sumOfCards < 16` 시 *16 시 hit X = 룰 와전*.
|
|
528
|
+
|
|
529
|
+
→ **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** — *< vs ≤ 점검*. 누적 10+ PR ⭐⭐⭐.
|
|
530
|
+
|
|
531
|
+
### 21. `Participant.finalScore` Ace Soft 1↔11 — 단일 +10 룰 (PR #36 결)
|
|
532
|
+
|
|
533
|
+
```kotlin
|
|
534
|
+
fun finalScore(): Int =
|
|
535
|
+
if (cards.hasAce() && !isBust(ACE_SOFT_SCORE)) {
|
|
536
|
+
cards.sumOfCards + ACE_SOFT_SCORE
|
|
537
|
+
} else {
|
|
538
|
+
cards.sumOfCards
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
→ **Ace 1 기본 + 단일 +10 룰** (PR #36 결의 *단일 +10*).
|
|
543
|
+
|
|
544
|
+
**Ace 2장 이상 처리 X** — *Ace 1장 = 1+10=11, Ace 2장 모두 11 시 22 > 21 = soft Ace 적용 X (단일 +10)*.
|
|
545
|
+
|
|
546
|
+
PR #117 (수학적 풀이) 결의 *Multi-Ace 정확 처리* vs 현재 안 *단일 +10*. **트레이드오프**:
|
|
547
|
+
|
|
548
|
+
| 안 | 장점 | 단점 |
|
|
549
|
+
|---|---|---|
|
|
550
|
+
| 단일 +10 (현재) | *간결 + Ace 1장 한정 정확* | *Ace 2장 이상 정확 X* |
|
|
551
|
+
| Multi-Ace 수학적 (PR #117 후속) | *모든 Ace 정확* | *공식 복잡* |
|
|
552
|
+
| while + 차감 (안티패턴) | *Multi-Ace OK* | *반복문 의존* |
|
|
553
|
+
|
|
554
|
+
**MCP 룰 `ace-bonus-single-vs-multi` 강화** — 누적 2+ PR (#36·#129).
|
|
555
|
+
|
|
556
|
+
### 22. `Participants` `getChoice(deck, getPlayerChoice, onPlayerStateUpdated)` 람다 2개
|
|
557
|
+
|
|
558
|
+
```kotlin
|
|
559
|
+
fun getChoice(
|
|
560
|
+
deck: Deck,
|
|
561
|
+
getPlayerChoice: (String) -> Boolean,
|
|
562
|
+
onPlayerStateUpdated: (Player) -> Unit,
|
|
563
|
+
) {
|
|
564
|
+
players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
→ **콜백 람다 2개 = call site 인지 부담 ↑** (PR #36 결).
|
|
569
|
+
|
|
570
|
+
다만 *Participants.getChoice = 단순 위임 (player.choice 호출)* = *추가 책임 없음*. **MCP 룰 `simple-delegation-method-unnecessary` 후보** — *단순 위임 메서드 = 추가 책임 X = 메서드 인공*.
|
|
571
|
+
|
|
572
|
+
PR #87 (Participant.getName, getCards 위임 6 개) 결 동일.
|
|
573
|
+
|
|
574
|
+
## 리뷰어 의견 요지
|
|
575
|
+
|
|
576
|
+
- **현실 메타포 = 게임 승패 외부 장치 X, 참가자 자가 결정** — *Tell-Don't-Ask + 현실 정합*.
|
|
577
|
+
- **추상화 활용 점검 = 공통 사항 + 기준 다름** — *지금까지 추상화를 진행한 이유 회수*.
|
|
578
|
+
- **딜러 여러 명 논리오류 + invariant 강제 시점 3 안** — *first / single / 생성자 타입 분리*.
|
|
579
|
+
- **sealed interface vs abstract class vs open class** — *Kotlin 어휘 자가 학습*.
|
|
580
|
+
- **Deck 테스트 가능성 + interface 분리** — *DIP*.
|
|
581
|
+
- **검증 코드 함수 분리 vs require 트레이드오프** — *내부 구현 알 필요 X 시 함수 분리*.
|
|
582
|
+
- **커뮤니케이션 메타 (줄글 vs 핵심 내용)** — *코드 외 학습 영역 + 학생 미래 커리어 의식*.
|
|
583
|
+
- **카드 공개 = 비즈니스 로직 vs Controller 로직** — *Participant 내로 이동 + 다형성*.
|
|
584
|
+
- **deck.pop 예외 처리 = 게임 종료 흐름** — *프로그램 종료 vs 안내문구 후 종료*.
|
|
585
|
+
- **`if (validateNames)` true/false 의미** → *직관 로직*.
|
|
586
|
+
- **Participants 생성자 프로퍼티 유의미 사용 점검** — *불필요한 변수 자가 깨달음*.
|
|
587
|
+
- **`open class` = abstract method 없는 abstract class 동치 점검** — *Kotlin 어휘 학생 자가 학습*.
|
|
588
|
+
- **`Player.allCards` 직접 접근 → `takeFirstN` 메시지** — *Tell-Don't-Ask*.
|
|
589
|
+
- **이미 칭찬한 부분** — View 로직 없는 enum / 고차함수 활용 / 명시적 테스트명 / 추상화.
|
|
590
|
+
|
|
591
|
+
## 대표 인용
|
|
592
|
+
|
|
593
|
+
> [KwonDae]
|
|
594
|
+
> *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요? 실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다."*
|
|
595
|
+
|
|
596
|
+
→ **현실 메타포 + Tell-Don't-Ask 어휘**. PR #117·#31·#21 결.
|
|
597
|
+
|
|
598
|
+
> [KwonDae]
|
|
599
|
+
> *"`내 점수와 상대 점수를 비교하여 결과를 판단한다`는 참가자와 딜러의 공통 로직입니다. 다만, 그 기준이 다를뿐일거에요. 지금까지 추상화를 진행한 이유에 대해 고민해보시죠!*
|
|
600
|
+
>
|
|
601
|
+
> *추상화를 진행하게 된다면 Controller입장에서는 `Participant` 가 참가자인지, 딜러인지 알 필요없이 `Participant` 에게 결과를 판단하라고 메세지만 던지면 됩니다"*
|
|
602
|
+
|
|
603
|
+
→ **추상화 활용 점검 + 학습 의도 회수** 어휘. **MCP `oop_propose_alternatives` 핵심 가치 합류**.
|
|
604
|
+
|
|
605
|
+
> [KwonDae]
|
|
606
|
+
> *"우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요. 예를 들어, 비비가 주신 질문을 줄글로 주셔도 좋지만, 핵심 내용을 간략하게 전달하는 것 또한 중요하다고 생각해요."*
|
|
607
|
+
|
|
608
|
+
→ **커뮤니케이션 메타 어휘** — *코드 외 학습 영역 + 학생 미래 커리어 의식*.
|
|
609
|
+
|
|
610
|
+
> [KwonDae]
|
|
611
|
+
> *"두가지 방법이 있을 것 같아요. - Paricipants 생성자에서 타입 분리(dealer, player) - 내부 프로퍼티에서 검증(예외던지기? singleOrNull?) 어느 방법이 좋을지 고민해보시고 알려주세요!"*
|
|
612
|
+
|
|
613
|
+
→ **N 안 + 학생 선택지** 어휘. **MCP `oop_propose_alternatives` 핵심 가치 합류**.
|
|
614
|
+
|
|
615
|
+
> [rosemin928 자가 답변]
|
|
616
|
+
> *"플레이어의 hitable 여부는 `isBust`가 아니라 `!isBust`여서 사용되는 방식이 아예 반대라는 것을 알았습니다... 시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"*
|
|
617
|
+
|
|
618
|
+
→ **학생 자가 한계 인정 (시간 압박) + 자가 깨달음** — *학습 적극성*. PR #36·#87·#117 결.
|
|
619
|
+
|
|
620
|
+
> [KwonDae]
|
|
621
|
+
> *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*
|
|
622
|
+
|
|
623
|
+
→ **reviewer 의도 명시 + 학생 자가 학습 권유** 어휘.
|
|
624
|
+
|
|
625
|
+
> [KwonDae]
|
|
626
|
+
> *"아니요 절대 죄송하지 않으셔야 합니다 ㅎㅎ 잘 진행해주고 계셔서 조금이라도 도움이 되었으면 하는 마음이었다는것만 알아주세요!"*
|
|
627
|
+
|
|
628
|
+
→ **reviewer 의 인간적 학생 격려** 어휘.
|
|
629
|
+
|
|
630
|
+
## 얻은 교훈 (보편)
|
|
631
|
+
|
|
632
|
+
1. **현실 메타포 = 게임 승패 외부 장치 X = 참가자 자가 결정** — *Tell-Don't-Ask + 현실 정합*. **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ 누적 9+ PR.
|
|
633
|
+
|
|
634
|
+
2. **추상화 활용 점검 = 공통 사항 → 추상 메서드** — *공통 사항 + 기준 다름 = 추상화 패턴*. **MCP 룰 `abstraction-as-shared-behavior-discovery` 후보**.
|
|
635
|
+
|
|
636
|
+
3. **추상화 진행 이유 회수** — *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* = *학습 의도 회수 어휘*. **MCP 룰 `abstraction-purpose-revisit` 후보**.
|
|
637
|
+
|
|
638
|
+
4. **invariant 강제 시점 3 안 (compile vs runtime vs filter)** — *생성자 타입 분리 vs single() vs filter().first()*. **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보**.
|
|
639
|
+
|
|
640
|
+
5. **sealed interface vs abstract class vs open class** — *Kotlin 어휘 트레이드오프*. **MCP 룰 `sealed-vs-abstract-vs-open-locator` 후보**.
|
|
641
|
+
|
|
642
|
+
6. **`abstract class` vs `open class` = 추상 메서드 유무** — *추상 메서드 없는 abstract = open 동치*. **MCP 룰 `abstract-without-abstract-method` 강화** 누적 5+ PR.
|
|
643
|
+
|
|
644
|
+
7. **테스트 가능성 = 객체 설계 지표 + interface 분리 (DIP)** — *production vs test 의 별도 구현*. **MCP 룰 `interface-for-test-substitution` 후보**.
|
|
645
|
+
|
|
646
|
+
8. **검증 코드 함수 분리 vs require 트레이드오프** — *내부 구현 알 필요 X 시 함수 분리*. **MCP 룰 `validation-function-vs-require-inline` 후보**.
|
|
647
|
+
|
|
648
|
+
9. **커뮤니케이션 메타 (줄글 vs 핵심 내용)** — *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP 핵심 가치 합류**.
|
|
649
|
+
|
|
650
|
+
10. **비즈니스 로직 vs Controller 로직 구분** — *카드 공개 = 비즈니스 (참가자 다형성)*. **MCP 룰 `business-logic-vs-controller-logic` 후보**.
|
|
651
|
+
|
|
652
|
+
11. **예외 처리 vs 게임 종료 흐름** — *Exception 던지기 vs graceful shutdown*. **MCP 룰 `exception-vs-graceful-shutdown` 후보**.
|
|
653
|
+
|
|
654
|
+
12. **Boolean 함수명 = true/false 의미 명시** — *validateNames true/false 모호*. **MCP 룰 `boolean-function-name-ambiguity` 후보**.
|
|
655
|
+
|
|
656
|
+
13. **외부 take vs 도메인 메서드** — *cards.allCards.take(N) → takeFirstN(n) 메시지*. **MCP 룰 `external-take-vs-domain-method` 후보**.
|
|
657
|
+
|
|
658
|
+
14. **대칭 getResult vs compareWith** — *각자 자가 결정 (대칭 코드) vs 한 자리에서 비교*. **MCP 룰 `symmetric-getResult-vs-compareWith` 후보**.
|
|
659
|
+
|
|
660
|
+
15. **모든 22 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 5+ 회** — *학생 자가 학습 가시화 정점*.
|
|
661
|
+
|
|
662
|
+
16. **2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 자가 명시)** — PR #117·#129 합류.
|
|
663
|
+
|
|
664
|
+
17. **학생 자가 한계 인정 (시간 압박)** — *시간에 쫓겨 미처 확인 못 함*. *학습 적극성*. 누적 10+ PR.
|
|
665
|
+
|
|
666
|
+
18. **단순 위임 메서드 = 추가 책임 X = 메서드 인공** — *Participants.getChoice = player.choice 단순 호출*. **MCP 룰 `simple-delegation-method-unnecessary` 후보**.
|
|
667
|
+
|
|
668
|
+
19. **결과 누적 callback vs return** — *callback action(map) vs return map*. **MCP 룰 `callback-action-for-result-aggregation` 후보**.
|
|
669
|
+
|
|
670
|
+
20. **원시 타입 반환 (Int) = 의미 누수** — *processDealerTurn(): Int = drawCount 의미 모호*. **MCP 룰 `primitive-return-without-domain-meaning` 후보**.
|
|
671
|
+
|
|
672
|
+
## 얻은 교훈 (도메인)
|
|
673
|
+
|
|
674
|
+
1. **Dealer 1장 / Player 2장 카드 공개 도메인 룰** — *showInitialCards 다형성*.
|
|
675
|
+
|
|
676
|
+
2. **Dealer 16 이하 hit / Player 21 이하 hit** — *Hit 가능 기준 차이 = 추상 메서드 isDrawable*.
|
|
677
|
+
|
|
678
|
+
3. **카드 수신 vs 공개 분리** — *수신은 모두 2장, 공개는 Dealer 1장 / Player 2장*.
|
|
679
|
+
|
|
680
|
+
4. **Ace 1 기본 + 단일 +10 룰** — PR #36 결. *Multi-Ace 정확 처리 X*.
|
|
681
|
+
|
|
682
|
+
5. **`Dealer.isDrawable() = sum + 10 < 16` (Ace Soft 적용)** — *Soft Ace + 16 한계*. 다만 *블랙잭 표준은 17 이상 stay → < 17 또는 ≤ 16 hit*.
|
|
683
|
+
|
|
684
|
+
→ **`DEALER_MAX_SCORE = 16` + `<` 비교 시 16 시 stay = 룰 와전 가능**. **블랙잭 룰 정확성 점검 필요**. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 10+ PR ⭐⭐⭐.
|
|
685
|
+
|
|
686
|
+
6. **게임 승패 = 참가자 자가 결정 (외부 GameResultDecider X)** — *Tell-Don't-Ask + 현실 메타포*.
|
|
687
|
+
|
|
688
|
+
7. **GameResult enum (WIN/LOSE/DRAW)** — *블랙잭 1.5배 분기 X (이번 미션 1단계)*.
|
|
689
|
+
|
|
690
|
+
## MCP 룰 후보 신규 + 강화 (PR #129)
|
|
691
|
+
|
|
692
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
693
|
+
|---|---|---|
|
|
694
|
+
| `metaphor-fidelity-locator` | 강화 | 9+ ⭐⭐⭐ |
|
|
695
|
+
| `abstraction-as-shared-behavior-discovery` | 신규 | 1 (#129) |
|
|
696
|
+
| `abstraction-purpose-revisit` | 신규 | 1 (#129) |
|
|
697
|
+
| `compile-time-singleton-vs-runtime-filter` | 신규 | 4+ (#129·#79·#92·#48) |
|
|
698
|
+
| `sealed-vs-abstract-vs-open-locator` | 신규 | 5+ (#129·#98·#36·#147·#93·#136) |
|
|
699
|
+
| `abstract-without-abstract-method` | 강화 | 5+ (#95·#36·#117·#129·#147) |
|
|
700
|
+
| `interface-for-test-substitution` | 신규 | 4+ (#129·#48·#39·#46) |
|
|
701
|
+
| `validation-function-vs-require-inline` | 신규 | 1 (#129) |
|
|
702
|
+
| `business-logic-vs-controller-logic` | 신규 | 2+ (#129·#129) |
|
|
703
|
+
| `exception-vs-graceful-shutdown` | 신규 | 1 (#129) |
|
|
704
|
+
| `boolean-function-name-ambiguity` | 신규 | 1 (#129) |
|
|
705
|
+
| `external-take-vs-domain-method` | 신규 | 1 (#129) |
|
|
706
|
+
| `symmetric-getResult-vs-compareWith` | 신규 | 1 (#129) |
|
|
707
|
+
| `simple-delegation-method-unnecessary` | 신규 | 2+ (#129·#87) |
|
|
708
|
+
| `callback-action-for-result-aggregation` | 신규 | 1 (#129) |
|
|
709
|
+
| `primitive-return-without-domain-meaning` | 신규 | 2+ (#129·#36) |
|
|
710
|
+
| `blackjack-rule-fidelity-comparison` | 강화 | 10+ ⭐⭐⭐ |
|
|
711
|
+
| `ace-bonus-single-vs-multi` | 강화 | 2+ (#36·#129) |
|
|
712
|
+
|
|
713
|
+
## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점 유지)
|
|
714
|
+
|
|
715
|
+
- ***KwonDae (제이든)*** — 기존 reviewer (batch 12 신규 합류) **메타 어휘 깊이 정점** (커뮤니케이션 메타 + 학생 인간적 격려 + 추상화 활용 점검 + 현실 메타포 정공).
|
|
716
|
+
- ***현실 메타포 = 외부 장치 X*** — KwonDae PR #129 — *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요? 실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다."* — **MCP `oh-my-oop` 핵심 가치 (현실 메타포 정합)**. PR #117·#31·#21 결.
|
|
717
|
+
- ***추상화 활용 점검 + 학습 의도 회수*** — KwonDae PR #129 — *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* — *학습 의도 회수 어휘*.
|
|
718
|
+
- ***N 안 + 학생 선택지*** — KwonDae PR #129 — *"두가지 방법이 있을 것 같아요. (...) 어느 방법이 좋을지 고민해보시고 알려주세요!"* — **MCP `oop_propose_alternatives` 핵심 가치 합류**.
|
|
719
|
+
- ***커뮤니케이션 메타 (줄글 vs 핵심 내용)*** — KwonDae PR #129 — *"우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요."* — *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP `oh-my-oop` 핵심 가치 합류**.
|
|
720
|
+
- ***학생 인간적 격려*** — KwonDae PR #129 — *"아니요 절대 죄송하지 않으셔야 합니다 ㅎㅎ"* — *reviewer 의 인간적 학생 격려* 어휘.
|
|
721
|
+
- ***reviewer 의도 명시 + 학생 자가 학습 권유*** — KwonDae PR #129 — *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*.
|
|
722
|
+
- ***학생 자가 한계 인정 (시간 압박)*** — rosemin928 PR #129 — *"시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"* — *학습 적극성*.
|
|
723
|
+
- ***모든 22 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 5+ 회*** — rosemin928 PR #129 — *학생 자가 학습 가시화 정점* (PR #117 결).
|
|
724
|
+
- ***2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 자가 명시)*** — *체계화된 PR 본문 + 학생 자가 한계 명시*. PR #117·#129 합류 = 2025 코호트 *2 PR 표본*.
|
|
725
|
+
|
|
726
|
+
→ **13 reviewer + MCP `oh-my-oop` 핵심 가치 어휘 합류 정점 유지**. **2025 코호트 (모바일 안드로이드 7기) 신규 패턴**: 셀프 체크리스트 PR 본문 + 모든 스레드 commit SHA + 학생 자가 한계 인정.
|