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,216 @@
|
|
|
1
|
+
# PR #32 — [블랙잭 1단계] 크롱 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@krrong](https://github.com/krrong) — **이 학생이 PR #148·#151 의 reviewer** (크롱). 학생/리뷰어 메타 흥미 케이스.
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/32
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 29 스레드 — *Card 인스턴스 캐싱 + Referee → Dealer 통합 + 사이드 이펙트* 학습 풍부
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Card` 52개 인스턴스 미리 캐싱 + Card.all() 재활용 자가 학습** — 학생 자가 답변: *"이번 리뷰를 받고 `Card`클래스에 미리 52개의 카드 인스턴스를 만들어두고 재사용 할 수 있도록 수정했습니다. 이렇게 되면 기존에 있던 모양과 숫자를 랜덤으로 생성하는 클래스들은 필요 없어진다고 생각이 들어 삭제하였고, `CardDeck` 클래스에서 카드를 뽑을 때 랜덤으로 동작하도록 수정했습니다."* — *카드 = 52개 고정 + 뽑는 순서가 랜덤* 메타포 자가 인식. **PR #148 의 *크롱 리뷰어 본인이 학생 시절 같은 자가 학습 진행* — 메타 흥미 케이스!**
|
|
12
|
+
- **`Referee` → `Dealer` 통합 자가 학습** — 학생 자가 답변: *"딜러와 플레이어의 승패를 계산하고 저장하는 `Referee`클래스를 만들어 해당 로직들을 이동했습니다!"* + 추가 후속: *"사이드 이펙트를 발생시키지 않기 위해 Referee 클래스를 삭제하고 승자를 판단하는 로직을 다시 딜러에게 주었습니다! 딜러는 플레이어들의 리스트를 받아서 점수를 비교하고 최종 결과를 `Map<String, Consequence>`형태로 돌려주도록 하였습니다!"*. **Referee 도입 후 부수효과 진단 → 딜러 통합 후퇴 자가 학습 모범**. PR #74 (알송, 말리빈) 의 *Referee 자가 토론* / PR #58 (수달, 페로로) 의 *학생 Referee 추구* 와 같은 결.
|
|
13
|
+
- **사이드 이펙트 = Player 가변 vs 결과 반환 자가 학습** — 학생 자가 인용: *"이 메서드에서 발생시키는 사이드 이펙트는 Player 가 갖고 있는 승패에 대한 정보를 바꾸는 것을 의미하는 것으로 이해했는데 맞을까요?"* + 말리빈 인정 + 위키 링크. **사이드 이펙트 정의 자가 학습**. PR #85·#137·#148 와 같은 결.
|
|
14
|
+
- **`CardNumber.ACE.value = null` → ACE 1 기본 자가 학습** — 학생 자가 답변: *"이 부분에 대해서 페어와 많은 의견을 나누었습니다. 다른 카드와는 다르게 ACE카드는 1과 11로 사용이 가능하기 때문에 특정 값으로 고정 시키기보다 null로 만든 뒤에 점수를 계산하는 부분에서 상황에 맞게 처리하자는 결론이 나와 위와 같이 작성했습니다! ACE카드는 일반적으로 1로 사용하기 때문에 그에 맞게 수정했습니다!"* + 말리빈: *"`점수를 계산하는 부분에서 상황에 맞게 처리하자`는 의견은 동의해요 :) 하지만, CardNumber 내부 값이 null인지 아닌지 비교하기보다는, CardNumber 자체가 ACE인지 비교를 하면 된다고 생각해요"*. **`null` 우회 vs `is ACE` 명시 비교 자가 학습**.
|
|
15
|
+
- **`isSuccessAddCardToPlayer` 함수명 자가 학습** — 말리빈 진단 *"addCard를 했는데 반환은 Boolean이네요 :) C 스타일의 코드처럼 느껴졌습니다."* + 학생 자가 반영. *Boolean 반환 시 명시적 이름*. PR #124·#125·#114·#41 와 같은 결.
|
|
16
|
+
- **`Set<Card>` → `List<Card>` 자가 학습** — 말리빈 진단 *"이후에 카드 여러 벌을 가지고 게임을 할 수 있는 요구사항이 추가된다면, Set으로 구현했을 때 어떤 일이 발생할 수 있을까요?"* + 학생: *"블랙잭 도메인에 대한 지식이 부족해서 단순히 52장의 카드로만 진행하는 게임이라고 생각했습니다."* + List 변경. PR #58·#108 와 같은 결.
|
|
17
|
+
- **`CardBunch` 2장 검증 자가 후퇴** — 학생 자가 인용: *"굳이 필요한 생성 조건인가?라는 생각을 했습니다. `CardBunch`는 단순히 유저가 들고 있는 카드를 의미하는데 생성 당시 2장임을 검사할 필요가 있는가, 컨트롤러에서 2장에 맞게 나누어주면 되는 것이 아닌가 하는 생각에 생성 조건을 삭제하였습니다!"*. *YAGNI + 책임 분배 자가 인식*.
|
|
18
|
+
- **블랙잭 룰 정확성 자가 학습** — 말리빈 진단 *"딜러가 블랙잭일 때, 플레이어가 블랙잭이 아니면 모든 플레이어는 패배합니다. 블랙잭의 도메인에 대해 더 공부해서 반영해보세요"* + 학생 자가 반영 + *"총점이 21점을 넘으면 어떤 상태인지, 등등의 게임 용어들이 있었지요"* 후속 반영. PR #148·#108·#125·#114·#131·#136·#137·#151 와 같은 결.
|
|
19
|
+
- **Card private constructor + 캐싱 + all() 활용 자가 반영** — 학생 자가 답변: *"코멘트 해주신 부분을 생각해보니 외부에서 올바른 값만 넣어주면 인스턴스를 생성할 수 있었고, 생성자를 private으로 바꿔서 Card 객체 이외에서는 인스턴스를 생성하지 못하게 막았고 `all()`을 통해 캐싱된 카드들을 가져다 쓸 수 있도록 변경하였습니다!"*. PR #108·#133·#136·#137·#146·#74 와 같은 결.
|
|
20
|
+
- **`Effective Kotlin Item 4/14` 학생 자가 학습** — 말리빈 권고 *"Effective Kotlin 서적의 챕터를 참고해서 스스로 생각해본 것과 비교해보아요. Item 4 : Inferred Type으로 리턴하지 말라. Item 14 : 변수 타입이 명확하지 않은 경우 확실하게 지정하라"* — PR #108 (시아) 와 같은 결.
|
|
21
|
+
- **`.sum { }` + `.any { }` Kotlin 확장 함수 자가 학습** — 학생 자가 인용: *"확장함수를 사용하니까 가독성도 좋고 코드도 짧아지네요 :) 더 공부해보도록 하겠습니당🙃"*.
|
|
22
|
+
- **Test Fixture 자가 학습 + 한글 명명 결정** — *PR #67 (s6m1n) 의 `BeforeEach` setUp 한글 명명* 과 같은 결.
|
|
23
|
+
|
|
24
|
+
## 못한 점 (설계 관점)
|
|
25
|
+
|
|
26
|
+
### 1. `CardBunch.size` 로 중복 카드 비교 — `contains` Kotlin 어휘 누락
|
|
27
|
+
|
|
28
|
+
말리빈: *"중복 카드를 사이즈로 비교하는 게 매우 어색합니다. contains를 활용해보세요."*
|
|
29
|
+
|
|
30
|
+
→ **`set.size != list.size` 우회 vs `list.contains(card)` 명시**. *Kotlin 어휘 = contains*. PR #67·#88 와 같은 결.
|
|
31
|
+
|
|
32
|
+
### 2. `addCard` 가 Boolean 반환 = C 스타일
|
|
33
|
+
|
|
34
|
+
말리빈: *"addCard를 했는데 반환은 Boolean이네요 :) C 스타일의 코드처럼 느껴졌습니다. 다른 개발자들은 해당 Boolean 값이 어떤 의미를 가지고 있을 지 한 번에 알아볼 수 있을까요?"*
|
|
35
|
+
|
|
36
|
+
학생: *"Boolean값이 어떤 의미를 가지고 있을지 한 번에 알아볼 수 있도록 함수명을 `isSuccessAddCardToPlayer`으로 변경하였습니다!"*
|
|
37
|
+
|
|
38
|
+
→ **Boolean 반환 = is/has 접두사 + 의미 명시**. PR #124·#125·#114·#41 와 같은 결.
|
|
39
|
+
|
|
40
|
+
### 3. `CardNumber 출력 메서드` View 의존
|
|
41
|
+
|
|
42
|
+
말리빈: *"해당 메서드는 View에서만 사용하네요 :) 도메인과 뷰의 로직을 분리해주세요."*
|
|
43
|
+
|
|
44
|
+
→ **enum 출력 메서드 = View 책임 누수**. PR #124·#28·#78·#112·#125·#128·#135·#137·#75 와 같은 결.
|
|
45
|
+
|
|
46
|
+
### 4. `overCondition` 함수명 모호
|
|
47
|
+
|
|
48
|
+
말리빈: *"overCondition이란 말은 어떤 의미를 가지고있을까요? 다른 개발자들도 한 번에 알아볼 수 있을까요?"*
|
|
49
|
+
|
|
50
|
+
학생: *"조금 더 직관적으로 알아볼 수 있게 `canGetCard`로 바꾸었는데 괜찮은 것인지 잘 모르겠네요,, 함수의 네이밍이 정말 어려운 것 같습니다..😢"*
|
|
51
|
+
|
|
52
|
+
→ **`overCondition` = 모호 vs `canGetCard` = 직관**. *`canDraw()` / `canHit()` Kotlin 어휘*. PR #75·#151·#41 와 같은 결.
|
|
53
|
+
|
|
54
|
+
### 5. `Player.calculateWinning` 사이드 이펙트 = Player 가변 변경
|
|
55
|
+
|
|
56
|
+
말리빈: *"이 역할은 정말 이 객체의 역할일 지 고민해보세요 :) 또, 사이드이팩트를 발생시키는 메서드의 작성은 최대한 지양해보세요."*
|
|
57
|
+
|
|
58
|
+
학생: *"딜러와 플레이어의 승패를 계산하고 저장하는 `Referee`클래스를 만들어 해당 로직들을 이동했습니다! 그리고 이 메서드에서 발생시키는 사이드 이펙트는 Player 가 갖고 있는 승패에 대한 정보를 바꾸는 것을 의미하는 것으로 이해했는데 맞을까요?"*
|
|
59
|
+
|
|
60
|
+
말리빈: *"네 :) 사이드 이팩트에 대한 정의는 [이 링크](https://en.wikipedia.org/wiki/Side_effect_(computer_science))를 참고해보세요!"*
|
|
61
|
+
|
|
62
|
+
→ **사이드 이펙트 = 함수가 외부 상태 변경 + 반환값 외 효과**. *순수 함수 (입력 → 출력)* 가 *예측 가능성*. *학생 자가 학습 모범*. PR #85·#137·#148 와 같은 결.
|
|
63
|
+
|
|
64
|
+
### 6. `CardDeck` 랜덤 위치 학생 자가 토론
|
|
65
|
+
|
|
66
|
+
말리빈 진단: *"shape와 card를 랜덤으로 생성할 필요가 있을까요? 해당 객체를 랜덤으로 생성했기에 필요하지 않은 로직들이 생겨나진 않았을까요? 정말로 랜덤이 필요한 곳은 어디일까요?"*
|
|
67
|
+
|
|
68
|
+
학생 자가 답변 깊음 (700+자): *"이 부분은 열심히 고민해봤는데 마땅한 방법이 떠오르지 않습니다..😢 ... 나름의 고민의 결과로 CardDeck 자체가 아래 프로퍼티를 갖게 하는 방법을 생각했습니다. ... 하지만 이렇게 구현하게 되면 랜덤을 사용하기 때문에 단위 테스트가 불가능하다고 생각됩니다. 접근 방법이 잘못된 것일까요?"*
|
|
69
|
+
|
|
70
|
+
말리빈 답변: *"지금은 카드를 뽑을 때 새로운 카드를 생성하는 형태이지요! 여러 벌의 카드를 사용할 때에 대해 생각해보면 좋겠어요 :) 또, 덱의 52장의 카드가 모두 떨어지면 이후 어떻게 해야할 지도 생각해보면 좋겠어요 🙂. 위 모두, 모양과 숫자가 동일한 카드를 재사용할 수 있다는 특징이 있지요. 한 번만 만들어두고 여러 번 재사용할 수 있게 만들어보셨으면 좋겠어요 :). 로또 번호도 45개를 만들어두고 재사용했었지요! **현실 세계에서 카드를 뽑으면, 카드의 요소가 랜덤 처럼 보이지만, 사실은 뽑는 카드의 순서가 랜덤이지요** 이런 생각으로 정말로 랜덤이 필요한 곳은 어디인지에 대해 질문을 드렸어요"*
|
|
71
|
+
|
|
72
|
+
→ **랜덤 = 카드 자체 X, 뽑는 순서가 랜덤**. *카드 52장 고정 + 뽑는 순서가 랜덤* 메타포. *학생 자가 학습 + 자가 적용 (Card.all() 캐싱 + CardDeck.drawCard 랜덤) 모범*. **현실 메타포 핵심 인용**. PR #146·#108·#133·#136 와 같은 결.
|
|
73
|
+
|
|
74
|
+
### 7. `CardDeck.drawCard 52장 모두 사용 후` 처리 부재
|
|
75
|
+
|
|
76
|
+
학생 자가 인용: *"또 말씀해주신 여러 벌의 카드를 사용할 때는 `Card`클래스에 있는 값을 여러번 가져오도록 확장할 수 있고, 52장의 카드가 모두 떨어진 경우 역시 다시 카드를 가져올 수 있도록 확장할 수 있을 것 같다고 생각이 들었습니다. (현재는 `IllegalArgumentException`를 반환하도록 만들어둔 상태입니다)"*
|
|
77
|
+
|
|
78
|
+
→ **카드 부족 시나리오 = `IllegalArgumentException` vs 무한 게임 메타포 트레이드오프**. PR #108·#133·#136·#41·#53·#74 와 같은 결.
|
|
79
|
+
|
|
80
|
+
### 8. `Referee` 사이드 이펙트 → 삭제 + 딜러 통합
|
|
81
|
+
|
|
82
|
+
말리빈: *"사이드 이팩트를 발생시키는 것 보다, 게임 결과를 반환하게 만들어보는 것은 어떨까요?"* + 후속: *"디미터의 법칙을 참고해서, 딜러와 플레이어의 점수를 가져오는 것을 변경해보는 것은 어떨까요?"*
|
|
83
|
+
|
|
84
|
+
학생 자가 반영: *"딜러와 플레이어의 점수를 가져오기 위해 객체에 메시지를 넘기는 방법으로 수정했습니다. 또, 사이드 이펙트를 발생시키지 않기 위해 Referee 클래스를 삭제하고 승자를 판단하는 로직을 다시 딜러에게 주었습니다!"*
|
|
85
|
+
|
|
86
|
+
→ **Referee 사이드 이펙트 + Demeter 위반 → Dealer 통합**. *현실 메타포 (Referee 분리) 시도 후 트레이드오프 후퇴 자가 학습*. PR #74·#58·#147 와 같은 결.
|
|
87
|
+
|
|
88
|
+
### 9. `Card 의 init require` = 의미 없는 검증 (자가 인식)
|
|
89
|
+
|
|
90
|
+
말리빈: *"이 로직은 정말로 의미 있는 검증일까요?"*
|
|
91
|
+
|
|
92
|
+
학생: *"캐싱된 카드를 가져오기 때문에 필요 없을 것이라고 생각했었는데 혹시라도 다른 값을 넣어 Card 객체를 만들지 못하도록 작성했었는데 의미 없는 코드인 것 같아 삭제했습니다!"*
|
|
93
|
+
|
|
94
|
+
→ **불필요한 방어 = 데드 코드**. *외부 호출 흐름 검증* 후 *불필요 시 삭제*. PR #88·#103·#147 와 같은 결.
|
|
95
|
+
|
|
96
|
+
### 10. `ACE 보너스 체크 1번만` 자가 학습
|
|
97
|
+
|
|
98
|
+
말리빈: *"ACE가 4장 있더라도, ACE의 점수 체크는 1번만 하면 됩니다. (카드 목록에 ACE의 유무 검사) 애초에 ACE가 2장이면, 22점이 아닌, 12점이기 때문이에요. 물론 2점으로도 사용할 수 있겠지요. 그 점을 고려해서 로직을 작성해볼까요? 😀"*
|
|
99
|
+
|
|
100
|
+
학생: *"ACE의 값은 1로 고정하여 계산하도록 수정했습니다! 그리고 ACE를 가지고 있다면 10을 더해줘도 21을 넘지 않는지 확인하고 넘지 않으면 10을 더해주도록 수정했습니다!"*
|
|
101
|
+
|
|
102
|
+
→ **Ace 보너스 +10 단일 적용 (PR #128·#114·#125·#108·#131·#132·#41·#49 와 같은 결의 정공 패턴)**.
|
|
103
|
+
|
|
104
|
+
### 11. `Dealer.canGetCard <= 15` vs `>= 17` 불일치 (콘솔 출력 vs 코드)
|
|
105
|
+
|
|
106
|
+
말리빈: *"딜러의 점수가 15이하 일 때만 카드를 받을 수 있네요 :) 콘솔엔 17이상 이라는 출력을 하고 있는데, 코드에서 사용하는 상수가 다르면 이후 디버깅할 때 어려울 것이 예상됩니다"*
|
|
107
|
+
|
|
108
|
+
학생: *"17로 수정했습니다 :)"*
|
|
109
|
+
|
|
110
|
+
→ **상수 vs 출력 메시지 일치성**. *디버깅 비용*. PR #131·#137 와 같은 결.
|
|
111
|
+
|
|
112
|
+
### 12. `Consequence (승/패/무) 문자열` = View 의존
|
|
113
|
+
|
|
114
|
+
말리빈: *"승 패 무 라는 문자열들은 도메인 영역 일지 고민해볼까요? 다른 비슷한 enum class가 또 있는 지 찾아볼까요?"*
|
|
115
|
+
|
|
116
|
+
학생 자가 답변: *"CardNumber는 \"총 합계계산\" 이라는 도메인 로직에서 사용하기 때문에 필요하지만 Consequence, Shape 은 단순히 출력만을 위해 값을 가지고 있던 것 같습니다. 생각하지 못한 부분을 짚어주셔서 감사합니다🙃"*
|
|
117
|
+
|
|
118
|
+
→ **enum UI value 안티패턴 (PR #75·#124·#28·#78·#112·#125·#128·#135·#137 와 같은 결)**.
|
|
119
|
+
|
|
120
|
+
### 13. `Dealer 의 if-else 다중 분기` → when + 게임 용어
|
|
121
|
+
|
|
122
|
+
말리빈: *"총점이 21점을 넘으면 어떤 상태인지, 등등의 게임 용어들이 있었지요 :) 해당 용어를 도메인 로직에 녹여내보는 것은 어떨까요? 세 번째 줄의 조건은 정말로 `블랙잭` 의 조건이 맞을까요? 또, if문이 많을 때는 when절을 활용해보세요"*
|
|
123
|
+
|
|
124
|
+
→ **`Bust` / `Blackjack` 도메인 어휘 활용 + when 패턴 매칭**. PR #137·#148·#136 와 같은 결.
|
|
125
|
+
|
|
126
|
+
### 14. `askGetCard + isSuccessAddCardToPlayer` 메서드 분리 — 학생 자가 학습
|
|
127
|
+
|
|
128
|
+
학생 자가 인용: *"이 부분에 대해서 많이 고민해봤는데,, 카드를 추가할 수 있는지 여부는 위의 함수인 `askGetCard`에서 while문 내부에서 확인을 하고, `isSuccessAddCardToPlayer` 함수는 플레이어에게 카드를 받을지 물어보고 받는다면 카드를 주가하는, 그리고 카드를 추가하는데 성공하면 true를, 실패했다면 false를 반환하도록 하는 일을 하는데요, 이 전체 과정이 하나의 일이라고 볼 수는 없는 것인지 궁금합니다..🙃"*
|
|
129
|
+
|
|
130
|
+
말리빈 답변: *"음! 말씀 대로 추가할 수 있는 지에 대한 여부는 player.canGetCard()로 묻고 있네요. 이 부분은 제가 잘못 말씀드렸어요 😥. 저는 플레이어가 카드를 받았는데, 그것에 대한 성공을 꼭 Boolean으로써 반환 해야 하는 지 의문이 들어요. 사실 InputView.getDecision(player)의 결과를 반환하는 것과 크게 다르지 않은 로직이라 생각합니다. 또, askGetCard 메서드를 봤을 때 수행하는 로직을 예측하기가 어렵다는 느낌을 많이 받았어요. **플레이어가 카드를 받을 수 있을 때 까지 반복문을 돌리고, 플레이어가 카드를 추가하는 데 성공했는데!... 갑자기 연재 종료된 웹툰이 된 느낌이랄까요?** 🤔"*
|
|
131
|
+
|
|
132
|
+
→ **메서드 의도 모호 = 연재 종료된 웹툰 비유**. *호출자가 다음 동작 예측 불가 = 책임 분배 실패 신호*. 학생 + 말리빈 양방향 토론 모범.
|
|
133
|
+
|
|
134
|
+
### 15. `RefereeTest` 명세 추상화 부족 — 자가 학습
|
|
135
|
+
|
|
136
|
+
말리빈: *"합계 수치만 가지고는 게임의 룰을 정확하게 알기는 어려워보여요. `플레이어보다 딜러가 점수가 높으면 딜러가 승리한다` 같은 이름은 어떨까요?"*
|
|
137
|
+
|
|
138
|
+
→ **테스트 함수명 = 룰 표현**. PR #137·#90·#136·#88 와 같은 결.
|
|
139
|
+
|
|
140
|
+
## 리뷰어 의견 요지
|
|
141
|
+
|
|
142
|
+
- **Boolean 반환 함수명 = is/has + 의미 명시** ("C 스타일 코드 느낌").
|
|
143
|
+
- **카드 = 52개 고정 + 뽑는 순서가 랜덤** (현실 메타포 핵심).
|
|
144
|
+
- **사이드 이펙트 = 외부 상태 변경 = 예측 불가 = 지양**.
|
|
145
|
+
- **Set vs List = 도메인 변경 (여러 벌) 대비**.
|
|
146
|
+
- **`Card.init require` = 외부 호출 검증 후 불필요 시 삭제**.
|
|
147
|
+
- **`overCondition` 모호 → `canGetCard` 직관**.
|
|
148
|
+
- **`Consequence` UI value = 도메인 누수**.
|
|
149
|
+
- **블랙잭 도메인 어휘 + when 활용**.
|
|
150
|
+
- **메서드 의도 명시 = "연재 종료된 웹툰 X" 비유**.
|
|
151
|
+
- **테스트 = 룰 표현 + 추상화**.
|
|
152
|
+
- **Card private constructor + 캐싱 + all() 활용 정공**.
|
|
153
|
+
- **ACE 보너스 = 카드 목록 ACE 유무 검사 + 단일 +10**.
|
|
154
|
+
- **상수 vs 출력 메시지 일치성 (디버깅 비용)**.
|
|
155
|
+
|
|
156
|
+
## 대표 인용
|
|
157
|
+
|
|
158
|
+
**말리빈 (현실 메타포 = 카드 자체 X, 뽑는 순서가 랜덤, CardDeck.kt):**
|
|
159
|
+
> 현실 세계에서 카드를 뽑으면, 카드의 요소가 랜덤 처럼 보이지만, 사실은 뽑는 카드의 순서가 랜덤이지요
|
|
160
|
+
> 이런 생각으로 정말로 랜덤이 필요한 곳은 어디인지에 대해 질문을 드렸어요 🙂
|
|
161
|
+
> 크롱은 어떻게 생각하시나요?
|
|
162
|
+
|
|
163
|
+
**말리빈 (메서드 의도 = 연재 종료된 웹툰 비유, Controller.kt:52):**
|
|
164
|
+
> 또, askGetCard 메서드를 봤을 때 수행하는 로직을 예측하기가 어렵다는 느낌을 많이 받았어요.
|
|
165
|
+
> 플레이어가 카드를 받을 수 있을 때 까지 반복문을 돌리고, 플레이어가 카드를 추가하는 데 성공했는데!... 갑자기 연재 종료된 웹툰이 된 느낌이랄까요? 🤔
|
|
166
|
+
|
|
167
|
+
**말리빈 (사이드 이펙트 정의 + 위키 링크, Player.kt):**
|
|
168
|
+
> 사이드 이팩트에 대한 정의는 [이 링크](https://en.wikipedia.org/wiki/Side_effect_(computer_science))를 참고해보세요!
|
|
169
|
+
|
|
170
|
+
**말리빈 (CardNumber ACE 비교 = is ACE, CardNumber.kt):**
|
|
171
|
+
> `점수를 계산하는 부분에서 상황에 맞게 처리하자`는 의견은 동의해요 :)
|
|
172
|
+
> 하지만, CardNumber 내부 값이 null인지 아닌지 비교하기보다는, CardNumber 자체가 ACE인지 비교를 하면 된다고 생각해요 🙂
|
|
173
|
+
|
|
174
|
+
**학생 자가 학습 (Card 52개 캐싱 + 뽑는 순서 랜덤, CardDeck.kt):**
|
|
175
|
+
> 이번 리뷰를 받고 `Card`클래스에 미리 52개의 카드 인스턴스를 만들어두고 재사용 할 수 있도록 수정했습니다. 이렇게 되면 기존에 있던 모양과 숫자를 랜덤으로 생성하는 클래스들은 필요 없어진다고 생각이 들어 삭제하였고, `CardDeck` 클래스에서 카드를 뽑을 때 랜덤으로 동작하도록 수정했습니다.
|
|
176
|
+
|
|
177
|
+
**학생 자가 학습 (사이드 이펙트 자가 정의, Player.kt):**
|
|
178
|
+
> 이 메서드에서 발생시키는 사이드 이펙트는 Player 가 갖고 있는 승패에 대한 정보를 바꾸는 것을 의미하는 것으로 이해했는데 맞을까요?
|
|
179
|
+
|
|
180
|
+
**학생 자가 학습 (Referee 자가 삭제 + Dealer 통합, Referee.kt):**
|
|
181
|
+
> 사이드 이펙트를 발생시키지 않기 위해 Referee 클래스를 삭제하고 승자를 판단하는 로직을 다시 딜러에게 주었습니다! 딜러는 플레이어들의 리스트를 받아서 점수를 비교하고 최종 결과를 `Map<String, Consequence>`형태로 돌려주도록 하였습니다!
|
|
182
|
+
|
|
183
|
+
**학생 자가 학습 (Consequence/Shape UI value 인식, Consequence.kt):**
|
|
184
|
+
> CardNumber는 "총 합계계산" 이라는 도메인 로직에서 사용하기 때문에 필요하지만 Consequence, Shape 은 단순히 출력만을 위해 값을 가지고 있던 것 같습니다. 생각하지 못한 부분을 짚어주셔서 감사합니다🙃
|
|
185
|
+
|
|
186
|
+
## 얻은 교훈
|
|
187
|
+
|
|
188
|
+
1. ***카드 = 52개 고정 + 뽑는 순서가 랜덤*** = *현실 메타포 핵심*. *Card.all() 캐싱 + CardDeck 랜덤 추출*. **MCP 룰 후보 — `random-on-card-vs-order`** (현실 메타포). PR #146·#108·#133·#136·#74 와 같은 결.
|
|
189
|
+
|
|
190
|
+
2. ***사이드 이펙트 = 외부 상태 변경 + 반환값 외 효과 = 예측 불가 = 지양***. *Player 가변 변경 → 결과 반환 패턴*. PR #85·#137·#148 와 같은 결.
|
|
191
|
+
|
|
192
|
+
3. ***Referee 도입 → 사이드 이펙트 + Demeter 위반 → Dealer 통합 후퇴***. *현실 메타포 vs 도메인 정합 자가 학습 모범*. PR #74·#58·#147 와 같은 결.
|
|
193
|
+
|
|
194
|
+
4. ***메서드 의도 = "연재 종료된 웹툰 X" 비유*** — 말리빈 명료 비유. *메서드 이름과 다른 책임 흡수 = 호출자 예측 실패*.
|
|
195
|
+
|
|
196
|
+
5. ***`addCard` Boolean 반환 = C 스타일 = 의미 모호*** → *is/has 접두사 + 명시적 이름*. PR #124·#125·#114·#41 와 같은 결.
|
|
197
|
+
|
|
198
|
+
6. ***`CardNumber.ACE` 비교 = `is ACE` 명시 > `value == null` 우회***. *enum 멤버 자체 비교*가 *Kotlin 어휘 정공*.
|
|
199
|
+
|
|
200
|
+
7. ***Set vs List = 도메인 변경 (여러 벌) 대비***. *Set = 중복 차단 + 1벌 가정*. *List = 중복 가능 + N벌 가능성*. PR #67·#88·#90 와 같은 결.
|
|
201
|
+
|
|
202
|
+
8. ***Card private constructor + all() 활용 = 외부 인스턴스 생성 차단***. PR #108·#133·#136·#137·#146·#74 와 같은 결.
|
|
203
|
+
|
|
204
|
+
9. ***Ace 보너스 = ACE 유무 검사 + 단일 +10 (Ace 4장도 +10 한 번만)***. PR #128·#114·#125·#108·#131·#132·#41·#49 와 같은 결.
|
|
205
|
+
|
|
206
|
+
10. ***상수 vs 출력 메시지 일치성 = 디버깅 비용***. *Dealer.16 코드 vs 17이상 메시지* 불일치 자가 반영. PR #131·#137 와 같은 결.
|
|
207
|
+
|
|
208
|
+
11. ***Consequence (승/패/무) UI value = 도메인 누수***. *학생 자가 인식 모범*. PR #75·#124·#28·#78 와 같은 결.
|
|
209
|
+
|
|
210
|
+
12. ***학생 krrong (이 PR 작성자) = PR #148·#151 의 reviewer 본인 = 메타 학습 케이스***. *학생 시절의 자가 학습이 reviewer 메타 질문 (역할 vs 상태 자가 학습, 반란군 비유) 으로 후속 누적*. *학습 곡선 메타 분석 가치*.
|
|
211
|
+
|
|
212
|
+
13. ***`overCondition` 모호 → `canGetCard` 직관***. *Kotlin Boolean 어휘 = `canDraw()` / `canHit()`*. PR #75·#151·#41 와 같은 결.
|
|
213
|
+
|
|
214
|
+
14. ***Effective Kotlin Item 4/14 자가 학습 (Inferred Type 반환 + 명확한 변수 타입)*** — PR #108·#137 와 같은 결.
|
|
215
|
+
|
|
216
|
+
15. ***학생 자가 답변 깊이 + 자가 토론 풍부 + reviewer 답변 흡수 = 학습 가시화***. *Referee 자가 토론 + 사이드 이펙트 자가 정의 + CardDeck 랜덤 위치 자가 학습 + ACE null 자가 토론*. PR #146·#148·#151·#137·#41·#74 와 같은 결.
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# PR #46 — [블랙잭 2단계] 크롱 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@krrong](https://github.com/krrong)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/46
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** @malibinYun (말리빈)
|
|
7
|
+
- **라인 코멘트:** 29 스레드 — *학생 자가 학습 + 양방향 메타 토론 풍부 + *반영커밋* URL 첨부 패턴 모범*
|
|
8
|
+
- **양 단계 분석 reviewee** (1단계 #32 별도). **메타 학습 케이스: krrong = 학생 (#32, #46) + reviewer (#148, #151)** 동시 등장.
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **모든 학생 답변에 *반영커밋 URL 첨부* 패턴** — 학생이 14회 코멘트 답변 중 11회에 *`[반영커밋](커밋URL)`* 명시 = *reviewer 가 *어떤 커밋이 어떤 권고를 반영*한 것인지 즉시 확인 가능*. **학습 가시화 매개체 모범** — PR #99 (s6m1n *PR URL 자가 참조*) / PR #128·#135·#108·#136 와 같은 결의 *학생 자가 학습 가시화 강화*.
|
|
13
|
+
- **양방향 메타 토론 (Dealer → Player vs Dealer → Participant)** — 학생 자가 반박: *"리뷰를 보고 리팩토링 하기 전에 딜러가 player보다 Participant를 알게 해서 얻을 수 있는 이점이 무엇이 있을까 고민해봤습니다. (...) 하지만 그렇게 해서 얻는 이점도 있지만 잃게 되는 것들도 있다고 생각이 듭니다. (...) 때문에 플레이어를 알고 있을 때의 이점이 더 크다고 생각됩니다. 하지만 리뷰어님이 코멘트를 달아주신 이유가 있을 것이라고 생각되는데 혹시 여쭤봐도 괜찮을까요? 🙃"* + 말리빈 매우 긴 답변. **양방향 토론 모범** — PR #137·#151·#133·#146·#147 와 같은 결.
|
|
14
|
+
- **Kotlin 어휘 자가 학습 풍부** — *`operator times` 오버로딩 자가 적용* / *`equals` & `hashCode` Alt+Insert 자가 단축키 학습* / *`return if ~` 표현식* / *`infix` 함수 자가 적용* / *`1_000` underscore 어휘* / *`object` (상태 없는 calculator)* / *backing property 자가 적용*. **Kotlin 어휘 자가 학습 모범** — PR #137·#148·#90·#146 의 *Kotlin 어휘 학습* 결.
|
|
15
|
+
- **Card 캐싱 + `equals` 오버라이드 자가 학습** — 학생 자가 답변: *"저도 그 부분을 고민하고 있어서 일반 class로 변경하고 equals를 오버라이드 하는 방식으로 수정하였습니다!"*. *data class private constructor + Factory 함정 자가 진단 + class + equals 자가 정공* — PR #133·#136·#74 의 *Card private constructor + Factory* 결.
|
|
16
|
+
- **Parameterized Test 자가 토론 + 콘솔 가독성 자가 의문** — 학생 자가 적용 + 자가 의문: *"이렇게 작성하고 테스트 코드를 실행했을 때 실행결과가 아래와 같이 나오기 때문에 가독성과 직관성이 떨어진다고 느껴지는데 리뷰어님은 어떻게 생각하시는지 여쭤보고 싶습니다! 🙃"* + 스크린샷 첨부 + 말리빈 답변: *"저는 사실 콘솔에 테스트 통과에 대해서는 잘 신경쓰지 않아요. 가끔은 성공한 것은 보이지도 않게 필터를 걸기도 합니다. 중요한 건 실패한 테스트라고 생각해요. (...) 어차피 콘솔에 어떻게 찍히든, 테스트 코드를 봐야 이해가 쉽기도 해요. 설명서의 역할이니까요 :)"*. **양방향 토론 + 스크린샷 증거 + reviewer 의 *테스트 명세서 어휘***. PR #99·#26 의 *테스트 명세서* 결.
|
|
17
|
+
- **backing property + 외부 참조 누수 자가 학습** — 말리빈 도전: *"`mutableList.clear()` 어떤 일이 발생할 수 있을까요?"* + 학생: *"해당 코드를 실행시키면 카드덱이 가지고 있는 카드들도 삭제가 되는 것을 확인했습니다! backing property를 활용해서 CardDeck이 생성될 때 인자로 받은 리스트를 기반으로 다시 생성하여 가지도록 수정했습니다! 추가로 같은 일이 CardBunch에서도 발생하는 것으로 보여서 해당 코드도 수정하였습니다!"*. **외부 참조 누수 자가 진단 + 동일 패턴 다른 위치 자가 검사**. PR #74·#108·#132·#133·#85·#58·#137·#148 의 *방어적 복사* 결.
|
|
18
|
+
|
|
19
|
+
## 못한 점 (설계 관점)
|
|
20
|
+
|
|
21
|
+
### 1. `BettingMoney * Int` 메서드 폭증 → `operator times` 오버로딩
|
|
22
|
+
|
|
23
|
+
말리빈 진단: *"1~10000개의 곱셈이 생긴다면 1만 개의 메서드가 생겨야할까요? BettingMoney를 불변 객체로 만들어주셨으니, BettingMoney자체를 곱셈할 수 있게, multiply operator를 오버로딩 해보는 것을 도전해보세요 :)"*
|
|
24
|
+
|
|
25
|
+
학생: *"`operator fun times(d: Double)` 을 사용해서 multiply operator를 오버로딩 해보았습니다!"*
|
|
26
|
+
|
|
27
|
+
→ **3 가지 학습**:
|
|
28
|
+
|
|
29
|
+
#### 1.1. *극단 사례 메타 어휘 — "1만 개"*
|
|
30
|
+
|
|
31
|
+
말리빈의 *"1~10000개의 곱셈이 생긴다면 1만 개의 메서드가 생겨야할까요?"* — **극단 사례 (reductio ad absurdum) 메타 어휘** = *현재 코드의 *한 사례 (× 2, × 3)* 가 *변경 요청 시 N 회 반복* 됨을 학생에게 자가 명시*. **MCP `oh-my-oop` 의 *변경 시 비용* 어휘**.
|
|
32
|
+
|
|
33
|
+
#### 1.2. *Kotlin operator overloading 어휘*
|
|
34
|
+
|
|
35
|
+
- *`operator fun times(d: Double): BettingMoney`* → *`BettingMoney(1000) * 4`* 표기.
|
|
36
|
+
- *Java/일반 OO 어휘*: `multiply(int)` 메서드.
|
|
37
|
+
- *Kotlin 의 *연산자 오버로딩* 어휘 = 도메인 객체에 *수학 연산* 명시*.
|
|
38
|
+
|
|
39
|
+
#### 1.3. *불변 객체 + 새 객체 반환 정공*
|
|
40
|
+
|
|
41
|
+
- *`times` 가 *새 BettingMoney 반환* = 불변성 유지.
|
|
42
|
+
- *호출 측: `val newMoney = oldMoney * 2`*.
|
|
43
|
+
|
|
44
|
+
### 2. `data class private primary constructor` 함정
|
|
45
|
+
|
|
46
|
+
말리빈 진단: *"data class의 private primary constructor는 컴파일러가 경고하듯, 의미가 없습니다. class로 변경해보는 것은 어떨까요?"*
|
|
47
|
+
|
|
48
|
+
학생: *"저도 그 부분을 고민하고 있어서 일반 class로 변경하고 equals를 오버라이드 하는 방식으로 수정하였습니다!"*
|
|
49
|
+
|
|
50
|
+
→ **2 가지 함정 진단**:
|
|
51
|
+
|
|
52
|
+
#### 2.1. *data class private constructor 함정*
|
|
53
|
+
|
|
54
|
+
- *data class*: `equals`/`hashCode`/`toString`/`copy` 자동 생성.
|
|
55
|
+
- *그러나 `copy()` = primary constructor 호출* — *primary 가 private 라도 `data.copy()` 는 외부에서 호출 가능 = private 우회*.
|
|
56
|
+
- *컴파일러 경고*: *"Non-private primary constructor is exposed via the generated 'copy()' method of a 'data' class. The 'copy' will be made non-public in the future releases."*
|
|
57
|
+
- **PR #58 (otter66) 의 *data class + private constructor copy 우회 함정* 결**. **MCP 룰 후보 — `dataclass-private-constructor-copy-leak`**.
|
|
58
|
+
|
|
59
|
+
#### 2.2. *학생 자가 사전 진단 + 자가 정공 채택*
|
|
60
|
+
|
|
61
|
+
학생의 *"저도 그 부분을 고민하고 있어서"* — **학생이 reviewer 권고 이전에 자가 인식**. *그러나 자가 결정 못해 일단 코드 작성 → reviewer 권고로 확정* 패턴. **학습 가시화 + 자가 결정 모범**.
|
|
62
|
+
|
|
63
|
+
### 3. `Dealer 가 Player vs Participant` — 양방향 매우 긴 토론
|
|
64
|
+
|
|
65
|
+
말리빈: *"딜러가 Player를 알기 보다, Participant를 알게 해보는 것은 어떨까요?"*
|
|
66
|
+
|
|
67
|
+
학생 자가 반박 (3 단계 토론):
|
|
68
|
+
|
|
69
|
+
> *"리뷰를 보고 리팩토링 하기 전에 딜러가 player보다 Participant를 알게 해서 얻을 수 있는 이점이 무엇이 있을까 고민해봤습니다. 제 생각은 나중에 어떤 클래스가 될지 모르지만 Participant를 구현한 다른 클래스가 오더라도(확장) 문제 없이 동작하기 위함이라고 생각됩니다."*
|
|
70
|
+
>
|
|
71
|
+
> *"하지만 그렇게 해서 얻는 이점도 있지만 잃게 되는 것들도 있다고 생각이 듭니다. 예를 들면 Calculator에서는 플레이어가 가지고 있는 베팅 금액과 승/패 여부를 가지고 받는 배당금을 계산하는 로직이 있는데요, 딜러가 Participant를 알도록 하면 플레이어만이 가지면 되는 배팅금액을 인터페이스까지 끌어올려야 하고, 자연스럽게 배팅금액을 가지고 있지 않아도 되는 딜러까지 배팅금액을 가지게 된다고 생각합니다."*
|
|
72
|
+
>
|
|
73
|
+
> *"때문에 플레이어를 알고 있을 때의 이점이 더 크다고 생각됩니다. 하지만 리뷰어님이 코멘트를 달아주신 이유가 있을 것이라고 생각되는데 혹시 여쭤봐도 괜찮을까요? 🙃"*
|
|
74
|
+
|
|
75
|
+
말리빈 매우 긴 답변:
|
|
76
|
+
|
|
77
|
+
> *"크롱이 말씀해주신 것 처럼, 확장의 이점도 있고, 의존 관계에 대한 이점도 가져올 수 있다고 생각했어요 :) 플레이어나 딜러는 Participant 의 하위 클래스인데, 딜러가 Player 대신 Participant를 알게 되면 하위 구현체끼리의 의존 관계를 잘라낼 수 있어 이점이 있다고 생각했어요 🙂*
|
|
78
|
+
>
|
|
79
|
+
> *제가 조금 이해가 어려운 것은, [학생 반박 인용] 이 부분인데요, 위 내용은 Calculator가 Participant를 알게 되면 갖게 되는 문제로 보입니다.*
|
|
80
|
+
>
|
|
81
|
+
> *Calculator는 이미 Dealer와는 영향이 전혀 없이, Player와 Consequence만을 가지고 금액을 결정하게 되는데요, getPlayerConsequence 이 메서드에서는 Participant에서 갖고 있는 메서들로만 Consequence를 계산해내고 있어 보여요. 이곳에서 Player의 베팅금액을 참조하고 있었다면 이야기가 달라지겠지요 🙂 그렇기에 배팅 금액을 Participant interface까지 끌어올려야 하지 않아도 된다고 생각이 듭니다.*
|
|
82
|
+
>
|
|
83
|
+
> *제가 크롱의 의도를 잘못 파악했을까요 ?_? 제가 이해하지 못한 내용이 있을 수 있으니, 곰곰이 생각해보시고 다시 이야기 나누어요 😊 슬랙 DM도 좋고, 코멘트도 좋습니다~"*
|
|
84
|
+
|
|
85
|
+
→ **5 가지 메타 학습**:
|
|
86
|
+
|
|
87
|
+
#### 3.1. *학생 자가 *3 단계 토론*: 자가 분석 + 자가 반박 + reviewer 의도 질문*
|
|
88
|
+
|
|
89
|
+
1. *자가 분석*: *"이점이 무엇일까 고민"*.
|
|
90
|
+
2. *자가 반박*: *"잃게 되는 것들도 있다"*.
|
|
91
|
+
3. *reviewer 의도 질문*: *"리뷰어님이 코멘트를 달아주신 이유가 있을 것이라고 생각되는데 혹시 여쭤봐도 괜찮을까요?"*.
|
|
92
|
+
|
|
93
|
+
**3 단계 학생 자가 토론 모범** — PR #137·#151·#133·#146 결.
|
|
94
|
+
|
|
95
|
+
#### 3.2. *Dealer → Player 의존 vs Dealer → Participant 의존*
|
|
96
|
+
|
|
97
|
+
- *Dealer → Player* (학생 코드) = *형제 구현체 간 직접 의존*. *Dealer 와 Player 가 같은 부모 (Participant) 를 가짐에도 형제끼리 의존*.
|
|
98
|
+
- *Dealer → Participant* (말리빈) = *Dealer 는 *추상 부모만 알면 충분***. *Player 는 Dealer 와 무관 + Dealer 는 *Participant 메시지만 사용*. **DIP (Dependency Inversion Principle)**.
|
|
99
|
+
|
|
100
|
+
PR #95 (송핑크 *Dealer extends Player?*) / PR #23 (멘델 *점수 책임 위치 3 후보*) / PR #148·#151·#49·#132 의 *참가자 vs 참가자 일반화* 결.
|
|
101
|
+
|
|
102
|
+
#### 3.3. *Calculator 가 Player 의존 vs Participant 의존*
|
|
103
|
+
|
|
104
|
+
말리빈의 *"위 내용은 Calculator가 Participant를 알게 되면 갖게 되는 문제로 보입니다"* — *학생의 반박이 *다른 의존* (Calculator → Participant) 의 문제 였음 자가 진단*. **reviewer 가 *학생 의도를 다시 명확화* 모범**.
|
|
105
|
+
|
|
106
|
+
#### 3.4. *reviewer 자가 의도 의문 — "제가 크롱의 의도를 잘못 파악했을까요 ?_?"*
|
|
107
|
+
|
|
108
|
+
말리빈의 *"제가 크롱의 의도를 잘못 파악했을까요 ?_? 제가 이해하지 못한 내용이 있을 수 있으니, 곰곰이 생각해보시고 다시 이야기 나누어요"* — **reviewer 자가 한계 인정 + 양방향 토론 권유**. PR #95 (말리빈 *"옳고 그름 없고 장단점만"*) / PR #137 (지훈 *어휘 혼란 자가 인정*) 결.
|
|
109
|
+
|
|
110
|
+
#### 3.5. *PR 코멘트 외부 채널 권유 (Slack DM)*
|
|
111
|
+
|
|
112
|
+
말리빈의 *"슬랙 DM도 좋고, 코멘트도 좋습니다~"* — **PR 외부 채널 권유 = 깊은 토론 가능성 인정**. PR #99 (KwonDae *DM 권유*) 결.
|
|
113
|
+
|
|
114
|
+
### 4. `BettingMoney 곱셈 → BettingMoney 반환 vs Int` 자가 토론
|
|
115
|
+
|
|
116
|
+
말리빈: *"곱셈을 수행하면, BettingMoney가 반환되도록 도전해보세요 :)"*
|
|
117
|
+
|
|
118
|
+
학생 자가 반박: *"저도 해당 부분을 BettingMoney가 반환되도록 하려고 했었습니다! 하지만 BettingMoney에는 0이하의 값이 들어갈 수 없도록 만들어두었기 때문에 이익을 계산할 수 없다고 판단해서 위와 같이 작성했었습니다. 최종 수익을 계산해서 반환하던, 게임의 결과로 받는 배당금을 반환하던 0 혹은 음수의 값이 들어갈 수 밖에 없다고 생각이 됩니다. 리뷰어님은 어떻게 생각하시나요?!"*
|
|
119
|
+
|
|
120
|
+
말리빈: *"BettingMoney에는 음수가 들어가서는 안되니, 수익률은 BettingMoney로 취급하지 않겠다는 의미겠지요! 그렇담, minusFrom은 없어도 괜찮겠다고 생각해요. 수익률을 계산하는 곳에서 BettingMoney의 value를 꺼내는 것도 괜찮다고 생각해요 :)"*
|
|
121
|
+
|
|
122
|
+
→ **2 가지 학습**:
|
|
123
|
+
|
|
124
|
+
#### 4.1. *불변 객체 invariant + 산술 연산 결과 타입*
|
|
125
|
+
|
|
126
|
+
- *`BettingMoney` invariant: ≥ 1* (베팅은 양수).
|
|
127
|
+
- *수익률 = *음수 가능* (손실)*.
|
|
128
|
+
- *동일 타입 (BettingMoney) 으로 표현 시* = *invariant 위반 위험 + 의미 누수*.
|
|
129
|
+
- **수익률 ≠ 베팅 머니** — *별도 타입 (예: `Profit`) 또는 *원시 Int 사용*.
|
|
130
|
+
|
|
131
|
+
#### 4.2. *학생 자가 의문 + reviewer 답변 후 *trade-off 인정***
|
|
132
|
+
|
|
133
|
+
말리빈의 *"수익률을 계산하는 곳에서 BettingMoney의 value를 꺼내는 것도 괜찮다고 생각해요"* — *value 노출 (Tell-Don't-Ask 위반) 도 *맥락에 따라 OK***. PR #95 (말리빈 *"옳고 그름 없고 장단점만"*) 결.
|
|
134
|
+
|
|
135
|
+
PR #133·#88·#132·#136·#93 의 *3 변수 제약 부산물 인공 객체* / PR #131 (moondev03 *`-0.0` Double IEEE 754 함정 우회*) 결의 *값 객체 invariant + 산술*.
|
|
136
|
+
|
|
137
|
+
### 5. `52장 vs 53번 뽑기 = 도메인 룰 (덱 리필)`
|
|
138
|
+
|
|
139
|
+
말리빈: *"블랙잭 게임을 하다보면 덱을 다시 채워야할 수도 있고, 한 게임은 여러 벌의 카드로 진행을 하는 요구사항이 생길 수도 있어요. 정말 53번 뽑으면 오류가 발생해야할까요?"*
|
|
140
|
+
|
|
141
|
+
학생: *"하나의 덱으로 게임을 한다는 것은 52장의 카드로 게임을 진행한다고 것이고 카드가 52장만 있을 때 53번을 뽑았을 때 오류가 발생하는지(== 덱에 카드가 하나도 없을 때 뽑으면 오류가 발생) 확인하려고 했었습니다!"*
|
|
142
|
+
|
|
143
|
+
말리빈 후속: *"52장을 다 사용햇더라도 게임을 진행할 수 있게 프로그램을 만들어보길 도전해보시면 좋겠네요! 😊"*
|
|
144
|
+
|
|
145
|
+
→ **카지노 6덱 메타포 + 덱 리필**. PR #58 (otter66 *카지노 6덱 메타포*) / PR #74·#108·#133·#136·#41 의 *카드 부족 시 게임 종료 UX* / PR #23·#26 의 *카드덱 자료구조* 결.
|
|
146
|
+
|
|
147
|
+
### 6. `cardDeck.drawCard()` 두 번 호출 → 한 메서드 2장 반환
|
|
148
|
+
|
|
149
|
+
말리빈: *"cardDeck.drawCard()를 두 번 호출하고 있네요 :) 한 메서드가 2장을 반환하게 만들어보는 것은 어떨까요?"*
|
|
150
|
+
|
|
151
|
+
말리빈 별도 권고: *"이후 3, 4, ... 100장을 가져오는 기능이 생긴다면 100개의 메서드를 작성해야합니다. `drawCards(...) : List<Card>` 재활용가능하게 만들어보는 것은 어떨까요?"*
|
|
152
|
+
|
|
153
|
+
→ **N 회 호출 < 가변 인자 메서드**:
|
|
154
|
+
- *`drawCard()` × 2* (호출자 책임) < *`drawCards(2)`* (도메인 책임).
|
|
155
|
+
- *학생 자가 답변*: *"컨트롤러에 필요 하지 않은 코드였던 것 같아요!"* = *Controller god-object 자가 인정*.
|
|
156
|
+
|
|
157
|
+
PR #99 (s6m1n *Controller god-object*) / PR #43 (chws0508 *BlackJack.runGame*) 결.
|
|
158
|
+
|
|
159
|
+
### 7. `Calculator` 상태 없음 → `object`
|
|
160
|
+
|
|
161
|
+
말리빈: *"calculator가 내부에 상태를 지니지 않으니, object로 만들어도 좋겠어요 :)"*
|
|
162
|
+
|
|
163
|
+
→ **Kotlin `object` 어휘 = 싱글톤** + *상태 없는 헬퍼*.
|
|
164
|
+
|
|
165
|
+
- *`class Calculator`* + *상태 없음* = *매번 인스턴스 생성 비용 + 의미 없음*.
|
|
166
|
+
- *`object Calculator`* = *단일 인스턴스 + 함수형 호출 (`Calculator.calculate(...)`)*.
|
|
167
|
+
|
|
168
|
+
PR #70 (chaehyuns 1단계 *ShuffleCardMachine + CardMachineManager = object 자가 학습*) 결.
|
|
169
|
+
|
|
170
|
+
### 8. `initialCards` 멤버 필요?
|
|
171
|
+
|
|
172
|
+
말리빈: *"initialCards는 멤버일 필요가 있을까요?"*
|
|
173
|
+
|
|
174
|
+
→ **메서드 지역 변수 vs 클래스 멤버 변수**:
|
|
175
|
+
- *멤버 변수 = 객체 생애 동안 유지 + 외부 노출 가능성*.
|
|
176
|
+
- *지역 변수 = 메서드 호출 동안만 + 캡슐화*.
|
|
177
|
+
- *`initialCards` 가 생성자에서만 사용 + 이후 미사용* = *지역 변수 / `init { ... }` 블록 정공*.
|
|
178
|
+
|
|
179
|
+
**MCP 룰 후보 — `unnecessary-member-variable`** = *멤버 변수 = 필요한 경우만*.
|
|
180
|
+
|
|
181
|
+
### 9. `카드들의총합가져오기` 메서드명 — 라면 비유
|
|
182
|
+
|
|
183
|
+
말리빈: *"`카드들의총합가져오기` 보다는, `총점가져오기` 같은 이름 짓기는 어떨까요? 아래 이름을 비교해보아요 :) `냄비에물을500미리붓고100도씨까지온도를올린뒤스프를뿌리고면을넣고3분을기다리기` vs `라면끓이기`"*
|
|
184
|
+
|
|
185
|
+
→ **추상화 수준 일치 + 의도 명시**:
|
|
186
|
+
- *긴 절차 명 = 구현 상세 노출 + 변경 시 명명도 변경*.
|
|
187
|
+
- *짧은 의도 명 = 행동 추상화 + 호출자 친화*.
|
|
188
|
+
- **MCP 룰 후보 — `procedural-method-name`** = *구현 상세 명명 vs 의도 명명*.
|
|
189
|
+
|
|
190
|
+
PR #146 (yrsel) / PR #99·#26 의 *명명 의문* 결.
|
|
191
|
+
|
|
192
|
+
### 10. `에러 메시지에 입력값 포함` (PR #39 결)
|
|
193
|
+
|
|
194
|
+
말리빈: *"Exception에 어떤 문제였는 지 에러 메시지를 담아보는 것은 어떨까요?"*
|
|
195
|
+
|
|
196
|
+
말리빈 별도: *"어떤 에러 메시지가 나왔는지도 검증해볼까요? 🙂"*
|
|
197
|
+
|
|
198
|
+
말리빈 또 별도: *"어떤 에러 메시지가 나타났는지도 검증해보세요 :)"*
|
|
199
|
+
|
|
200
|
+
→ **에러 메시지 = *입력값 + 사용자 친화도 + 디버깅 친화도***. PR #39 (rhthrhrl0) 결.
|
|
201
|
+
|
|
202
|
+
### 11. `숫자 1_000 underscore` Kotlin 어휘
|
|
203
|
+
|
|
204
|
+
말리빈: *"숫자를 나타낼 때에는 `1_000` 이렇게도 나타낼 수 있답니다! 숫자가 `100000`만 되어도 읽기가 어려워서, `100_000` 라고 나타내주면 쉽게 읽을 수 있어요 :)"*
|
|
205
|
+
|
|
206
|
+
→ **Kotlin literal underscore**. 가독성 명시 + 도메인 단위 (천/만) 시각화.
|
|
207
|
+
|
|
208
|
+
### 12. `테스트 = 2장 들어있음 < 예상 카드 들어있음`
|
|
209
|
+
|
|
210
|
+
말리빈: *"2장이 들어있음만을 검증하기 보다는, 실제로 예상한 카드가 들어있는 지 검증해보세요 :)"*
|
|
211
|
+
|
|
212
|
+
→ **테스트 품질 = 결정적 + 검증 가능한 최소**. PR #23·#26·#39 의 *갯수만 검증 무의미* 결.
|
|
213
|
+
|
|
214
|
+
### 13. `21점` ≠ `블랙잭` — 블랙잭 룰 정확성
|
|
215
|
+
|
|
216
|
+
말리빈: *"21점이어야만 이 테스트 상황이 만들어지는 것은 아닙니다. `블랙잭`과 `총합21점`은 서로 다르다는 점을 유의해주세요 :)"*
|
|
217
|
+
|
|
218
|
+
→ **블랙잭 룰 정확성** = *2장 21점 (BlackJack) ≠ 3장 이상 21점 (Twenty-One)*. PR #26 (잭슨 *BlackJack 21점 > 3장 이상 21점*) 결. **MCP 룰 후보 `blackjack-rule-fidelity`**.
|
|
219
|
+
|
|
220
|
+
### 14. `52장 다 사용 후 게임 진행` — 도전 권유
|
|
221
|
+
|
|
222
|
+
말리빈 머지 시점: *"52장을 다 사용햇더라도 게임을 진행할 수 있게 프로그램을 만들어보길 도전해보시면 좋겠네요! 😊"*
|
|
223
|
+
|
|
224
|
+
→ **도전 권유 = 학습 시드**. PR #98·#99·#95 의 *재구현 권유* 결.
|
|
225
|
+
|
|
226
|
+
## 리뷰어 의견 요지 (말리빈 / malibinYun)
|
|
227
|
+
|
|
228
|
+
29 코멘트 특징 (PR #23·#39·#74·#95 와 동일 reviewer):
|
|
229
|
+
|
|
230
|
+
- **메타 질문 + 극단 사례** — *"1만 개의 메서드가 생겨야할까요?"* (BettingMoney), *"100개의 메서드를 작성해야합니다"* (drawCards) — **극단 사례 (reductio ad absurdum) 메타 어휘**. PR #23·#39 결.
|
|
231
|
+
- **양방향 토론 + 자가 한계 인정** — *"제가 크롱의 의도를 잘못 파악했을까요 ?_?"* — **reviewer 자가 한계 인정**. PR #95·#137·#147·#151 결.
|
|
232
|
+
- **외부 채널 권유 (Slack DM)** — *"슬랙 DM도 좋고, 코멘트도 좋습니다~"*. PR #99 (KwonDae) 결.
|
|
233
|
+
- **라면 비유** — *"`냄비에물을500미리붓고...` vs `라면끓이기`"* — **추상화 수준 시각화 메타 어휘**. PR #151 (크롱 *반란군 비유*) / PR #146 (두루 *YAGNI 비유*) 결.
|
|
234
|
+
- **suggestion 블록 없음** — PR #26·#39·#43 의 *suggestion 첨부* 와 차이.
|
|
235
|
+
- **머지 시점 도전 권유** — *"52장을 다 사용햇더라도 게임을 진행할 수 있게 프로그램을 만들어보길 도전해보시면 좋겠네요!"*. PR #98·#99·#95 결.
|
|
236
|
+
|
|
237
|
+
## 학생/Reviewer 메타 학습 케이스 — krrong
|
|
238
|
+
|
|
239
|
+
**krrong = 학생 (#32 1단계, #46 2단계) + reviewer (#148 etama 2단계, #151 jerry 2단계)** 동시 등장.
|
|
240
|
+
|
|
241
|
+
PR #46 학생 시기 (2023년 3월): *학생 자가 학습 + 양방향 토론 + 반영커밋 URL 첨부 + 3 단계 자가 토론*.
|
|
242
|
+
|
|
243
|
+
PR #148·#151 reviewer 시기 (2024년 3월, 약 1년 후): *역할 vs 상태 자가 학습 + 참가자 vs 참가자 일반화 + 반란군 비유 + 학생 자가 토론 권유 + 머지 시점 학습 진화 인정*.
|
|
244
|
+
|
|
245
|
+
→ **1 년 학생 → reviewer 진화 케이스**. *학생 시기의 학습 패턴 (자가 토론 + 양방향 + 반영커밋 URL)* 이 *reviewer 시기에 *학생에게 같은 패턴 권유* 로 진화*. **MCP `oh-my-oop` 의 *학습 = 시간 두고 반복* 어휘와 일치**. PR #95·#98·#99 의 *재구현 권유* 결.
|
|
246
|
+
|
|
247
|
+
## 대표 인용
|
|
248
|
+
|
|
249
|
+
> *"하지만 그렇게 해서 얻는 이점도 있지만 잃게 되는 것들도 있다고 생각이 듭니다. (...) 때문에 플레이어를 알고 있을 때의 이점이 더 크다고 생각됩니다. 하지만 리뷰어님이 코멘트를 달아주신 이유가 있을 것이라고 생각되는데 혹시 여쭤봐도 괜찮을까요? 🙃"* — krrong (3 단계 학생 자가 토론 모범)
|
|
250
|
+
|
|
251
|
+
> *"제가 크롱의 의도를 잘못 파악했을까요 ?_? 제가 이해하지 못한 내용이 있을 수 있으니, 곰곰이 생각해보시고 다시 이야기 나누어요 😊 슬랙 DM도 좋고, 코멘트도 좋습니다~"* — malibinYun (reviewer 자가 한계 인정 + 양방향 토론 권유)
|
|
252
|
+
|
|
253
|
+
> *"`냄비에물을500미리붓고100도씨까지온도를올린뒤스프를뿌리고면을넣고3분을기다리기` vs `라면끓이기`"* — malibinYun (추상화 수준 라면 비유)
|
|
254
|
+
|
|
255
|
+
> *"이렇게 작성하고 테스트 코드를 실행했을 때 실행결과가 아래와 같이 나오기 때문에 가독성과 직관성이 떨어진다고 느껴지는데 리뷰어님은 어떻게 생각하시는지 여쭤보고 싶습니다! 🙃"* — krrong (Parameterized Test 자가 의문 + 스크린샷 첨부)
|
|
256
|
+
|
|
257
|
+
> *"저는 사실 콘솔에 테스트 통과에 대해서는 잘 신경쓰지 않아요. 가끔은 성공한 것은 보이지도 않게 필터를 걸기도 합니다. 중요한 건 실패한 테스트라고 생각해요."* — malibinYun (테스트 명세서 어휘)
|
|
258
|
+
|
|
259
|
+
> *"저도 해당 부분을 BettingMoney가 반환되도록 하려고 했었습니다! 하지만 BettingMoney에는 0이하의 값이 들어갈 수 없도록 만들어두었기 때문에 이익을 계산할 수 없다고 판단해서 위와 같이 작성했었습니다. (...) 리뷰어님은 어떻게 생각하시나요?!"* — krrong (불변 객체 invariant + 산술 연산 자가 의문)
|
|
260
|
+
|
|
261
|
+
## 얻은 교훈
|
|
262
|
+
|
|
263
|
+
1. **`extends 자식 → Player` vs `extends 자식 → Participant` 의존 방향** — *형제 구현체 의존 < 추상 부모 의존 (DIP)*. *Dealer → Player = 형제 직접 의존* / *Dealer → Participant = 추상 의존 + 형제 의존 차단*. PR #95·#23·#148·#151·#49·#132 결.
|
|
264
|
+
|
|
265
|
+
2. **`data class private constructor + copy() 우회 함정`** — *컴파일러 경고 명시 + `copy()` 가 primary constructor 우회*. PR #58 (otter66 *data class + private constructor copy 우회*) / PR #74·#108·#133·#136 의 *Card private constructor + Factory* 결. **MCP 룰 후보 `dataclass-private-constructor-copy-leak`**.
|
|
266
|
+
|
|
267
|
+
3. **`operator overloading` Kotlin 어휘 = *수학 연산 도메인 명시*** — *`BettingMoney * 4`* / *`Score > 21`* / *`State.compareTo`* — *도메인 객체에 수학/비교 연산 = Kotlin 어휘*. PR #93·#136·#152·#39 결.
|
|
268
|
+
|
|
269
|
+
4. **`불변 객체 invariant + 산술 연산 결과 타입`** — *`BettingMoney ≥ 1` invariant + 수익률 (음수 가능) → 별도 타입 (Profit) 또는 원시 Int*. **MCP 룰 후보 `value-object-arithmetic-invariant-leak`**.
|
|
270
|
+
|
|
271
|
+
5. **3 단계 학생 자가 토론** — *자가 분석 + 자가 반박 + reviewer 의도 질문*. **학생 자가 학습 가시화 모범**. PR #137·#151·#133·#146·#23 결.
|
|
272
|
+
|
|
273
|
+
6. **reviewer 자가 한계 인정 + 양방향 토론** — *"제가 의도를 잘못 파악했을까요?"* — *reviewer 가 *학생 의도* 를 *잘못 해석 가능성* 명시*. PR #95·#147·#137·#151 결.
|
|
274
|
+
|
|
275
|
+
7. **반영커밋 URL 첨부 패턴** — *학생이 *어떤 권고를 어떤 커밋에서 반영* 명시*. **학습 가시화 매개체 + reviewer 친화도**. PR #99 (PR URL) / PR #128·#135·#108·#136 결.
|
|
276
|
+
|
|
277
|
+
8. **라면 비유 (추상화 수준)** — *긴 절차 명 vs 짧은 의도 명*. **MCP 룰 후보 `procedural-method-name`**. PR #151·#146 의 *비유 어휘* 결.
|
|
278
|
+
|
|
279
|
+
9. **극단 사례 메타 어휘 (reductio ad absurdum)** — *"1만 개의 메서드가 생겨야할까요?"* / *"100개의 메서드"* — *현재 코드의 *한 사례* 가 *변경 시 N 회 반복* 자가 명시*. **MCP `oh-my-oop` 의 *변경 시 비용* 어휘**.
|
|
280
|
+
|
|
281
|
+
10. **`testing = 명세서` 어휘 (Parameterized Test 학생 자가 의문 후)** — *"콘솔 통과 X, 테스트 코드는 설명서"* — PR #99·#26 (테스트 명세서) 결.
|
|
282
|
+
|
|
283
|
+
11. **외부 참조 누수 + backing property 자가 학습** — *`mutableList` 외부 보유 + `clear()` → 내부 누수*. *backing property + 재생성 정공*. PR #74·#108·#132·#133·#85·#58·#137·#148 결.
|
|
284
|
+
|
|
285
|
+
12. **krrong 1 년 학생 → reviewer 진화 케이스** — *2023년 3월 학생 시기의 학습 패턴 (자가 토론 + 양방향 + 반영커밋 URL) → 2024년 3월 reviewer 시기의 학생 권유*. **MCP `oh-my-oop` 의 *학습 = 시간 두고 반복* 어휘와 일치**. 학생/reviewer 동시 등장 메타 케이스. PR #98·#95·#99 의 *재구현 권유* 결.
|