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.
Files changed (660) hide show
  1. package/MCP_STRUCTURE.md +301 -0
  2. package/README.md +167 -0
  3. package/SCOPE.md +27 -0
  4. package/dist/application/discovery.d.ts +133 -0
  5. package/dist/application/discovery.js +62 -0
  6. package/dist/application/discovery.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +80 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +16 -0
  11. package/dist/config.js +32 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/domain/collaborators.d.ts +2 -0
  14. package/dist/domain/collaborators.js +26 -0
  15. package/dist/domain/collaborators.js.map +1 -0
  16. package/dist/domain/ids.d.ts +4 -0
  17. package/dist/domain/ids.js +23 -0
  18. package/dist/domain/ids.js.map +1 -0
  19. package/dist/domain/model.d.ts +71 -0
  20. package/dist/domain/model.js +2 -0
  21. package/dist/domain/model.js.map +1 -0
  22. package/dist/domain/schemas.d.ts +213 -0
  23. package/dist/domain/schemas.js +79 -0
  24. package/dist/domain/schemas.js.map +1 -0
  25. package/dist/domain/stereotypes.d.ts +7 -0
  26. package/dist/domain/stereotypes.js +65 -0
  27. package/dist/domain/stereotypes.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +21 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/io/classStore.d.ts +9 -0
  32. package/dist/io/classStore.js +39 -0
  33. package/dist/io/classStore.js.map +1 -0
  34. package/dist/io/collaborationStore.d.ts +7 -0
  35. package/dist/io/collaborationStore.js +32 -0
  36. package/dist/io/collaborationStore.js.map +1 -0
  37. package/dist/io/design.d.ts +3 -0
  38. package/dist/io/design.js +22 -0
  39. package/dist/io/design.js.map +1 -0
  40. package/dist/io/designIndex.d.ts +6 -0
  41. package/dist/io/designIndex.js +49 -0
  42. package/dist/io/designIndex.js.map +1 -0
  43. package/dist/io/frontmatter.d.ts +8 -0
  44. package/dist/io/frontmatter.js +31 -0
  45. package/dist/io/frontmatter.js.map +1 -0
  46. package/dist/io/history.d.ts +10 -0
  47. package/dist/io/history.js +38 -0
  48. package/dist/io/history.js.map +1 -0
  49. package/dist/io/useCaseStore.d.ts +8 -0
  50. package/dist/io/useCaseStore.js +36 -0
  51. package/dist/io/useCaseStore.js.map +1 -0
  52. package/dist/io/workspace.d.ts +14 -0
  53. package/dist/io/workspace.js +82 -0
  54. package/dist/io/workspace.js.map +1 -0
  55. package/dist/oop/commands.d.ts +446 -0
  56. package/dist/oop/commands.js +319 -0
  57. package/dist/oop/commands.js.map +1 -0
  58. package/dist/oop/conformance.d.ts +16 -0
  59. package/dist/oop/conformance.js +30 -0
  60. package/dist/oop/conformance.js.map +1 -0
  61. package/dist/prompts/discovery.d.ts +2 -0
  62. package/dist/prompts/discovery.js +41 -0
  63. package/dist/prompts/discovery.js.map +1 -0
  64. package/dist/prompts/imagineWithoutController.d.ts +2 -0
  65. package/dist/prompts/imagineWithoutController.js +75 -0
  66. package/dist/prompts/imagineWithoutController.js.map +1 -0
  67. package/dist/prompts/index.d.ts +2 -0
  68. package/dist/prompts/index.js +17 -0
  69. package/dist/prompts/index.js.map +1 -0
  70. package/dist/prompts/phasePressureTest.d.ts +2 -0
  71. package/dist/prompts/phasePressureTest.js +69 -0
  72. package/dist/prompts/phasePressureTest.js.map +1 -0
  73. package/dist/prompts/rddIntro.d.ts +2 -0
  74. package/dist/prompts/rddIntro.js +53 -0
  75. package/dist/prompts/rddIntro.js.map +1 -0
  76. package/dist/prompts/review.d.ts +2 -0
  77. package/dist/prompts/review.js +45 -0
  78. package/dist/prompts/review.js.map +1 -0
  79. package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
  80. package/dist/prompts/stateMachineIntrospect.js +80 -0
  81. package/dist/prompts/stateMachineIntrospect.js.map +1 -0
  82. package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
  83. package/dist/prompts/tellDontAskRephrase.js +66 -0
  84. package/dist/prompts/tellDontAskRephrase.js.map +1 -0
  85. package/dist/render/diff.d.ts +21 -0
  86. package/dist/render/diff.js +84 -0
  87. package/dist/render/diff.js.map +1 -0
  88. package/dist/render/mermaid.d.ts +24 -0
  89. package/dist/render/mermaid.js +53 -0
  90. package/dist/render/mermaid.js.map +1 -0
  91. package/dist/render/sideBySide.d.ts +14 -0
  92. package/dist/render/sideBySide.js +91 -0
  93. package/dist/render/sideBySide.js.map +1 -0
  94. package/dist/resources/index.d.ts +2 -0
  95. package/dist/resources/index.js +349 -0
  96. package/dist/resources/index.js.map +1 -0
  97. package/dist/server.d.ts +2 -0
  98. package/dist/server.js +22 -0
  99. package/dist/server.js.map +1 -0
  100. package/dist/tools/alternatives.d.ts +2 -0
  101. package/dist/tools/alternatives.js +9 -0
  102. package/dist/tools/alternatives.js.map +1 -0
  103. package/dist/tools/classes.d.ts +2 -0
  104. package/dist/tools/classes.js +13 -0
  105. package/dist/tools/classes.js.map +1 -0
  106. package/dist/tools/collaborations.d.ts +2 -0
  107. package/dist/tools/collaborations.js +8 -0
  108. package/dist/tools/collaborations.js.map +1 -0
  109. package/dist/tools/compare.d.ts +2 -0
  110. package/dist/tools/compare.js +9 -0
  111. package/dist/tools/compare.js.map +1 -0
  112. package/dist/tools/conformance.d.ts +3 -0
  113. package/dist/tools/conformance.js +11 -0
  114. package/dist/tools/conformance.js.map +1 -0
  115. package/dist/tools/diagram.d.ts +2 -0
  116. package/dist/tools/diagram.js +9 -0
  117. package/dist/tools/diagram.js.map +1 -0
  118. package/dist/tools/discovery.d.ts +2 -0
  119. package/dist/tools/discovery.js +23 -0
  120. package/dist/tools/discovery.js.map +1 -0
  121. package/dist/tools/index.d.ts +2 -0
  122. package/dist/tools/index.js +27 -0
  123. package/dist/tools/index.js.map +1 -0
  124. package/dist/tools/init.d.ts +2 -0
  125. package/dist/tools/init.js +9 -0
  126. package/dist/tools/init.js.map +1 -0
  127. package/dist/tools/oop.d.ts +9 -0
  128. package/dist/tools/oop.js +26 -0
  129. package/dist/tools/oop.js.map +1 -0
  130. package/dist/tools/responsibilities.d.ts +2 -0
  131. package/dist/tools/responsibilities.js +13 -0
  132. package/dist/tools/responsibilities.js.map +1 -0
  133. package/dist/tools/state.d.ts +2 -0
  134. package/dist/tools/state.js +8 -0
  135. package/dist/tools/state.js.map +1 -0
  136. package/dist/tools/useCases.d.ts +2 -0
  137. package/dist/tools/useCases.js +18 -0
  138. package/dist/tools/useCases.js.map +1 -0
  139. package/dist/tools/validate.d.ts +2 -0
  140. package/dist/tools/validate.js +9 -0
  141. package/dist/tools/validate.js.map +1 -0
  142. package/dist/tradeoff/engine.d.ts +61 -0
  143. package/dist/tradeoff/engine.js +171 -0
  144. package/dist/tradeoff/engine.js.map +1 -0
  145. package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
  146. package/dist/tradeoff/heuristics/classSplit.js +94 -0
  147. package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
  148. package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
  149. package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
  150. package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
  151. package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
  152. package/dist/tradeoff/heuristics/collectionShape.js +113 -0
  153. package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
  154. package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
  155. package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
  156. package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
  157. package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
  158. package/dist/tradeoff/heuristics/errorHandling.js +110 -0
  159. package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
  160. package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
  161. package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
  162. package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
  163. package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
  164. package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
  165. package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
  166. package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
  167. package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
  168. package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
  169. package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
  170. package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
  171. package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
  172. package/dist/tradeoff/templates.d.ts +2 -0
  173. package/dist/tradeoff/templates.js +33 -0
  174. package/dist/tradeoff/templates.js.map +1 -0
  175. package/dist/util/log.d.ts +1 -0
  176. package/dist/util/log.js +7 -0
  177. package/dist/util/log.js.map +1 -0
  178. package/dist/util/mcp.d.ts +4 -0
  179. package/dist/util/mcp.js +18 -0
  180. package/dist/util/mcp.js.map +1 -0
  181. package/dist/validate/cohesion.d.ts +3 -0
  182. package/dist/validate/cohesion.js +88 -0
  183. package/dist/validate/cohesion.js.map +1 -0
  184. package/dist/validate/collectionWrapper.d.ts +3 -0
  185. package/dist/validate/collectionWrapper.js +131 -0
  186. package/dist/validate/collectionWrapper.js.map +1 -0
  187. package/dist/validate/coupling.d.ts +3 -0
  188. package/dist/validate/coupling.js +47 -0
  189. package/dist/validate/coupling.js.map +1 -0
  190. package/dist/validate/cycle.d.ts +3 -0
  191. package/dist/validate/cycle.js +101 -0
  192. package/dist/validate/cycle.js.map +1 -0
  193. package/dist/validate/dataDuplication.d.ts +3 -0
  194. package/dist/validate/dataDuplication.js +150 -0
  195. package/dist/validate/dataDuplication.js.map +1 -0
  196. package/dist/validate/dependencyDirection.d.ts +3 -0
  197. package/dist/validate/dependencyDirection.js +106 -0
  198. package/dist/validate/dependencyDirection.js.map +1 -0
  199. package/dist/validate/dualUseKnowing.d.ts +3 -0
  200. package/dist/validate/dualUseKnowing.js +137 -0
  201. package/dist/validate/dualUseKnowing.js.map +1 -0
  202. package/dist/validate/emptyObjectFill.d.ts +3 -0
  203. package/dist/validate/emptyObjectFill.js +119 -0
  204. package/dist/validate/emptyObjectFill.js.map +1 -0
  205. package/dist/validate/findings.d.ts +22 -0
  206. package/dist/validate/findings.js +12 -0
  207. package/dist/validate/findings.js.map +1 -0
  208. package/dist/validate/functionDecompositionExcess.d.ts +3 -0
  209. package/dist/validate/functionDecompositionExcess.js +120 -0
  210. package/dist/validate/functionDecompositionExcess.js.map +1 -0
  211. package/dist/validate/functionNotObject.d.ts +3 -0
  212. package/dist/validate/functionNotObject.js +80 -0
  213. package/dist/validate/functionNotObject.js.map +1 -0
  214. package/dist/validate/godObject.d.ts +6 -0
  215. package/dist/validate/godObject.js +76 -0
  216. package/dist/validate/godObject.js.map +1 -0
  217. package/dist/validate/presentationInDomain.d.ts +3 -0
  218. package/dist/validate/presentationInDomain.js +57 -0
  219. package/dist/validate/presentationInDomain.js.map +1 -0
  220. package/dist/validate/primitiveWrapper.d.ts +3 -0
  221. package/dist/validate/primitiveWrapper.js +106 -0
  222. package/dist/validate/primitiveWrapper.js.map +1 -0
  223. package/dist/validate/rules.d.ts +24 -0
  224. package/dist/validate/rules.js +269 -0
  225. package/dist/validate/rules.js.map +1 -0
  226. package/dist/validate/singletonStatefulHolder.d.ts +3 -0
  227. package/dist/validate/singletonStatefulHolder.js +128 -0
  228. package/dist/validate/singletonStatefulHolder.js.map +1 -0
  229. package/dist/validate/strategyAsymmetry.d.ts +3 -0
  230. package/dist/validate/strategyAsymmetry.js +131 -0
  231. package/dist/validate/strategyAsymmetry.js.map +1 -0
  232. package/dist/validate/testability.d.ts +5 -0
  233. package/dist/validate/testability.js +157 -0
  234. package/dist/validate/testability.js.map +1 -0
  235. package/dist/validate/vagueName.d.ts +3 -0
  236. package/dist/validate/vagueName.js +136 -0
  237. package/dist/validate/vagueName.js.map +1 -0
  238. package/dist/validate/validationLocation.d.ts +3 -0
  239. package/dist/validate/validationLocation.js +120 -0
  240. package/dist/validate/validationLocation.js.map +1 -0
  241. package/lessons/STYLE_GUIDE.md +304 -0
  242. 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
  243. 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
  244. 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
  245. 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
  246. 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
  247. 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
  248. 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
  249. package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
  250. 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
  251. 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
  252. 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
  253. 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
  254. 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
  255. 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
  256. 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
  257. 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
  258. 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
  259. 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
  260. 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
  261. 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
  262. 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
  263. 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
  264. 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
  265. 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
  266. 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
  267. 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
  268. 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
  269. 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
  270. 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
  271. 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
  272. 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
  273. 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
  274. 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
  275. 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
  276. 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
  277. 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
  278. 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
  279. 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
  280. 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
  281. 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
  282. 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
  283. 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
  284. 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
  285. 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
  286. 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
  287. 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
  288. 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
  289. 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
  290. 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
  291. 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
  292. 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
  293. 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
  294. 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
  295. 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
  296. 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
  297. 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
  298. 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
  299. 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
  300. 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
  301. 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
  302. 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
  303. 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
  304. 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
  305. 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
  306. 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
  307. 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
  308. 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
  309. 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
  310. 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
  311. 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
  312. 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
  313. 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
  314. 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
  315. 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
  316. 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
  317. 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
  318. 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
  319. 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
  320. 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
  321. 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
  322. 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
  323. 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
  324. 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
  325. 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
  326. 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
  327. 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
  328. 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
  329. 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
  330. 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
  331. 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
  332. 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
  333. 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
  334. 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
  335. 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
  336. 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
  337. 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
  338. 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
  339. 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
  340. 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
  341. 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
  342. 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
  343. 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
  344. 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
  345. 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
  346. 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
  347. 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
  348. 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
  349. 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
  350. 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
  351. 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
  352. 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
  353. 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
  354. 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
  355. 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
  356. 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
  357. 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
  358. 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
  359. 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
  360. 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
  361. 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
  362. 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
  363. 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
  364. 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
  365. 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
  366. 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
  367. 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
  368. 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
  369. 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
  370. 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
  371. 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
  372. 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
  373. 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
  374. 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
  375. 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
  376. 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
  377. 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
  378. package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  379. package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
  380. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
  381. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  382. package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  383. package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
  384. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  385. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
  386. package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
  387. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  388. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
  389. package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  390. package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
  391. package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
  392. package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
  393. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  394. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  395. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  396. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
  397. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
  398. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  399. package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
  400. package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
  401. package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  402. package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  403. package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
  404. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  405. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
  406. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
  407. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
  408. package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
  409. package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  410. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  411. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  412. package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  413. package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
  414. package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  415. package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  416. package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  417. package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  418. package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
  419. package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
  420. package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  421. package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
  422. package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  423. package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  424. package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  425. package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
  426. package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  427. package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  428. package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  429. package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
  430. package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
  431. package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
  432. package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  433. package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  434. package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  435. package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  436. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  437. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
  438. package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  439. package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  440. package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
  441. package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  442. package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  443. package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
  444. package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  445. package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
  446. package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  447. package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  448. package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  449. package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  450. package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  451. package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  452. package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
  453. package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
  454. package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
  455. package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  456. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  457. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
  458. package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  459. package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  460. package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
  461. package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  462. package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  463. package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  464. package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  465. package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  466. package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  467. package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
  468. package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
  469. package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
  470. package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
  471. package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  472. package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  473. package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  474. package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  475. package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
  476. package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
  477. package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  478. package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  479. package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
  480. package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
  481. package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  482. package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  483. package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  484. package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
  485. package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
  486. package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  487. package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  488. package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
  489. package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  490. package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
  491. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  492. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
  493. package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  494. package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  495. package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  496. package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  497. package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  498. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  499. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  500. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  501. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  502. package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  503. package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
  504. package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  505. package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
  506. package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
  507. package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  508. package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
  509. package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
  510. package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
  511. package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  512. package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  513. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  514. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  515. package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  516. package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
  517. package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  518. package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
  519. package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
  520. package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
  521. package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  522. package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
  523. 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
  524. 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
  525. 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
  526. 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
  527. 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
  528. 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
  529. 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
  530. 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
  531. 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
  532. 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
  533. package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
  534. 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
  535. 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
  536. 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
  537. 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
  538. 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
  539. 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
  540. 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
  541. 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
  542. package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
  543. package/lessons/woowacourse-racingcar/README.md +69 -0
  544. 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
  545. 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
  546. 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
  547. package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
  548. 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
  549. 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
  550. 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
  551. 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
  552. 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
  553. package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
  554. 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
  555. 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
  556. 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
  557. 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
  558. 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
  559. package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
  560. 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
  561. 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
  562. 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
  563. 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
  564. 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
  565. 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
  566. 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
  567. 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
  568. 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
  569. 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
  570. 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
  571. 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
  572. 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
  573. 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
  574. 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
  575. package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  576. 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
  577. 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
  578. 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
  579. 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
  580. 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
  581. package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
  582. 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
  583. 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
  584. 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
  585. 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
  586. 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
  587. 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
  588. 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
  589. 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
  590. 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
  591. 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
  592. 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
  593. 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
  594. 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
  595. 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
  596. 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
  597. 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
  598. 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
  599. 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
  600. 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
  601. 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
  602. 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
  603. 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
  604. 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
  605. 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
  606. 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
  607. 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
  608. 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
  609. 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
  610. package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
  611. 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
  612. package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  613. 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
  614. 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
  615. 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
  616. 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
  617. 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
  618. 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
  619. 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
  620. 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
  621. 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
  622. 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
  623. 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
  624. 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
  625. 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
  626. 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
  627. 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
  628. 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
  629. 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
  630. 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
  631. 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
  632. 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
  633. 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
  634. 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
  635. 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
  636. 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
  637. 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
  638. 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
  639. 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
  640. 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
  641. 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
  642. 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
  643. 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
  644. 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
  645. 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
  646. 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
  647. 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
  648. 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
  649. 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
  650. 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
  651. 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
  652. 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
  653. 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
  654. 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
  655. 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
  656. 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
  657. 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
  658. 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
  659. package/package.json +46 -0
  660. package/skills/oh-my-oop/SKILL.md +39 -0
