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,287 @@
|
|
|
1
|
+
# PR #77 — [블랙잭 1단계] 오둥이 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@murjune](https://github.com/murjune)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/77
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @KwonDae (제이든)
|
|
7
|
+
- **라인 코멘트:** 24 스레드 — *학생 자가 PR 본문 의문 + 외부 블로그 인용 + Higher Order Function 자가 학습 + 일급컬렉션 정의 자가 주장*
|
|
8
|
+
- **신규 reviewee** (2024년 코호트). PR #99·#67 (KwonDae) 와 동일 reviewer.
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **PR 본문 자가 의문 + 이미지 첨부** — *"Card 들의 합을 계산하는 방식을 동적으로 바꾸고 싶어 위와 같이 생성자에 calculator 객체를 만들었습니다. 그러나, calculator를 domain model(일급 컬렉션)에 넣는 것이 맞는것일까.. 라는 고민을 하고 있습니다. 이에 대해 제이든의 피드백을 받고 싶습니다🙋♂️"* + 코드 이미지 첨부. **학생 자가 학습 모범 + 시각 자료**. PR #128·#135·#108·#133·#136·#137·#148·#151·#98·#95·#99 결.
|
|
13
|
+
- **`value class` Kotlin 어휘 자가 활용** — KwonDae 칭찬: *"value class 활용 👍"*. **Kotlin 1.5+ value class = inline 성능 + 타입 안전성** — PR #137·#148·#90·#146 의 *Kotlin 어휘 학습* 결.
|
|
14
|
+
- **`Read-Only 컬렉션 + plus operator` 자가 활용** — KwonDae 칭찬: *"Read-Only 컬렉션을 사용하기 때문에 plus 연산자로 처리해주는 부분 인상깊었네요 👍"*. **불변 객체 + 새 컬렉션 반환** — PR #46 (krrong *operator times*) / PR #39 (rhthrhrl0 *컬렉션 + operator*) 결.
|
|
15
|
+
- **`TestFixture` 활용 풍부** — KwonDae 칭찬 2회 (`CardFixtures.kt`, `DeckFixtures.kt`): *"TestFixture를 잘 활용해주셨네요 💯"* / *"TestFixture 사용으로 가독성이 좋아졌네요 👍"*. **PR #99 (s6m1n *Test Fixture 품질*) 권고 자가 적용 모범** — *KwonDae 가 양 PR 모두 리뷰* 했기에 *PR #99 학생 자가 학습이 PR #77 학생에게 권고로 이어진 패턴* 가능성.
|
|
16
|
+
- **`Deck.removeLast()` 빈 컬렉션 사전 방어** — KwonDae 칭찬: *"룰 마다 다르겠지만? cards가 비어있을 때 removeLast()가 예외가 발생할 수 있는데 사전에 막아주는 코드 좋습니다 👍"*. **방어 코드 + Kotlin 어휘**.
|
|
17
|
+
- **`UiModel` View 캡슐화 자가 학습** — KwonDae 칭찬: *"UiModel로 View에서 나타낼 데이터들을 캡슐화 해주셨군요..! 👍"*. **MVVM / Presentation Model 어휘** — PR #88·#131 의 *view-by-stage-split* 결의 진화.
|
|
18
|
+
- **추상화 활용** — KwonDae 칭찬: *"추상화를 잘 이용해주셨네요 👍 공통 로직을 중복으로 구현하기 보다 super 키워드를 활용해 한곳에서 관리할 수 있도록 개선해볼 수 있겠네요!"* + 외부 글 ([Kotlin 공식 문서 - inheritance](https://kotlinlang.org/docs/inheritance.html#calling-the-superclass-implementation)). **외부 자료 첨부**.
|
|
19
|
+
|
|
20
|
+
## 못한 점 (설계 관점)
|
|
21
|
+
|
|
22
|
+
### 1. `Hand 책임 위치` — 학생 자가 깊은 토론 (Hand vs Participant)
|
|
23
|
+
|
|
24
|
+
KwonDae 1차: *"현재 참가자(플레이어, 딜러)의 상태(들고있는 카드 정보, bust 여부 등)을 알고있다면 계산이 간소화 될거라 생각합니다. 참가자가 Hit를 수행할 때 마다 현재 Ace를 들고있다면 현재 스코어에 따라 1과 11중 어떤 값을 취해야 할 지 판단할 수 있기 때문에 참가자(Participant)가 스스로 판단하여 점수를 계산하게끔 할 수 있을거에요"*
|
|
25
|
+
|
|
26
|
+
학생 자가 반박: *"나의 상태(score) 도 결국 Hand의 상태(cards)를 가져와 계산하는 것이라 생각합니다. Hand 가 스스로 점수가 몇 점인지, 버스트인지, 블랙잭인지 판단하는 것이 좋다고 생각합니다!"*
|
|
27
|
+
|
|
28
|
+
KwonDae 2차: *"카드를 가져오거나 내 상태에 대한 판단은 Hand가 하는걸까요? 이러한 현재 내 카드에 대한 판단은 참가자가 할 수 있을겁니다. 또한, 이 로직은 딜러와 플레이어의 공통 로직이 되겠네요!"*
|
|
29
|
+
|
|
30
|
+
학생 후속: *"참여자(Participant)가 Hand 의 상태를 가져와 판단하기 보다는 Hand 가 자신의 상태(cards)를 기반으로 스스로 점수가 몇 점인지, 버스트인지, 블랙잭인지 판단하는 것이 좋다고 생각합니다!"*
|
|
31
|
+
|
|
32
|
+
→ **3 가지 학습**:
|
|
33
|
+
|
|
34
|
+
#### 1.1. *책임 위치 = Hand vs Participant (양방향 토론)*
|
|
35
|
+
|
|
36
|
+
- **Hand 책임** (학생 주장):
|
|
37
|
+
- *카드 모음의 상태 (점수, Bust, BlackJack) 는 *카드 모음 자체* 가 알 수 있음*.
|
|
38
|
+
- *Participant 가 Hand 위임 = 응집*.
|
|
39
|
+
- **Participant 책임** (KwonDae 주장):
|
|
40
|
+
- *Ace 1↔11 결정은 *현재 스코어* 에 따라 변동 → 참가자 상태와 결합*.
|
|
41
|
+
- *Hit 명령 → Participant 가 자기 상태 판단 + Hand 업데이트*.
|
|
42
|
+
|
|
43
|
+
**둘 다 유효 + 다른 트레이드오프** — *Hand = 데이터 응집 / Participant = 상태 변경 응집*. PR #99 (s6m1n *Hand 클래스 도입*) / PR #98 (chaehyuns *State + HandCards*) / PR #46 (krrong *CardBunch*) 결.
|
|
44
|
+
|
|
45
|
+
#### 1.2. *학생 자가 주장 유지 + reviewer 인정*
|
|
46
|
+
|
|
47
|
+
학생이 *자가 주장 유지* + *KwonDae 가 *학생 주장 수용* (`이 로직은 딜러와 플레이어의 공통 로직` 권고 후 그 이상 밀지 않음)*. **학생/reviewer 양방향 토론 + 학생 결정 존중**. PR #95 (말리빈 *"옳고 그름 없고 장단점만"*) / PR #46 (말리빈 *Dealer→Player vs Participant 토론*) 결.
|
|
48
|
+
|
|
49
|
+
#### 1.3. *학생 의문에 대한 reviewer 자가 부연 + 사과*
|
|
50
|
+
|
|
51
|
+
KwonDae: *"앗, 제가 오히려 헷갈리게 질문을 드린거 같아 죄송하네요 🥲 정리하면, 처음에 일급 컬렉션이라고 생각하지 못하고 캡슐화한 클래스라고 생각했었습니다."* — **reviewer 자가 사과 + 자가 부연**. PR #95·#137·#147·#151 의 *reviewer 자가 한계 인정* 결.
|
|
52
|
+
|
|
53
|
+
### 2. `Hand 일급 컬렉션 정의` — 학생 자가 매우 긴 외부 글 인용 답변
|
|
54
|
+
|
|
55
|
+
KwonDae 의문: *"이 경우에 Hand는 일급컬렉션 일까요?"*
|
|
56
|
+
|
|
57
|
+
학생 자가 매우 긴 답변:
|
|
58
|
+
|
|
59
|
+
```kotlin
|
|
60
|
+
class Hand(
|
|
61
|
+
val cards: List<Card>,
|
|
62
|
+
private val pointCalculator: PointCalculator = DefaultPointCalculator(BLACKJACK_NUMBER),
|
|
63
|
+
) : List<Card> by cards {
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
> *"저는 일급컬렉션이라고 생각합니다. 이유: 저는 일급컬렉션이 기본 collection 에 `비지니스 로직을 입힌 domain model` 이라고 스스로 정의했습니다. 해당 `Hand` 는 `List<Card> + 비지니스 로직` 형태 입니다. 저는 일급컬렉션이 기본 collection 에 `비지니스 로직을 입힌 domain model`라고 생각하기 때문에 by 키워드를 써도 일급컬렉션이라 생각합니다."*
|
|
67
|
+
|
|
68
|
+
> *(이후 학생의 외부 블로그 인용)* *"일급컬렉션의 규칙 중 하나는 [컬렉션을 제외한 다른 멤버변수는 존재하지 않아야](https://developerfarm.wordpress.com/2012/02/01/object) ..."*
|
|
69
|
+
|
|
70
|
+
→ **3 가지 메타 학습**:
|
|
71
|
+
|
|
72
|
+
#### 2.1. *학생 자가 일급 컬렉션 정의 명시*
|
|
73
|
+
|
|
74
|
+
학생의 *"스스로 정의했습니다"* — **자가 학습 + 자가 정의** 모범. PR #74·#108·#133·#99·#46 의 *일급 컬렉션 자가 학습* 결.
|
|
75
|
+
|
|
76
|
+
#### 2.2. *외부 블로그 인용 + 정의 검증*
|
|
77
|
+
|
|
78
|
+
학생이 *외부 블로그의 일급 컬렉션 규칙 (1 변수만) 인용* + *자가 코드가 규칙 위반인지 자가 검증*. **외부 자료 + 자가 검증 모범** — PR #95·#67·#23·#26·#16·#46 의 *외부 자료 첨부* 결의 *학생측 외부 자료 인용*.
|
|
79
|
+
|
|
80
|
+
#### 2.3. *`by` 키워드 (Kotlin 위임)*
|
|
81
|
+
|
|
82
|
+
- *`class Hand(val cards: List<Card>) : List<Card> by cards`* = *Hand 가 `List<Card>` 인터페이스를 *cards 에 위임*.
|
|
83
|
+
- **Kotlin Delegation 어휘** — *상속 X + 인터페이스 위임*. PR #74 (송핑크 *Delegate vs 일급 컬렉션 자가 학습 + 트레이드오프*) 결의 *Hand 적용*.
|
|
84
|
+
|
|
85
|
+
**MCP 룰 후보 — `delegate-vs-firstclass-collection`** = *PR #74 (말리빈 *Delegate 활용 일급 컬렉션 권고 X*) 와 본 PR (학생 *Delegate 사용*) 의 *동일 토론 패턴*. 양가성 인정*.
|
|
86
|
+
|
|
87
|
+
### 3. `Participant 추상화 + judge` — 참가자 vs 참가자 일반화
|
|
88
|
+
|
|
89
|
+
KwonDae: *"승부를 판단하는 로직을 참가자 객체가 스스로하게끔 할 수 있을까요? 즉, 플레이어와 딜러 구분 없이 Participant 자체가 다른 Participant와 비교하여 판단할 수 있지 않을까요?"*
|
|
90
|
+
|
|
91
|
+
```kotlin
|
|
92
|
+
abstract class Participant {
|
|
93
|
+
fun judge(otherParticipant: Participant): Result { ... }
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
학생 자가 답변 + 코드 + 도메인 룰:
|
|
98
|
+
|
|
99
|
+
> *"실제 블랙잭 게임에서 딜러와 플레이어가 둘다 Bust 상태 일 때, 플레이어가 지는 것으로 알고 있습니다! 따라서, 딜러와 플레이어의 계산 방식이 약간 다릅니다!! 사실 이 부분이 마음에 들지 않아 개선하기 위해 머리를 싸매고 있네요..😅"*
|
|
100
|
+
|
|
101
|
+
```kotlin
|
|
102
|
+
// Dealer
|
|
103
|
+
override fun judge(other: Participant): GameResult =
|
|
104
|
+
when {
|
|
105
|
+
other.isBust() -> GameResult.WIN
|
|
106
|
+
isBust() -> GameResult.LOSE
|
|
107
|
+
... 나머지는 동일
|
|
108
|
+
|
|
109
|
+
// Player
|
|
110
|
+
override fun judge(other: Participant): GameResult =
|
|
111
|
+
when {
|
|
112
|
+
isBust() -> GameResult.LOSE // 자기 Bust 우선 (둘 다 Bust 시 플레이어 패배)
|
|
113
|
+
...
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
KwonDae 후속: *"오둥이의 블랙잭 게임장은 둘 다 bust 일 때 플레이어가 패배하는 룰을 적용하고 있었군요..! 오둥이도 이부분이 마음에 들지 않는다면 같이 고민해봐도 좋을 것 같습니다 :)"*
|
|
117
|
+
|
|
118
|
+
→ **5 가지 학습**:
|
|
119
|
+
|
|
120
|
+
#### 3.1. *참가자 vs 참가자 일반화 (`judge(other: Participant)`) 시도*
|
|
121
|
+
|
|
122
|
+
- *`Dealer.compareResult(player)`* (한 방향) < *`Participant.judge(other)`* (양방향 일반화).
|
|
123
|
+
- *형제 구현체 간 강한 의존 차단 + DIP 적용*.
|
|
124
|
+
|
|
125
|
+
PR #46 (krrong 2단계 *Dealer → Participant 양방향 토론*) / PR #95·#23·#148·#151·#49·#132 결.
|
|
126
|
+
|
|
127
|
+
#### 3.2. *블랙잭 룰 정확성 (둘 다 Bust 시 플레이어 패배)*
|
|
128
|
+
|
|
129
|
+
학생 자가 도메인 룰 인용 — *"실제 블랙잭 게임에서 딜러와 플레이어가 둘다 Bust 상태 일 때, 플레이어가 지는 것으로 알고 있습니다!"*. **MCP 룰 후보 `blackjack-rule-fidelity`** + PR #26 (잭슨 *Bust 양측 명시*) / PR #46 (말리빈 *BlackJack ≠ 21*) 결.
|
|
130
|
+
|
|
131
|
+
#### 3.3. *judge 다형성 vs 비대칭 도메인 룰*
|
|
132
|
+
|
|
133
|
+
- *판정 룰이 *대칭* (점수 비교) 인 경우 = `Participant.judge` 일반화 정공.
|
|
134
|
+
- *판정 룰이 *비대칭* (Player Bust 우선) 인 경우 = *각자 다른 judge 구현* 필요 → *Participant 일반화의 한계*.
|
|
135
|
+
|
|
136
|
+
#### 3.4. *학생 자가 *마음에 들지 않음* 자가 명시*
|
|
137
|
+
|
|
138
|
+
*"사실 이 부분이 마음에 들지 않아 개선하기 위해 머리를 싸매고 있네요..😅"* — **학생 자가 *현 코드 만족도 명시*** = *MCP `oh-my-oop` 의 *학생 결정 + reviewer 협력* 어휘와 일치*. PR #128·#135·#108·#133·#98·#95·#99·#46 결.
|
|
139
|
+
|
|
140
|
+
#### 3.5. *reviewer 가 *학생 결정 존중* + *공동 고민 권유**
|
|
141
|
+
|
|
142
|
+
KwonDae: *"오둥이도 이부분이 마음에 들지 않는다면 같이 고민해봐도 좋을 것 같습니다"* — **공동 학습 어휘**. PR #46 (말리빈 *"슬랙 DM도 좋고"*) / PR #99 (KwonDae *DM 권유*) 결.
|
|
143
|
+
|
|
144
|
+
### 4. `play 함수 + onHit 람다 → 생성자 주입` 권유 — Higher Order Function 자가 학습
|
|
145
|
+
|
|
146
|
+
KwonDae: *"지금 공통 로직을 잘 분리해주셨는데요, play 함수도 `onHit: (String) -> Boolean,` 외에는 동작이 같아서 사용자가 HIt를 할지 말지에 대한 람다는 Player의 생성자에서 받아보는건 어떨까요? Dealer와 같은 [HIgher Order Function](https://kotlinlang.org/docs/lambdas.html#higher-order-functions)이 될 수 있어보여 이 함수도 추상화가 가능할 것 같습니다."*
|
|
147
|
+
|
|
148
|
+
→ **2 가지 학습**:
|
|
149
|
+
|
|
150
|
+
#### 4.1. *람다 인자 주입 vs 생성자 주입*
|
|
151
|
+
|
|
152
|
+
- *매 호출마다 람다 인자 주입* = *호출자가 매번 람다 전달*.
|
|
153
|
+
- *생성자에서 람다 보유* = *객체 생성 시 1회 + 매 호출에서 재사용*.
|
|
154
|
+
- *호출 횟수 N 회 시* = *생성자 주입 정공*.
|
|
155
|
+
|
|
156
|
+
#### 4.2. *Higher Order Function 외부 글*
|
|
157
|
+
|
|
158
|
+
KwonDae 가 *Kotlin 공식 문서 인용* — **외부 자료 첨부**. PR #95·#67·#23·#26·#16·#46 의 *외부 자료 첨부* 결.
|
|
159
|
+
|
|
160
|
+
### 5. `PointCalculator` 도메인 모델 vs 분리 — PR 본문 자가 의문
|
|
161
|
+
|
|
162
|
+
PR 본문 학생 자가 의문: *"calculator를 domain model(일급 컬렉션)에 넣는 것이 맞는것일까.."*
|
|
163
|
+
|
|
164
|
+
KwonDae 답변: *"딜러와 플레이어의 카드 계산 방식이 다른걸까요?.? 이 고민은 Participant 클래스를 abstract class로 추상화 시킴으로써 해결이 가능할거라 생각합니다. (...) 지금 고민중이신 카드계산은 공통로직에 해당하여 추상클래스에서 공통로직으로 소화할 수 있습니다."*
|
|
165
|
+
|
|
166
|
+
학생 후속: *"게임의 기획이 바뀌어 카드 score 계산 알고리즘이 바뀔 수도 있을 것 같아, 계산 알고리즘을 따로 빼두려 했습니다!"*
|
|
167
|
+
|
|
168
|
+
→ **2 가지 학습**:
|
|
169
|
+
|
|
170
|
+
#### 5.1. *전략 패턴 의도 (`PointCalculator` 분리)*
|
|
171
|
+
|
|
172
|
+
- *카드 점수 계산 알고리즘 변동 가능성* = *전략 객체 (PointCalculator) 분리* 의도.
|
|
173
|
+
- *YAGNI 위반 가능성*: *현재 요구사항에는 단일 알고리즘 (블랙잭 점수)*.
|
|
174
|
+
|
|
175
|
+
PR #146 (yrsel *YAGNI 자가 인정*) / PR #67 (s6m1n 1단계 *PointCalculator 등장 가능*) 결.
|
|
176
|
+
|
|
177
|
+
#### 5.2. *Participant abstract class 공통 로직 vs 별도 객체*
|
|
178
|
+
|
|
179
|
+
- *Participant abstract class* = *상속 + 메서드 공통 위치*.
|
|
180
|
+
- *별도 PointCalculator* = *컴포지션 + 책임 분리*.
|
|
181
|
+
|
|
182
|
+
**상속 vs 컴포지션 트레이드오프**. PR #95·#74·#46 결.
|
|
183
|
+
|
|
184
|
+
### 6. `Rank.label`, `Suit.스페이드` View 누수 자가 학습
|
|
185
|
+
|
|
186
|
+
KwonDae 1차: *"label 은 출력용으로 존재하는 걸까요? 출력되는 문구를 모양으로 바꾼다던가 수정 사항이 생긴다면 도메인 로직을 수정해야 하겠네요 🧐"*
|
|
187
|
+
|
|
188
|
+
학생: *"완전 아차싶네요.. 수정하겠습니다!!💪"*
|
|
189
|
+
|
|
190
|
+
KwonDae 2차: *"`스페이드` 는 도메인로직일까요? 위에 Rank 의 label 처럼 문구가 아닌 모양으로 수정되어야 한다면 도메인 로직이 수정되어야 합니다."*
|
|
191
|
+
|
|
192
|
+
학생: *"오...! 놏치고 있었네요 반영하겠습니다~!"*
|
|
193
|
+
|
|
194
|
+
→ **MCP 기존 룰 `enum-with-ui-value`** (lotto/blackjack 다수 PR 결). PR #28·#78·#112·#125·#147·#23·#26 결.
|
|
195
|
+
|
|
196
|
+
### 7. `Deck.shuffle()` 매번 vs 생성 시 1회
|
|
197
|
+
|
|
198
|
+
KwonDae: *"카드를 뽑는 로직인 pull() 메서드 내부의 shuffle 이라는 랜덤요소로 테스트가 불가능한 상황입니다. Deck이 생성되는 때 받는 카드들이 이미 랜덤요소가 들어간 상태로 받는다면 매번 pull() 할 때 마다 shuffle 행동이 필요할까요? 실제로 블랙잭 게임에서도 hit 할 때 마다 섞지 않습니다 🧐"*
|
|
199
|
+
|
|
200
|
+
→ **현실 메타포 + 테스터빌리티**:
|
|
201
|
+
- *현실 블랙잭* = *덱 셔플 1회 + 매 카드 뽑기*.
|
|
202
|
+
- *학생 코드* = *매 뽑기마다 셔플 (무한 셔플)* = *현실 룰 X + 테스트 불가*.
|
|
203
|
+
- *해결* = *Deck 생성 시 셔플 1회 + 매 뽑기는 결정적*.
|
|
204
|
+
|
|
205
|
+
PR #74·#23·#95·#99·#26·#39·#46 의 *랜덤 테스트* 결.
|
|
206
|
+
|
|
207
|
+
### 8. `Controller god-object → 참가자 스스로 행동`
|
|
208
|
+
|
|
209
|
+
KwonDae: *"ParticipantHands를 통해서 플레이어를 생성해야 할까요? `player.firstDraw(deck)` `dealer.firstDraw(deck)` 객체 스스로 행동하게끔 매세지만 던져볼까요?"*
|
|
210
|
+
|
|
211
|
+
KwonDae 별도: *"이 클래스 대신 참가자(딜러, 플레이어)가 스스로 행동하게끔 할 수 있을까요? Controller에서 이부분에 대한 코멘트 드린 부분과 연결되는 내용입니다."*
|
|
212
|
+
|
|
213
|
+
→ **Tell-Don't-Ask + Controller god-object**. PR #99·#95·#28·#78·#112·#125·#147·#43 결.
|
|
214
|
+
|
|
215
|
+
### 9. `GameResult` 승/패/무 도메인 vs UI
|
|
216
|
+
|
|
217
|
+
KwonDae: *"승,패,무는 도메인 로직일까요~? UI 로직이 수정된다면 여기서 수정이 일어나야 됩니다 🧐"*
|
|
218
|
+
|
|
219
|
+
→ **enum-with-ui-value 결**.
|
|
220
|
+
|
|
221
|
+
### 10. `Deck 테스트` 추가 권고
|
|
222
|
+
|
|
223
|
+
KwonDae: *"이 도메인에 대한 테스트는 진행되지 않았네요. card를 생성자로 주입받음으로써 테스트가 가능하게끔은 잘해주셨습니다 👍 예로, 아래 테스트도 진행해볼까요? > A하트 카드 한장이 남았을 때, Hit시 A하트 카드가 나와야 한다."*
|
|
224
|
+
|
|
225
|
+
→ **결정적 테스트 케이스 권고**. PR #16·#39·#46·#23·#26 결.
|
|
226
|
+
|
|
227
|
+
### 11. `ktlint` 확인 권고
|
|
228
|
+
|
|
229
|
+
KwonDae: *"ktlint 확인해주세요! 👍"* (이미지 첨부).
|
|
230
|
+
|
|
231
|
+
→ **린터 = 코드 컨벤션 자동화**. PR #41·#137·#148 의 *Kotlin 어휘* 결의 *컨벤션 도구*.
|
|
232
|
+
|
|
233
|
+
## 리뷰어 의견 요지 (KwonDae / 제이든)
|
|
234
|
+
|
|
235
|
+
24 코멘트 특징 (PR #99 와 동일 reviewer):
|
|
236
|
+
|
|
237
|
+
- **이미지 첨부** — ktlint 결과 화면. **시각 자료** — PR #46 (krrong *Parameterized Test 스크린샷*) 결.
|
|
238
|
+
- **외부 글 첨부** — *Kotlin 공식 문서 (lambdas + inheritance)*. PR #95·#67·#23·#26·#16·#46 결.
|
|
239
|
+
- **메타 질문 + 학생 자가 답변 유도** — *"Hand는 일급컬렉션 일까요?"*, *"label 은 출력용으로 존재하는 걸까요?"*, *"승,패,무는 도메인 로직일까요~?"*.
|
|
240
|
+
- **`?.?`, `🧐` 등 가벼운 이모티콘** — *학생 친화적 어조*. PR #99 (KwonDae *`?.?`*) / PR #95 (말리빈 *`?_?`*) 와 동일 어휘.
|
|
241
|
+
- **reviewer 자가 사과** — *"앗, 제가 오히려 헷갈리게 질문을 드린거 같아 죄송하네요 🥲"* — PR #95·#46·#137 결.
|
|
242
|
+
- **공동 학습 권유** — *"같이 고민해봐도 좋을 것 같습니다"* — PR #46 (말리빈 *DM 권유*) / PR #99 (KwonDae *DM 권유*) 결.
|
|
243
|
+
- **학생 결정 존중** — Hand vs Participant 토론에서 *학생 주장 수용 후 추가 권고 X*. **MCP `oh-my-oop` 의 *학생 선택지 인정* 어휘**.
|
|
244
|
+
|
|
245
|
+
## 대표 인용
|
|
246
|
+
|
|
247
|
+
> *"calculator를 domain model(일급 컬렉션)에 넣는 것이 맞는것일까.. 라는 고민을 하고 있습니다. 이에 대해 제이든의 피드백을 받고 싶습니다🙋♂️"* — murjune (PR 본문 학생 자가 의문 + 이미지)
|
|
248
|
+
|
|
249
|
+
> *"저는 일급컬렉션이 기본 collection 에 `비지니스 로직을 입힌 domain model` 이라고 스스로 정의했습니다."* — murjune (학생 자가 일급 컬렉션 정의)
|
|
250
|
+
|
|
251
|
+
> *"실제 블랙잭 게임에서 딜러와 플레이어가 둘다 Bust 상태 일 때, 플레이어가 지는 것으로 알고 있습니다! 따라서, 딜러와 플레이어의 계산 방식이 약간 다릅니다!! 사실 이 부분이 마음에 들지 않아 개선하기 위해 머리를 싸매고 있네요..😅"* — murjune (학생 자가 도메인 룰 인용 + 자가 만족도 명시)
|
|
252
|
+
|
|
253
|
+
> *"오둥이의 블랙잭 게임장은 둘 다 bust 일 때 플레이어가 패배하는 룰을 적용하고 있었군요..! 오둥이도 이부분이 마음에 들지 않는다면 같이 고민해봐도 좋을 것 같습니다 :)"* — KwonDae (학생 결정 존중 + 공동 학습 권유)
|
|
254
|
+
|
|
255
|
+
> *"앗, 제가 오히려 헷갈리게 질문을 드린거 같아 죄송하네요 🥲"* — KwonDae (reviewer 자가 사과)
|
|
256
|
+
|
|
257
|
+
> *"이 경우에 Hand는 일급컬렉션 일까요?"* — KwonDae (정의 자가 의문 + 학생 자가 답변 유도)
|
|
258
|
+
|
|
259
|
+
## 얻은 교훈
|
|
260
|
+
|
|
261
|
+
1. **`by` 키워드 (Kotlin Delegation) + 일급 컬렉션 양가성** — *`class Hand(...) : List<Card> by cards`* = *위임 + 일급 컬렉션 양가성*. **MCP 룰 후보 `delegate-vs-firstclass-collection`**. PR #74 (송핑크 *Delegate vs 일급 컬렉션 토론*) 결.
|
|
262
|
+
|
|
263
|
+
2. **`value class` Kotlin 어휘** — *Kotlin 1.5+ inline 성능 + 타입 안전성*. PR #137·#148·#90·#146·#39 의 *Kotlin 어휘 학습* 결.
|
|
264
|
+
|
|
265
|
+
3. **`Higher Order Function` + 생성자 주입** — *람다 인자 주입 (매 호출) vs 생성자 주입 (1 회 + 재사용)*. **MCP 룰 후보 `lambda-injection-locus`**. PR #46 (krrong *Kotlin 어휘*) / PR #137·#132·#99·#23 의 *onXX 콜백* 결.
|
|
266
|
+
|
|
267
|
+
4. **`Hand vs Participant` 책임 위치 양방향 토론** — *Hand = 데이터 응집 / Participant = 상태 변경 응집*. **둘 다 유효 + 다른 트레이드오프 + 학생 결정 존중**. PR #99·#98·#46·#74·#43 의 *Hand 클래스 도입* 결.
|
|
268
|
+
|
|
269
|
+
5. **`참가자 vs 참가자 일반화 (`judge(other: Participant)`)`** + **블랙잭 룰 비대칭 (둘 다 Bust 시 플레이어 패배)** — *판정 룰이 *대칭* 이면 일반화 정공 / *비대칭* 이면 각자 다른 구현 필요*. **MCP 룰 후보 `judge-symmetry-violation`**. PR #46·#95·#23·#148·#151·#49·#132 결.
|
|
270
|
+
|
|
271
|
+
6. **`외부 블로그 인용 + 자가 정의 검증`** — *학생이 *외부 일급 컬렉션 정의 (1 변수만)* 인용 + *자가 코드가 규칙 위반인지 자가 검증*. **외부 자료 + 자가 검증 학생 모범**. PR #95·#67·#23·#26·#16·#46 의 *외부 자료 첨부* 결의 *학생측*.
|
|
272
|
+
|
|
273
|
+
7. **`Deck.shuffle()` 매번 vs 생성 시 1회** — *현실 메타포 + 테스터빌리티*. *현실 룰 = 셔플 1회 + 매 카드 결정적*. PR #74·#23·#95·#99·#26·#39·#46 결.
|
|
274
|
+
|
|
275
|
+
8. **`reviewer 자가 사과 + 자가 부연`** — *"제가 오히려 헷갈리게 질문을 드린거 같아 죄송하네요 🥲"* — **양방향 토론 + reviewer 자가 한계 인정**. PR #95·#46·#137·#147·#151 결.
|
|
276
|
+
|
|
277
|
+
9. **`공동 학습 권유`** — *"같이 고민해봐도 좋을 것 같습니다"* — **학생/reviewer 협력 어휘**. PR #46 (말리빈 *DM 권유*) / PR #99 (KwonDae *DM 권유*) 결.
|
|
278
|
+
|
|
279
|
+
10. **`enum-with-ui-value` 결 (Rank.label, Suit.스페이드)** — **MCP 기존 룰** + lotto/blackjack 다수 PR. PR #28·#78·#112·#125·#147·#23·#26·#16 결.
|
|
280
|
+
|
|
281
|
+
11. **`Test Fixture 활용`** — *PR #99 (KwonDae *Test Fixture 품질*) 권고가 PR #77 학생에게 *적용된 후 칭찬* 받는 패턴* — **reviewer 의 학습 시드가 다른 학생에게 이어지는 *학습 전파 케이스***.
|
|
282
|
+
|
|
283
|
+
12. **`PR 본문 자가 의문 + 이미지`** — *코드 이미지 첨부* + *외부 자료 인용* + *자가 학습* — **학생 자가 학습 가시화 모범**. PR #98·#99·#136·#137·#148·#46 결.
|
|
284
|
+
|
|
285
|
+
13. **`PointCalculator` 분리 = YAGNI 위반 vs 전략 패턴 의도** — *현재 단일 알고리즘 + 미래 변동 가능성*. *PR #146 (YAGNI 자가 인정)* 결. **MCP 룰 후보 `premature-strategy-extraction`**.
|
|
286
|
+
|
|
287
|
+
14. **`ktlint` 자동 컨벤션 도구** — *Kotlin 어휘 + 컨벤션 자동화*. *리뷰어가 *코드 스타일 = 자동화 도구* 권유*.
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# PR #91 — [블랙잭 2단계] 오둥이 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@murjune](https://github.com/murjune)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/91
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @KwonDae (제이든)
|
|
7
|
+
- **라인 코멘트:** 13 스레드 — *학생 자가 깊은 메타 토론 + PR 본문 자가 의문 2개 + 외부 책 인용 (엘레강트 오브젝트 + 헤드퍼스트 디자인 패턴)*
|
|
8
|
+
- **양 단계 분석 reviewee** (1단계 #77 별도). PR #99·#67·#77 와 동일 reviewer.
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **PR 본문 자가 의문 2개 + 외부 책 인용 + 코드 첨부** — *UiModel postfix 자가 의문 (엘레강트 오브젝트 인용)* + *상태 패턴 의문 (Heads First Design Patterns 인용)* + *외부 블로그 링크 첨부*. **학생 자가 학습 매우 깊은 모범** — PR #128·#135·#108·#136·#137·#148·#151·#98·#95·#99·#46·#77 결.
|
|
13
|
+
- **`sealed class` 학생 자가 매우 긴 답변 (Kotlin 어휘 자가 정리)** — KwonDae 메타 질문: *"abstract class 로 선언했을 때와 어떤 차이점이 있을까요?"* + 학생: *"sealed class 는 컴파일 시점에 sub class 들이 결정되는 special 한 abstract class 입니다! sealed class 는 abstract class 와 달리 구현체가 같은 패키지 안에만 있어야 합니다. 따라서, 다른 패키지에서 super class를 상속하지 못합니다. 이에 따라, 컴파일러가 해당 super class 의 자손들을 모두 알고 있기 때문에 when 문에서 `else 문`을 사용하지 않아도 됩니다. 이에 따른 장점) else 문이 없기 때문에, sub class 를 추가했을 때 when 절에서 컴파일 에러가 발생하여 추가적인 로직 처리를 강제 시킵니다. 이를 통해, else 문이 발생시킬 수 있는 논리 에러를 방지할 수 있다는 장점이 있습니다! (따라서, else 문을 사용하면 sealed class 를 사용할 이유가 없다고 생각합니다)"*. **Kotlin 어휘 학생 자가 정리 모범 (sealed vs abstract + when exhaustive 효과)** — PR #98 (chaehyuns *sealed class 자가 학습*) / PR #137·#148·#90·#146 결.
|
|
14
|
+
- **`super` 키워드 자가 학습 + 자가 위험 인식** — 학생: *"super 키워드를 사용하여 Bust 와 같이 예외적인 상황은 sub class 가 처리하도록 하고, 기본 로직은 super class 의 judge 를 통해 처리하도록 했습니다. (...) 다만, super class 의 judge 기능이 바뀔 때 sub class 들도 이에 대한 변경이 강제되었습니다. 따라서, 부모의 규칙을 반드시 자식도 지켜야할 때만 open 키워드로 확장을 열어야 겠다는 생각을 했습니다. 또 한가지 든 생각이 해당 judge 함수를 잘 모르는 사람이 이를 override 하여 재정의한다면 저의 의도와 다르게 사용할 수도 있어 위험할 수 있겠다는 염려도 있었습니다.(제가 처음 Activity의 onCreate, onStart 함수들을 사용할 때 이상하게 사용했거든요 🥲)"*. **상속 양가성 자가 학습 + 안드로이드 경험 인용 모범**. PR #46·#77·#23 의 *상속 학습* 결.
|
|
15
|
+
- **상태 패턴 양방향 토론 + Heads First Design Patterns 코드 인용** — 학생이 *책 코드 직접 첨부 + 자가 의문 명시*. **외부 자료 + 자가 검증 모범** — PR #95·#67·#23·#26·#16·#46·#77 의 *외부 자료* 결.
|
|
16
|
+
- **`ParameterizedTest` 활용** — KwonDae 칭찬 *"ParameterizedTest 활용 👍 👍"*. PR #46 (krrong *Parameterized Test 자가 토론*) 결.
|
|
17
|
+
- **`abstract fun` 활용 칭찬** — KwonDae *"abstract fun 활용 👍"*. PR #16 (SeongHoonC *abstract vs open 자가 학습*) 결.
|
|
18
|
+
|
|
19
|
+
## 못한 점 (설계 관점)
|
|
20
|
+
|
|
21
|
+
### 1. `UiModel postfix` 자가 의문 — 엘레강트 오브젝트 인용
|
|
22
|
+
|
|
23
|
+
PR 본문 학생 자가 의문 (엘레강트 오브젝트 인용):
|
|
24
|
+
|
|
25
|
+
> *"객체를 '정보를 수정하거나 스스로 어떤 일을 수행할 만큼 똑똑하지 못하기 때문에 단순히 정보를 전달하는 용도' 로 사용하지말고, '스스로 결정을 내리고 행동할 수 있는 자립적인 엔티티'로 사용하라"*
|
|
26
|
+
>
|
|
27
|
+
> *"현재 제가 만든 UiModel 은 단순히 데이터를 View 에 편하게 전달하기 위한 용도로만 사용하고 있습니다. 따라서 책에서 말하는 '스스로 결정을 내리고 행동할 수 있는 자립적인 엔티티' 라고는 보기 힘듭니다..🥲 이러한, UiModel 에게 다른 책임을 좀 더 부여하여 `UiModel` 이라는 postfix 를 떼어버릴 수 있도록 하는 것이 좋을까요??"*
|
|
28
|
+
|
|
29
|
+
KwonDae 답변 (UiModel 미래 책임 명시):
|
|
30
|
+
|
|
31
|
+
> *"UiModel을 잘 작성해주셨어요 👍 지금은 콘솔 출력이기에 크게 쓰임새가 있진 않지만, 안드로이드 개발을 진행하다 보면 Domain model 데이터 그대로 보여주기보다 1. 가공을 하거나 2. 새로운 필드가 필요할 경우 3. UiModel 에서 책임이 있는 함수(ex.특정 글자 하이라이팅) 지금도 만약 조건별로 출력조건이 다르다면 UiModel 에 로직이 추가되어야 할 것입니다. 그렇다면 스스로 결정하고 판단할 수 있는 객체가 되겠지요. 현재 요구사항에서는 유지..."*
|
|
32
|
+
|
|
33
|
+
→ **3 가지 메타 학습**:
|
|
34
|
+
|
|
35
|
+
#### 1.1. *DTO/UiModel = 자립적 객체 vs 데이터 운반자 양가성*
|
|
36
|
+
|
|
37
|
+
- *엘레강트 오브젝트 (Yegor Bugayenko)* = *모든 객체는 자립적 + 행동 보유*. *DTO = 안티패턴* 시점.
|
|
38
|
+
- *MVVM / Android* = *UiModel = ViewModel ↔ View 사이 변환 데이터 + 가공 로직 보유 가능*.
|
|
39
|
+
- *현재 콘솔 미션 = 가공 로직 미미 → 단순 운반자*. *향후 안드로이드 = 책임 추가 시 자립적*.
|
|
40
|
+
|
|
41
|
+
**MCP 룰 후보 — `uimodel-passive-vs-active-tension`** = *현재 책임 부족 vs 미래 책임 가능성 트레이드오프*.
|
|
42
|
+
|
|
43
|
+
#### 1.2. *외부 책 (엘레강트 오브젝트) 자가 인용 + 자가 의문*
|
|
44
|
+
|
|
45
|
+
학생이 *책 내용 발췌 + 자가 코드와 비교 + 자가 후회* — *외부 학습 + 자가 검증 모범*. **PR #136 (oungsi2000 *엘레강트 오브젝트 4.2/2.2 인용*) 와 같은 결**.
|
|
46
|
+
|
|
47
|
+
#### 1.3. *reviewer 가 *미래 책임 명시* + *현재 OK 인정**
|
|
48
|
+
|
|
49
|
+
KwonDae 의 *"현재 요구사항에서는 유지..."* (미완성 텍스트, 추정 "유지하시되 미래에 책임 추가 시 재고려" 의미) — *현재 코드 OK 인정 + 미래 시나리오 명시*. **MCP `oh-my-oop` 의 *N 안 + 트레이드오프* 어휘**.
|
|
50
|
+
|
|
51
|
+
PR #74 (송핑크 *Delegate 자가 학습 + 트레이드오프*) / PR #46 (krrong *BettingMoney 곱셈 자가 의문*) 결.
|
|
52
|
+
|
|
53
|
+
### 2. `상태 패턴 Context↔State 양방향` vs `Context→State 단방향` — PR 본문 자가 의문
|
|
54
|
+
|
|
55
|
+
PR 본문 학생 자가 의문:
|
|
56
|
+
|
|
57
|
+
> *"전통적인 상태 패턴은 state 가 context 를 들고 있고, 여러 state 가 상황에 맞게 context의 state를 update 하는 방식으로 알고 있습니다!! 그러나, 저는 state 와 context 가 서로 양방향 의존관계를 가지고 있다는 점이 추후 문제가 될 수 있다 판단하여 participant(context) ---> state 단방향 형태로 구현하였습니다. 이유) context 혹은 state를 변경하면 다른 클래스도 변경해야 하기 때문에 확장성 및 유지보수가 어려워질 것을 염려했습니다."*
|
|
58
|
+
|
|
59
|
+
KwonDae 1차 답변 (정의 재설명):
|
|
60
|
+
|
|
61
|
+
> *"정의를 다시 할 필요가 있습니다. 상태 패턴에서의 context 란 State 를 저장하고 관리하는 역할을 갖고 있는 호스트 객체를 뜻합니다. Context는 내부적으로 상황에 따라 State를 변경할 수 있고, 그 외에 상태에 영향을 줄 수 있는 변수들은 갖고 있습니다. 그렇다면 위 의문점이 깔끔하게 해소가 될까요? 🧐"*
|
|
62
|
+
|
|
63
|
+
학생 자가 명확화 + 책 코드 인용:
|
|
64
|
+
|
|
65
|
+
> *"제 의도와 맞지 않게 잘못 질문한것 같습니다.. 죄송합니다. 😥 저는 [헤드퍼스트 디자인 패턴] 을 기반으로 상태 패턴을 학습하였습니다. 책에서는, 아래 코드와 같이 state 도 context 를 들고 있고, state의 액션이 끝나면 context의 setState를 호출하여 상태를 업데이트를 합니다. state와 context가 서로를 가지고 있는 아래와 같은 상태 패턴을 실제로 사용하는지 의문이 들어 질문한 것이였습니다!"*
|
|
66
|
+
|
|
67
|
+
KwonDae 2차 답변 (양방향 트레이드오프):
|
|
68
|
+
|
|
69
|
+
> *"좋은 질문을 주셨네요 👍 제 개인적인 생각으로는 두가지 방법은 장단점이 뚜렷합니다.*
|
|
70
|
+
>
|
|
71
|
+
> *1. Context -> State: 이 경우는 State가 Context를 알 필요가 없습니다. 단지 State에 따라 내부적으로 상태에 따라 필요한 로직을 수행하며, 상태가 변경될 때 새로운 상태를 생성할 수 있습니다.*
|
|
72
|
+
>
|
|
73
|
+
> *2. Context <-> State: 양방향 의존성이 있다면, 1:1로 코드의 복잡성이 증가할 수 있고 재사용이 어려워질 수 있습니다. 다만, State가 Context를 알고 있기에 상태 전환시 Context 로직에 대한 제어를 갖게될 수 있기에 Context는 단순히 상태를 전환하는 업무를 수행하고, 비즈니스 로직을 위임받은 State가 상태에 따른 로직을 수행할 수 있겠죠. 그만큼 상태에 따라 유기적으로 수행하는 장점이 있다고 생각합니다."*
|
|
74
|
+
|
|
75
|
+
학생: *"2가지 방식을 알기 쉽게 설명해주셔서 감사합니다~!! 1 : N 관계가 아니라면 Context <-> State 방식도 한 번 시도해봐야겠습니다~!!💪"*
|
|
76
|
+
|
|
77
|
+
→ **5 가지 학습**:
|
|
78
|
+
|
|
79
|
+
#### 2.1. *학생 자가 의문 + 책 코드 인용 + 자가 의도 명확화 (3 단계)*
|
|
80
|
+
|
|
81
|
+
1. *자가 의문* (PR 본문) = 양방향 의존 *문제 시*.
|
|
82
|
+
2. *reviewer 정의 재설명* (Context = 호스트 객체).
|
|
83
|
+
3. *자가 의문 명확화* (책 코드 첨부 + 자가 의도 명시: *"실제로 사용하는지 의문"*).
|
|
84
|
+
|
|
85
|
+
**3 단계 학생 자가 토론 + 의도 명확화 모범**. PR #95 (송핑크 *"이해를 못했습니다"*) / PR #46 (krrong *3 단계 토론*) / PR #43 (chws0508 *4 후보 명시*) 결.
|
|
86
|
+
|
|
87
|
+
#### 2.2. *Context↔State (양방향) vs Context→State (단방향)*
|
|
88
|
+
|
|
89
|
+
- **Context→State** (학생 선택):
|
|
90
|
+
- State 는 Context 무관 = 재사용 친화 + 결합도 한정.
|
|
91
|
+
- 단점: Context 가 모든 분기 책임 = 분기 많을 시 복잡.
|
|
92
|
+
- **Context↔State** (책 표준):
|
|
93
|
+
- State 가 Context 의 setState 호출 = 상태 전환 책임이 State 에.
|
|
94
|
+
- 단점: 양방향 의존 = 재사용 어려움 + 복잡성 증가.
|
|
95
|
+
- 장점: Context 는 단순 + State 자기 도메인 로직 응집.
|
|
96
|
+
|
|
97
|
+
PR #98 (chaehyuns *State 자가 학습 + Player 들고 있음*) / PR #39 (rhthrhrl0 *State 생성자 주입*) / PR #43·#152·#93·#136 의 *State 정공* 결.
|
|
98
|
+
|
|
99
|
+
#### 2.3. *KwonDae 의 *"좋은 질문을 주셨네요"* — reviewer 가 학생 의문 인정*
|
|
100
|
+
|
|
101
|
+
학생의 *책 코드 첨부 후 명확화* 가 *reviewer 의 새로운 답변 (트레이드오프 양방향)* 유도. **양방향 토론 모범**. PR #95·#46·#137 결.
|
|
102
|
+
|
|
103
|
+
#### 2.4. *"개인적인 생각으로는"* — reviewer 메타 어휘*
|
|
104
|
+
|
|
105
|
+
KwonDae 의 *"제 개인적인 생각으로는"* — **개인 의견 메타 분리**. PR #23 (말리빈 *"제 개인적인 의견입니다 ㅎ_ㅎ"*) / PR #26 (잭슨 *"개인적인 의견이니 참고만"*) / PR #43 (잭슨 *"정답은 없는거니"*) / PR #95 (말리빈 *"옳고 그름 없고 장단점만"*) 결의 *KwonDae 어휘 합류*. **MCP `oh-my-oop` 핵심 가치와 일치**.
|
|
106
|
+
|
|
107
|
+
#### 2.5. *책 (헤드퍼스트 디자인 패턴) 인용 + 코드 직접 첨부*
|
|
108
|
+
|
|
109
|
+
학생이 *책 코드 그대로 첨부* + *자가 의문 명시* — *외부 자료 + 자가 검증 학생 모범*. PR #136 (oungsi2000 *엘레강트 오브젝트*) / PR #98 (chaehyuns *Heads First Design Patterns*) 결.
|
|
110
|
+
|
|
111
|
+
### 3. `Result vs runCatching` 위치 — Controller vs View 양방향 토론
|
|
112
|
+
|
|
113
|
+
KwonDae 1차: *"InputView.fetchBetting() 으로부터 `Result<List<Betting>>` 값을 받거나, `List<Betting>?` 을 받도록 한다면 Controller에서의 로직이 단순해질 수 있을까요?"*
|
|
114
|
+
|
|
115
|
+
학생 자가 반박: *"Betting 에서 논리적 오류가 발생하였기 때문에 재시작을 위하여 runCatching 을 사용하였습니다! 그리고, 해당 error 는 Domain 으로부터 던져진 Error 이기 때문에 Controller에서 처리하도록했습니다. 혹시, View 에서 해당 에러를 핸들링하라고 하신 이유가 있을까요?!"*
|
|
116
|
+
|
|
117
|
+
KwonDae 2차 (의도 명확화 + 코드 첨부):
|
|
118
|
+
|
|
119
|
+
> *"저의 코멘트 의도는 에러가 발생할 가능성이 있는 InputView 클래스 내 `inputView.fetchBetting(name)` 에서 runCatching으로 감싸 이에 대한 결과값으로 `Result` or `List<Betting>?` 를 통한 성공/실패 시에 대한 로직 처리가 Controller에서 하는게 어울리지 않을까하는 코드의 위치 관점에서 였습니다."*
|
|
120
|
+
|
|
121
|
+
```kotlin
|
|
122
|
+
private tailrec fun createBetting(name: String): Betting {
|
|
123
|
+
return inputView.fetchBetting(name)
|
|
124
|
+
.onFailure { ... }
|
|
125
|
+
.getOrT...
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
→ **3 가지 학습**:
|
|
129
|
+
|
|
130
|
+
#### 3.1. *Domain 에러 vs View 에러 위치*
|
|
131
|
+
|
|
132
|
+
- *학생 해석*: *Betting 검증 = 도메인 = Controller 가 처리*.
|
|
133
|
+
- *KwonDae 의도*: *runCatching 위치 = InputView 에서 + Result 반환 → Controller 가 onSuccess/onFailure 처리*.
|
|
134
|
+
|
|
135
|
+
#### 3.2. *runCatching 위치 = 에러 발생 근접*
|
|
136
|
+
|
|
137
|
+
- *View 가 입력 받음 → 도메인 객체 생성 시점 = View 가 *에러 발생 가능 코드 영역**.
|
|
138
|
+
- *try/catch 또는 runCatching 위치* = *호출자 (Controller) 가 *결과만* 받도록* — *View 의 책임이 *입력 + 결과 반환*.
|
|
139
|
+
|
|
140
|
+
#### 3.3. *학생 자가 의문 ("혹시 ~ 이유가 있을까요?")*
|
|
141
|
+
|
|
142
|
+
학생이 *자가 정당화 + reviewer 의도 의문* — **3 단계 토론 모범**. PR #46 (krrong *3 단계 토론*) / PR #95·#43 결.
|
|
143
|
+
|
|
144
|
+
### 4. `finishState 미할당 시 예외 vs null` — 학생 자가 *논리적 오류* 자가 결정
|
|
145
|
+
|
|
146
|
+
KwonDae: *"현재 finishState 가 값이 할당이 되지 않으면 예외가 발생하여 프로그램이 종료될텐데요, 지난 로또 미션에서의 오류에 대해 어떻게 처리했었는지 배웠던 것 처럼 `논리적인 오류가 아니면 예외를 던지지 말고 null을 반환한다.` 를 활용해보는건 어떨까요?"*
|
|
147
|
+
|
|
148
|
+
학생 자가 반박: *"저는 참가자의 state가 finishState 가 아닌데, judge() 함수를 호출하는 것이 논리적 오류라 판단했습니다. 그 이유는, Participant 가 아직 블랙잭 게임을 Play하지도 않았는데, judge를 호출하는 것이 의도대로 동작하지 않는 논리 에러 라 생각했기 때문입니다. 따라서, 다른 개발자가 Play하지도 않았는데, judge를 호출한다면 예외를 발생시켜 개발자에게 알리고자 했습니다!"*
|
|
149
|
+
|
|
150
|
+
→ **2 가지 학습**:
|
|
151
|
+
|
|
152
|
+
#### 4.1. *논리적 오류 vs 입력 오류*
|
|
153
|
+
|
|
154
|
+
- **논리적 오류 (학생 자가 분류)** = *코드 호출 순서 잘못* (예: `judge()` 가 finished 전 호출). *Exception 정공* = *개발자에게 즉시 알림*.
|
|
155
|
+
- **입력 오류** = *사용자 입력 X 또는 형식 잘못*. *null/Result 반환* = *재시도 가능*.
|
|
156
|
+
|
|
157
|
+
#### 4.2. *학생 자가 *분류 기준* 명시 + reviewer 권고 반박*
|
|
158
|
+
|
|
159
|
+
학생이 *자기 코드의 *오류 종류* 를 *논리적 오류* 로 분류 + 권고 거부 + 이유 명시*. **자가 분류 + 권고 반박 모범**. PR #46·#43·#95 결의 *학생 자가 결정 + 이유 명시*.
|
|
160
|
+
|
|
161
|
+
PR #143·#147 (sealed without differentiation) / PR #98 (chaehyuns *상태 패턴 효과 의문*) 결.
|
|
162
|
+
|
|
163
|
+
### 5. `프로퍼티 vs 함수` 자가 인정
|
|
164
|
+
|
|
165
|
+
KwonDae: *"프로퍼티로 선언하지 않은 이유가 있을까요?"*
|
|
166
|
+
|
|
167
|
+
학생: *"실수한 것 같습니다.. 반영하겠습니다!"*
|
|
168
|
+
|
|
169
|
+
→ **Kotlin 어휘 (interface property)**. PR #43 (chws0508 *interface 프로퍼티 자가 학습*) 결.
|
|
170
|
+
|
|
171
|
+
### 6. `Test Fixture 팩토리 패턴 + `List<Player>` 반환` 권유
|
|
172
|
+
|
|
173
|
+
KwonDae 1차: *"given 에 중복되는 코드가 많이 들어가는데요, 차이점은 인자로 들어가는 값이군요.. 🧐 팩토리 메서드 패턴을 통해서 의미있는 객체를 보기 쉽게 생성해보는건 어떨까요? 테스트 코드는 가독성을 높이기 위해 여러 장치들을 사용하곤 합니다."*
|
|
174
|
+
|
|
175
|
+
KwonDae 2차 (`createBustPlayers` 함수 코드 예시):
|
|
176
|
+
|
|
177
|
+
```kotlin
|
|
178
|
+
fun createBustPlayers(betting: Betting, count: Int): List<Player> {
|
|
179
|
+
return List(count) {
|
|
180
|
+
Player(NAME, betting, createBustState()) { true }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
KwonDae 3차 (`createCards vararg` 코드 예시):
|
|
186
|
+
|
|
187
|
+
```kotlin
|
|
188
|
+
fun createCards(vararg ranks: Rank): List<Card> {
|
|
189
|
+
return List(ranks.size) {
|
|
190
|
+
createCard(rank = ranks[it])
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// AS-IS
|
|
195
|
+
val cards = listOf(SEVEN_CARD, FIVE_CARD)
|
|
196
|
+
// TO-BE
|
|
197
|
+
val cards = createCards(Rank.ACE, Rank.SIX)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
→ **PR #99 (KwonDae *Test Fixture 품질*) 의 *Test Fixture 학습 시드* 가 PR #77 (#77 학생 자가 적용 후 칭찬) → PR #91 (학습 진화 + 한 단계 더) 으로 이어지는 패턴**. **MCP 룰 후보 `test-fixture-quality-parity` 강화** = *vararg 함수 + 의미 명명 + 재사용*.
|
|
201
|
+
|
|
202
|
+
### 7. `given-when-then` `given` 위치 의문 + reviewer 자가 부연
|
|
203
|
+
|
|
204
|
+
KwonDae: *"제가 이전 코멘트의 내용은 사실 위 코멘트들에 더 어울리는 내용이었네요 혼란을 드린거 같아 죄송합니다 🥲 이 부분에서는 given-when-then 패턴에서 given 에 과연 어떤 값을 셋팅해두는게 효율적인가? 에 대해 고민을 해보셨으면 했습니다. 처음 봤을 땐 otherPoint, betting, expect 모두 when 에서의 어떠한 행동을 하기 전 필요한 값이라고 생각이 들 것 같다는 생각이 들었습니다."*
|
|
205
|
+
|
|
206
|
+
```kotlin
|
|
207
|
+
// given
|
|
208
|
+
val state = createBlackjackState()
|
|
209
|
+
// when
|
|
210
|
+
val actual = state.calculateProfit(BETTING_10000, BLACKJ...
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
→ **2 가지 학습**:
|
|
214
|
+
|
|
215
|
+
#### 7.1. *given 정의 = 상태 셋업 vs 인자 값*
|
|
216
|
+
|
|
217
|
+
- *`given` = *테스트 컨텍스트 (생성 객체)***.
|
|
218
|
+
- *`when` = *행동 (메서드 호출) + 필요한 인자**.
|
|
219
|
+
- *학생 코드*: *otherPoint, betting, expect 모두 given* — *KwonDae 권고*: *otherPoint/betting 은 when 의 인자 / expect 는 then 의 검증값*.
|
|
220
|
+
|
|
221
|
+
#### 7.2. *reviewer 자가 사과 + URL 자가 참조 + 자가 부연*
|
|
222
|
+
|
|
223
|
+
KwonDae 의 *"혼란을 드린거 같아 죄송합니다 🥲"* + URL 참조 — **reviewer 자가 한계 인정 + 자가 부연 + 이전 코멘트 정정**. PR #77·#46·#16·#95·#137 결.
|
|
224
|
+
|
|
225
|
+
PR #99·#26·#46 의 *given-when-then 패턴* 결.
|
|
226
|
+
|
|
227
|
+
## 리뷰어 의견 요지 (KwonDae / 제이든)
|
|
228
|
+
|
|
229
|
+
13 코멘트 특징:
|
|
230
|
+
|
|
231
|
+
- **코드 예시 첨부 다수** — Test Fixture `createBustPlayers`, `createCards vararg`, given-when-then 분리. **코드 예시 = 학생이 바로 비교 가능**. PR #77·#99·#46 결.
|
|
232
|
+
- **PR 자가 참조 + 자가 사과** — *"제가 이전 코멘트의 내용은 사실 위 코멘트들에 더 어울리는 내용이었네요 혼란을 드린거 같아 죄송합니다"*. PR #77·#46·#16·#95 결.
|
|
233
|
+
- **메타 질문 + 학생 자가 답변 유도** — *"abstract class 로 선언했을 때와 어떤 차이점이 있을까요?"*, *"super 키워드를 사용하면서 어떤 장점이 있다고 생각하시나요?"*, *"프로퍼티로 선언하지 않은 이유가 있을까요?"*.
|
|
234
|
+
- **개인 의견 메타 어휘** — *"제 개인적인 생각으로는"*. **MCP `oh-my-oop` 핵심 가치**. PR #23·#26·#43·#95·#46 결의 *KwonDae 어휘 합류*.
|
|
235
|
+
- **이전 미션 학습 자가 연결** — *"지난 로또 미션에서의 오류에 대해 어떻게 처리했었는지 배웠던 것 처럼"* — *racingcar/lotto/blackjack 미션 간 학습 연쇄*. PR #95·#23·#46 결.
|
|
236
|
+
- **양방향 토론 + 학생 의도 명확화 후 트레이드오프 답변** — 상태 패턴 / Result 위치 등에서 *학생 의도 재확인 후 양방향 답변*. PR #95·#46·#77·#137 결.
|
|
237
|
+
|
|
238
|
+
## 대표 인용
|
|
239
|
+
|
|
240
|
+
> *"객체를 '정보를 수정하거나 스스로 어떤 일을 수행할 만큼 똑똑하지 못하기 때문에 단순히 정보를 전달하는 용도' 로 사용하지말고, '스스로 결정을 내리고 행동할 수 있는 자립적인 엔티티'로 사용하라"* — 엘레강트 오브젝트 (murjune PR 본문 인용)
|
|
241
|
+
|
|
242
|
+
> *"sealed class 는 컴파일 시점에 sub class 들이 결정되는 special 한 abstract class 입니다! (...) 컴파일러가 해당 super class 의 자손들을 모두 알고 있기 때문에 when 문에서 `else 문`을 사용하지 않아도 됩니다."* — murjune (Kotlin 어휘 학생 자가 정리)
|
|
243
|
+
|
|
244
|
+
> *"또 한가지 든 생각이 해당 judge 함수를 잘 모르는 사람이 이를 override 하여 재정의한다면 저의 의도와 다르게 사용할 수도 있어 위험할 수 있겠다는 염려도 있었습니다.(제가 처음 Activity의 onCreate, onStart 함수들을 사용할 때 이상하게 사용했거든요 🥲)"* — murjune (상속 위험 자가 학습 + 안드로이드 경험 인용)
|
|
245
|
+
|
|
246
|
+
> *"제 의도와 맞지 않게 잘못 질문한것 같습니다.. 죄송합니다. 😥 저는 헤드퍼스트 디자인 패턴을 기반으로 상태 패턴을 학습하였습니다."* — murjune (자가 질문 명확화 + 책 인용)
|
|
247
|
+
|
|
248
|
+
> *"제 개인적인 생각으로는 두가지 방법은 장단점이 뚜렷합니다. 1. Context -> State (...) 2. Context <-> State"* — KwonDae (양방향 트레이드오프 + 개인 의견 메타)
|
|
249
|
+
|
|
250
|
+
> *"저는 참가자의 state가 finishState 가 아닌데, judge() 함수를 호출하는 것이 논리적 오류라 판단했습니다."* — murjune (자가 오류 분류 + 권고 반박 + 이유 명시)
|
|
251
|
+
|
|
252
|
+
## 얻은 교훈
|
|
253
|
+
|
|
254
|
+
1. **`DTO/UiModel = 자립적 객체 vs 데이터 운반자 양가성`** — *엘레강트 오브젝트 (모든 객체 자립) vs MVVM (UiModel 미래 책임)*. *현재 미션 = 단순 운반자 OK + 미래 시나리오 (안드로이드 가공) = 자립적*. **MCP 룰 후보 `uimodel-passive-vs-active-tension`**. PR #136 (oungsi2000 *엘레강트 오브젝트 인용*) 결.
|
|
255
|
+
|
|
256
|
+
2. **`상태 패턴 Context↔State vs Context→State` 양가성** — *책 (Heads First) 표준 = 양방향* vs *학생 단방향 의도 (결합도 한정)*. **양방향 = State 의 setState 위임 + 비즈니스 로직 응집** / **단방향 = State 재사용 + Context 분기 책임**. PR #98·#39·#43·#152·#93·#136 결.
|
|
257
|
+
|
|
258
|
+
3. **`sealed class vs abstract class` Kotlin 어휘 학생 자가 정리** — *컴파일 시점 sub class 결정 + when else 불필요 + 컴파일러 강제*. **MCP 룰 후보 `sealed-class-when-exhaustive`**. PR #98·#137·#148·#90·#146 결.
|
|
259
|
+
|
|
260
|
+
4. **`super 키워드 = 상속 양가성 자가 학습`** — *공통 로직 위임 장점 + super 변경 시 sub 강제 변경 + override 위험성 (Activity 경험 인용)*. PR #46·#77·#23 결.
|
|
261
|
+
|
|
262
|
+
5. **`runCatching / Result 위치 = 에러 발생 근접`** — *View 입력 → 도메인 객체 생성 시점에서 runCatching + Result 반환* / *Controller 는 onSuccess/onFailure 처리*. **MCP 룰 후보 `runcatching-locus`**. PR #93 (junjange *runCatching on non-input*) 결.
|
|
263
|
+
|
|
264
|
+
6. **`논리적 오류 vs 입력 오류` 분류** — *논리적 오류 = 코드 호출 순서 잘못 = Exception* / *입력 오류 = 사용자 입력 X = null/Result*. **MCP 룰 후보 `error-classification-locus`**.
|
|
265
|
+
|
|
266
|
+
7. **`학생 자가 분류 + 권고 반박 + 이유 명시`** — *학생이 *자기 코드의 오류 종류* 자가 분류 + reviewer 권고 거부 + 이유 명시*. **자가 결정 + 논리 모범**. PR #46·#43·#95·#23 결.
|
|
267
|
+
|
|
268
|
+
8. **`Test Fixture 진화 = vararg 함수 + 재사용`** — *PR #99 (Test Fixture 품질) → PR #77 (학습 적용) → PR #91 (vararg + 재사용 한 단계 더)*. **MCP 룰 후보 `test-fixture-quality-parity` 강화**. **reviewer 매개 학습 전파 케이스**.
|
|
269
|
+
|
|
270
|
+
9. **`given-when-then` `given` 정의 — 상태 셋업 vs 인자** — *`given` = 객체 생성 / `when` = 행동 + 인자 / `then` = 검증값*. *otherPoint, betting, expect 모두 given X → 인자/검증값 위치 분리*.
|
|
271
|
+
|
|
272
|
+
10. **`개인 의견 메타 어휘 (KwonDae 합류)`** — *"제 개인적인 생각으로는"* — **MCP `oh-my-oop` 핵심 가치**. PR #23·#26·#43·#95·#46 결의 *9 reviewer 모두 사용하는 공통 어휘*.
|
|
273
|
+
|
|
274
|
+
11. **`reviewer 자가 사과 + URL 자가 참조 + 자가 부연`** — *학생 의문 → reviewer 자가 한계 인정 + 정정*. **양방향 토론 모범**. PR #77·#46·#16·#95·#137 결.
|
|
275
|
+
|
|
276
|
+
12. **`이전 미션 학습 자가 연결 (lotto → blackjack)`** — *"지난 로또 미션에서의 오류에 대해 어떻게 처리했었는지"* — *미션 간 학습 연쇄*. PR #95·#23·#46 결.
|
|
277
|
+
|
|
278
|
+
13. **`외부 책 인용 + 자가 검증` (학생측 풍부)** — *엘레강트 오브젝트 + 헤드퍼스트 디자인 패턴* — *학생이 *책 코드 직접 첨부* + *자가 의문 명시* + *자가 검증*. **MCP `oh-my-oop` 의 *학습 자료 확장* 어휘**. PR #136·#108·#46·#77 결.
|
|
279
|
+
|
|
280
|
+
14. **`Activity onCreate/onStart` 안드로이드 경험 인용** — *학생이 *과거 경험* 을 *현재 코드 위험성 진단*에 활용. **메타 학습 = 도메인 간 연결**.
|