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,279 @@
|
|
|
1
|
+
# PR #76 — [블랙잭 1단계] 서기 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Yunseok-Nam](https://github.com/Yunseok-Nam)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/76
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 18 스레드 — *PR 본문 자가 의문 3개 + 학생 매우 깊은 양방향 토론 + 팩토리 메서드 vs 부생성자 매우 긴 토론 + 학생 자가 결정 변경*
|
|
8
|
+
- **신규 reviewee** (2024 코호트).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **PR 본문 자가 의문 3개 + 자가 학습 모범**:
|
|
13
|
+
1. *"Card클래스에서 테스트의 편의를 위해 팩토리 메서드인 of를 작성하였습니다. 말리빈은 테스트를 위한 팩토리 메서드에 대해서 어떻게 생각하시는지 궁금합니다!!"*
|
|
14
|
+
2. *"ScoreBoard에서 cardSum을 상태로 가지고 있는데 이때 updateCardSum()을 할때마다 해당 값을 다시 0으로 초기화 해주는 로직이 실행됩니다. cardSum을 따로 저장하지 않고 매번 다시 계산하는 것보다는 낫다고 생각해서 이와같이 구현을 하였습니다. 혹시 더 좋은 방법이 있을 지 궁금합니다!"*
|
|
15
|
+
3. *"BlackjackGame에서 initCard메서드가 게임 시작 시 딜러와 플레이어에게 2장의 카드를 나누어 주는 기능을 수행합니다. 해당 기능이 controller와 model의 경계에 있는데 model에 조금 더 근접하다 생각되어 이와같이 작성하였습니다. 이것이 맞는 것인지 그렇지 않다면 다른 접근 법이 있는지 궁금합니다"*
|
|
16
|
+
|
|
17
|
+
**PR 본문 자가 의문 3개 모범**. PR #128·#135·#108·#136·#137·#148·#151·#98·#95·#99·#46·#77·#91·#107 결.
|
|
18
|
+
- **`model 이 view 참조 X 근본 이유 자가 학습 (4 단계 메타 질문)`** — 학생 자가 답변:
|
|
19
|
+
|
|
20
|
+
> *"### 1. model이 view를 참조하지 말아야하는 근본적인 이유는 무엇일까요?*
|
|
21
|
+
> *근본적인 이유는 구성 요소간 결합도를 최소화 함으로써 유지보수성을 높이기 위함이라 생각합니다.*
|
|
22
|
+
>
|
|
23
|
+
> *### 고차함수 방식을 사용하면 어떤 부분이 해결되었나요?*
|
|
24
|
+
> *해당 도메인에서 view를 선언하거나 상태를 가지지 않게 함으로써 직접적으로 view를 참조하지 않을 수 있었습니다.*
|
|
25
|
+
>
|
|
26
|
+
> *### '주입'은 무엇을 해결하기 위한 방법일까요?*
|
|
27
|
+
> *구성요소 간의 직접적인 참조를 피하면서 해당 구성요소의 기능을 사용할 수 있게 하는 방법이라고 생각합니다."*
|
|
28
|
+
|
|
29
|
+
말리빈 칭찬: *"좋은 답변이네요!!! 👍 고민해보시면서 질문하신 부분들에 대해 조금은 자신만의 생각이 생겨나셨을까요 ?_?"*
|
|
30
|
+
|
|
31
|
+
학생 자가 학습 명시: *"네넵 🙂 질문에 답을 하기위해 고민을 하다보니 제가 생각한 부분에 대해서 확신이 들었습니다. 예를 들어 위 질문에 대해서는 처음에 그저 model과 view가 참조되어있다는 것이 불편했다면 지금 저의 생각은 BlackjackGame내부에 직접적으로 view인스턴스가 생성된 것이 아닌 주입을 통한 참조가 이루어진 것이므로 이것을 강한 참조라 보기 어렵다입니다. 그러면서 코드의 질과 관계없이 말리빈이 해주신 말씀처럼 저의 코드에 대한 주관이 생긴 것 같습니다!"*
|
|
32
|
+
|
|
33
|
+
**자가 의문 → 자가 답변 → 자가 학습 가시화 모범** — PR #46·#107·#91·#43 결.
|
|
34
|
+
|
|
35
|
+
- **`에러 메시지 검증 자가 학습 + reviewer 추가 가치 공유`** — 학생: *"의도대로 에러 메세지가 출력되는지 + 에러메세지가 직접 드러나면서 어떤 것을 테스트 하고 어떤 결과를 원하는 지 파악하기 쉬워진 것 같습니다!"* + 학생 자가 의문: *"혹시 이 밖에 말리빈이 생각하는 에러 메시지 검증을 함으로써 얻을 수 있는 이점이 있는지 궁금합니다!"* + 말리빈: *"하나 더 좋은 점을 공유해드리자면, 같은 종류의 Exception Instance가 throw 되더라도, 에러메시지로 특정 예외를 구분할 수 있겠지요!"*. **학생 자가 의문 → reviewer 추가 가치 공유 모범** — PR #91·#46·#107·#137 결.
|
|
36
|
+
|
|
37
|
+
## 못한 점 (설계 관점)
|
|
38
|
+
|
|
39
|
+
### 1. PR 본문 자가 의문 — Card 카드 생성 + View 의존 + 팩토리 메서드 양가성
|
|
40
|
+
|
|
41
|
+
말리빈: *"기호와 숫자를 다른 문자열로도 나타낼 수 있는 요구사항이 추가되면 이 메서드는 어떻게 될까요? 예를 들어, 앞으로 스페이드는 ♤,♠,spade, Spade, 스페이드 등으로도 입력받을 수 있다면 모든 경우를 도메인 로직에서 처리해주어야할까요?"*
|
|
42
|
+
|
|
43
|
+
학생 자가 의문: *"감이 잘 오지 않네요😢😢😢 하루 정도 고민해보았는데 위에서 하신 질문에 대해서 감이 안잡히네요ㅜ"*
|
|
44
|
+
|
|
45
|
+
말리빈 자가 부연: *"이런 수많은 문자열에 대해 카드를 찾을 수 있는 모든 경우의 수를 도메인에서 처리하면, 메서드의 길이가 매우 길어질 수 있겠지요. 그런 역할은 Card 도메인 객체가 맡을 역할이 적절할지 고민해보시라는 의미었어요 :) 생성자에서 이미 우리가 원하는 값을 넣어야만 하는 제약을 두었음에도 불구하고, 입력 문자열에 의존해 카드를 찾는다는 것은, 결국 View의 요소에 의존하는 것과 크게 다르지 않아보이네요!"*
|
|
46
|
+
|
|
47
|
+
→ **3 가지 학습**:
|
|
48
|
+
|
|
49
|
+
#### 1.1. *학생 자가 *감이 안 잡힘* 명시*
|
|
50
|
+
|
|
51
|
+
*"감이 잘 오지 않네요😢😢😢 하루 정도 고민해보았는데"* — **학생 자가 학습 갭 명시 + 시간 투자 명시 모범**. PR #95·#107·#16 결.
|
|
52
|
+
|
|
53
|
+
#### 1.2. *Card.of(String) = View 입력 문자열 의존*
|
|
54
|
+
|
|
55
|
+
- *학생 코드*: *`Card.of("♠", "10")`* — *View 입력 문자열을 도메인이 받아 변환*.
|
|
56
|
+
- *반박*: *생성자 제약 (CardSuit enum) 으로 충분한데 *문자열 변환* 까지 도메인에 = 책임 누수*.
|
|
57
|
+
|
|
58
|
+
#### 1.3. *reviewer 자가 부연*
|
|
59
|
+
|
|
60
|
+
*"질문 의도가 아니었어요"* 류 자가 부연. PR #91·#16·#46·#95·#137·#77 결.
|
|
61
|
+
|
|
62
|
+
### 2. `팩토리 메서드 vs 부생성자` 매우 긴 토론 — 학생 자가 결정 변경
|
|
63
|
+
|
|
64
|
+
말리빈: *"부생성자를 활용해보는 건 어떨까요?"*
|
|
65
|
+
|
|
66
|
+
학생 1차: *"팩토리 메서드를 알기 전에는 위 같은 것들을 부생성자로 처리하곤 했었습니다. 팩토리 메서드를 알게되고 부생성자에 비해 많은 이점을 가지고 있는 팩토리 메서드(의미있는 함수명 가능, 여러 생성자 로직을 깔끔하게 구현..etc)를 사용하는 것이 좋다고 생각되었습니다! 혹시 말리빈이 위 코드에서 어떠한 부분때문에 부생성자 활용을 추천하신건지 궁금합니다! 😄"*
|
|
67
|
+
|
|
68
|
+
말리빈 메타 질문:
|
|
69
|
+
|
|
70
|
+
> *"현 코드에서 부 생성자와 팩터리메서드를 동시에 놓고 비교했을때, 1. 생성자를 활용하는 것은 팩터리 메서드의 from을 사용 만큼 이해하기 어려운 생성 방법이었나요? 2. 어떤 부분에서 깔끔한 차이를 보였나요?*
|
|
71
|
+
>
|
|
72
|
+
> *제가 코드를 작성할 때 중요하게 생각하는 것 중에 하나는, '필요에 의해서 추가 및 수정함' 이에요. 이 경우에서 팩터리 메서드가 정말로 필요했었는지 저는 동의하기 어려웠어요.*
|
|
73
|
+
>
|
|
74
|
+
> *다른 개발자들이, 객체를 생성할 때 어떤 제약 조건들이 있는지 보기 위해 가장 먼저 떠올릴 위치는 어디일까요?"*
|
|
75
|
+
|
|
76
|
+
학생 답변: *"1. 각 메서드 별 객체를 생성하는 특징을 함수명으로 보여줌으로써 부생성자보다는 가독성 면에서 좋다. 2. 부생성자에서 보다는 팩토리 메서드가 어떤 로직이 실행되는지 잘 보여준다는 점에서 깔끔하게 구현할 수 있다."* + *"### 다른 개발자들이, 객체를 생성할 때 어떤 제약 조건들이 있는지 보기 위해 가장 먼저 떠올릴 위치는 어디일까요? 가장 상단에 위치할 init블럭일 것 같습니다!"*
|
|
77
|
+
|
|
78
|
+
추가: *"앗 그리고 아래와 같이 부생성자로 할 경우 `JVM signature error` 가 발생합니다. dummy implicit을 사용하여 해결할 수 있지만 그것 보다는 팩토리메서드를 사용하는것이 좋다 생각됩니다!"*
|
|
79
|
+
|
|
80
|
+
말리빈 자가 인정 + 메타 답변:
|
|
81
|
+
|
|
82
|
+
> *"Template을 활용할 때의 Type erase 떄문에 활용한다는 것에 저도 100% 동의해요!*
|
|
83
|
+
>
|
|
84
|
+
> *> 각 메서드 별 객체를 생성하는 특징을 함수명으로 보여줌으로써 부생성자보다는 가독성 면에서 좋다.*
|
|
85
|
+
>
|
|
86
|
+
> *위 의견이 저에게 와닿지 않았던 생각을 말씀드릴게요 :)*
|
|
87
|
+
>
|
|
88
|
+
> *객체 생성은 생성자를 통해 한다 라는 것이 기본 문법이기에, 팩터리 메서드가 존재함을 알기 위해서는 생성자로의 생성이 막혀있음을 알게 된 다음에나 인식할 수 있다고 생각해요. 생성자가 막혀있지 않다면, 구현을 직접 들어가보지 않는 이상 팩터리 메서드의 존재를 바로 인식하기란 쉽지 않겠지요.*
|
|
89
|
+
>
|
|
90
|
+
> *그리고 `Players.from(List<String>)` 이나, `Players(List<String>)` 이나 , List\<String>으로부터 Players 객체를 생성한다는 의미는 모두 동일하게 의도..."*
|
|
91
|
+
|
|
92
|
+
학생 자가 결정 변경:
|
|
93
|
+
|
|
94
|
+
> *"질문에 대해서 고민하고 답을 작성하고 마지막에 해주신 말씀을 보면서 제가 코드를 작성할 때를 생각해보았을 때 팩토리메서드가 그저 좋다라는 것만 생각하고 일단 생성한 다음 의미를 부여한것 같다는 생각이 들었습니다. (...) 특히 위 질문을 보고 고민하면서 다른 사람들의 편의성을 생각하지 않고 저의 편의성을 우선했라는 생각이 많이 들었네요🥲🥲"*
|
|
95
|
+
|
|
96
|
+
→ **6 가지 학습**:
|
|
97
|
+
|
|
98
|
+
#### 2.1. *팩토리 메서드 vs 부생성자 양가성*
|
|
99
|
+
|
|
100
|
+
- **팩토리 메서드 장점** (학생 의견): 의미있는 함수명, 여러 생성자 로직 깔끔.
|
|
101
|
+
- **부생성자 장점** (말리빈 의견): 기본 문법 + 생성자 위치에서 가장 먼저 발견.
|
|
102
|
+
- **JVM Type erase** (학생 자가 인용): `List<T>` 시그니처 충돌 = 팩토리 정공.
|
|
103
|
+
|
|
104
|
+
#### 2.2. *"필요에 의해서 추가 및 수정함"* — reviewer 메타 어휘
|
|
105
|
+
|
|
106
|
+
**YAGNI 어휘**. PR #146 (yrsel YAGNI) / PR #107 (junseo511 *abstract class*) / PR #145 (학생 자가 *Manager 폭증*) / PR #31·#77 결.
|
|
107
|
+
|
|
108
|
+
#### 2.3. *학생 자가 *팩토리 메서드 그저 좋다 생각만* 자가 인정*
|
|
109
|
+
|
|
110
|
+
*"팩토리메서드가 그저 좋다라는 것만 생각하고 일단 생성한 다음 의미를 부여한것 같다"* — **학생 자가 *과한 추상화 자가 인정* 모범**. PR #146·#107·#145·#31·#77 결.
|
|
111
|
+
|
|
112
|
+
#### 2.4. *"다른 사람들의 편의성 vs 자기 편의성"* — 메타 어휘
|
|
113
|
+
|
|
114
|
+
**MCP `oh-my-oop` 의 *유지보수자 시점 메타 어휘* 와 일치**. PR #107 (lee-ji-hoon *유지보수 관점 평가*) 결.
|
|
115
|
+
|
|
116
|
+
#### 2.5. *부생성자 / 팩터리 메서드 / 생성자 발견 순서*
|
|
117
|
+
|
|
118
|
+
- *기본 = 생성자 (가장 먼저 보임)*.
|
|
119
|
+
- *부생성자 = 생성자 옆 (자동 발견)*.
|
|
120
|
+
- *팩토리 메서드 = companion object 또는 외부 (생성자 막혀야 인식)*.
|
|
121
|
+
|
|
122
|
+
**MCP 룰 후보 — `factory-method-discoverability`** = *생성자 미차단 + 팩토리 메서드 = 발견 어려움*.
|
|
123
|
+
|
|
124
|
+
#### 2.6. *JVM Type erase 회피 시 팩토리 메서드 정공*
|
|
125
|
+
|
|
126
|
+
- *`Players(playerNames: List<String>)` + `Players(players: List<Player>)`* = JVM 시그니처 충돌.
|
|
127
|
+
- *팩토리 메서드* = *함수명 차이*로 회피.
|
|
128
|
+
|
|
129
|
+
### 3. `BlackjackGame 대리자 vs 현실 게임 객체` 자가 학습
|
|
130
|
+
|
|
131
|
+
말리빈: *"이 객체에게 계속 플레이어와 딜러를 넘기면서 게임을 진행해야하네요. 블랙잭 게임을 수행하는 객체라기 보다는, 귀찮은 일들을 대신 수행해주는 대리자의 느낌을 강하게 받았어요. 블랙잭 게임 객체가 현실세계를 모방한 역할을 가지게 만들어보는건 어떨까요?"*
|
|
132
|
+
|
|
133
|
+
학생: *"BlackjackGame 객체를 실제 게임이 진행되는 공간이라 생각하고 게임 진행이 해당 객체에서 진행되도록 해보겠습니다 😸"*
|
|
134
|
+
|
|
135
|
+
→ **`대리자` vs `자율 객체`** = *외부에서 *데이터 넘기며* 작업 시키는 객체 = 대리자 (수동) / 자기 데이터 + 자기 책임 수행 객체 = 자율*. **MCP 룰 후보 `proxy-object-anti-pattern`** = *데이터 외부 주입 + 행동 위탁 = 대리자 시그널*. PR #99·#107·#46·#43·#77 결.
|
|
136
|
+
|
|
137
|
+
### 4. `Controller god-object → 게임 객체 자율성`
|
|
138
|
+
|
|
139
|
+
말리빈: *"게임 객체에게 무언가를 하라고 일일이 지시하고 있네요! 게임 객체가 자율성을 가지도록 만들어 볼 수 있을까요? 게임 객체에게 게임 시작하라고 하면, 반환 값으로는 게임 결과를 받고, 그것을 출력만 할 수 있도록 구성해보는 건 어떨까요?"*
|
|
140
|
+
|
|
141
|
+
학생: *"아하 BlackJackGame의 역할을 잘 살렸다고 생각했었는데 말씀하신 것을 보고 생각해보았을 때 결국 controller에서는 게임의 시작과 결과만이 중요하다고 생각되고 나머지 로직은 도메인에서 내부적으로 처리하도록 하는것이 좋다고 생각이 드네요."*
|
|
142
|
+
|
|
143
|
+
→ **Controller god-object + Tell-Don't-Ask**. PR #99·#107·#43·#46·#77·#9 결.
|
|
144
|
+
|
|
145
|
+
### 5. `applyReceivedCard` 함수명 = 동작 추론 어려움
|
|
146
|
+
|
|
147
|
+
말리빈: *"applyReceivedCard메서드 명을 보고, 카드가 들어올 때 점수 계산을 수행하고 있다는 사실을 다른 개발자들도 한 번에 알 수 있을까요?"*
|
|
148
|
+
|
|
149
|
+
→ **함수명 = 부수 효과 명시**. PR #99·#39·#9 결.
|
|
150
|
+
|
|
151
|
+
### 6. `DealerResult` 외부 mutableMap 초기화 안티패턴
|
|
152
|
+
|
|
153
|
+
말리빈: *"객체를 만들고 외부에서 상태를 변화시키는 것 보다, 필요한 컬렉션을 생성자에서 받게끔 구성해보는 건 어떨까요? 현 형태는 DealerResult 객체 자체가 큰 의미를 가지지 못해보여요. 이 객체를 사용하는 쪽에서 mutableMapOf<GameResultType, Int>() 를 직접 생성해서 사용하는 것과 크게 다르지 않아 보이네요. 카운트를 세기 위함이라면, groupingBy, eachcount 등의 확장함수를 적극 활용해보시길 바라요 :)"*
|
|
154
|
+
|
|
155
|
+
→ **MCP 기존 룰 `empty-object-external-fill`** (lotto 변형). PR #145·#39 결.
|
|
156
|
+
|
|
157
|
+
### 7. `Card 인스턴스 재활용`
|
|
158
|
+
|
|
159
|
+
말리빈: *"카드를 생성하는 경우는 얼마나 될까요? 인스턴스를 재활용해볼 수 있을까요?"*
|
|
160
|
+
|
|
161
|
+
→ **불변 객체 + 재활용**. PR #74·#108·#133·#23·#26·#46·#77·#66 결.
|
|
162
|
+
|
|
163
|
+
### 8. `Denomination 10 상수 위치`
|
|
164
|
+
|
|
165
|
+
말리빈: *"이 값의 위치에 대해 더 고민해보는 건 어떨까요? 이 값이 정말로 필요한 객체는 어디였나요?"*
|
|
166
|
+
|
|
167
|
+
학생: *"처음 설계 시 Ace의 값이 1또는 11이 될 수 있어서 기본 값을 1로 두고 해당 상수를 암묵적으로 11이라 생각하여 Denomination에 위치시켰습니다. 말씀해주신 것을 보고 해당 값이 정말 Denomination에 어울리는가를 고민을 해보았을 때 해당 값(10)이 사실은 카드의 score를 의미한다기 보다는 카드 합계 계산 시 필요한 값의 의미가 더 강하다고 생각이 들었습니다. 그렇다면 해당 값이 있어야 할 곳은 cardSum을 계산하는 곳이라 생각이 드네요."*
|
|
168
|
+
|
|
169
|
+
→ **상수 위치 = 의미 응집**. **MCP 룰 후보 `constant-locus-meaning-cohesion`**. PR #16·#9·#11·#43·#137·#148 결.
|
|
170
|
+
|
|
171
|
+
### 9. `4장 21점 = 블랙잭?` 룰 정확성
|
|
172
|
+
|
|
173
|
+
말리빈: *"카드 4장의 점수의 합이 21이면 이것은 블랙잭인가요?"*
|
|
174
|
+
|
|
175
|
+
학생: *"카드 2장의 합이 21일때만 블랙잭이라고 하는군요,, 수정하겠습니다!"*
|
|
176
|
+
|
|
177
|
+
→ **블랙잭 룰 정확성 (2장 21점만 블랙잭)**. PR #26·#46·#16·#23·#66·#107 결.
|
|
178
|
+
|
|
179
|
+
### 10. `RandomCardProvider 파라미터` 인터페이스 활용 후 불필요
|
|
180
|
+
|
|
181
|
+
말리빈: *"이미 인터페이스로 랜덤 테스트를 구현할 수 있게끔 구성되어있으니, 파라미터로 카드 목록을 받지 않아도 좋아보이네요!"*
|
|
182
|
+
|
|
183
|
+
→ **DI 정공 + 추가 파라미터 불필요**. PR #74·#23·#95·#99·#26·#39·#46 결.
|
|
184
|
+
|
|
185
|
+
### 11. `HandCards` 테스트 부재 + 생성자 초기값
|
|
186
|
+
|
|
187
|
+
말리빈: *"HandCards에 대한 테스트가 없네요! 모든 도메인 로직에 대해 테스트 코드를 작성해주세요 :) 테스트를 진행할 때, 초기 카드를 addCard를 부르지 않고 생성자로 초기 값을 세팅할 수 있도록 구성해보는 건 어떨까요?"*
|
|
188
|
+
|
|
189
|
+
→ **TDD 요구사항 + 생성자 초기값**. PR #16·#33·#9·#145 결.
|
|
190
|
+
|
|
191
|
+
### 12. `Score 직접 꺼내기 vs 메시지`
|
|
192
|
+
|
|
193
|
+
말리빈: *"점수 계산을 수행할 때, 값을 직접 꺼내지 않고 객체에게 메시지를 던져보는 건 어떨까요?"*
|
|
194
|
+
|
|
195
|
+
→ **Tell-Don't-Ask**. PR #66·#43·#107·#46·#137·#148 결.
|
|
196
|
+
|
|
197
|
+
### 13. `에러 메시지 입력값 포함`
|
|
198
|
+
|
|
199
|
+
말리빈: *"에러메시지에 입력 값이 무엇이었는지도 표시해주는 건 어떨까요? 어떤 장점이 생길 수 있을까요?"*
|
|
200
|
+
|
|
201
|
+
→ **에러 메시지 입력값 명시**. PR #39·#46 결.
|
|
202
|
+
|
|
203
|
+
### 14. `companion object 함수 위치` 자가 인정
|
|
204
|
+
|
|
205
|
+
말리빈: *"이 함수는 생성자에서만 사용하는데, companion object 에 위치시킨 이유가 무엇이었나요 ?_?"*
|
|
206
|
+
|
|
207
|
+
학생: *"이전에 팩토리 메소드에서도 사용되었어서 동반객체에 위치시켰었는데 리팩토링 후에 신경을 쓰지 못했네요,,🥲🥲"*
|
|
208
|
+
|
|
209
|
+
→ **리팩토링 후 잔재 자가 인정**. PR #98·#145 결.
|
|
210
|
+
|
|
211
|
+
### 15. `BlackjackGameTest 하드코딩` 가독성
|
|
212
|
+
|
|
213
|
+
말리빈: *"테스트 코드를 보는 사람은 이곳에서 잠깐 멈출 것 같아요. 어떤 로직이 실행돼서 어떤 값이 할당이 되는지 머릿속으로 생각하기 위해서요. 읽다가 멈추는 것은 테스트 가독성을 낮추는 점이라 생각해요. 값을 하드코딩해서 넣어주는 건 어떨까요? 또, 생성자를 통해 필요한 초기 값을 넣어주는 방법에 대해서도 고민해보시면 좋겠어요 :)"*
|
|
214
|
+
|
|
215
|
+
→ **테스트 가독성 = 멈추지 않고 읽기**. **MCP 룰 후보 `test-readability-pause-anti-pattern`**.
|
|
216
|
+
|
|
217
|
+
### 16. `DenominationTest` 불필요 값 잔재
|
|
218
|
+
|
|
219
|
+
말리빈: *"이 값은 언제 사용하는 값인가요?"*
|
|
220
|
+
|
|
221
|
+
학생: *"앗,, Denomination을 리팩토링 하는 과정에서 테스트도 수정하였는데 해당 값도 없애야 했는데 신경쓰지 못했네요,,ㅜ 좀 더 집중해서 리팩토링 진행하겠습니다!!!"*
|
|
222
|
+
|
|
223
|
+
→ **리팩토링 후 잔재**. 위 §14 결.
|
|
224
|
+
|
|
225
|
+
## 리뷰어 의견 요지 (말리빈 / malibinYun)
|
|
226
|
+
|
|
227
|
+
18 코멘트 특징 (PR #23·#39·#46·#74·#95 와 동일 reviewer):
|
|
228
|
+
|
|
229
|
+
- **메타 질문 다중 (4 단계)** — model-view 참조 X 근본 이유 4 질문 시리즈 → 학생 자가 답변 모범 유도.
|
|
230
|
+
- **`"필요에 의해서 추가 및 수정함"` YAGNI 어휘** — 팩토리 메서드 양가성 토론에서 사용.
|
|
231
|
+
- **`팩토리 메서드 vs 부생성자` 매우 긴 토론** — 학생 자가 결정 변경 모범.
|
|
232
|
+
- **`?_?`, `:)`, `🥲` 친밀한 어조** — PR #95·#23·#46·#74·#39 와 일관.
|
|
233
|
+
- **메타 어휘 (`대리자`, `자율 객체`)** — *"귀찮은 일들을 대신 수행해주는 대리자의 느낌을 강하게 받았어요"* — **대리자 안티패턴 어휘**.
|
|
234
|
+
|
|
235
|
+
## 대표 인용
|
|
236
|
+
|
|
237
|
+
> *"감이 잘 오지 않네요😢😢😢 하루 정도 고민해보았는데 위에서 하신 질문에 대해서 감이 안잡히네요ㅜ"* — Yunseok-Nam (학생 자가 *학습 갭 + 시간 투자* 명시)
|
|
238
|
+
|
|
239
|
+
> *"근본적인 이유는 구성 요소간 결합도를 최소화 함으로써 유지보수성을 높이기 위함이라 생각합니다."* — Yunseok-Nam (model-view 참조 X 근본 이유 자가 학습)
|
|
240
|
+
|
|
241
|
+
> *"좋은 답변이네요!!! 👍 고민해보시면서 질문하신 부분들에 대해 조금은 자신만의 생각이 생겨나셨을까요 ?_?"* — malibinYun (학생 자가 학습 가시화 인정)
|
|
242
|
+
|
|
243
|
+
> *"질문에 대해서 고민하고 답을 작성하고 마지막에 해주신 말씀을 보면서 제가 코드를 작성할 때를 생각해보았을 때 팩토리메서드가 그저 좋다라는 것만 생각하고 일단 생성한 다음 의미를 부여한것 같다는 생각이 들었습니다. (...) 특히 위 질문을 보고 고민하면서 다른 사람들의 편의성을 생각하지 않고 저의 편의성을 우선했라는 생각이 많이 들었네요🥲🥲"* — Yunseok-Nam (학생 자가 *과한 추상화 인정* + *유지보수자 시점 메타*)
|
|
244
|
+
|
|
245
|
+
> *"제가 코드를 작성할 때 중요하게 생각하는 것 중에 하나는, '필요에 의해서 추가 및 수정함' 이에요."* — malibinYun (YAGNI 어휘)
|
|
246
|
+
|
|
247
|
+
> *"객체를 만들고 외부에서 상태를 변화시키는 것 보다, 필요한 컬렉션을 생성자에서 받게끔 구성해보는 건 어떨까요? 현 형태는 DealerResult 객체 자체가 큰 의미를 가지지 못해보여요."* — malibinYun (empty-object-external-fill 결)
|
|
248
|
+
|
|
249
|
+
## 얻은 교훈
|
|
250
|
+
|
|
251
|
+
1. **`팩토리 메서드 vs 부생성자` 양가성** — *팩토리 (의미 명명 + 여러 로직)* vs *부생성자 (기본 문법 + 발견 가능성)*. **MCP 룰 후보 `factory-method-discoverability`** = *생성자 미차단 + 팩토리 = 발견 어려움*.
|
|
252
|
+
|
|
253
|
+
2. **`"필요에 의해서 추가 및 수정"` (YAGNI 어휘)** — PR #146·#107·#145·#31·#77 결의 *말리빈 어휘 강화*.
|
|
254
|
+
|
|
255
|
+
3. **`학생 자가 과한 추상화 자가 인정`** — *"팩토리메서드가 그저 좋다라는 것만 생각하고 일단 생성한 다음 의미를 부여한것 같다"* = **MCP 룰 후보 `pattern-applied-without-need`**. PR #146·#39 (rhthrhrl0 *일급 컬렉션 과적용*) / PR #77 (*PointCalculator 분리*) / PR #145 (*Manager 폭증*) / PR #31 (*Builder 패턴 불필요*) 결.
|
|
256
|
+
|
|
257
|
+
4. **`대리자 (Proxy) vs 자율 객체` 메타 어휘** — *데이터 외부 주입 + 행동 위탁 = 대리자 시그널 / 자기 데이터 + 자기 책임 = 자율 객체*. **MCP 룰 후보 `proxy-object-anti-pattern`**. PR #99·#107·#46 결.
|
|
258
|
+
|
|
259
|
+
5. **`다른 사람들의 편의성 vs 자기 편의성` 유지보수자 시점** — PR #107 (lee-ji-hoon *유지보수 관점 평가*) 결.
|
|
260
|
+
|
|
261
|
+
6. **`model-view 참조 X 근본 이유 4 단계 메타 질문`** — *결합도 최소화 + 유지보수성 + 강한 참조 vs 주입 = 자가 학습*. PR #99·#107·#137 결.
|
|
262
|
+
|
|
263
|
+
7. **`Card.of(String)` View 입력 의존 안티패턴** — *생성자 enum 제약 + 문자열 변환 별도 책임 분리*. **MCP 룰 후보 `domain-object-string-input-leak`**. PR #66·#23·#26 결.
|
|
264
|
+
|
|
265
|
+
8. **`상수 위치 = 의미 응집`** — *Denomination 10 = 카드 score X / 카드 합계 계산 영역*. **MCP 룰 후보 `constant-locus-meaning-cohesion`**.
|
|
266
|
+
|
|
267
|
+
9. **`JVM Type erase = 팩토리 메서드 정공 시나리오`** — *`List<T>` 시그니처 충돌*. **MCP 룰 후보 `jvm-type-erase-factory-justification`**.
|
|
268
|
+
|
|
269
|
+
10. **`외부 mutableMap 초기화 + 외부 채우기 = empty-object-external-fill`** — *MCP 기존 룰 lotto 변형*. PR #145·#39 결.
|
|
270
|
+
|
|
271
|
+
11. **`테스트 가독성 = 멈추지 않고 읽기`** — *복잡 로직 = 머릿속 계산 강제 = 가독성 ↓*. **MCP 룰 후보 `test-readability-pause-anti-pattern`**.
|
|
272
|
+
|
|
273
|
+
12. **`학생 자가 *감 안 잡힘* 명시 + 시간 투자`** — *PR 본문 + 코멘트 응답에서 학습 갭 명시 모범*. PR #95·#107·#16 결.
|
|
274
|
+
|
|
275
|
+
13. **`reviewer 추가 가치 공유` 어휘** — *학생 자가 의문 → reviewer 추가 가치 공유*. *에러 메시지 = 같은 Exception 종류 구별 가능*. PR #91·#46·#107·#137 결.
|
|
276
|
+
|
|
277
|
+
14. **`PR 본문 자가 의문 3개` = 학습 가시화 모범** — PR #128·#135·#108·#136·#137·#148·#151·#98·#95·#99·#46·#77·#91·#107 결.
|
|
278
|
+
|
|
279
|
+
15. **`리팩토링 후 잔재` 자가 인정** — *companion object 함수 / Denomination 테스트 값* — *리팩토링 시 *놓친 잔재* 자가 인정*. PR #98 (chaehyuns *_cards.clear()*) / PR #145 결.
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# PR #86 — [블랙잭 2단계] 서기 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Yunseok-Nam](https://github.com/Yunseok-Nam)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/86
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 16 스레드 — *data class private constructor + copy() 우회 자가 인정 + 검증 로직 불필요 자가 학습 + HandCards 생성자 초기값 양가성*
|
|
8
|
+
- **양 단계 분석 reviewee** (1단계 #76 별도).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **`data class private constructor` 함정 자가 인정** — 말리빈: *"data class의 생성자에 private 를 붙여주셨네요. IDE에서 어떤 경고문이 나오고 있나요? 무엇을 경고하고 있나요?"* + 학생 자가 답변: *"주생성자를 막았더라도 data클래스를 선언하게 되면 자동으로 생긴 `copy()`메서드로 인해 주생성자를 막는게 의미가 없어지네요,, 심지어 굳이 data를 붙일 필요도없었고요,,😮💨😮💨 만약 생성자를 private으로 한 상황에서 data class의 기능이 필요한 경우 필요한 메서드만(hashCode,equals..etc) 명시적으로 오버라이딩하는 방법을 사용해야겠네요"*. **PR #46·#58 결의 `dataclass-private-constructor-copy-leak` 강화** + 학생 자가 *명시적 오버라이딩* 대안 자가 학습.
|
|
13
|
+
- **`검증 로직 불필요` 자가 학습** — 말리빈: *"이 검증 로직은 실제로 exception이 발생할 수 있는 로직일까요?"* + 학생: *"생각해보니 이미 파라미터로 Denomination, Suite를 넘겨주는 것 자체가 실제 있는 값을 넘겨 준다는 것이네요.. 만약 사용자가 카드를 직접 입력할 수 있도록 기능이 확장 될 경우 View단에서 유효성 검증을 하고 Denomination(혹은 Suite)를 반환해주는 것이 더 자연스러운 것 같네요,, 정리해보면 말리빈이 질문주신 것에 대한 답은 예외가 발생할 수 없는 로직이네요 위 검증 코드는.. 😢"*. **type system 신뢰 = 검증 불필요 자가 학습**. PR #66·#107·#23·#9·#16 의 *경계 입력 검증* 결의 *type 신뢰* 변형.
|
|
14
|
+
- **카드 캐싱 칭찬** — 말리빈: *"카드 인스턴스를 캐싱해주셨네요 👍"*. PR #74·#108·#133·#46·#77·#23·#26 결.
|
|
15
|
+
|
|
16
|
+
## 못한 점 (설계 관점)
|
|
17
|
+
|
|
18
|
+
### 1. `blackjackGame.start` 결과 반환
|
|
19
|
+
|
|
20
|
+
말리빈: *"blackjackGame.start의 결과물로 게임 결과가 반환되도록 구성해보는 건 어떨까요?"*
|
|
21
|
+
|
|
22
|
+
학생: *"딜러와 플레이어의 결과(2단계에서는 수익률)를 딜러와 플레이어가 가지고 있지 않고 결과 객체가 가지게 하고 게임 결과로 결과객체를 반환하도록 수정해봐야겠네요 💪"*
|
|
23
|
+
|
|
24
|
+
→ **Controller god-object → 결과 반환**. PR #95·#99·#43·#46·#77·#107·#145 결.
|
|
25
|
+
|
|
26
|
+
### 2. `Card.from(cardProvider)` vs `cardProvider.provide()` 양가성
|
|
27
|
+
|
|
28
|
+
말리빈: *"아래코드에서 카드를 한 장 가져오는데, cardProvider만 있어도 충분해보이는데 이렇게 구성하게 된 이유가 궁금해요 :)"*
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
val cardProvider: CardProvider = ~~
|
|
32
|
+
val card1 = cardProvider.provide()
|
|
33
|
+
val card2 = Card.from(cardProvider)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
학생 자가 정당화: *"만약 Card가 현재 프로덕션에서 사용하고 있는 RandomCardProvider가 아니라 다른 종류의 CardProvider를 사용하고 싶을 경우 `val cardProvider: CardProvider = RandomCardProvider`코드를 수정하기 보다 `from()`메서드의 파라미터를 통해 전략을 수정해주고 싶어서 위와 같이 작성하였습니다!"*
|
|
37
|
+
|
|
38
|
+
말리빈 반박:
|
|
39
|
+
|
|
40
|
+
```kotlin
|
|
41
|
+
var cardProvider: CardProvider = RandcomCardProvider()
|
|
42
|
+
val card1 = cardProvider.provide()
|
|
43
|
+
|
|
44
|
+
cardProvider = OtherCardProvider()
|
|
45
|
+
val card2 = cardProvider.provide()
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
*"아래 코드 처럼 cardProvider만을 가지고도 충분히, 원하는 'RandomCardProvider가 아니라 다른 종류의 CardProvider를 사용하고 싶을 경우' 를 지킬 수 있어보이네요!"*
|
|
49
|
+
|
|
50
|
+
→ **3 가지 학습**:
|
|
51
|
+
|
|
52
|
+
#### 2.1. *Card.from(provider) = 책임 누수*
|
|
53
|
+
|
|
54
|
+
- *Card 가 *provider 알기* = *Card 가 *생성 전략* 인지*.
|
|
55
|
+
- *학생 의도 = 전략 선택 가능성*. *현실 = `var cardProvider` 변경* 으로 충분.
|
|
56
|
+
|
|
57
|
+
#### 2.2. *Card 가 provider 의존 = 양방향 의존 위험*
|
|
58
|
+
|
|
59
|
+
- *학생: Card → CardProvider 의존*.
|
|
60
|
+
- *추가 의존성 = 결합도 증가*.
|
|
61
|
+
|
|
62
|
+
#### 2.3. *학생 자가 의도 명시 + reviewer 단순 대안 제시*
|
|
63
|
+
|
|
64
|
+
**MCP 룰 후보 `redundant-factory-with-strategy-parameter`** = *전략 객체 + 정적 팩토리 + 전략 인자 = 중복*.
|
|
65
|
+
|
|
66
|
+
### 3. `Dealer` 빈 객체 + add → 값 모음 + 한 번 + 불변
|
|
67
|
+
|
|
68
|
+
말리빈: *"빈 객체를 생성해서 값을 계속 add 하는 형태보다, 값을 모두 모았다가 객체를 생성할 때 한 번에 넣어주고, 해당 객체는 불변하게 변경해보는 건 어떨까요?"*
|
|
69
|
+
|
|
70
|
+
→ **MCP 기존 룰 `empty-object-external-fill`** 강화. PR #145·#39·#76 결.
|
|
71
|
+
|
|
72
|
+
### 4. `들여쓰기 규칙`
|
|
73
|
+
|
|
74
|
+
말리빈: *"들여쓰기 규칙은 꼭 지켜주세요!"*
|
|
75
|
+
|
|
76
|
+
→ **Kotlin 코딩 컨벤션 (ktlint)**. PR #77·#9·#82 결.
|
|
77
|
+
|
|
78
|
+
### 5. `companion object` 모든 메서드 위치 자가 학습
|
|
79
|
+
|
|
80
|
+
말리빈: *"companion object 내의 모든 메서드들은 모두 이곳에 위치해야하나요 ?_?"*
|
|
81
|
+
|
|
82
|
+
학생: *"`players()`는 부생성자에 쓰기 위해서 companion object내에 위치 시켜 주었고(코드를 작성할 때 해당 메서드를 동반객체 밖에 선언할 경우 컴파일에러가 발생했었습니당) `validatePlayers()`와 `findDuplicatedNames()`메서드 역시 `players()`에 사용되기 위해 companion object내에 위치 시켜주었습니다🔆🔆"*
|
|
83
|
+
|
|
84
|
+
→ **companion object 사용 기준** = *팩토리 메서드 + 내부 도우미 함수만*. *모든 메서드 위치 강제 X*. **MCP 룰 후보 `companion-object-method-locus`**.
|
|
85
|
+
|
|
86
|
+
### 6. `테스트용 카드 상수 활용`
|
|
87
|
+
|
|
88
|
+
말리빈: *"자주 사용하는 테스트용 카드는 상수로 만들어보는 건 어떨까요? 누가 봐도 이것은 하트2 카드구나! 라고 인식할 수 있을 정도로 이름을 지어서요!"*
|
|
89
|
+
|
|
90
|
+
→ **테스트 픽스처 상수 명명**. PR #99 (s6m1n *Test Fixture 품질*) / PR #91 (murjune *vararg*) / PR #46·#76 결.
|
|
91
|
+
|
|
92
|
+
### 7. `HandCards` 생성자 초기값 양가성 — 학생 자가 의문
|
|
93
|
+
|
|
94
|
+
말리빈: *"HandCards 의 생성자로 초기 값을 넣을 수 있게 재구성해보는 건 어떨까요?"*
|
|
95
|
+
|
|
96
|
+
학생 자가 정당화:
|
|
97
|
+
|
|
98
|
+
```kotlin
|
|
99
|
+
class HandCards {
|
|
100
|
+
private val _cards = mutableListOf<Card>()
|
|
101
|
+
val cards: List<Card>
|
|
102
|
+
get() = _cards.toList()
|
|
103
|
+
fun addCard(card: Card) {
|
|
104
|
+
_cards.add(card)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
*"현재 HandCards에서 생성자로 초기 값을 넣어주려면 주생성자에 cards가 들어가야 하고 그러기 위해서는 카드를 한장씩 add하는 것이 아니라 한번에 넘겨주야 하는데 게임 로직 상 한장씩 넘겨줄 수 밖에 없는 상황이 있는 것 같습니다,,ㅜ"*
|
|
110
|
+
|
|
111
|
+
말리빈 메타 질문: *"주생성자에 cards가 들어갈때, 이 cards는 반드시 멤버 변수로 동시에 선언되어야할까요?"*
|
|
112
|
+
|
|
113
|
+
→ **3 가지 학습**:
|
|
114
|
+
|
|
115
|
+
#### 7.1. *생성자 인자 ≠ 멤버 변수*
|
|
116
|
+
|
|
117
|
+
- *`class HandCards(cards: List<Card>)` (멤버 X)* — *생성 시 받지만 내부 mutable list 로 변환*.
|
|
118
|
+
- *`class HandCards(val cards: List<Card>)` (멤버 O)* — *외부 노출*.
|
|
119
|
+
|
|
120
|
+
#### 7.2. *학생 자가 잘못된 가정*
|
|
121
|
+
|
|
122
|
+
*"주생성자에 cards가 들어가면 자동으로 멤버"* 가정 = *Kotlin 어휘 미숙*.
|
|
123
|
+
|
|
124
|
+
#### 7.3. *PR #145 와 같은 결*
|
|
125
|
+
|
|
126
|
+
PR #145 (junseo511 *Hand initialCards 7 단계 토론*) / PR #76 (Yunseok-Nam 1단계 *HandCards 테스트*) 결.
|
|
127
|
+
|
|
128
|
+
### 8. `equal로 인스턴스 비교` 테스트
|
|
129
|
+
|
|
130
|
+
말리빈: *"equal로 실제 인스턴스가 같은지도 비교할 수 있을까요? of를 사용하지 않고, 생성자를 public으로 변경한 뒤에, 아래 코드를 실행시키면 테스트는 성공할까요?"*
|
|
131
|
+
|
|
132
|
+
학생: *"캐싱된 값을 비교하려했는데 그저 값만 비교했네요,, 참조 값이 같은지 테스트하도록 수정하겠습니다^_^"*
|
|
133
|
+
|
|
134
|
+
→ **참조 vs 값 비교 자가 학습**. *캐싱 검증 = `===` (참조 동일) vs `==` (값 동일)*. **Kotlin 어휘**. PR #46 (krrong *equals & hashcode*) 결.
|
|
135
|
+
|
|
136
|
+
### 9. `Dealer` Kotlin 컬렉션 체이닝 도전
|
|
137
|
+
|
|
138
|
+
말리빈: *"이 부분은 다양한 코틀린 컬렉션 확장함수들을 활용해서 메서드 체이닝을 이용해 구성해볼 수 있겠어요 :) 어렵겠지만 꼭 도전해보시면 좋겠어요!"*
|
|
139
|
+
|
|
140
|
+
→ **함수형 체이닝 어휘**. PR #39·#26·#13 결.
|
|
141
|
+
|
|
142
|
+
### 10. `Profit 인스턴스 2번 생성`
|
|
143
|
+
|
|
144
|
+
말리빈: *"dealerProfit, playerProfit을 만들 때 Profit의 인스턴스를 불필요하게 2번씩 생성하고있네요. 1번만 생성하도록 변경해보는 건 어떨까요?"*
|
|
145
|
+
|
|
146
|
+
→ **불필요 객체 생성**. PR #46·#95 결.
|
|
147
|
+
|
|
148
|
+
### 11. `GAME_MAX_SCORE` vs *구체적 21 의미*
|
|
149
|
+
|
|
150
|
+
말리빈: *"GAME_MAX_SCORE 보다는 저 구체적인 21 점수에 대한 의미를 변수명에 녹여보는 건 어떨까요? 21점수만은 특정 룰이라고 할 수 없지만, 그 특정 룰을 만들어내는 한가지의 중요한 요소이니까요!"*
|
|
151
|
+
|
|
152
|
+
→ **상수 명명 = 도메인 의미 응축**. PR #46·#76 결.
|
|
153
|
+
|
|
154
|
+
### 12. `GameResultType.BLACKJACK = Win 변형` 로직 표현
|
|
155
|
+
|
|
156
|
+
말리빈: *"블랙잭은 결국 Win과 다르지 않아보이네요. Blackjack은 로직으로써 표현해봐도 좋겠다는 생각이 드네요 :)"*
|
|
157
|
+
|
|
158
|
+
→ **enum 분기 = 로직 표현 vs 멤버 추가** 양가성. PR #99·#107 결.
|
|
159
|
+
|
|
160
|
+
### 13. `assertAll` 활용
|
|
161
|
+
|
|
162
|
+
말리빈: *"assertAll로 감싸는 것과 아닌 것은 어떤 점이 다를까요?"*
|
|
163
|
+
|
|
164
|
+
→ **assertAll = 모든 검증 실행 + 실패 시 모두 보고**. PR #23 (멘델 *assertAll 자가 학습*) 결.
|
|
165
|
+
|
|
166
|
+
### 14. `CsvSource` 활용
|
|
167
|
+
|
|
168
|
+
말리빈: *"CsvSource를 활용해보는 건 어떨까요?"*
|
|
169
|
+
|
|
170
|
+
→ **Parameterized Test 어휘**. PR #46·#91 결.
|
|
171
|
+
|
|
172
|
+
## 리뷰어 의견 요지 (말리빈 / malibinYun)
|
|
173
|
+
|
|
174
|
+
16 코멘트 특징 (PR #76 와 동일 reviewer):
|
|
175
|
+
|
|
176
|
+
- **메타 질문 어휘** — *"어떤 경고문이 나오고 있나요?"*, *"이렇게 구성하게 된 이유가 궁금해요"*, *"실제로 exception이 발생할 수 있는 로직일까요?"* — 학생 자가 답변 유도.
|
|
177
|
+
- **`?_?`, `😮💨`, `🔆`, `^_^` 친밀한 이모지** — PR #76 일관.
|
|
178
|
+
- **양방향 대안 코드 제시** — *Card.from(provider) vs var cardProvider 변경* 코드 직접 첨부.
|
|
179
|
+
- **PR #76 와 동일 분량/스타일**.
|
|
180
|
+
|
|
181
|
+
## 대표 인용
|
|
182
|
+
|
|
183
|
+
> *"주생성자를 막았더라도 data클래스를 선언하게 되면 자동으로 생긴 copy()메서드로 인해 주생성자를 막는게 의미가 없어지네요,, 심지어 굳이 data를 붙일 필요도없었고요,,😮💨😮💨"* — Yunseok-Nam (data class private constructor + copy() 우회 자가 인정)
|
|
184
|
+
|
|
185
|
+
> *"생각해보니 이미 파라미터로 Denomination, Suite를 넘겨주는 것 자체가 실제 있는 값을 넘겨 준다는 것이네요.. (...) 정리해보면 말리빈이 질문주신 것에 대한 답은 예외가 발생할 수 없는 로직이네요 위 검증 코드는.. 😢"* — Yunseok-Nam (type system 신뢰 자가 학습)
|
|
186
|
+
|
|
187
|
+
## 얻은 교훈
|
|
188
|
+
|
|
189
|
+
1. **`data class private constructor + copy() 우회`** 강화 — PR #46·#58·#76 결.
|
|
190
|
+
|
|
191
|
+
2. **`type system 신뢰 = 검증 불필요`** — *enum/sealed 등 type 으로 제약 + 추가 검증 = 중복*. **MCP 룰 후보 `redundant-validation-on-type-constraint`**.
|
|
192
|
+
|
|
193
|
+
3. **`redundant-factory-with-strategy-parameter`** — *Card.from(provider) = 정적 팩토리 + 전략 인자 = 중복*.
|
|
194
|
+
|
|
195
|
+
4. **`companion-object-method-locus`** — *팩토리 + 내부 도우미만 / 모든 메서드 강제 X*.
|
|
196
|
+
|
|
197
|
+
5. **`생성자 인자 ≠ 멤버 변수`** Kotlin 어휘 학생 자가 학습 갭. PR #145 결.
|
|
198
|
+
|
|
199
|
+
6. **`참조 vs 값 비교`** 테스트 (`===` vs `==`). PR #46 결.
|
|
200
|
+
|
|
201
|
+
7. **`상수 명명 = 도메인 의미 응축`** (GAME_MAX_SCORE → BLACKJACK_TARGET). PR #46·#76 결.
|
|
202
|
+
|
|
203
|
+
8. **`empty-object-external-fill`** Dealer 변형. PR #145·#39·#76 결.
|