@@ -0,0 +1,691 @@
1
+ # PR #35 — [블랙잭 2단계] 둘리 미션
2
+
3
+ - **Reviewee:** [@hyemdooly](https://github.com/hyemdooly)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/35
5
+ - **단계:** 2단계
6
+ - **리뷰어:** [@galcyurio](https://github.com/galcyurio) — 1단계 #21 동일 reviewer
7
+ - **라인 코멘트:** 13 스레드 — *PR 본문 자가 의문 3개 (judge 함수 분리 / DSL 빌더 / Domain ↔ View 경계) + reviewer 답변 3 자리 (Thread 1·2·3 PR 본문 인용으로 답변) + 고차함수 + Listener 콜백 vs UI 함수 인자 (onXxx 도메인 어휘) + MVC + 고차함수 위배 X (다만 code smell) + 예외 vs 재입력 + 외부글 (medium @elizarov 코틀린 예외 처리) + Domain layer 가장 테스트 쉬움 어휘 + DSL 활용 시점 (한 번 X / 테스트 fixture OK) + RankModel UI layer 한정 모델 + cards private + 일급 컬렉션 의미 보존 + Hand 정보를 Cards 에 위임 + 불필요한 캐스팅 + indent 깊이*
8
+ - **양 단계 완성 reviewee** (1단계 #21 batch 19 분석 완료 + 2단계 #35 = batch 20 추가, 2023년 3월 코호트).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 3개 — 학습 적극성 모범
13
+
14
+ PR 본문:
15
+
16
+ > *"안녕하세요, 리뷰어님! 1단계 피드백을 반영하고 2단계 기능을 구현하였습니다. 제가 봐도 아직 코드가 부족하다고 생각하는데, 혼자 고민해도 어려워서 질문드립니다!*
17
+ >
18
+ > *1. 객체가 일을 해야한다고 생각해서 Player에 판단하는 기능을 넣었는데, judge 함수를 따로 다른 클래스에 빼는 것이 좋을까요?*
19
+ > *2. 컨트롤러나 테스트코드에서 초기화하는 코드가 너무 복잡한 경우 DSL을 이용한 빌더를 작성해주는 것이 좋을까요? (Ex. Controller의 initBetInfo)*
20
+ > *3. CardGame과 컨트롤러의 경계를 어떻게 지어야할지 감이 잘 안옵니다. (...) 저는 도메인에서 View의 함수를 사용하는 일은 피해야한다는 입장입니다! 도메인에서 View의 함수를 사용하는 것이, 도메인에서는 View에서 오는 함수인지 모른다고 할지라도 MVC에 위배되지 않는건가요?"*
21
+
22
+ → **PR 본문 자가 의문 3개 + 학생 자가 한계 인정 + 자가 의견 명시** (3번째 자가 의문에 *학생의 입장* 명시):
23
+
24
+ #### 1.1. *학생 자가 의문 = 의견 + 의문 양립*
25
+
26
+ - **judge 함수 위치**: 학생 *"객체가 일을 해야한다"* (Tell-Don't-Ask 인지) → *Player.judge 자가 적용* + *분리 의문*.
27
+ - **DSL 빌더**: *복잡한 초기화 코드 자가 인식* → *DSL 대안 의문*.
28
+ - **Domain ↔ View 경계 + 고차함수**: 학생 *"도메인에서 View의 함수를 사용하는 일은 피해야한다는 입장입니다!"* → *자가 의견 명시 + 다른 크루 의견 vs 자가 입장 비교*.
29
+
30
+ #### 1.2. *PR 본문 답변 가시성 정공*
31
+
32
+ reviewer 가 *PR 본문 자가 의문 3개에 각각 라인 코멘트로 답변* (Thread 1·2·3) = **PR 본문 자가 의문 답변 가능성 정공**. PR #139 (PR 본문 자가 의문 답변 X) 의 *반대 시점*.
33
+
34
+ **MCP 룰 `pr-body-question-explicit-reviewer-quote` 후보** — *reviewer 가 PR 본문 자가 의문 인용 + 라인 코멘트 답변 = 가시성 정공*.
35
+
36
+ PR #14·#106·#80·#82·#107·#46·#91·#11·#13·#18·#73 결의 *자가 의문 PR 본문* 강화.
37
+
38
+ ### 2. `enum FinalResult(val rate: Double)` 4 멤버 + Profit 책임
39
+
40
+ ```kotlin
41
+ enum class FinalResult(val rate: Double) {
42
+ BLACKJACK_WIN(0.5),
43
+ WIN(1.0),
44
+ PUSH(0.0),
45
+ LOSE(-1.0)
46
+ }
47
+ ```
48
+
49
+ → **블랙잭 4 결과 + 수익률 멤버** = *PR #36·#87·#129·#138 결의 *enum 책임 강화* + *BLACKJACK_WIN 별도 멤버***.
50
+
51
+ 다만 **`BLACKJACK_WIN = 0.5`** = *블랙잭 1.5배 vs 0.5배 도메인 룰 혼동* — *0.5배 = +0.5 추가 (1.5배 - 1.0배)*. **블랙잭 룰 와전 가능**.
52
+
53
+ #### 2.1. *블랙잭 1.5배 도메인 룰*
54
+
55
+ - *블랙잭 1.5배* = *베팅 × 1.5 받음* = *수익 = 베팅 × 0.5 (베팅 외 추가)*.
56
+ - *학생 0.5* = *수익 (베팅 외 추가) 의미* → *수익 모델 정합* 단, *PR #36·#87·#138 의 `BLACKJACK_WIN(1.5)` 와 반대 시점 (베팅 × 1.5 = 총 받음)*.
57
+
58
+ **MCP 룰 `blackjack-payout-vs-profit-model` 후보** — *총 받음 (1.5배) vs 순수익 (0.5배) 모델 양가*.
59
+
60
+ PR #36·#87·#138 (총 받음 모델) vs PR #35 (순수익 모델). **트레이드오프**.
61
+
62
+ #### 2.2. *PUSH (DRAW) 어휘*
63
+
64
+ `PUSH` = *블랙잭 카지노 어휘* (DRAW 의 카지노 용어). PR #20·#28·#125·#147·#65·#92·#36·#87·#138 의 *DRAW* 어휘 와 **반대 시점** (카지노 도메인 어휘 정공).
65
+
66
+ **MCP 룰 `domain-vocabulary-fidelity` 후보** — *PUSH vs DRAW = 도메인 어휘 정확성*.
67
+
68
+ ### 3. `Player.judge(dealer: Dealer): FinalResult` 다형성 — Tell-Don't-Ask + Player 자가 결정
69
+
70
+ ```kotlin
71
+ class Player(hand: Hand, name: Name) : Participant(hand, name) {
72
+ private fun isBlackJackWin(dealer: Dealer): Boolean { ... }
73
+ private fun isWin(dealer: Dealer): Boolean { ... }
74
+ private fun isPush(dealer: Dealer): Boolean { ... }
75
+ private fun isLose(dealer: Dealer): Boolean { ... }
76
+
77
+ fun judge(dealer: Dealer): FinalResult = when {
78
+ isBlackJackWin(dealer) -> FinalResult.BLACKJACK_WIN
79
+ isLose(dealer) -> FinalResult.LOSE
80
+ isWin(dealer) -> FinalResult.WIN
81
+ isPush(dealer) -> FinalResult.PUSH
82
+ else -> FinalResult.LOSE
83
+ }
84
+ }
85
+ ```
86
+
87
+ → **Player 자가 결정 (Tell-Don't-Ask 정공)** + **4 분기 private 메서드 분리** = *각 결과 자가 판단*.
88
+
89
+ reviewer (Thread 1):
90
+
91
+ > *"지금 구현도 좋습니다. 🙂 다만 개인적으로는 객체 자체를 선언하는 것만으로도 의미가 있다고 생각해요. `Map<String, List<String>>`와 같이 사용하는 경우 각각의 타입이 어떤 의미인지를 알 수 없지만 클래스로 선언해두면 이름을 통해 역할을 드러낼 수 있기 때문이에요."*
92
+
93
+ → **reviewer 가 *현재 안 OK* + *별도 클래스도 의미 있음* 2 안 제시** = *학생 자가 선택 권유*. **MCP `oop_propose_alternatives` 핵심 가치 합류**.
94
+
95
+ #### 3.1. *3 가지 트레이드오프*
96
+
97
+ | 안 | 장점 | 단점 |
98
+ |---|---|---|
99
+ | Player.judge (현재) | *Tell-Don't-Ask + Player 책임 명확* | *isWin/isLose/isPush/isBlackJackWin 4개 private 메서드 ↑* |
100
+ | 별도 Judge/Referee 객체 | *판단 책임 분리 + 객체 자체 선언 의미* | *Judge ↔ Player ↔ Dealer 양방향 결합* |
101
+ | State 패턴 (sealed) | *Tell-Don't-Ask + 다형성* | *State 추가 비용* |
102
+
103
+ PR #87·#129·#138 결의 *Tell-Don't-Ask + 외부 객체 vs Participant 메서드* 트레이드오프 와 *반대 시점 정공*.
104
+
105
+ ### 4. `BetInfo(info: Map<Player, Bet>)` 일급 컬렉션 + `operator fun get`
106
+
107
+ ```kotlin
108
+ data class BetInfo(val info: Map<Player, Bet>) {
109
+ operator fun get(player: Player): Bet? = info[player]
110
+ }
111
+ ```
112
+
113
+ → **Bet Map 일급 컬렉션 + Kotlin operator overloading** = *betInfo[player]* 호출 가능. **Kotlin 어휘 자가 활용**.
114
+
115
+ PR #36·#117·#138 결의 *Kotlin 어휘 자가 학습* 어휘 합류.
116
+
117
+ 다만 **`operator fun get` 반환 `Bet?` (nullable)** = *Bet 없을 시 null* → *호출자 nullable 처리 필요*.
118
+
119
+ ### 5. `data class Bet(amount: Int)` + min/max invariant
120
+
121
+ ```kotlin
122
+ data class Bet(val amount: Int) {
123
+ init {
124
+ require(amount in MIN_AMOUNT..MAX_AMOUNT) { AMOUNT_RANGE_ERROR }
125
+ }
126
+
127
+ companion object {
128
+ private const val MIN_AMOUNT = 1000
129
+ private const val MAX_AMOUNT = 1000000
130
+ }
131
+ }
132
+ ```
133
+
134
+ → **Bet 값 객체 + min/max invariant** — *블랙잭 베팅 1000원~1000000원 도메인 룰 자가 적용*. PR #138 (Money MIN_BETTING_MONEY = 1000) 결의 *최소 베팅액 정공* + *최대 베팅액 추가*.
135
+
136
+ **MCP 룰 `domain-range-invariant` 후보** — *도메인 값 범위 invariant 강제*. PR #36·#138·#87 결.
137
+
138
+ ### 6. `GameResult.companion object.of(dealer, betInfos)` + `private constructor`
139
+
140
+ ```kotlin
141
+ class GameResult private constructor(val playersFinalResult: Map<Name, Int>) {
142
+ fun getDealerProfitResult(): Int = playersFinalResult.values.sum() * -1
143
+
144
+ companion object {
145
+ fun of(dealer: Dealer, betInfos: BetInfo): GameResult = ...
146
+ }
147
+ }
148
+ ```
149
+
150
+ → **`private constructor` + companion object factory** = *생성자 외부 노출 X + factory 만 사용*. *Kotlin 어휘 자가 학습*.
151
+
152
+ **MCP 룰 `private-constructor-with-static-factory` 후보**. PR #58 (data class private constructor copy 우회 함정) 결의 *반대 시점 (정공 활용)*.
153
+
154
+ ### 7. `getDealerProfitResult(): Int = playersFinalResult.values.sum() * -1` — 부호 반전 정공
155
+
156
+ reviewer (Thread 7):
157
+
158
+ > *"바로 모두 더해버리는건 어떨까요?*
159
+ > *`fun getDealerProfitResult(): Int = playersFinalResult.values.sum() * -1`"*
160
+
161
+ → **Dealer 수익 = -Players 수익 합** (PR #36 `operator fun not()` 결의 정공). 학생 자가 적용.
162
+
163
+ **MCP 룰 `dealer-profit-as-negated-player-sum` 후보** — *Dealer 수익 = 플레이어 합 부호 반전*. PR #36·#87·#129·#138·#139 누적 6+ PR.
164
+
165
+ ### 8. 추가 칭찬
166
+
167
+ - Thread 5: *"ui layer에서만 쓰기 위한 모델 👍"* — `RankModel` UI layer 한정 모델. **PR #21 (1단계 SuitModel UI layer 미래 권유) 학생 자가 적용**. *학생 자가 학습 시간성 정공*.
168
+ - Thread 12: 학생 *"이해했습니다, 감사합니다!"* — *Domain layer 가장 테스트 쉬움 어휘 학생 자가 수용*.
169
+
170
+ ## 못한 점 (설계 관점)
171
+
172
+ ### 1. Domain ↔ View 경계 — 고차함수 + Listener 정공 vs `show*`/`print*` 함수 인자
173
+
174
+ reviewer (Thread 3 — PR 본문 3번째 자가 의문 답변):
175
+
176
+ > *"고차함수를 받는 것으로는 MVC에 위배되지 않습니다. 위배되지는 않으나 `showXxx()`, `printXxx()`와 같은 이름이라면 code smell로 여겨집니다.*
177
+ >
178
+ > *조금 다르게 생각해보세요.*
179
+ > *- as-is: domain에서 특정 상태가 되면, ui에서 넘어온 함수를 호출한다.*
180
+ > *- to-be: domain에서 특정 상태가 되면, 해당 상태를 외부로 노출한다.*
181
+ >
182
+ > *쉽게 이야기하자면, 외부에서 domain 클래스에 Listener 또는 콜백 함수를 선언할 수 있도록 만들어보라는 뜻입니다. 또는 고차 함수로 받을 수도 있습니다. 또한 `showXxx()`와 같은 UI 중심의 이름이 아닌 `onXxx()` 형태로 domain 중심으로 이름이 지어져야 합니다."*
183
+
184
+ → **고차함수 자체 OK + UI 어휘 (`showXxx`) X + 도메인 어휘 (`onXxx`) OK**:
185
+
186
+ #### 1.1. *학생 코드 검토*
187
+
188
+ 학생의 CardGame:
189
+ ```kotlin
190
+ fun setBets(players: Players, onGetBet: (Name) -> Unit, getBet: () -> Bet): BetInfo = ...
191
+ fun askGetMorePlayersCard(
192
+ players: Players,
193
+ onHit: (Name) -> Unit,
194
+ getAnswer: () -> Boolean,
195
+ onGetPlayerCard: (Player) -> Unit
196
+ ) { ... }
197
+ fun getMoreDealerCard(dealer: Dealer, onHitDealer: () -> Unit) { ... }
198
+ ```
199
+
200
+ → **`onGetBet` / `onHit` / `onGetPlayerCard` / `onHitDealer` 도메인 어휘 자가 적용** = **reviewer 권고 (`onXxx` 형태) 정공**.
201
+
202
+ #### 1.2. *Listener vs 고차함수 vs 상태 노출 3 안*
203
+
204
+ | 안 | 장점 | 단점 |
205
+ |---|---|---|
206
+ | 상태 노출 + 외부 polling (to-be 정공) | *완전 분리 + Domain → UI 의존 X* | *호출자가 매 상태 확인* |
207
+ | Listener interface | *책임 그룹화 + onXxx 일관* | *Adapter 클래스 필요* |
208
+ | 고차함수 (현재) | *호출자가 함수 참조 간결* | *람다 ↑ + 시그니처 분산* |
209
+
210
+ PR #87·#137·#148·#36 결의 *Listener vs 고차함수 vs 상태 노출* 트레이드오프 합류.
211
+
212
+ **MCP 룰 `domain-state-exposure-vs-callback` 강화** 누적 5+ PR (#137·#148·#36·#87·#35).
213
+
214
+ #### 1.3. *외부글 X (다만 reviewer 어휘 풍부)*
215
+
216
+ reviewer 의 *as-is / to-be 어휘 명시* = *학생 자가 학습 가시화*.
217
+
218
+ ### 2. `cards: LinkedList<Card>` private + 일급 컬렉션 의미 보존 (1단계 #21 결 재발)
219
+
220
+ reviewer (Thread 4):
221
+
222
+ > *"`cards`를 private으로 변경해주세요. 외부에서 `cards`를 곧바로 접근할 수 있기 때문에 의도치 않게 값을 변경할 수 있습니다. `cards`를 직접 접근해서 데이터를 꺼내므로 일급컬렉션으로 선언한 의미가 사라져버렸습니다. 조금 boilerplate code라고 느껴지더라도 간접적으로 변경하도록 만들어주세요. 정말 필요한 경우에만 `toList(): List<Card>`와 같은 함수에서 방어적 복사를 한 이후에 노출시켜주세요."*
223
+
224
+ 학생 자가 적용:
225
+
226
+ ```kotlin
227
+ data class Cards(private val cards: LinkedList<Card>) {
228
+ ...
229
+ fun toList(): List<Card> = cards.toList()
230
+ ...
231
+ }
232
+ ```
233
+
234
+ → **1단계 #21 (일급 컬렉션 + 위임 = 나쁜 습관) 결 강화** + **2단계 cards private 자가 적용** = *학습 시간성 정공*.
235
+
236
+ **MCP 룰 `first-class-collection-delegation-pitfall` 강화** 누적 5+ PR (#21·#74·#108·#46·#35).
237
+
238
+ ### 3. 예외 vs 재입력 + 외부글 (medium @elizarov 코틀린 예외 처리)
239
+
240
+ reviewer (Thread 6):
241
+
242
+ > *"잘못된 입력이 들어온 경우 프로그램이 예외가 던져져서 강제 종료되기보다는 재입력을 받도록 만들어보세요.*
243
+ >
244
+ > *다음은 코틀린에서의 예외처리 방식입니다.*
245
+ > *- 논리 오류일 때만 예외를 던지세요. (...)*
246
+ > *- 논리 오류가 아니면 예외를 던지지 말고 null을 반환하세요.*
247
+ > *- 실패하는 경우가 복잡해서 null로 처리할 수 없으면 sealed class를 반환하세요.*
248
+ > *- 일반적인 코틀린 코드에서 `try-catch`를 사용하지 마세요.*
249
+ >
250
+ > *위 사항들의 자세한 설명은 아래 글을 읽어보세요. https://medium.com/@elizarov/kotlin-and-exceptions-8062f589d07"*
251
+
252
+ → **Kotlin 예외 처리 4 원칙 + 외부글 (Elizarov, Kotlin 핵심 개발자)**:
253
+
254
+ #### 3.1. *4 원칙*
255
+
256
+ 1. *논리 오류 → 예외 (전역 catch + 리포팅)*.
257
+ 2. *비논리 오류 → null 반환*.
258
+ 3. *복잡 실패 → sealed class*.
259
+ 4. *일반 try-catch X*.
260
+
261
+ → **Kotlin 어휘 깊은 학습** = *PR #117·#138 (getOrNull 논리오류) 결의 *외부글 + 자가 학습* 강화*.
262
+
263
+ **MCP 룰 `kotlin-exception-handling-strategy` 후보** — *4 원칙 + 외부글 (Elizarov)*. 누적 3+ PR (#129·#138·#35).
264
+
265
+ ### 4. DSL 빌더 활용 시점 — 한 번만 사용 X / 테스트 fixture O
266
+
267
+ reviewer (Thread 2 — PR 본문 2번째 자가 의문 답변):
268
+
269
+ > *"DSL은 주로 여러번 사용되는 public API를 조금 더 가독성있게 사용할 수 있도록 제공하는 별도의 public API라고 볼 수 있습니다. 지금과 같은 경우는 단 한번만 쓰이고 있고 제공하는 API가 bet() 하나라서 쓸 필요는 없어보입니다.*
270
+ >
271
+ > *별개로 테스트 코드 같은 경우에는 불필요한 정보를 제거하거나 fixture를 설정하는 경우 좋은 도구가 될 수 있습니다."*
272
+
273
+ reviewer (Thread 11):
274
+
275
+ > *"DSL은 외부에 드러낼 API를 조금 더 가독성있고 쉽게 작성할 수 있도록 새로운 언어를 만드는 개념이라고 볼 수 있습니다. 지금과 같은 경우에는 굳이 사용해서 얻는 이점이 없고 Builder 내부로 구현이 감추어지기 때문에 가독성도 오히려 좋지 않습니다. 이번 미션에서 DSL을 활용한다면 테스트 코드에서 불필요한 정보를 제거하거나 test fixture를 생성할 때 활용해보면 좋겠어요."*
276
+
277
+ → **DSL 활용 시점 명시**:
278
+
279
+ #### 4.1. *3 가지 시점*
280
+
281
+ | 시점 | 적합? |
282
+ |---|---|
283
+ | 한 번만 사용되는 public API | X — *간결한 함수로 충분* |
284
+ | 여러 번 사용되는 public API + 가독성 | OK — *DSL 가치* |
285
+ | 테스트 fixture 설정 | OK — *불필요한 정보 제거* |
286
+
287
+ **MCP 룰 `dsl-applicability-criteria` 후보** — *DSL 사용 시점 트레이드오프*. PR #58·#137·#148 결의 *수업 적용 욕구 (Builder/DSL 의도 위반)* 결 합류.
288
+
289
+ ### 5. `Hand` 정보를 `Cards` 에 위임 — Tell-Don't-Ask
290
+
291
+ reviewer (Thread 8):
292
+
293
+ > *"정보를 가지고 있는 Cards에서 처리하도록 만들어보세요."*
294
+
295
+ → **정보 가진 곳 = 책임 위치** = Tell-Don't-Ask 정공. PR #138 (ParticipantCards 책임 이동) 결의 *학생 자가 적용*과 같은 어휘.
296
+
297
+ **MCP 룰 `information-locator-as-responsibility` 후보** — *정보 가진 곳 = 책임 위치*.
298
+
299
+ ### 6. 불필요한 캐스팅 (Participants)
300
+
301
+ reviewer (Thread 9): *"불필요한 캐스팅입니다."*
302
+
303
+ → **PR #21 (1단계 unnecessary cast via typed listOf) 결 재발** = *학습 시간성 한계*. **MCP 룰 `unnecessary-cast-via-typed-listOf` 강화** 누적 2+ PR (#21·#35).
304
+
305
+ ### 7. indent 깊이 (GameResult) — 함수 또는 지역 변수 분리
306
+
307
+ reviewer (Thread 10): *"intent가 너무 깊습니다. 함수 또는 지역 변수로 분리해보세요."*
308
+
309
+ → **PR #129 (depth ≥2 자가 인식) 결과 같은 어휘** — *함수/지역 변수 분리*. **MCP 룰 `indent-depth-reduction` 후보** — *indent 깊이 = 함수/지역 변수 분리*.
310
+
311
+ ### 8. `Player.judge` private 메서드 4개 분기 중복 (isBlackJackWin/isWin/isPush/isLose)
312
+
313
+ ```kotlin
314
+ private fun isBlackJackWin(dealer: Dealer): Boolean = when { !dealer.isBlackJack() && isBlackJack() -> true; else -> false }
315
+ private fun isWin(dealer: Dealer): Boolean = when { !isBust() && dealer.isBust() -> true; !dealer.isBlackJack() && isBlackJack() -> true; ... }
316
+ private fun isPush(dealer: Dealer): Boolean = ...
317
+ private fun isLose(dealer: Dealer): Boolean = ...
318
+ ```
319
+
320
+ → **4 메서드 분기 중복** = *judge 의 when 분기와 동일 조건 반복*. *boolean 메서드 4개 = N 개 분기 평탄화 시 동일 조건 반복*.
321
+
322
+ 대안: **`judge` 안에서 직접 when 분기** (private 메서드 분리 X) — *함수 분리가 *추상화 의도 X*** (PR #117 `function-decomposition-creates-identity` 결).
323
+
324
+ **MCP 룰 `boolean-method-decomposition-redundancy` 후보** — *Boolean 메서드 N개 분리 = when 분기 중복*. PR #117 결.
325
+
326
+ ### 9. `Player.isHit() = !isBust() && (hand.sum() != BLACKJACK_POINT)` — 21 정확 시 stop
327
+
328
+ ```kotlin
329
+ override fun isHit(): Boolean = !isBust() && (hand.sum() != BLACKJACK_POINT)
330
+ ```
331
+
332
+ → **Player 21 정확 시 stop** = *PR #129·#138·#139 의 *21 시 hit 가능 (≤)* 와 **반대 시점 (21 시 stop)***. **블랙잭 룰 정공** — *21 = 블랙잭 = stop 자가 결정*.
333
+
334
+ **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 13+ PR ⭐⭐⭐. *21 시 hit X 자가 결정* 정공.
335
+
336
+ ### 10. `Dealer.isHit() = hand.sum() < HIT_STANDARD_POINT` (`< 17`) — 16 시 hit 정공
337
+
338
+ ```kotlin
339
+ override fun isHit(): Boolean = hand.sum() < HIT_STANDARD_POINT // < 17
340
+
341
+ companion object {
342
+ private const val HIT_STANDARD_POINT = 17
343
+ }
344
+ ```
345
+
346
+ → **`< 17` = 16 시 hit, 17 시 stop** = *블랙잭 표준 룰 정공*. PR #138 (16 ≤ hit) 결과 같은 의미. PR #129 (`<` 16 vs `<= 16`) 결의 *반대 시점*.
347
+
348
+ **`HIT_STANDARD_POINT = 17`** 명명 = *17 부터 stop 의미 명확* — **PR #129·#138 의 `DEALER_MAX_SCORE = 16` 명명 양가성 (16 vs 17 기준) 반대 시점 정공**.
349
+
350
+ **MCP 룰 `dealer-stand-threshold-naming` 후보** — *HIT_STANDARD vs MAX_SCORE 명명 정확성*.
351
+
352
+ ### 11. `CardGame.askGetMorePlayersCard` 람다 4개 인자 — 콜백 폭증
353
+
354
+ ```kotlin
355
+ fun askGetMorePlayersCard(
356
+ players: Players,
357
+ onHit: (Name) -> Unit,
358
+ getAnswer: () -> Boolean,
359
+ onGetPlayerCard: (Player) -> Unit
360
+ ) { ... }
361
+ ```
362
+
363
+ → **람다 인자 4 개 = 콜백 폭증 + 시그니처 ↑**. PR #36·#87 결의 *Listener vs 고차함수 트레이드오프* 일관.
364
+
365
+ 대안: **PlayerActionListener interface** (PR #148 결):
366
+ ```kotlin
367
+ interface PlayerTurnListener {
368
+ fun onHit(name: Name)
369
+ fun getAnswer(): Boolean
370
+ fun onGetPlayerCard(player: Player)
371
+ }
372
+ ```
373
+
374
+ **MCP 룰 `callback-lambda-explosion` 후보** — *람다 인자 ≥3 = Listener 후보*.
375
+
376
+ ### 12. `Bet` 의 `MAX_AMOUNT = 1000000` — 임의 도메인 룰
377
+
378
+ ```kotlin
379
+ companion object {
380
+ private const val MIN_AMOUNT = 1000
381
+ private const val MAX_AMOUNT = 1000000
382
+ private const val AMOUNT_RANGE_ERROR = "배팅 금액은 1000원부터 1000000원까지 가능합니다."
383
+ }
384
+ ```
385
+
386
+ → **`MAX_AMOUNT = 1000000` 임의 결정** — *블랙잭 도메인 룰 X*. **MCP 룰 `domain-rule-arbitrary-constant` 강화** 누적 2+ PR (#138·#35).
387
+
388
+ ### 13. `BetInfo.get(player): Bet?` nullable 반환 — null 처리 강제
389
+
390
+ ```kotlin
391
+ operator fun get(player: Player): Bet? = info[player]
392
+ ```
393
+
394
+ → **Bet 없을 시 null 반환** = *호출자 nullable 처리 강제*. PR #138 *getOrNull = 논리오류 즉시 감지* 결 합류.
395
+
396
+ **MCP 룰 `get-vs-getOrNull-exception-timing` 강화** 누적 2+ PR (#138·#35).
397
+
398
+ ### 14. `Cards.LinkedList<Card>` 자료구조 (1단계 #21 reviewer 권유 자가 적용)
399
+
400
+ ```kotlin
401
+ data class Cards(private val cards: LinkedList<Card>) {
402
+ ...
403
+ constructor(cards: List<Card>) : this(LinkedList(cards))
404
+ fun pop(): Card = cards.pop() // ← O(1)
405
+ }
406
+ ```
407
+
408
+ → **PR #21 (1단계 LinkedList 권유) 학생 자가 적용** = *학습 시간성 정공*. **MCP 룰 `data-structure-choice-deck` 강화** 누적 5+ PR (#21·#58·#23·#26·#35).
409
+
410
+ ### 15. `Cards.sum()` Ace 분리 합산 — 2 단계 filterSum
411
+
412
+ ```kotlin
413
+ fun sum(): Int {
414
+ var sum = filterSum { it != Rank.ACE }
415
+ sum = filterSum(sum) { it == Rank.ACE }
416
+ return sum
417
+ }
418
+
419
+ private fun filterSum(score: Int = 0, condition: (Rank) -> Boolean): Int {
420
+ var sum = score
421
+ cards.toList().filter { condition(it.rank) }.forEach {
422
+ sum += it.rank.getScore(sum)
423
+ }
424
+ return sum
425
+ }
426
+ ```
427
+
428
+ → **Ace 분리 합산 + filterSum 일반화** — *PR #21 (1단계 `Cards.sum`) 결 동일* + *2 단계 filterSum 함수 분리* = *PR #117 (function-decomposition-excess) 결의 *반대 시점 (의미 있는 추출)***.
429
+
430
+ **MCP 룰 `ace-bonus-multi-pass-vs-math-formula` 후보** — *2 단계 filterSum vs 수학적 단일 식 (PR #117 결)*.
431
+
432
+ ### 16. `GameResult` 의 `private constructor` — 외부 생성 차단
433
+
434
+ §6 참조. *Kotlin 어휘 자가 활용 정공*.
435
+
436
+ ### 17. `CardGame.bulidPlayers` 오타 (`buildPlayers` 가 정상)
437
+
438
+ ```kotlin
439
+ private fun bulidPlayers(names: Names) = buildList { ... }
440
+ ```
441
+
442
+ → **오타 `bulidPlayers`** (build → bulid). PR #87 (Aginst), PR #117·#139 (isBackJack) 결 합류. **MCP 룰 `english-spelling-naming` 강화** 누적 3+ PR.
443
+
444
+ ### 18. `pickTwice` `setUp` `setDealer` `setPlayers` 명명 양가
445
+
446
+ - `setUp(names)`: *Participants 초기화 (반환 = Participants)*. `set` prefix = *Java getter/setter 어휘*. *코틀린 어휘 양가*.
447
+ - `setDealer()`, `setPlayers(names)`: *Dealer/Players 인스턴스 *생성 (`Dealer(...)` `Players(...)`)*. *`create*` 또는 `make*` 가 정공*.
448
+
449
+ 대안:
450
+ - `setUp` → `initialize` / `start`.
451
+ - `setDealer` → `createDealer`.
452
+ - `setPlayers` → `createPlayers`.
453
+
454
+ **MCP 룰 `set-prefix-vs-create-prefix` 후보** — *Java setter 어휘 vs Kotlin 어휘*.
455
+
456
+ ### 19. `RankModel` UI layer 한정 모델 — PR #21 미래 권유 자가 적용
457
+
458
+ 1단계 #21 reviewer (Thread 12): *"조금 더 고도화해본다면 ui layer에서만 사용하는 SuitModel을 만들고 해당 클래스에서 UI를 제공하도록 만드는 방법도 있습니다. 이 방식은 이번 미션에서는 적용하지 않아도 좋지만 추후 안드로이드에서 자주 쓰이는 방식이니 미리 인지해두시면 좋겠어요."*
459
+
460
+ → 학생 2단계 #35 자가 적용 (RankModel) = **학습 시간성 정공**. reviewer 칭찬 (Thread 5).
461
+
462
+ **MCP 룰 `ui-layer-model-separation` 강화** 누적 2+ PR (#21·#35).
463
+
464
+ ### 20. CardGame ↔ Controller 경계 학생 자가 학습 + Domain layer 가장 테스트 쉬움 어휘
465
+
466
+ reviewer (Thread 12):
467
+
468
+ > *"각 layer의 역할을 침범하지만 않는다면, 지금처럼 최대한 domain layer로 관련 로직을 옮겨주면 좋습니다. 그 이유는 domain layer가 가장 테스트하기 쉬운 layer이기 때문입니다.*
469
+ >
470
+ > *presentation layer에 해당하는 controller에 대한 테스트 코드와 ui layer에 해당하는 InputView, OutputView에 대한 테스트 코드를 작성해야 한다고 생각해보면 왜 domain layer로 옮겨야 하는지 이해하기 쉬울거에요."*
471
+
472
+ 학생: *"이해했습니다, 감사합니다!"*
473
+
474
+ → **Domain layer 가장 테스트 쉬움 어휘** = **PR #87 (테스트 = 객체 설계 명세서) + PR #129 (테스트 가능성 = 객체 설계 지표) 결 합류**.
475
+
476
+ **MCP 룰 `domain-layer-testability-priority` 후보** — *Domain layer = 가장 테스트 쉬움 → 로직 우선 위치*.
477
+
478
+ ### 21. `Participant.isBlackJack() = (hand.size == 2) && (hand.sum() == BLACKJACK_POINT)` — 정공
479
+
480
+ ```kotlin
481
+ fun isBlackJack(): Boolean = (hand.size == 2) && (hand.sum() == BLACKJACK_POINT)
482
+ ```
483
+
484
+ → **블랙잭 = 초기 2장 + 21점 정공** = PR #138·#129·#36·#87 결의 *isBlackJack* 룰 정공.
485
+
486
+ 다만 **PR #139 reviewer (woowahan-dino) Thread 3 *short-circuit evaluation*** 어휘 적용:
487
+ - `(hand.size == 2) && (hand.sum() == BLACKJACK_POINT)` = *hand.size cheap 먼저 + sum 계산 비용 뒤* = **short-circuit 정공**.
488
+
489
+ PR #139 결 강화.
490
+
491
+ ### 22. `CardGame.getMoreDealerCard` while 루프 — 재귀 X
492
+
493
+ ```kotlin
494
+ fun getMoreDealerCard(dealer: Dealer, onHitDealer: () -> Unit) {
495
+ while (dealer.isHit()) {
496
+ onHitDealer()
497
+ dealer.pick(cardPack)
498
+ }
499
+ }
500
+ ```
501
+
502
+ → **while 루프 (재귀 X)** = *PR #138 (Player.choice 재귀, ShuffledDeck.pop 재귀) 결의 *반대 시점 (명령형)***.
503
+
504
+ reviewer 명시 X — *현재 안 OK*.
505
+
506
+ ### 23. `getName` 으로 넘기지 말고 UI layer 재입력 처리
507
+
508
+ reviewer (Thread 13):
509
+
510
+ > *"`getName()`으로 넘기기보다는 UI layer에서 재입력을 받도록 처리하고 domain layer에서는 올바른 입력만 들어오도록 만들어보세요. domain에서는 ui를 알지 못해야하지만 ui 에서는 domain을 알아도 됩니다. 이 점을 활용해보세요."*
511
+
512
+ → **재입력 = UI layer 책임 + Domain layer = 올바른 입력만 받음** = *MVC 정공*. **MCP 룰 `model-view-dependency-direction` 강화** 누적 10+ PR ⭐⭐⭐.
513
+
514
+ #### 23.1. *대안 (UI ↔ Domain 의존 방향)*
515
+
516
+ | 안 | Domain | UI |
517
+ |---|---|---|
518
+ | Domain 가 재입력 (학생 초안) | *Domain 이 invalid input + 재입력 + 검증 모두* | *수동적* |
519
+ | UI 재입력 + Domain 검증 (정공) | *Domain 은 valid 만 받음* | *UI 가 재입력 루프 + 검증 호출* |
520
+
521
+ **MCP 룰 `retry-loop-locator-ui-vs-domain` 후보** — *재입력 위치 = UI*.
522
+
523
+ ## 리뷰어 의견 요지
524
+
525
+ - **PR 본문 자가 의문 3개에 라인 코멘트로 답변 (Thread 1·2·3)** — *judge 분리 / DSL 빌더 / Domain↔View 경계*.
526
+ - **judge 함수 = 현재 OK + 객체 자체 선언 의미 (Map<String, List<String>> vs 클래스)** — *2 안 제시 + 학생 자가 선택*.
527
+ - **DSL 활용 시점 = 여러 번 사용 + 가독성 + 테스트 fixture** — *한 번만 사용 X*.
528
+ - **고차함수 + Listener 정공 + `onXxx` 도메인 어휘 + `showXxx` code smell** — *as-is/to-be 어휘*.
529
+ - **Domain ↔ View 경계 = 상태 노출 정공 (외부 polling)** — *Listener 또는 고차함수 + 도메인 어휘*.
530
+ - **cards private + 일급 컬렉션 의미 + toList 방어적 복사** — *1단계 #21 결 재발*.
531
+ - **Kotlin 예외 처리 4 원칙 + 외부글 (Elizarov)** — *논리 오류 / null / sealed / try-catch X*.
532
+ - **DealerProfit = playerProfits.sum() * -1** — *부호 반전 정공*.
533
+ - **정보 가진 곳 = 책임 위치 (Hand → Cards)** — *Tell-Don't-Ask*.
534
+ - **불필요한 캐스팅** — 1단계 결 재발.
535
+ - **indent 깊이 = 함수/지역 변수 분리**.
536
+ - **DSL 외부 드러낼 API + Builder 내부 구현 감춤**.
537
+ - **Domain layer 가장 테스트 쉬움 = 로직 우선 위치**.
538
+ - **getName 으로 넘기지 말고 UI layer 재입력 + Domain 은 valid 만**.
539
+ - **RankModel UI layer 한정 모델 칭찬 (1단계 #21 미래 권유 자가 적용)**.
540
+
541
+ ## 대표 인용
542
+
543
+ > [hyemdooly PR 본문]
544
+ > *"객체가 일을 해야한다고 생각해서 Player에 판단하는 기능을 넣었는데, judge 함수를 따로 다른 클래스에 빼는 것이 좋을까요?"*
545
+
546
+ → **학생 자가 의문 = Tell-Don't-Ask 인지 + 분리 의문 양립**.
547
+
548
+ > [hyemdooly PR 본문]
549
+ > *"저는 도메인에서 View의 함수를 사용하는 일은 피해야한다는 입장입니다! 도메인에서 View의 함수를 사용하는 것이, 도메인에서는 View에서 오는 함수인지 모른다고 할지라도 MVC에 위배되지 않는건가요?"*
550
+
551
+ → **학생 자가 의견 명시 + 의문 양립** — *자가 입장 + 의문 표현 모범*.
552
+
553
+ > [galcyurio Thread 1]
554
+ > *"지금 구현도 좋습니다. 🙂 다만 개인적으로는 객체 자체를 선언하는 것만으로도 의미가 있다고 생각해요. `Map<String, List<String>>`와 같이 사용하는 경우 각각의 타입이 어떤 의미인지를 알 수 없지만 클래스로 선언해두면 이름을 통해 역할을 드러낼 수 있기 때문이에요."*
555
+
556
+ → **`Map<String, List<String>>` 타입 누수 vs 클래스 선언 의미** = *PR #36·#117 (tuple 누수) 결의 강화*.
557
+
558
+ > [galcyurio Thread 3]
559
+ > *"고차함수를 받는 것으로는 MVC에 위배되지 않습니다. 위배되지는 않으나 `showXxx()`, `printXxx()`와 같은 이름이라면 code smell로 여겨집니다. (...) 외부에서 domain 클래스에 Listener 또는 콜백 함수를 선언할 수 있도록 만들어보라는 뜻입니다. (...) `showXxx()`와 같은 UI 중심의 이름이 아닌 `onXxx()` 형태로 domain 중심으로 이름이 지어져야 합니다."*
560
+
561
+ → **고차함수 자체 OK + `onXxx` 도메인 어휘 정공** + **as-is / to-be 어휘**. **MCP 핵심 가치 합류**.
562
+
563
+ > [galcyurio Thread 6]
564
+ > *"논리 오류일 때만 예외를 던지세요. (...) 논리 오류가 아니면 예외를 던지지 말고 null을 반환하세요. (...) 실패하는 경우가 복잡해서 null로 처리할 수 없으면 sealed class를 반환하세요. (...) 일반적인 코틀린 코드에서 `try-catch`를 사용하지 마세요."*
565
+
566
+ → **Kotlin 예외 처리 4 원칙 + 외부글 (Elizarov, Kotlin 핵심 개발자)** — *깊은 어휘 인용*.
567
+
568
+ > [galcyurio Thread 12]
569
+ > *"각 layer의 역할을 침범하지만 않는다면, 지금처럼 최대한 domain layer로 관련 로직을 옮겨주면 좋습니다. 그 이유는 domain layer가 가장 테스트하기 쉬운 layer이기 때문입니다."*
570
+
571
+ → **Domain layer = 가장 테스트 쉬움 어휘** = *PR #87·#129 결 합류*.
572
+
573
+ > [galcyurio Thread 13]
574
+ > *"domain에서는 ui를 알지 못해야하지만 ui 에서는 domain을 알아도 됩니다. 이 점을 활용해보세요."*
575
+
576
+ → **MVC 의존 방향 정공 어휘** — *UI → Domain OK, Domain → UI X*.
577
+
578
+ ## 얻은 교훈 (보편)
579
+
580
+ 1. **PR 본문 자가 의문 3개 + reviewer 가 PR 본문 인용 + 라인 코멘트 답변** — *PR 본문 자가 의문 답변 가시성 정공*. **MCP 룰 `pr-body-question-explicit-reviewer-quote` 후보**. PR #139 (PR 본문 자가 의문 답변 X) 반대 시점.
581
+
582
+ 2. **객체 자체 선언 의미 (Map<String, List<String>> vs 클래스)** — *타입 누수 vs 도메인 객체*. **MCP 룰 `tuple-leak-vs-domain-dto` 강화** 누적 4+ PR.
583
+
584
+ 3. **DSL 활용 시점 (여러 번 + 테스트 fixture)** — *한 번만 사용 X*. **MCP 룰 `dsl-applicability-criteria` 후보**.
585
+
586
+ 4. **고차함수 + `onXxx` 도메인 어휘 정공 + as-is / to-be 어휘** — *고차함수 자체 OK + UI 어휘 X*. **MCP 룰 `domain-state-exposure-vs-callback` 강화** 누적 5+ PR.
587
+
588
+ 5. **Kotlin 예외 처리 4 원칙 + 외부글 (Elizarov)** — *논리 오류 / null / sealed / try-catch X*. **MCP 룰 `kotlin-exception-handling-strategy` 후보** 누적 3+ PR.
589
+
590
+ 6. **Dealer 수익 = Players 합 부호 반전** — *PR #36 결*. **MCP 룰 `dealer-profit-as-negated-player-sum` 강화** 누적 6+ PR.
591
+
592
+ 7. **정보 가진 곳 = 책임 위치 (Hand → Cards)** — *Tell-Don't-Ask 정공*. **MCP 룰 `information-locator-as-responsibility` 후보**.
593
+
594
+ 8. **불필요한 캐스팅 1단계 → 2단계 재발** — *학습 시간성 한계*. **MCP 룰 `unnecessary-cast-via-typed-listOf` 강화** 누적 2+ PR.
595
+
596
+ 9. **indent 깊이 = 함수/지역 변수 분리** — **MCP 룰 `indent-depth-reduction` 후보**.
597
+
598
+ 10. **Boolean 메서드 N개 분리 = when 분기 중복** — *4 boolean 메서드 vs 1 when*. **MCP 룰 `boolean-method-decomposition-redundancy` 후보**.
599
+
600
+ 11. **RankModel UI layer 한정 모델 (PR #21 1단계 미래 권유 자가 적용)** — *학습 시간성 정공*. **MCP 룰 `ui-layer-model-separation` 강화** 누적 2+ PR.
601
+
602
+ 12. **Domain layer = 가장 테스트 쉬움 = 로직 우선 위치** — *PR #87·#129 결 합류*. **MCP 룰 `domain-layer-testability-priority` 후보**.
603
+
604
+ 13. **UI 재입력 + Domain 검증 = MVC 의존 방향 정공** — *Domain → UI X, UI → Domain OK*. **MCP 룰 `retry-loop-locator-ui-vs-domain` 후보**.
605
+
606
+ 14. **블랙잭 0.5 vs 1.5 모델 (순수익 vs 총 받음)** — *블랙잭 1.5배 정확성 양가성*. **MCP 룰 `blackjack-payout-vs-profit-model` 후보**.
607
+
608
+ 15. **PUSH vs DRAW 도메인 어휘** — *카지노 블랙잭 정확 어휘*. **MCP 룰 `domain-vocabulary-fidelity` 후보**.
609
+
610
+ 16. **Player 21 정확 시 stop 자가 결정 (`!= BLACKJACK_POINT`)** — *블랙잭 룰 정공*. PR #129·#138·#139 의 *21 시 hit 가능* 반대 시점. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 13+ PR ⭐⭐⭐.
611
+
612
+ 17. **Dealer 16 시 hit / 17 시 stop (`< 17`)** — *블랙잭 표준 룰 정공*. **MCP 룰 `dealer-stand-threshold-naming` 후보**.
613
+
614
+ 18. **private constructor + companion object factory** — *Kotlin 어휘 정공*. **MCP 룰 `private-constructor-with-static-factory` 후보**.
615
+
616
+ 19. **`set` prefix vs `create` prefix** — *Java setter 어휘 vs Kotlin 어휘*. **MCP 룰 `set-prefix-vs-create-prefix` 후보**.
617
+
618
+ 20. **블랙잭 베팅 1000-1000000 임의 도메인 룰** — *임의 max 값*. **MCP 룰 `domain-rule-arbitrary-constant` 강화** 누적 2+ PR.
619
+
620
+ 21. **Ace 분리 합산 + filterSum 함수 분리 (의미 있는 추출)** — *PR #117 function-decomposition-creates-identity 반대 시점*. **MCP 룰 `ace-bonus-multi-pass-vs-math-formula` 후보**.
621
+
622
+ 22. **2 reviewer (galcyurio + woowahan-dino) 의 *delegation 어휘 차이*** — *PR #21 galcyurio = 위임 = 나쁜 습관 / PR #117 woowahan-dino = delegation 권유* (이미 batch 19 발견).
623
+
624
+ ## 얻은 교훈 (도메인)
625
+
626
+ 1. **블랙잭 PUSH (DRAW의 카지노 어휘)** — *도메인 어휘 정확성*.
627
+
628
+ 2. **블랙잭 베팅 범위 (1000원~1000000원 임의)** — *최소/최대 invariant + 임의 값*.
629
+
630
+ 3. **`BLACKJACK_WIN = 0.5` (순수익 모델)** — *블랙잭 1.5배 = 베팅 × 1.5 받음 = 수익 = 베팅 × 0.5*. PR #36·#87·#138 의 *총 받음 모델* 반대 시점.
631
+
632
+ 4. **Player 21 정확 시 stop 자가 결정** — *블랙잭 룰 정공*. PR #129·#138 의 *21 시 hit (≤)* 반대 시점.
633
+
634
+ 5. **Dealer 16 시 hit / 17 시 stop (`HIT_STANDARD_POINT = 17`)** — *명명 정확성*.
635
+
636
+ 6. **Ace 1↔11 양가성 + filterSum 2 단계 합산** — *PR #21 1단계 결 유지*.
637
+
638
+ 7. **카드 중복 invariant 양쪽 검증 (init + add)** — *PR #21 1단계 결 유지*.
639
+
640
+ ## MCP 룰 후보 신규 + 강화 (PR #35)
641
+
642
+ | 룰 | 신규 / 강화 | 누적 PR |
643
+ |---|---|---|
644
+ | `pr-body-question-explicit-reviewer-quote` | 신규 | 1 (#35) — PR #139 반대 시점 |
645
+ | `dsl-applicability-criteria` | 신규 | 1 (#35) |
646
+ | `domain-state-exposure-vs-callback` | 강화 | 5+ (#137·#148·#36·#87·#35) |
647
+ | `kotlin-exception-handling-strategy` | 신규 | 3+ (#129·#138·#35) |
648
+ | `dealer-profit-as-negated-player-sum` | 강화 | 6+ (#36·#87·#129·#138·#139·#35) |
649
+ | `information-locator-as-responsibility` | 신규 | 1 (#35) |
650
+ | `indent-depth-reduction` | 신규 | 1 (#35) |
651
+ | `boolean-method-decomposition-redundancy` | 신규 | 1 (#35) |
652
+ | `ui-layer-model-separation` | 강화 | 2+ (#21·#35) |
653
+ | `domain-layer-testability-priority` | 신규 | 1 (#35) |
654
+ | `retry-loop-locator-ui-vs-domain` | 신규 | 1 (#35) |
655
+ | `blackjack-payout-vs-profit-model` | 신규 | 1 (#35) |
656
+ | `domain-vocabulary-fidelity` | 신규 | 1 (#35) |
657
+ | `blackjack-rule-fidelity-comparison` | 강화 | 13+ ⭐⭐⭐ |
658
+ | `dealer-stand-threshold-naming` | 신규 | 1 (#35) |
659
+ | `private-constructor-with-static-factory` | 신규 | 1 (#35) |
660
+ | `set-prefix-vs-create-prefix` | 신규 | 1 (#35) |
661
+ | `domain-rule-arbitrary-constant` | 강화 | 2+ (#138·#35) |
662
+ | `ace-bonus-multi-pass-vs-math-formula` | 신규 | 1 (#35) |
663
+ | `first-class-collection-delegation-pitfall` | 강화 | 5+ |
664
+ | `unnecessary-cast-via-typed-listOf` | 강화 | 2+ (#21·#35) |
665
+ | `english-spelling-naming` | 강화 | 3+ |
666
+ | `callback-lambda-explosion` | 신규 | 2+ (#35·#36) |
667
+ | `tuple-leak-vs-domain-dto` | 강화 | 4+ |
668
+ | `data-structure-choice-deck` | 강화 | 5+ |
669
+
670
+ ## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점 유지)
671
+
672
+ - ***PR 본문 자가 의문 3개 + reviewer 가 PR 본문 인용 + 라인 코멘트 답변*** — galcyurio PR #35 — **PR 본문 자가 의문 답변 가시성 정공** = *PR #139 (PR 본문 답변 X) 반대 시점*.
673
+ - ***`Map<String, List<String>>` vs 클래스 선언 의미*** — galcyurio PR #35 — *Tuple 누수 vs 도메인 객체 어휘*.
674
+ - ***as-is / to-be 어휘*** — galcyurio PR #35 — *Domain → UI 호출 (as-is) vs 상태 노출 (to-be)* + *onXxx 도메인 어휘*.
675
+ - ***Kotlin 예외 처리 4 원칙 + 외부글 (Elizarov)*** — galcyurio PR #35 — *Kotlin 핵심 개발자 외부글 인용*.
676
+ - ***Domain layer 가장 테스트 쉬움*** — galcyurio PR #35 — *PR #87·#129 (테스트 = 객체 설계 명세서) 결 합류*.
677
+ - ***UI 재입력 + Domain 검증 = MVC 의존 방향 정공*** — galcyurio PR #35 — *Domain → UI X, UI → Domain OK*.
678
+ - ***DSL 활용 시점 명시 (여러 번 + 테스트 fixture)*** — galcyurio PR #35 — *한 번만 사용 X*.
679
+
680
+ → **13 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **galcyurio (PR #21 + #35) 어휘 합류 = 메타 어휘 깊이 정점**.
681
+
682
+ ## 비교 (PR #21 → #35 진화 — 사족 X, 안티패턴 명시만)
683
+
684
+ - **1단계 #21 자가 의문 0개 → 2단계 #35 PR 본문 자가 의문 3개** — *학생 자가 의문 정점 진화*.
685
+ - **1단계 #21 일급 컬렉션 + 위임 권유 → 2단계 #35 cards private 자가 적용** — *학습 시간성 정공*.
686
+ - **1단계 #21 LinkedList 권유 → 2단계 #35 LinkedList 자가 적용** — *학습 시간성 정공*.
687
+ - **1단계 #21 SuitModel UI layer 미래 권유 → 2단계 #35 RankModel UI layer 자가 적용** — *학습 시간성 정공*.
688
+ - **1단계 #21 불필요한 캐스팅 → 2단계 #35 불필요한 캐스팅 재발** — *학습 시간성 한계*.
689
+ - **1단계 #21 단순 PR 본문 → 2단계 #35 자가 의문 3개 + 자가 의견 명시** — *학생 자가 의문 진화*.
690
+
691
+ → *진화 비교 = 사족 아님 (안티패턴 코드 위치 명시)* + *학생 자가 학습 정점 + 일부 한계 (캐스팅 재발)*.