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,106 @@
|
|
|
1
|
+
# PR #52 — [로피] 2단계 블랙잭
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Choisehyeon](https://github.com/Choisehyeon) (로피)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/52
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@BeokBeok](https://github.com/BeokBeok) (커트/벅벅)
|
|
7
|
+
- **라인 코멘트:** 6 스레드 — *PR 본문 3 인스턴스 변수 원칙 학생 자가 어려움 어휘 + 학생 자가 답변 2 thread / 와일드카드 import + null 보장 + 함수명 = 도메인 의도 + enum profitRate 칭찬 + 테스트 자세*
|
|
8
|
+
- **Choisehyeon 양 단계 완성** (1단계 #9).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 — 3 인스턴스 변수 원칙 학생 자가 어려움
|
|
13
|
+
|
|
14
|
+
PR 본문:
|
|
15
|
+
|
|
16
|
+
> *"안녕하세요! 리뷰어님. **User 클래스에 베팅금액을 넣어버리면 프로퍼티가 3개가 되어서 그거에 대해 고민하느라 2단계 제출이 늦어졌습니다ㅠㅠ**"*
|
|
17
|
+
|
|
18
|
+
→ **MCP 룰 `pr-body-three-instance-var-difficulty-vocabulary`** ⭐⭐ 신규 — *3 인스턴스 변수 원칙 학생 자가 어려움 명시*. PR #37 (`principle-as-guide-not-absolute` reviewer가 *원칙 = 가이드 / 절대 X* 권유) 결의 *학생 측 시간 손실* 다른 축.
|
|
19
|
+
|
|
20
|
+
### 2. enum profitRate 칭찬 (Thread 4)
|
|
21
|
+
|
|
22
|
+
reviewer: *"승패 관련해서 수익률까지 enum에 잘 적용해주셨네요. 👍"*
|
|
23
|
+
|
|
24
|
+
→ PR #97 (`enum-with-domain-value-as-elegant`) 결 합류 누적 2 PR.
|
|
25
|
+
|
|
26
|
+
### 3. 딜러 최종 수익 테스트 칭찬 (Thread 5)
|
|
27
|
+
|
|
28
|
+
reviewer: *"딜러의 최종 수익을 반환하는 테스트 코드를 잘 작성해주셨네요. 👍"*
|
|
29
|
+
|
|
30
|
+
## 못한 점 (설계 관점)
|
|
31
|
+
|
|
32
|
+
### 1. 와일드카드 import 지양 + ktlint ref (Thread 1)
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
import blackjack.domain.* // 와일드카드
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
reviewer:
|
|
39
|
+
|
|
40
|
+
> *"코틀린에서는 와일드카드(*)를 사용하는 것을 지양합니다.*
|
|
41
|
+
> *ref. https://pinterest.github.io/ktlint/rules/standard/#no-wildcard-imports"*
|
|
42
|
+
|
|
43
|
+
→ **MCP 룰 `kotlin-wildcard-import-avoid`** ⭐ 신규 — *Kotlin 와일드카드 import 지양 + ktlint 공식 컨벤션 ref*. PR #47 (`underscore-prefix-backing-property-only` Kotlin 공식 컨벤션 ref) 결 합류 누적 2 PR.
|
|
44
|
+
|
|
45
|
+
### 2. null 보장 (Thread 2)
|
|
46
|
+
|
|
47
|
+
reviewer:
|
|
48
|
+
|
|
49
|
+
> *"input이 null이 전달될 경우에는 어떻게 동작하게 될까요? **input이 반드시 null이 아님을 보장할 수 있을까요?**"*
|
|
50
|
+
|
|
51
|
+
학생 자가 답변: *"InputView에서 getOrElse를 사용하여 null을 반환하지 않도록 수정했습니다!"*
|
|
52
|
+
|
|
53
|
+
→ **`null-guarantee-via-getorelse`** ⭐⭐ — *`getOrElse` = null 회피 어휘*. PR #154 (`toIntOrNull-vs-type-check`) 결 합류.
|
|
54
|
+
|
|
55
|
+
### 3. 함수명 = 도메인 의도 일치 (Thread 3)
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
// 변경 전 - 모호
|
|
59
|
+
fun isBlackJackSize(): Boolean = cards.size == 2
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
reviewer:
|
|
63
|
+
|
|
64
|
+
> *"함수명만 봐서는, 카드의 크기가 2인 경우에는 블랙잭 사이즈라고 이해가 되는데요. **카드 크기가 2인데 블랙잭이 아닌 경우도 있지 않을까요?** 물론, 카드가 2장이고 그 합이 21일 경우를 의도하셨겠지만, 다른 개발자가 보았을 때 이 로직만 보면 오해를 할 수 있지 않을까요?"*
|
|
65
|
+
|
|
66
|
+
학생 자가 답변: *"isSizeTwo()로 네이밍 수정했습니다!"*
|
|
67
|
+
|
|
68
|
+
→ **함수명 의도 일치 누적 16+ PR** — *카드 2 ≠ 블랙잭 도메인 정확성*. PR #12·#15·#101 등 결.
|
|
69
|
+
|
|
70
|
+
### 4. 프로그램 실행 단위 개행 (Thread 0)
|
|
71
|
+
|
|
72
|
+
reviewer: *"프로그램 실행 단위로 개행을 해주게 되면, 좀 더 코드를 읽기가 편해집니다."*
|
|
73
|
+
|
|
74
|
+
→ PR #38·#54 (`blank-line-as-flow-boundary`) 결 누적 3 PR.
|
|
75
|
+
|
|
76
|
+
### 5. 테스트 자세 — 딜러 패배 도메인 룰 (Thread 5)
|
|
77
|
+
|
|
78
|
+
reviewer:
|
|
79
|
+
|
|
80
|
+
> *"딜러인 경우에도 좀 더 자세하게 작성해보면 어떨까요? \"딜러가 패배하면 딜러는 모든 유저의 배팅금액만큼 잃는다\""*
|
|
81
|
+
|
|
82
|
+
→ **테스트 명명 도메인 어휘** = 누적 다수.
|
|
83
|
+
|
|
84
|
+
## 대표 인용
|
|
85
|
+
|
|
86
|
+
> [Choisehyeon PR 본문]
|
|
87
|
+
> *"User 클래스에 베팅금액을 넣어버리면 프로퍼티가 3개가 되어서 그거에 대해 고민하느라 2단계 제출이 늦어졌습니다ㅠㅠ"*
|
|
88
|
+
|
|
89
|
+
→ **학생 자가 3 인스턴스 변수 원칙 어려움 어휘**.
|
|
90
|
+
|
|
91
|
+
> [BeokBeok Thread 3]
|
|
92
|
+
> *"카드의 크기가 2인 경우에는 블랙잭 사이즈라고 이해가 되는데요. 카드 크기가 2인데 블랙잭이 아닌 경우도 있지 않을까요?"*
|
|
93
|
+
|
|
94
|
+
→ **함수명 = 도메인 정확성 어휘**.
|
|
95
|
+
|
|
96
|
+
## 얻은 교훈 (보편)
|
|
97
|
+
|
|
98
|
+
1. **3 인스턴스 변수 원칙 학생 자가 시간 손실** — **MCP 룰 `pr-body-three-instance-var-difficulty-vocabulary` 후보** ⭐⭐.
|
|
99
|
+
2. **Kotlin 와일드카드 import 지양 + ktlint** — **MCP 룰 `kotlin-wildcard-import-avoid` 후보** ⭐.
|
|
100
|
+
3. **`getOrElse` null 회피** — **MCP 룰 `null-guarantee-via-getorelse` 후보** ⭐⭐.
|
|
101
|
+
4. **함수명 = 도메인 정확성 누적 16+ PR** = 강화.
|
|
102
|
+
|
|
103
|
+
## 메타 노트
|
|
104
|
+
|
|
105
|
+
- **Choisehyeon 양 단계 완성 (1단계 #9 → 2단계 #52)**.
|
|
106
|
+
- **3 인스턴스 변수 원칙 어휘 누적** — PR #37·#52 — *학생 측 어려움 + reviewer *원칙 = 가이드 / 절대 X*. 단일 답 거부 어휘 누적 강화.
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# PR #9 — [블랙잭 1단계] 로피 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@Choisehyeon](https://github.com/Choisehyeon)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/9
|
|
5
|
+
- **단계:** 1단계 (페어)
|
|
6
|
+
- **리뷰어:** @BeokBeok (벅벅)
|
|
7
|
+
- **라인 코멘트:** 23 스레드 — *학생 자가 확장 함수 vs 멤버 함수 장단점 자가 정리 + Builder 패턴 호출 순서 + 외부 글 첨부*
|
|
8
|
+
- **신규 reviewee** (2023년 3월 코호트). PR #16 (SeongHoonC) 와 동일 reviewer.
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **확장 함수 vs 멤버 함수 장단점 학생 자가 매우 긴 답변** — 벅벅 메타 질문: *"winTo 함수를 확장함수 또는 멤버함수로 구현했을 때 각각 어떤 장단점이 있을지 고민해보면 어떨까요?"* + 학생 자가 답변:
|
|
13
|
+
|
|
14
|
+
> **확장함수 장점:** *"코드가 간결해져서 가독성이 높다. 기존 클래스를 수정하지 않고도 새로운 기능 추가 할 수 있다, 수신 객체를 지정하지 않고도 User 클래스에 멤버 프로퍼티나 메서드에 접근할 수 있다."*
|
|
15
|
+
>
|
|
16
|
+
> **확장함수 단점:** *"네임스페이스 오염이 발생할 수 있다. 확장 함수는 클래스 외부에서 정의되므로, 클래스 내부의 함수와 이름이 충돌할 수 있다. 클래스의 캡슐화가 위반될 수 있다."*
|
|
17
|
+
>
|
|
18
|
+
> **멤버함수 장점:** *"클래스의 캡슐화를 보호할 수 있다. 클래스 내부에서 수행되므로 코드를 읽는 사람이 이를 의도적으로 이해하기 쉽다."*
|
|
19
|
+
>
|
|
20
|
+
> **멤버함수 단점:** *"클래스의 구조와 밀접하게 연관된 작업만 수행할 수 있기 때문에, 클래스의 구조를 변경하지 않고 새로운 기능을 추가하기 어려울 수 있다."*
|
|
21
|
+
|
|
22
|
+
**Kotlin 어휘 학생 자가 4 분면 정리 모범** (장점 × 2 + 단점 × 2). PR #16 (SeongHoonC *abstract vs open*) / PR #91 (murjune *sealed vs abstract*) / PR #43 (chws0508 *interface 프로퍼티*) 결.
|
|
23
|
+
|
|
24
|
+
- **`map` + `getter` 활용 칭찬** — 벅벅: *"getter와 map을 활용해서 participants를 Outcome 객체로 잘 변환해주셨네요. 👍"* — Kotlin 함수형 어휘.
|
|
25
|
+
- **확장 함수 정공 칭찬** — 벅벅: *"winTo라는 확장함수를 잘 구현해주셨네요. 👍"* — *위 §장단점 토론 + 칭찬 양립*.
|
|
26
|
+
- **`ACE 포함 여부` 함수 칭찬** — 벅벅: *"ACE가 포함 여부를 조회하는 함수를 잘 구현해주셨네요."*
|
|
27
|
+
|
|
28
|
+
## 못한 점 (설계 관점)
|
|
29
|
+
|
|
30
|
+
### 1. `setBlackJack()` 함수명 — set 계열 함수 컨벤션 위반
|
|
31
|
+
|
|
32
|
+
벅벅: *"함수명만 봤을 때에는 '블랙잭을 설정한다' 라는 의미로 이해가 되는데요. 하지만 흔히 set 계열의 함수는 무언가를 리턴하는 것으로 예상되기 보다는, 단순히 값을 설정할 것으로 예상이 됩니다. 함수명이 구현체가 하는 일을 잘 표현하도록 함수명을 개선해보면 어떨까요?"*
|
|
33
|
+
|
|
34
|
+
→ **JavaBean 컨벤션 + Kotlin**:
|
|
35
|
+
- *`setX(value)`* = *값 설정 + Unit 반환* (관용).
|
|
36
|
+
- *`set 동사 + 명사`* + *리턴값 보유* = *컨벤션 위반*.
|
|
37
|
+
- 대안: *`createBlackJack()`*, *`buildBlackJack()`*, *`initializeBlackJack()`*.
|
|
38
|
+
|
|
39
|
+
**MCP 기존 룰 `vagueName` 변형** + *set 접두사 컨벤션 위반 검사*. PR #99·#26·#39·#46 결.
|
|
40
|
+
|
|
41
|
+
### 2. `winTo` 함수 = 프로퍼티 X (상태 vs 행동)
|
|
42
|
+
|
|
43
|
+
벅벅: *"프로퍼티는 상태를 나타내며, 함수는 행동을 나타냅니다. winTo 함수는 상태라기보다는 행동을 의미합니다. 프로퍼티는 상태만을 갖도록 코드를 개선해보면 어떨까요?"*
|
|
44
|
+
|
|
45
|
+
→ **Kotlin 어휘 (프로퍼티 vs 함수)**:
|
|
46
|
+
- *프로퍼티* = *상태 (값) 표현*. 정적 의미.
|
|
47
|
+
- *함수* = *행동 (계산/변환) 표현*. 동적 의미.
|
|
48
|
+
- *`val winTo: ...` (프로퍼티)* < *`fun winTo(): ...` (함수)* — *행동은 함수 정공*.
|
|
49
|
+
|
|
50
|
+
PR #91 (murjune *프로퍼티 vs 함수 자가 인정*) 결.
|
|
51
|
+
|
|
52
|
+
### 3. `BlackJack 확장 함수` 위치 — 외부 발견 가능성
|
|
53
|
+
|
|
54
|
+
벅벅: *"BlackJack 클래스와 관련된 확장 함수를 작성해주셨네요. 👍 BlackJack 클래스 내의 멤버 함수로 구현하는 것과, 다른 클래스에서 BlackJack의 확장함수를 만드는 것은 각각 어떤 장점이 있을까요? 만약 다른 개발자가 guestsTurn 함수와 dealerTurn 함수가 BlackJackGame에 정의가 되어있을 것이라 예상할 수 있을까요?"*
|
|
55
|
+
|
|
56
|
+
→ **확장 함수 vs 멤버 함수 발견 가능성**:
|
|
57
|
+
- *멤버 함수* = *클래스 내 즉시 가시 + 자동 완성*.
|
|
58
|
+
- *확장 함수* = *외부 클래스에 정의 + import 필요 + 발견 어려움*.
|
|
59
|
+
- *블랙잭 도메인 핵심 메서드 (guestsTurn, dealerTurn)* = *멤버 함수 정공*.
|
|
60
|
+
|
|
61
|
+
PR #11 (위 학생 자가 4 분면) 의 *확장 함수 단점 (네임스페이스 오염)* 와 동일 결.
|
|
62
|
+
|
|
63
|
+
### 4. `CardDeck` 외부 shuffle → 생성 시 shuffle
|
|
64
|
+
|
|
65
|
+
벅벅: *"외부에서 shuffle 함수를 호출해줘야할까요? CardDeck 객체를 생성할 때 shuffle 해서 전달해줘도 되지 않을까요?"*
|
|
66
|
+
|
|
67
|
+
→ **객체 invariant + 생성 시 보장**. PR #16 (SeongHoonC *init 블록 자가 적용*) / PR #77 (murjune *Deck shuffle 생성 시 1회*) 결.
|
|
68
|
+
|
|
69
|
+
### 5. `Cards.toList()` 외부 호출 — 학생 자가 정당화
|
|
70
|
+
|
|
71
|
+
벅벅: *"toList라는 함수를 외부에서 호출해줘야할까요? 외부에서 cards 변수에 접근해서 값을 조회하도록 개선해보면 어떨까요?"*
|
|
72
|
+
|
|
73
|
+
학생 자가 정당화: *"캡슐화를 위해 toList 함수를 사용해서 호출해줬는데 직접 접근하게 된다면 Card.card.toList()과 같이 될 것 같아서 캡슐화를 하기 위해 위 방식으로 진행했습니다!"*
|
|
74
|
+
|
|
75
|
+
벅벅 별도 (suggestion):
|
|
76
|
+
|
|
77
|
+
```kotlin
|
|
78
|
+
class Cards(val cards: Set<Card> = setOf()) {
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
*"대체로 Immutable한 컬렉션 타입이라면, 외부에 오픈이 되더라도 변경할 수 없습니다. private 접근자를 제거한다면, 불필요한 toList 함수를 만들지 않아도 됩니다."*
|
|
82
|
+
|
|
83
|
+
→ **2 가지 학습**:
|
|
84
|
+
|
|
85
|
+
#### 5.1. *Immutable 컬렉션 vs Mutable 컬렉션 외부 노출*
|
|
86
|
+
|
|
87
|
+
- *`MutableList<Card>` 외부 노출* = *외부 변경 위험* → *방어적 복사 / `toList()` 필요*.
|
|
88
|
+
- *`List<Card>` (Immutable interface)* = *외부에서 변경 불가* → *`toList()` 불필요*.
|
|
89
|
+
- **단, `MutableList` 가 백킹 객체인 경우 `List` 인터페이스로 캐스팅해도 외부에서 `as MutableList` 가능** — PR #16 (SeongHoonC *LSP 자가 학습*) 결.
|
|
90
|
+
|
|
91
|
+
#### 5.2. *학생 자가 정당화 (캡슐화 의도)*
|
|
92
|
+
|
|
93
|
+
학생이 *`toList()` 가 캡슐화를 위한 것* 자가 명시. *그러나 Set<Card> immutable 이라면 노출해도 무해* — *학생 자가 학습 갭*.
|
|
94
|
+
|
|
95
|
+
PR #74 (송핑크 *불변 객체 자가 학습*) / PR #46 (krrong *backing property*) 결.
|
|
96
|
+
|
|
97
|
+
### 6. `OutputView` enum 출력 — 학생 자가 정당화 (View 영역)
|
|
98
|
+
|
|
99
|
+
벅벅: *"지금과 같은 구조에서는 enum이 변경될 때마다 이 코드들도 변경을 해줘야합니다. enum만 변경해도 이 코드들이 영향을 미치지 않도록 코드를 개선해보면 어떨까요?"*
|
|
100
|
+
|
|
101
|
+
학생 자가 정당화: *"저는 이부분이 출력에 관한 부분이라고 생각해서 enum에서 값을 넣어주는 것이 뷰의 역할을 가지고 있다는 생각이 들어서 위와 같이 진행했습니다!"*
|
|
102
|
+
|
|
103
|
+
→ **enum 출력 위치 양가성**:
|
|
104
|
+
- *학생 시점*: *View 가 enum → 문자열 변환 = View 영역*.
|
|
105
|
+
- *벅벅 시점*: *enum 추가 시 View 코드 변경 강제 = 변경 파급*.
|
|
106
|
+
|
|
107
|
+
대안:
|
|
108
|
+
- (A) **enum.label / enum.displayName** — *enum 이 출력 문자열 보유*. **MCP 기존 룰 `enum-with-ui-value`** — *벅벅이 *enum 영역 누수* 진단하는 학생 자가 결정*.
|
|
109
|
+
- (B) **View 가 enum-to-string Map** — *enum 추가 시 Map 추가 = 한 곳 변경*.
|
|
110
|
+
- (C) **별도 mapper 객체** — *View ↔ enum 사이 변환 응집*.
|
|
111
|
+
|
|
112
|
+
PR #28·#78·#112·#125·#147·#23·#26·#16·#77 의 *enum-with-ui-value* 결의 *반대 시점* — *View 가 enum 변환 책임 보유 학생 자가 결정*.
|
|
113
|
+
|
|
114
|
+
### 7. `User` 3 변수 제약 (요구사항)
|
|
115
|
+
|
|
116
|
+
벅벅: *"프로그램 요구사항에는 아래와 같은 항목이 있습니다. - 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. 위 요구사항을 적용해보면 어떨까요?"*
|
|
117
|
+
|
|
118
|
+
→ **요구사항 인용 (벅벅 패턴)**. PR #16 (SeongHoonC) 결.
|
|
119
|
+
|
|
120
|
+
### 8. `Builder 패턴 호출 순서 + 지연 초기화`
|
|
121
|
+
|
|
122
|
+
벅벅: *"Builder 패턴은 호출 순서와 상관 없이, build 함수를 호출하는 순간 객체가 정상적으로 만들어져야 합니다. 하지만, 아래와 같은 코드를 작성하게 되면 어떻게 될까요?"*
|
|
123
|
+
|
|
124
|
+
```kotlin
|
|
125
|
+
val blackjack = BlackJackBuilder().build()
|
|
126
|
+
blackjack.participants
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
*"이를 해결하기 위해서는 어떻게 하면 좋을지 고민해보면 어떨까요? Builder 패턴의 장단점 및 지연초기화의 장단점에 대해서 학습해보면 좋을 것 같아요."*
|
|
130
|
+
|
|
131
|
+
→ **3 가지 학습**:
|
|
132
|
+
|
|
133
|
+
#### 8.1. *Builder 패턴 = 호출 순서 무관 + build() 시점 완성*
|
|
134
|
+
|
|
135
|
+
- *학생 코드*: *`cardDeck()` 호출 후 `draw()` 호출* 필요 — *호출 순서 의존*.
|
|
136
|
+
- *Builder 정공*: *내부 default 값 / required 인자 강제* + *build() 시점 invariant 검증*.
|
|
137
|
+
|
|
138
|
+
#### 8.2. *지연 초기화 (`by lazy` / `lateinit var`)*
|
|
139
|
+
|
|
140
|
+
- *`by lazy`* = *최초 접근 시 초기화 + 이후 캐싱*.
|
|
141
|
+
- *`lateinit var`* = *향후 초기화 강제 + 접근 전 초기화 필수*.
|
|
142
|
+
|
|
143
|
+
#### 8.3. *cardDeck 미호출 + draw 호출 시 NullPointerException*
|
|
144
|
+
|
|
145
|
+
벅벅 별도: *"cardDeck 함수가 호출되지 않은 상태에서 draw 함수가 호출되면 어떤 일이 발생할까요? 이를 예방하려면 어떻게 개선하면 좋을지 고민해보면 어떨까요?"*
|
|
146
|
+
|
|
147
|
+
PR #16 (SeongHoonC *init 블록 invariant*) 결.
|
|
148
|
+
|
|
149
|
+
### 9. `introduce` + `companion init` 중복
|
|
150
|
+
|
|
151
|
+
벅벅: *"introduce 함수와 BlackJackBuilder 클래스의 companion object의 init 함수의 구현체가 동일하네요. 그렇다면 중복되는 코드를 줄여보면 어떨까요?"*
|
|
152
|
+
|
|
153
|
+
→ **DRY (Don't Repeat Yourself)** + *중복 코드 = 변경 시 N 곳 모두 수정*.
|
|
154
|
+
|
|
155
|
+
### 10. `when exhaustive` (Kotlin 1.6+) — 외부 글
|
|
156
|
+
|
|
157
|
+
벅벅: *"만약 CardValue의 값이 추가가 된다면, 별도로 신경을 쓰지 않는 이상 else 문으로 동작하게 되면서 예상치 못한 오류가 발생할 수 있습니다. when을 exhaustive하게 작성해보면 어떨까요?"* + [Kotlin 공식 문서 - exhaustive when](https://kotlinlang.org/docs/whatsnew16.html#stable-exhaustive-when-statements-for-enum-sealed-and-boolean-subjects).
|
|
158
|
+
|
|
159
|
+
→ **Kotlin 1.6+ exhaustive when** — *enum 추가 시 컴파일 에러 강제*. PR #91 (murjune *sealed + when exhaustive 자가 학습*) / PR #137·#148·#90·#146 결.
|
|
160
|
+
|
|
161
|
+
### 11. `when (binary)` vs `if` — 외부 글
|
|
162
|
+
|
|
163
|
+
벅벅: *"binary condition인 경우에는 when 보다는 if문 사용을 권장해요. ref. https://kotlinlang.org/docs/coding-conventions.html#if-versus-when"*
|
|
164
|
+
|
|
165
|
+
→ **Kotlin 코딩 컨벤션**:
|
|
166
|
+
- *2 분기 = if 정공 (단순)*.
|
|
167
|
+
- *3 분기 이상 = when 정공 (가독성)*.
|
|
168
|
+
|
|
169
|
+
PR #26 (잭슨) / PR #16 (벅벅) / PR #43 (chws0508 자가 학습) 의 *동일 외부 글*.
|
|
170
|
+
|
|
171
|
+
### 12. `forEach` vs `map` (변환 X)
|
|
172
|
+
|
|
173
|
+
벅벅 suggestion: `participants.all().forEach { ... }` *"무언가를 변환하는 것이 아니라면 forEach를 활용해보면 어떨까요?"*
|
|
174
|
+
|
|
175
|
+
→ **Kotlin 컬렉션 함수형 어휘**:
|
|
176
|
+
- *`map`* = *값 변환* (`List<A>` → `List<B>`).
|
|
177
|
+
- *`forEach`* = *부수 효과* (Unit 반환).
|
|
178
|
+
|
|
179
|
+
PR #26 (잭슨 *forEach → map/groupingBy* — 반대 권고 — *map 활용*) 결의 *반대 시점*.
|
|
180
|
+
|
|
181
|
+
### 13. `경계값 테스트 (20 vs 21)`
|
|
182
|
+
|
|
183
|
+
벅벅: *"20자가 넘을 경우에 예외처리가 발생하는 것으로 이해하고 있습니다. 테스트 코드에서는 가급적이면 경계값을 위주로 테스트를 하는 것이 좋습니다. 여기에서는 이름을 21자에 대해서 테스트를 하는 것으로 개선하는 것을 권장합니다."*
|
|
184
|
+
|
|
185
|
+
→ **경계값 테스트 (Boundary Value Analysis)** — *N + 1 검증*. 가장 흔한 버그 위치.
|
|
186
|
+
|
|
187
|
+
### 14. `Cards.ACE 책임 = CardValue 메시지`
|
|
188
|
+
|
|
189
|
+
벅벅: *"ACE가 포함 여부를 조회하는 함수를 잘 구현해주셨네요. 다만, Cards 클래스가 CardValue 객체에 대해서 너무 잘 알고 있어요. ACE를 관리하는 주체가 어디인지 고민해보시고, ACE를 관리하는 곳에 메시지를 보내서 ACE가 포함되어있는지 확인하도록 코드를 개선해보면 어떨까요?"*
|
|
190
|
+
|
|
191
|
+
→ **Tell-Don't-Ask + 책임 위치**:
|
|
192
|
+
- *`Cards.contains(CardValue.ACE)` = Cards 가 CardValue 분기 알기*.
|
|
193
|
+
- *`Card.isAce()` = Card 가 자기 책임* → *`Cards.any { it.isAce() }`* 정공.
|
|
194
|
+
|
|
195
|
+
PR #43·#74·#98·#137·#148 의 *Tell-Don't-Ask* 결.
|
|
196
|
+
|
|
197
|
+
### 15. `= 표현식 함수` vs `{} 블록` Kotlin 어휘
|
|
198
|
+
|
|
199
|
+
벅벅 suggestion: `fun initDraw() { ... }` *"`=` 을 사용하게 되면, 흔히 코드만 봤을 때 마치 리턴값이 있는 것처럼 보여요. 리턴타입이 없는 경우에는 `=` 보다는 중괄호를 사용해보면 어떨까요?"*
|
|
200
|
+
|
|
201
|
+
→ **Kotlin 어휘**:
|
|
202
|
+
- *`fun f(): Int = expr`* = *단일 표현식 + 리턴값*.
|
|
203
|
+
- *`fun f() { stmt }`* = *블록 + Unit (보통 리턴 X)*.
|
|
204
|
+
- *학생 코드 `fun f() = forEach { ... }`* = *Unit 반환 + `=` 사용 = 가독성 ↓*.
|
|
205
|
+
|
|
206
|
+
### 16. `세팅이 된다` 테스트 함수명 모호
|
|
207
|
+
|
|
208
|
+
벅벅: *"'세팅이 된다' 라는 것은 어떤 것을 의미할까요? 다른 개발자가 보았을 때에도 어떤 것을 의미하는지 알 수 있도록 함수명을 작성해보면 어떨까요?"*
|
|
209
|
+
|
|
210
|
+
→ **테스트 명세서 어휘** — PR #26·#46·#99 결.
|
|
211
|
+
|
|
212
|
+
### 17. `결과` 함수명 vs `Outcome` 리턴 타입 불일치
|
|
213
|
+
|
|
214
|
+
벅벅: *"함수명만 봤을 때에는 '게임 결과'라는 의미로 해석돼요. 하지만 리턴타입은 Outcome이네요. 함수명만 봤을 때 리턴타입이 Outcome임을 알 수 있도록 개선해보면 어떨까요?"*
|
|
215
|
+
|
|
216
|
+
→ **함수명 = 리턴 타입 추론 가능 권유**. *`fun getResult(): Outcome` < `fun toOutcome(): Outcome`*. PR #99·#39 (vagueName) 결.
|
|
217
|
+
|
|
218
|
+
### 18. `->` 같은 라인 (Kotlin 컨벤션)
|
|
219
|
+
|
|
220
|
+
벅벅 suggestion: `CardValue.TEN -> this.value.toString()` *"사소하지만, `->` 는 같은 라인에 작성하는 것을 권장합니다."*
|
|
221
|
+
|
|
222
|
+
→ **Kotlin 코딩 컨벤션 (ktlint)**. PR #77 (KwonDae *ktlint 확인*) 결.
|
|
223
|
+
|
|
224
|
+
### 19. `인덴트 depth ≤ 2` (요구사항)
|
|
225
|
+
|
|
226
|
+
벅벅: *"아래 프로그래밍 요구사항을 적용해보면 어떨까요? - indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다."*
|
|
227
|
+
|
|
228
|
+
→ **요구사항 인용 (벅벅 패턴)** + **객체지향 생활 체조 원칙**.
|
|
229
|
+
|
|
230
|
+
## 리뷰어 의견 요지 (벅벅 / BeokBeok)
|
|
231
|
+
|
|
232
|
+
23 코멘트 특징 (PR #16 와 동일 reviewer):
|
|
233
|
+
|
|
234
|
+
- **요구사항 인용** — *"프로그래밍 요구사항에는 아래와 같은 항목이 있습니다"* (3 회). PR #16 결.
|
|
235
|
+
- **외부 글 첨부** — *Kotlin 공식 문서 (exhaustive when + if vs when)* — PR #16·#26·#23·#95·#67·#46·#77 결.
|
|
236
|
+
- **suggestion 블록 활용** — `Cards(val cards: Set<Card>)`, `participants.all().forEach`, `fun initDraw() {}`, `-> ...` 4회. PR #26·#39·#43·#77 결.
|
|
237
|
+
- **메타 질문 + 학생 자가 답변 유도** — *"확장함수 또는 멤버함수로 구현했을 때 각각 어떤 장단점이 있을지"* (학생 4 분면 답변 유도) / *"shuffle 함수를 호출해줘야할까요?"* / *"toList라는 함수를 외부에서 호출해줘야할까요?"*.
|
|
238
|
+
- **학생 자가 정당화 인정 + 권고 유지** — `toList` 캡슐화 자가 정당화 + `enum` 출력 위치 자가 정당화. *학생 결정 존중 + 추가 권고*. PR #91·#43·#46 결.
|
|
239
|
+
|
|
240
|
+
## 대표 인용
|
|
241
|
+
|
|
242
|
+
> **확장함수 장점:** *"코드가 간결해져서 가독성이 높다. 기존 클래스를 수정하지 않고도 새로운 기능 추가 할 수 있다."* / **확장함수 단점:** *"네임스페이스 오염이 발생할 수 있다. 클래스의 캡슐화가 위반될 수 있다."* / **멤버함수 장점:** *"클래스의 캡슐화를 보호할 수 있다."* / **멤버함수 단점:** *"클래스의 구조와 밀접하게 연관된 작업만 수행할 수 있기 때문에, 클래스의 구조를 변경하지 않고 새로운 기능을 추가하기 어려울 수 있다."* — Choisehyeon (Kotlin 어휘 4 분면 자가 정리)
|
|
243
|
+
|
|
244
|
+
> *"BlackJack 클래스 내의 멤버 함수로 구현하는 것과, 다른 클래스에서 BlackJack의 확장함수를 만드는 것은 각각 어떤 장점이 있을까요? 만약 다른 개발자가 guestsTurn 함수와 dealerTurn 함수가 BlackJackGame에 정의가 되어있을 것이라 예상할 수 있을까요?"* — BeokBeok (확장 함수 발견 가능성 메타 질문)
|
|
245
|
+
|
|
246
|
+
> *"Builder 패턴은 호출 순서와 상관 없이, build 함수를 호출하는 순간 객체가 정상적으로 만들어져야 합니다."* — BeokBeok (Builder 패턴 정의 어휘)
|
|
247
|
+
|
|
248
|
+
> *"캡슐화를 위해 toList 함수를 사용해서 호출해줬는데 직접 접근하게 된다면 Card.card.toList()과 같이 될 것 같아서 캡슐화를 하기 위해 위 방식으로 진행했습니다!"* — Choisehyeon (학생 자가 캡슐화 정당화)
|
|
249
|
+
|
|
250
|
+
> *"저는 이부분이 출력에 관한 부분이라고 생각해서 enum에서 값을 넣어주는 것이 뷰의 역할을 가지고 있다는 생각이 들어서 위와 같이 진행했습니다!"* — Choisehyeon (enum 출력 위치 학생 자가 정당화)
|
|
251
|
+
|
|
252
|
+
## 얻은 교훈
|
|
253
|
+
|
|
254
|
+
1. **`확장 함수 vs 멤버 함수` 학생 자가 4 분면 정리** — *장단점 × 2 명시*. **Kotlin 어휘 자가 학습 모범**. PR #16·#43·#91·#74 결의 *학생 자가 학습 풍부 시리즈*.
|
|
255
|
+
|
|
256
|
+
2. **`확장 함수 발견 가능성` = 외부 위치 + import 필요 = 도메인 핵심 메서드 부적합** — *멤버 함수 = 즉시 가시* / *확장 함수 = 외부 유틸*. **MCP 룰 후보 `extension-function-domain-misuse`**.
|
|
257
|
+
|
|
258
|
+
3. **`Builder 패턴 호출 순서 + 지연 초기화`** — *호출 순서 의존 = Builder 정공 X*. *build() 시점 invariant 검증 + 지연 초기화 (`by lazy`)*. **MCP 룰 후보 `builder-call-order-dependency`**.
|
|
259
|
+
|
|
260
|
+
4. **`set 접두사 함수명 + 리턴값 보유` 컨벤션 위반** — *`set 동사` = JavaBean = Unit 반환 관용*. PR #99·#26·#39·#46 의 *vagueName* 결.
|
|
261
|
+
|
|
262
|
+
5. **`프로퍼티 vs 함수` = 상태 vs 행동** — *`val 이름`* = *상태* / *`fun 이름()` = *행동**. PR #91 (murjune *프로퍼티 vs 함수*) 결.
|
|
263
|
+
|
|
264
|
+
6. **`Immutable 컬렉션 vs Mutable` 외부 노출** — *`Set<Card>` immutable = 외부 노출 OK + `toList()` 불필요*. PR #16 (SeongHoonC *LSP*) / PR #46 (krrong *backing property*) 결.
|
|
265
|
+
|
|
266
|
+
7. **`enum 출력 위치 양가성`** — *학생: View 가 enum→string 변환 = View 영역* vs *reviewer: enum 추가 시 View 변경 강제 = enum 영역 누수*. **MCP 기존 룰 `enum-with-ui-value` 반대 시점**.
|
|
267
|
+
|
|
268
|
+
8. **`when exhaustive` Kotlin 1.6+** — *enum/sealed/Boolean exhaustive 보장 + else 불필요*. PR #91 (murjune *sealed + when exhaustive*) 결.
|
|
269
|
+
|
|
270
|
+
9. **`when (binary) vs if` Kotlin 컨벤션** — *2 분기 = if / 3 분기 = when*. PR #26·#16·#43 의 *동일 외부 글*.
|
|
271
|
+
|
|
272
|
+
10. **`경계값 테스트` (Boundary Value Analysis)** — *N + 1 검증* = *예외 처리 가장 흔한 버그 위치*.
|
|
273
|
+
|
|
274
|
+
11. **`= 표현식 함수` vs `{} 블록` Kotlin 어휘** — *Unit 반환 = 블록 / 리턴값 = 표현식*. PR #43·#39 의 *Kotlin 어휘 학습* 결.
|
|
275
|
+
|
|
276
|
+
12. **`함수명 = 리턴 타입 추론 가능 권유`** — *`fun result()` < `fun toOutcome()`* — *명명 일관성*. PR #99·#39 결.
|
|
277
|
+
|
|
278
|
+
13. **`인덴트 depth ≤ 2` 요구사항** — *객체지향 생활 체조 원칙*. PR #16·#23·#26 결의 *2023년 3월 코호트 요구사항 인용 패턴*.
|
|
279
|
+
|
|
280
|
+
14. **`Tell-Don't-Ask + Card.isAce()` 책임 위치** — *Cards 가 CardValue 분기 알기 < Card 가 자기 책임*. PR #43·#74·#98·#137·#148 결.
|
|
281
|
+
|
|
282
|
+
15. **`벅벅 reviewer 패턴`** — *요구사항 인용 + Kotlin 공식 문서 + suggestion 블록 + 메타 질문* — PR #16 와 *동일한 패턴*. **2023년 3월 코호트 reviewer 3인 중 가장 *외부 자료 + 컨벤션* 어휘 강도 높음**.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# PR #14 — [블랙잭 1단계] 코건 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@DYGames](https://github.com/DYGames)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/14
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @galcyurio
|
|
7
|
+
- **라인 코멘트:** 16 스레드 — *PR 본문 자가 의문 (뷰-모델 상호작용 + 람다 깊이) + ManualCardFactory Map suggestion + ordinal 지양*
|
|
8
|
+
- **신규 reviewee** (2023년 3월 코호트). PR #22·#48 와 동일 reviewer.
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
- **PR 본문 자가 의문 (뷰-모델 람다 깊이)** — *"질문드릴 점이 있는데, 게임에서 모든 플레이어들에게 한장의 카드를 더 받는지 결정하는 로직이 있습니다. 이때 뷰와 모델의 로직이 복잡하게 상호작용하는데, 이를 저는 람다를 이용해서 해결하였는데 여전히 복잡하고 코드 깊이가 깊어집니다. 어떻게 생각하고 구현하면 좀 더 깔끔하고 분리된 코드를 작성할 수 있을지 궁금합니다."* — **PR 본문 자가 의문 모범**. PR #76·#82·#107·#46·#91·#11·#13·#80·#106 결.
|
|
13
|
+
- **방어적 복사 칭찬** — galcyurio: *"방어적 복사 :+1:"*. PR #74·#108·#133·#46·#23 결.
|
|
14
|
+
- **UI layer 도메인 의존 칭찬** — galcyurio: *"ui layer에서 domain layer를 의존하여 데이터를 받아서 렌더링하도록 잘 구현해주셨네요 :+1:"*. PR #22 (galcyurio *UI→Domain OK*) 결.
|
|
15
|
+
- **불필요 정보 분리 자가 적용** — galcyurio: *"불필요한 정보를 잘 분리해주셨습니다 👍"* + 학생 자가 함수 분리. PR #22 결.
|
|
16
|
+
|
|
17
|
+
## 못한 점 (설계 관점)
|
|
18
|
+
|
|
19
|
+
### 1. `y/n CLI 환경 의존 → Boolean (GUI 가정)`
|
|
20
|
+
|
|
21
|
+
galcyurio: *"`y`, `n`은 CLI 환경에서만 실행될 것이라는 전제가 깔려있으며, 또한 외부에서는 Boolean으로 사용되고 있습니다. Boolean으로 사용하는게 오히려 가독성도 좋고 더 유연해집니다. 이 프로그램을 그대로 GUI 환경에서도 쓴다고 생각하고 만들어보세요."*
|
|
22
|
+
|
|
23
|
+
학생: *"View 단에서 Boolean으로 검증, 변환해주었습니다."*
|
|
24
|
+
|
|
25
|
+
→ **CLI vs GUI 가정 메타 어휘**:
|
|
26
|
+
- *`y`/`n` 도메인 = CLI 한정*.
|
|
27
|
+
- *Boolean = 도메인 추상화 + GUI 전환 가능*.
|
|
28
|
+
|
|
29
|
+
**MCP 룰 후보 `cli-vs-gui-assumption-test`**. PR #137 (HamBeomJoon *Multi-platform 함정*) / PR #41·#151·#80·#82·#100 결.
|
|
30
|
+
|
|
31
|
+
### 2. `if/when 중괄호` 공식 컨벤션
|
|
32
|
+
|
|
33
|
+
galcyurio: *"[공식 컨벤션](https://kotlinlang.org/docs/coding-conventions.html#control-flow-statements)에 따르면 if문과 when문은 2줄 이상이면 중괄호를 사용합니다."*
|
|
34
|
+
|
|
35
|
+
→ **Kotlin 공식 컨벤션**. PR #82·#9·#16·#26 결.
|
|
36
|
+
|
|
37
|
+
### 3. `ManualCardFactory` 테스트 전용 + Map 받기
|
|
38
|
+
|
|
39
|
+
galcyurio: *"ManualCardFactory는 테스트를 위한 Fake 구현체이기 때문에 이를 위한 테스트 케이스는 작성되어선 안됩니다. 추가로 ManualCardFactory는 현재 테스트 케이스를 제외하고는 그 어떤 테스트 케이스에서도 쓰이지 않고 있네요. CardFactory를 의존하고 있는 BlackjackStage에 대한 테스트 케이스를 작성하다보면 필요해질 겁니다."*
|
|
40
|
+
|
|
41
|
+
galcyurio (Map suggestion):
|
|
42
|
+
|
|
43
|
+
```kotlin
|
|
44
|
+
// AS-IS
|
|
45
|
+
val cardFactory = ManualCardFactory(
|
|
46
|
+
listOf(CardType.CLUB, CardType.SPADE), listOf(CardNumber.THREE, CardNumber.QUEEN)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
// TO-BE
|
|
50
|
+
val cardFactory = ManualCardFactory(mapOf(
|
|
51
|
+
CardType.CLUB to CardNumber.THREE,
|
|
52
|
+
...
|
|
53
|
+
))
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
galcyurio 자가 *착각 사과*: *"제가 착각하고 잘못 말씀드렸네요 🙏🙇 이 구현체는 테스트를 위한 구현체니까 단순히 원하는대로 반환을 시키면 됩니다. 테스트 가독성을 위해 List로 받는 대신 Map을 받도록 처리해보면 어떨까요?"*
|
|
57
|
+
|
|
58
|
+
→ **3 가지 학습**:
|
|
59
|
+
|
|
60
|
+
#### 3.1. *Test Fake 구현체 = 자체 테스트 X*
|
|
61
|
+
|
|
62
|
+
- *Fake = 테스트용 도구 = 의존하는 코드 테스트할 때 사용*.
|
|
63
|
+
- *Fake 자체 테스트 = 무의미*.
|
|
64
|
+
|
|
65
|
+
**MCP 룰 후보 `test-fake-self-test-anti-pattern`**. PR #145 (junseo511 *unaryMinus 무의미 테스트*) / PR #99·#91 결.
|
|
66
|
+
|
|
67
|
+
#### 3.2. *List<A> + List<B> vs Map<A,B>* — 데이터 구조 변경
|
|
68
|
+
|
|
69
|
+
*두 리스트의 i 번째 페어* < *Map 의 명시적 페어*.
|
|
70
|
+
|
|
71
|
+
#### 3.3. *reviewer 자가 *착각* 사과*
|
|
72
|
+
|
|
73
|
+
PR #91·#77·#46·#16·#95·#137·#107·#145·#48 결.
|
|
74
|
+
|
|
75
|
+
### 4. `it/it2` 변수명 — 명시적 명명
|
|
76
|
+
|
|
77
|
+
galcyurio: *"`it`, `it2` 대신 알맞은 이름을 명시해보세요."*
|
|
78
|
+
|
|
79
|
+
학생: *"각각 cardType, cardNumber로 변경하였습니다."*
|
|
80
|
+
|
|
81
|
+
→ **중첩 람다 명시 명명**. PR #13·#107·#145 결.
|
|
82
|
+
|
|
83
|
+
### 5. `when expression vs if expression`
|
|
84
|
+
|
|
85
|
+
galcyurio: *"when expression을 활용하여 `''`와 같은 불필요한 반환을 없애보세요. 변환 후에 CardType이나 CardNumber를 추가해보고 if expression과 when expression 2개 방식에 어떤 차이점이 있는지도 정리해보면 좋겠어요."*
|
|
86
|
+
|
|
87
|
+
학생: *"enum 클래스에서 when expression을 사용할 때는, else 브랜치를 사용하지 않을때 enum의 모든 항목에 대해 브랜치를 관리하도록 강제하는 차이가 있다고 정리했습니다."*
|
|
88
|
+
|
|
89
|
+
→ **MCP 기존 룰 `sealed-class-when-exhaustive`** (enum 변형) — *when exhaustive + else 강제*. PR #91·#9·#26·#43·#16·#76 결.
|
|
90
|
+
|
|
91
|
+
### 6. `테스트 static import 컨벤션`
|
|
92
|
+
|
|
93
|
+
galcyurio: *"프로덕션 코드에서는 static import를 하지 않는게 컨벤션이지만 테스트 코드에서는 static import를 하는게 컨벤션입니다."*
|
|
94
|
+
|
|
95
|
+
```kotlin
|
|
96
|
+
assertThat(isDistributable).isTrue
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
→ **테스트 코드 컨벤션 = 프로덕션과 다름**. **MCP 룰 후보 `test-static-import-convention`**.
|
|
100
|
+
|
|
101
|
+
### 7. `테스트 가독성 = 불필요 정보 분리`
|
|
102
|
+
|
|
103
|
+
galcyurio: *"테스트 본문에는 테스트하고자 하는 것을 이해할 수 있는 정보를 모두 가지고 있어야 하고, 반대로 불필요한 내용을 전부 감추어야 합니다."* + [Google Testing Blog](https://testing.googleblog.com/2014/03/testing-on-toilet-what-makes-good-test.html) + *"이 테스트 케이스에서 중요한 건 숫자의 합입니다. 그 이외에 `CardType.HEART`와 같은 코드는 보이지 않도록 만들어보세요."*
|
|
104
|
+
|
|
105
|
+
학생: *"Int를 입력받아 같은 수를 가지는 Cards를 생성하는 함수를 분리하여 테스트 코드의 가독성을 높였습니다."*
|
|
106
|
+
|
|
107
|
+
galcyurio 별도: *"테스트 코드에서는 가독성이 중요합니다. 적절한 개행을 통해 CardNumber.TEN, CardNumber.TEN, CardNumber.TWO가 잘 보이도록 하거나 불필요한 코드를 테스트 본문 밖으로 분리해보세요."*
|
|
108
|
+
|
|
109
|
+
→ **PR #22 (galcyurio *Google Testing Blog*) 와 같은 결**. *동일 reviewer 동일 어휘 강화*. PR #22 결.
|
|
110
|
+
|
|
111
|
+
### 8. `when actual vs then expected` 위치
|
|
112
|
+
|
|
113
|
+
galcyurio: *"when절에 실제값(actual)이 위치해야하고 then절에 기댓값(expected)가 위치해야 합니다."*
|
|
114
|
+
|
|
115
|
+
→ **GWT 패턴 표준**. PR #99·#46·#107·#145·#9 결.
|
|
116
|
+
|
|
117
|
+
### 9. `뷰-모델 람다 깊이` PR 본문 자가 의문
|
|
118
|
+
|
|
119
|
+
galcyurio: *"특정 시점에 View의 함수를 호출해야 한다는 점 때문에 이런 코드가 생긴 것으로 보이네요. domain layer로 ui layer의 고차 함수를 넘겨서 처리하겠다는 방법은 좋습니다 :+1: 여러 가지를 한꺼번에 처리하다보니 복잡해진 것 같은데 작은 문제 여러개로 나누어서 처리해보세요. - 고차함수 하나에서 너무 많은 작..."*
|
|
120
|
+
|
|
121
|
+
학생: *"도메인 로직은 최대한 도메인 안으로 이동하고, 고차 함수 전달과 반환을 적절히 활용하여 수정하였습니다."*
|
|
122
|
+
|
|
123
|
+
→ **고차 함수 + 작은 문제 분해**. PR #145·#107·#82·#100·#80·#48 결.
|
|
124
|
+
|
|
125
|
+
### 10. `BlackjackStageTest` 테스트 케이스명 명확화
|
|
126
|
+
|
|
127
|
+
galcyurio: *"BlackjackStageTest의 테스트 케이스 이름들도 조금 더 명확하게 작성해보면 좋겠어요!"*
|
|
128
|
+
|
|
129
|
+
→ **테스트 = 명세서 어휘**. PR #22·#26·#46·#99·#107·#145·#9 결.
|
|
130
|
+
|
|
131
|
+
### 11. `ordinal 사용 지양`
|
|
132
|
+
|
|
133
|
+
galcyurio: *"ordinal 사용은 지양해주세요. 사용하더라도 enum 간의 순서가 바뀌었을 때 문제없어야 합니다."*
|
|
134
|
+
|
|
135
|
+
→ **ordinal 의존 = 순서 변경 시 깨짐**. **MCP 룰 후보 `enum-ordinal-dependency`** (기존 룰 후보 강화). PR #137 (HamBeomJoon *enum-ordinal-dependency*) 결.
|
|
136
|
+
|
|
137
|
+
### 12. `테스트 함수 위치`
|
|
138
|
+
|
|
139
|
+
galcyurio: *"별개로 테스트 클래스에서 중요한 부분은 테스트 본문이므로 해당 함수들은 테스트 함수들 아래쪽에 작성해주시는게 좋습니다. :)"*
|
|
140
|
+
|
|
141
|
+
→ **테스트 파일 구조**. PR #22·#145 결.
|
|
142
|
+
|
|
143
|
+
## 리뷰어 의견 요지 (galcyurio)
|
|
144
|
+
|
|
145
|
+
16 코멘트 특징 (PR #22·#48 와 동일 reviewer):
|
|
146
|
+
|
|
147
|
+
- **공식 컨벤션 외부 자료** — *Kotlin coding-conventions, Google Testing Blog* — PR #22·#48 결.
|
|
148
|
+
- **suggestion 블록 활용** — Map 자료구조 + `assertThat ... isTrue` 코드.
|
|
149
|
+
- **`:+1:`, `🙏`, `🙇` 친밀한 어조** — PR #22·#48 일관.
|
|
150
|
+
- **자가 *착각* 사과** — PR #91·#77·#46·#16·#95·#137·#107·#145·#48 결.
|
|
151
|
+
|
|
152
|
+
## 대표 인용
|
|
153
|
+
|
|
154
|
+
> *"`y`, `n`은 CLI 환경에서만 실행될 것이라는 전제가 깔려있으며 (...) 이 프로그램을 그대로 GUI 환경에서도 쓴다고 생각하고 만들어보세요."* — galcyurio (CLI vs GUI 가정 메타)
|
|
155
|
+
|
|
156
|
+
> *"ManualCardFactory는 테스트를 위한 Fake 구현체이기 때문에 이를 위한 테스트 케이스는 작성되어선 안됩니다."* — galcyurio (Test Fake 자체 테스트 안티패턴)
|
|
157
|
+
|
|
158
|
+
> *"enum 클래스에서 when expression을 사용할 때는, else 브랜치를 사용하지 않을때 enum의 모든 항목에 대해 브랜치를 관리하도록 강제하는 차이가 있다고 정리했습니다."* — DYGames (Kotlin when exhaustive 자가 학습)
|
|
159
|
+
|
|
160
|
+
> *"제가 착각하고 잘못 말씀드렸네요 🙏🙇"* — galcyurio (reviewer 자가 *착각* 사과)
|
|
161
|
+
|
|
162
|
+
## 얻은 교훈
|
|
163
|
+
|
|
164
|
+
1. **`CLI vs GUI 가정 메타`** — *`y`/`n` 도메인 = CLI 한정 / Boolean 추상화 = GUI 전환 가능*. **MCP 룰 후보 `cli-vs-gui-assumption-test`**. PR #137·#41·#151·#80·#82·#100 결.
|
|
165
|
+
|
|
166
|
+
2. **`Test Fake 구현체 자체 테스트 X`** — *Fake = 의존 코드 테스트 도구 / Fake 자체 테스트 = 무의미*. **MCP 룰 후보 `test-fake-self-test-anti-pattern`**. PR #145·#99·#91 결.
|
|
167
|
+
|
|
168
|
+
3. **`테스트 static import 컨벤션`** — *프로덕션과 다름*. **MCP 룰 후보 `test-static-import-convention`**.
|
|
169
|
+
|
|
170
|
+
4. **`ordinal 의존 = 순서 변경 시 깨짐`** = 기존 룰 후보 강화. PR #137 결.
|
|
171
|
+
|
|
172
|
+
5. **`when expression exhaustive`** Kotlin 어휘. PR #91·#9·#26·#43·#16·#76 결.
|
|
173
|
+
|
|
174
|
+
6. **`when actual / then expected` GWT 위치 규칙**. PR #99·#46·#107·#145·#9 결.
|
|
175
|
+
|
|
176
|
+
7. **`테스트 가독성 = 불필요 정보 분리`** (Google Testing Blog). PR #22 결의 *동일 reviewer 동일 어휘*.
|
|
177
|
+
|
|
178
|
+
8. **`고차 함수 + 작은 문제 분해`** — *복잡 람다 = 분해*. PR #145·#107·#82·#100·#80·#48 결.
|
|
179
|
+
|
|
180
|
+
9. **`if/when 중괄호` 공식 컨벤션**. PR #82·#9·#16·#26 결.
|
|
181
|
+
|
|
182
|
+
10. **`Map<A,B> vs List<A> + List<B>`** = 데이터 구조 = 가독성.
|