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,845 @@
1
+ # PR #138 — [블랙잭 2단계] 비비 미션
2
+
3
+ - **Reviewee:** [@rosemin928](https://github.com/rosemin928)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/138
5
+ - **단계:** 2단계
6
+ - **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 1단계 #129 동일 reviewer
7
+ - **라인 코멘트:** 20 스레드 — *PR 본문 자가 의문 2개 (8 덱 도메인 룰 자가 학습 + ParticipantCards 책임 이동) + getResult 다형성 + super 키워드 (4 스레드 학습) + value class + @JvmInline 자가 학습 + 재귀 함수 (tailrec) + BlackJackTable 형식 규칙 부산물 자가 인정 + 디미터 법칙 (외부글) + getOrNull 논리오류 처리 + 8 덱 도메인 룰 적용 + 캐싱 (companion lazy) + 인스턴스 변수 2개 묶음 (name+money vs name+cards) 자가 의문*
8
+ - **양 단계 완성 reviewee** (1단계 #129 batch 19 분석 완료 + 2단계 #138 = batch 20 추가).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 2개 (2025 코호트 자가 학습 정점)
13
+
14
+ #### 1.1. *8 덱 도메인 룰 자가 학습*
15
+
16
+ PR 본문:
17
+
18
+ > *"1단계 merge하며 주신 리뷰 중 `deck을 전부 사용했을 때 어떻게 할 것인가?`를 고민하다가 **블랙잭의 최대 플레이 인원은 8명이다**, **블랙잭은 총 8개의 덱을 사용한다**라는 규칙이 있다는 것을 알게 되었습니다. 따라서 이 도메인 규칙에 따라 Deck 로직을 수정하였습니다! pop 로직을 바꾸지 않으려 해봤지만 결국 바꾸는 방향으로 가게 되었습니다...! 수정한 Deck에 대해 어떻게 생각하시는지 궁금합니다!"*
19
+
20
+ → **학생 자가 도메인 룰 학습 + 코드 자가 수정**:
21
+ - 1단계 #129 reviewer (Thread 20) *"deck.pop 예외 처리 = 게임 종료 흐름"* 의문 → 학생 자가 도메인 학습.
22
+ - **블랙잭 카지노 룰 = 8 덱** 자가 학습 + `MAX_DECK_COUNT = 8` 적용.
23
+
24
+ **MCP `oh-my-oop` *학습 = 시간 두고 반복* 어휘 정점** — *reviewer 한 마디 의문 → 학생 자가 도메인 학습 → 코드 자가 수정 (1단계 → 2단계 사이 학습)*. PR #58 (otter66 *카지노 6덱 메타포 vs 요구사항*) 결의 *반대 시점 (실제 8덱)*. **MCP 룰 `multi-deck-domain-rule` 강화**.
25
+
26
+ #### 1.2. *ParticipantCards 책임 이동 자가 의문*
27
+
28
+ PR 본문:
29
+
30
+ > *"이번에 각 객체들의 역할과 책임에 대해 고민해보다가 `isBust`, `isBlackJack`, `finalScore` 이 세 가지 함수를 ParticipantCards로 옮기게 되었습니다. 위의 3가지를 각 참여자가 가진 카드들의 상태로 볼 수도 있겠다는 생각을 하게 되어 수정했는데 제이든은 어떻게 생각하시는지 궁금합니다!"*
31
+
32
+ reviewer 칭찬 (Thread 3):
33
+
34
+ > *"좋습니다 👍 2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요. 참가자가 들고 있는 카드들의 역할을 분리해볼 수 있습니다. 손에 있는 카드들 또한 객체로 취급할 수 있으니까요!"*
35
+
36
+ → **학생 자가 책임 이동 (Participant → ParticipantCards)** = *reviewer 가 권유 전에 학생이 자가 추론*. **학습 정점 = reviewer 예상 코멘트를 학생이 선제 적용**.
37
+
38
+ PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13·#36·#87 결의 *학생 자가 한계 인정* 와 *반대 시점 (학생이 reviewer 보다 한 발 앞서)*.
39
+
40
+ ### 2. `value class Money(val value: Int)` + `@JvmInline` + 학생 자가 학습
41
+
42
+ ```kotlin
43
+ @JvmInline
44
+ value class Money(val value: Int) {
45
+ init {
46
+ require(value >= MINIMUM_BETTING_MONEY) { ERROR_UNDER_MINIMUM_BETTING_MONEY_MESSAGE }
47
+ }
48
+ ...
49
+ }
50
+ ```
51
+
52
+ → **value class + @JvmInline 자가 적용 + 자가 학습 깊이**:
53
+
54
+ reviewer (Thread 1·10): *"value class 활용이 가능해보이네요! 어떤 상황에서 사용할 수 있을까요?"* + *"`@JvmInline` 어노테이션은 어떤 역할을 하는걸까요?"*
55
+
56
+ 학생 자가 답변:
57
+
58
+ > *"value class는 함수 호출 및 연산 시, 객체가 아닌 내부 값 자체로 처리되어 참조 비용을 줄이고 실행 속도를 향상시킨다는 장점이 있습니다. (...) `@JvmInline`은 코틀린에서 사용되는 애노테이션 중 하나로 인라인 클래스를 정의할 때 사용됩니다. 인라인 클래스는 **실제 객체를 만들지 않고**, 값을 직접 저장하는 방식으로 동작합니다."*
59
+
60
+ → **Kotlin 어휘 깊은 학생 자가 학습 + reviewer 가 *왜* 묻기 + 학생 자가 *답*하기**. PR #117 (parkjiminnnn *property val vs computed property*) 결의 *Kotlin 어휘 자가 학습* 강화. PR #36·#82·#76·#107·#106·#18 결의 *value class 적용* 일치.
61
+
62
+ **MCP 룰 `value-class-application-and-rationale` 후보** — *value class 사용 시점 + @JvmInline 의도 명시*.
63
+
64
+ ### 3. `enum class GameResult` 멤버 별 수익 책임 분리 — 4 멤버 + 메서드 2개
65
+
66
+ ```kotlin
67
+ enum class GameResult(
68
+ private val playerMultiplier: Double,
69
+ private val dealerMultiplier: Double,
70
+ ) {
71
+ WIN(1.0, 1.0),
72
+ LOSE(-1.0, -1.0),
73
+ DRAW(0.0, 0.0),
74
+ BLACKJACK(1.5, 1.0),
75
+ ;
76
+
77
+ fun calculatePlayerProfit(bettingMoney: Money): Double = bettingMoney.value * playerMultiplier
78
+ fun calculateDealerProfit(bettingMoney: Money): Double = bettingMoney.value * dealerMultiplier
79
+ }
80
+ ```
81
+
82
+ → **enum 멤버에 playerMultiplier + dealerMultiplier 2 속성 묶음** + **calculatePlayerProfit + calculateDealerProfit 메서드** = *GameResult 가 수익률 계산 책임*. PR #87 (GameOutcome enum + scoreRecord + payoutMultiplier 묶음) 결.
83
+
84
+ reviewer (Thread 9):
85
+
86
+ > *"수익률을 계산하는 것은 BlackJackGame 내에서 수행하는 역할일까요? 로또 미션에서와 같이 GameResult 가 수익률을 계산해보는건 어떨까요?"*
87
+
88
+ → **로또 미션 결과 객체 결 일관** + **enum 의 책임 강화 (단순 분류 X)** — PR #133·#108·#46·#39·#88·#90·#131 (Lotto rank 자가 결과 계산) 결 합류.
89
+
90
+ **`BLACKJACK(1.5, 1.0)` 별도 멤버** — *Win + isBlackjack 분기 vs 별도 멤버* 정공. 누적 10+ PR ⭐⭐⭐.
91
+
92
+ #### 3.1. *Player vs Dealer 수익 부호 일관*
93
+
94
+ ```kotlin
95
+ WIN(1.0, 1.0), // 둘 다 양수? 의미 양가
96
+ LOSE(-1.0, -1.0),
97
+ DRAW(0.0, 0.0),
98
+ BLACKJACK(1.5, 1.0),
99
+ ```
100
+
101
+ → **WIN 둘 다 1.0 = Player.calculateProfit(WIN, money) = +money, Dealer.calculateProfit(WIN, money) = +money**.
102
+
103
+ 다만 *호출 자리에서 부호 처리* (BlackJackGame.getDealerProfit):
104
+ ```kotlin
105
+ fun getDealerProfit(): Double =
106
+ participants.players.sumOf { player ->
107
+ val result = participants.dealer.getResult(player) // ← Dealer 의 결과
108
+ result.calculateDealerProfit(player.money)
109
+ }
110
+ ```
111
+
112
+ → *Dealer.getResult(player) = Dealer 시점 결과* → *Dealer Win 시 +money* → *Dealer 수익 = +money* (정확).
113
+
114
+ 다만 *Player Win = -money for Dealer* — *현재 GameResult.WIN(1.0, 1.0)* 에서 dealerMultiplier = +1.0 → *Player Win 시 Dealer 도 +money* = *룰 와전?*
115
+
116
+ → **WIN/LOSE 가 어느 시점 (Player/Dealer)에 적용되는지 명시 X = 양가성 위험**. *부호 일관 (-1.0, +1.0)* 또는 *operator fun not()* (PR #36 결) 활용 가능.
117
+
118
+ **MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보** — *enum 에 양쪽 시점 multiplier 보관 = 부호 양가*.
119
+
120
+ ### 4. `Deck` interface + `ShuffledDeck` 구현 + 8 덱 도메인 룰
121
+
122
+ ```kotlin
123
+ interface Deck {
124
+ fun pop(): TrumpCard
125
+ fun makeCards(): Deque<TrumpCard>
126
+ }
127
+
128
+ class ShuffledDeck : Deck {
129
+ private val deckPool: MutableList<Deque<TrumpCard>> = mutableListOf()
130
+ private var currentDeckIndex = 0
131
+
132
+ init {
133
+ repeat(MAX_DECK_COUNT) { deckPool.add(makeCards()) }
134
+ }
135
+
136
+ override fun pop(): TrumpCard {
137
+ val currentDeck = deckPool.getOrNull(currentDeckIndex)
138
+ ?: throw IllegalArgumentException(ERROR_EMPTY_DECK_MESSAGE)
139
+ return if (currentDeck.isNotEmpty()) {
140
+ currentDeck.pop()
141
+ } else {
142
+ currentDeckIndex++
143
+ pop() // ← 재귀
144
+ }
145
+ }
146
+
147
+ companion object {
148
+ private const val MAX_DECK_COUNT = 8
149
+ private val SHUFFLED_DECK: List<TrumpCard> by lazy {
150
+ Shape.entries.flatMap { shape ->
151
+ CardTier.entries.map { tier -> TrumpCard(tier, shape) }
152
+ }.shuffled()
153
+ }
154
+ }
155
+ }
156
+ ```
157
+
158
+ → **3 가지 정공**:
159
+
160
+ #### 4.1. *interface 분리 (DIP)*
161
+
162
+ 1단계 #129 reviewer (Thread 9) 의 *Deck 테스트 가능성* 권유 → *interface Deck + ShuffledDeck 구현* 자가 적용 + *2단계 확장*. **MCP 룰 `interface-for-test-substitution` 강화** 누적 5+ PR.
163
+
164
+ #### 4.2. *재귀 함수 (tailrec 미적용)*
165
+
166
+ `pop()` 자가 호출 = *재귀*. reviewer (Thread 11·18) *"while 루프도 좋지만, 재귀함수로도 구현해볼 수 있을거에요. kotlin의 tailrec 에 대해 찾아보셔도 좋습니다!"* → 학생 자가 적용 (다만 `tailrec` 키워드 X).
167
+
168
+ **MCP 룰 `tailrec-optimization-applicability` 후보** — *Kotlin tailrec = 스택 오버플로우 방지*.
169
+
170
+ #### 4.3. *companion object lazy 캐싱*
171
+
172
+ reviewer (Thread 4): *"트럼프 카드에는 중복되는 모양과 숫자, 문자가 존재하죠. 이 객체들을 효율적으로 사용할 수 있을까요?"* → 학생 자가 적용 (`SHUFFLED_DECK by lazy`).
173
+
174
+ → **lazy initialization + companion object** = *Singleton pool*. 다만 *블랙잭 = 카드 도메인 객체가 8 덱 모두 같은 풀에서 shuffle* = *각 덱이 SHUFFLED_DECK 인스턴스 재사용*. **PR #20·#28·#125·#65·#92·#108·#137·#106·#48·#9·#22·#13·#11·#39·#16·#46·#36·#117·#129 누적 18+ PR Singleton Deck 안티패턴 강화 (다만 정공: interface + lazy 활용)**.
175
+
176
+ **MCP 룰 `lazy-init-companion-vs-instance-pool` 후보** — *companion lazy = 정적 한 번 초기화*.
177
+
178
+ ### 5. `getOrNull` 활용 — 논리오류 처리
179
+
180
+ ```kotlin
181
+ val currentDeck = deckPool.getOrNull(currentDeckIndex)
182
+ ?: throw IllegalArgumentException(ERROR_EMPTY_DECK_MESSAGE)
183
+ ```
184
+
185
+ → reviewer (Thread 5): *"kotlin collection 에는 `getOrNull` 이라는 키워드가 존재합니다. 로또미션에서 [논리오류] 에 대해 학습했을 때 이러한 상황에서 어떻게 처리할 수 있을지 배웠던거 같아요. 어떻게 개선해볼 수 있을까요? 그렇다고 지금 상황이 논리오류 라는것은 아닙니다 :)"*
186
+
187
+ 학생 자가 답변:
188
+
189
+ > *"1. 수정 전에는 currentDeckIndex가 MAX_DECK_COUNT를 초과하면 반복문이 종료되고 예외가 발생하지만 현재는 MAX_DECK_COUNT를 초과하는 즉시 예외가 발생한다. 2. getOrNull을 사용하여 null을 체크하고 그 경우에 예외를 던지기 때문에 더 안전해졌다."*
190
+
191
+ → **Kotlin `getOrNull` = 논리오류 즉시 감지** + **`get(index)` 예외 vs `getOrNull` nullable 비교**. 학생 자가 학습.
192
+
193
+ **MCP 룰 `get-vs-getOrNull-exception-timing` 후보**.
194
+
195
+ ### 6. `getResult` 다형성 + `super` 키워드 — 4 스레드 학습
196
+
197
+ ```kotlin
198
+ // Participant (공통 로직)
199
+ open fun getResult(other: Participant): GameResult {
200
+ val myScore = cards.finalScore()
201
+ val otherScore = other.cards.finalScore()
202
+ return when {
203
+ !cards.isBlackJack() && other.cards.isBlackJack() -> GameResult.LOSE
204
+ cards.isBlackJack() && !other.cards.isBlackJack() -> GameResult.BLACKJACK
205
+ other.cards.isBust() -> GameResult.WIN
206
+ myScore > otherScore -> GameResult.WIN
207
+ myScore < otherScore -> GameResult.LOSE
208
+ else -> GameResult.DRAW
209
+ }
210
+ }
211
+
212
+ // Player (한 가지 경우만)
213
+ override fun getResult(other: Participant): GameResult =
214
+ when {
215
+ cards.isBust() -> GameResult.LOSE
216
+ else -> super.getResult(other) // ← super 키워드
217
+ }
218
+
219
+ // Dealer (한 가지 경우만)
220
+ override fun getResult(other: Participant): GameResult =
221
+ when {
222
+ cards.isBust() && !other.cards.isBust() -> GameResult.LOSE
223
+ else -> super.getResult(other)
224
+ }
225
+ ```
226
+
227
+ → **`super` 키워드 활용 = *공통 로직 + 자식 별 한 가지 경우 추가***:
228
+
229
+ #### 6.1. *4 스레드 학습 흐름 (Thread 8 → 13 → 14 → 19)*
230
+
231
+ 1. **Thread 8 (reviewer)**: *"결과를 판단하는 로직이 게임 규칙상 굉장히 복잡하죠. 다형성을 활용해볼 수 있습니다. 다형성을 이용해서 어떻게 개선할 수 있을까요?"* — *질문*.
232
+ 2. **Thread 8 (학생)**: *"`getResult`의 로직을 확인해보니 한 가지의 경우를 제외하고는 플레이어와 딜러의 로직이 동일하다는 것을 알게 되었습니다. (...) 이렇게 변경한 것이 제이든의 의도와 맞게 변경한 것인지는 잘 모르겠어요 🥲 다형성을 이용해 더 개선할 수 있는 방법이 있을까요?"* — *학생 자가 의문*.
233
+ 3. **Thread 13 (reviewer)**: *"식으로 다형성을 활용해볼 수 있을거에요 (super 키워드 코드 예시)"* — *답변 코드 예시*.
234
+ 4. **Thread 14·19 (reviewer + 학생)**: *Dealer/Player 양쪽 `super.getResult` 호출 자가 적용 + reviewer 확장 권유 (각 자식이 자가 override 로 더 많은 케이스 다룸)*.
235
+
236
+ → **양방향 reviewer/학생 토론 + 학생 자가 한계 인정 + reviewer 코드 힌트 + 학생 자가 적용** = *학습 시간성 모범*. PR #87·#117·#129·#137·#151·#133·#146·#147 결 합류.
237
+
238
+ #### 6.2. *open class + super 어휘*
239
+
240
+ PR #129 (1단계) *abstract class 추상 메서드 없음 = open class 동치* 결의 *반대 시점* — *getResult 는 open + super 활용* = *공통 로직 보유 + 자식 확장 정공*.
241
+
242
+ **MCP 룰 `super-keyword-for-shared-logic` 후보** — *부모 open + 자식 super 호출 = 공통 로직 + 자식 확장*.
243
+
244
+ #### 6.3. *reviewer 추가 권유 (Thread 19)*
245
+
246
+ > *"버스트의 케이스에 따라 딜러와 참가자가 다른 속성을 지니고 있죠. 이런 부분은 Dealer 와 Player 가 각각 override를 통해 설정을 해줄 수 있습니다. 그 이외에는 지금처럼 추상클래스에 구현을 하면 공통 로직 활용이 가능하죠. 이부분은 미션이 끝나고 한번 해보셔도 도움이 될 것 같아요.*
247
+ >
248
+ > *현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"*
249
+
250
+ → **미션 종료 후 추가 학습 권유** — *학생 부담 최소화 + 학습 시간 인정* 어휘. PR #87·#129·#36 결.
251
+
252
+ ### 7. `BlackJackTable(deck, bettingMoney)` 객체 자가 생성 → 자가 제거
253
+
254
+ 학생 초안:
255
+ ```kotlin
256
+ class BlackJackTable(
257
+ val deck: Deck,
258
+ private val bettingMoney: Map<Player, Money>,
259
+ ) {
260
+ fun getPlayerBettingMoney(player: Player): Money = ...
261
+ }
262
+ ```
263
+
264
+ → **`BlackJackTable` 객체 자가 생성 후 *형식 규칙 (인스턴스 변수 2개)* 위해서만 묶음** = *형식 규칙 부산물 인공 객체*. PR #133·#88·#132·#136·#93·#87·#147 누적 결.
265
+
266
+ reviewer (Thread 15·16):
267
+
268
+ > *"bettingMoney는 Player에 있음으로써 응집도가 높아진다고 생각해요. 기존처럼 money를 Player가 갖고 있게 된다면 BlackJackTable 객체도 없어질 수 있을까요?"*
269
+
270
+ > *"BlackJackTable 을 생성함으로써 어느 부분의 역할이 가벼워졌을까요? 처음 이 객체를 본 동료 개발자도 Table에 deck, bettingMoney만 있는걸 쉽게 알아차릴 수 있을까요? 🧐"*
271
+
272
+ 학생 자가 답변:
273
+
274
+ > *"Table에 deck과 bettingMoney만 있는걸 쉽게 알아차리기는 어려울 것 같아요. 사실 인스턴스 변수를 2개를 유지하기 위해 BlackJackTable을 만들었었는데 Player에서 인스턴스 변수 2개를 유지할 수 있다는 장점을 제외하고는 스스로도 납득이 가는 장점이 크지는 않았던 것 같아요. (...) `돈을 가지고 있는 Player여야 하지 않나?` 라는 의문이 생겼었습니다! 그래서 Money는 Player로 다시 돌려주게 되었습니다!"*
275
+
276
+ → **학생 자가 형식 규칙 부산물 인정 + 자가 제거**. **MCP 룰 `instance-variable-limit-artificial-grouping` 강화** 누적 6+ PR ⭐⭐ (#133·#88·#132·#136·#93·#87·#138).
277
+
278
+ 다만 **현재 최종 코드** 는 `Player(name, cards, money)` = *3 변수* — *형식 규칙 위반*? 또는 *cards 가 ParticipantCards 객체로 추출되었으니 *유의미한 추출* OK*. **학생의 자가 판단**: *cards = 진짜 객체 / money = Player 의 도메인 속성 / name = Player 의 도메인 속성* → *형식 규칙 위반 무의미*.
279
+
280
+ ### 8. 디미터 법칙 — table.deck 접근
281
+
282
+ reviewer (Thread 17):
283
+
284
+ > *"table이라는 객체가 생기면서 객체 지향 프로그래밍에서 이야기하는 [디미터의 법칙](https://mangkyu.tistory.com/147)에 대해 한번 찾아보셔도 도움이 될 것 같아요 🙂"*
285
+
286
+ 학생 자가 깨달음:
287
+
288
+ > *"table이 있을 때에는 table 내에서 deck을 가져와야 해서 응집도와 캡슐화를 해치게 되네요... 😢 앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*
289
+
290
+ → **디미터 법칙 + 외부글 (mangkyu.tistory) + 학생 자가 깨달음**:
291
+
292
+ #### 8.1. *table.deck 깊이 = 디미터 위반*
293
+
294
+ `blackJackGame.table.deck.pop()` → *3 단계 위임* = a.b.c.d 위반. 학생 자가 제거 (BlackJackTable 자가 제거).
295
+
296
+ #### 8.2. *외부글 활용*
297
+
298
+ `mangkyu.tistory.com/147` 디미터 법칙 — **외부 자료 + 자가 학습** 어휘. PR #87·#21·#117·#129 결의 *외부글 + 자가 학습* 어휘 합류.
299
+
300
+ **MCP 룰 `law-of-demeter-violation-depth` 강화** 누적 7+ PR.
301
+
302
+ ### 9. `Player.choice` 재귀 함수 자가 적용
303
+
304
+ ```kotlin
305
+ fun choice(
306
+ deck: Deck,
307
+ getPlayerChoice: (String) -> Boolean,
308
+ onPlayerStateUpdated: (Player) -> Unit,
309
+ ) {
310
+ if (!isDrawable()) return
311
+ if (getPlayerChoice(name)) {
312
+ receiveCard(deck.pop())
313
+ onPlayerStateUpdated(this)
314
+ choice(deck, getPlayerChoice, onPlayerStateUpdated) // ← 재귀
315
+ }
316
+ }
317
+ ```
318
+
319
+ → reviewer (Thread 12): *"이런 부분도 재귀로 구현이 가능할 것 같아요!"* → 학생 자가 적용.
320
+
321
+ **재귀 = while 의 함수형 변환**. PR #117 (수학적 풀이) + PR #87 (mutableMap → fold) 결의 *명령형 vs 함수형* 어휘 합류.
322
+
323
+ **MCP 룰 `recursive-vs-while-functional` 후보** — *재귀 = 함수형 정공*.
324
+
325
+ ### 10. 추가 칭찬
326
+
327
+ - **2단계 카드 책임 분리 자가 적용 (PR 본문 + Thread 3)** — *reviewer 가 권유 전에 학생 선제 적용*.
328
+ - **재귀 함수 활용 칭찬 (Thread 18)** — *"재귀로 잘 구현해주셨네요 👍"*.
329
+ - **모든 20 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 4+ 회** — *학생 자가 학습 가시화 정점* (PR #117·#129 결 강화).
330
+
331
+ ## 못한 점 (설계 관점)
332
+
333
+ ### 1. `Money(1000)` 최소 금액 검증 — require vs 재입력
334
+
335
+ 학생 초안: `require(value >= 1000)` → 미만 시 예외 던짐 + 프로그램 종료.
336
+
337
+ reviewer (Thread 2):
338
+
339
+ > *"require 로 검증을 잘 해주셨어요. 다만, 1000원 이상을 입력해야 하는 룰이 주어졌었나요? (정말 몰라서 하는 질문입니다 ㅎㅎ) 만약 그런 룰이 있다면 조건을 충족하지 못해 프로그램이 종료되어 버린다면 유저 입장에선 어떨까요?"*
340
+
341
+ 학생 자가 적용:
342
+
343
+ > *"룰이 주어지지는 않았지만 실제 블랙잭 게임에서는 최소 베팅액이 주어진다는 것을 알게 되어 해당 검증을 하게 되었습니다! 최소 금액을 입력하지 않았을 때 프로그램을 종료하는 것보다 **에러 메세지를 주고 다시 입력**할 수 있도록 하는 것이 나을 것 같다고 생각하여 수정하였습니다! inputView에서 runCatching을 통해 검증에서 걸렸을 때 메시지를 출력하고 다시 입력하도록 했습니다!"*
344
+
345
+ → **require 예외 vs 재입력 (graceful retry)** — PR #129 (deck.pop 예외 vs graceful shutdown) 결의 *재입력* 변형:
346
+
347
+ #### 1.1. *3 가지 트레이드오프*
348
+
349
+ | 안 | 장점 | 단점 |
350
+ |---|---|---|
351
+ | `require` 예외 + 프로그램 종료 (학생 초안) | *invariant 강제 + 코드 간결* | *유저 경험 ↓ (재시도 X)* |
352
+ | `require` + `runCatching` 재입력 (학생 자가 적용) | *유저 경험 ↑ + invariant 강제* | *Controller/View 가 runCatching 처리* |
353
+ | `require` 없이 nullable 반환 | *호출자가 명시적 처리* | *invariant 강제 X (null 무시 가능)* |
354
+
355
+ **MCP 룰 `require-exception-vs-graceful-retry` 후보** — *invariant 위반 시 종료 vs 재입력*. PR #129·#138 결.
356
+
357
+ #### 1.2. *블랙잭 도메인 룰 자가 학습*
358
+
359
+ 학생 *"실제 블랙잭 게임에서는 최소 베팅액이 주어진다"* 자가 학습 = *PR 본문 8 덱 룰 학습* 어휘 합류.
360
+
361
+ ### 2. `getAllCards()` 위임 → `cards.take(count)` 직접 — Tell-Don't-Ask
362
+
363
+ reviewer (Thread 6):
364
+
365
+ > *"getAllCards() 함수를 거쳐야만 할까요? `cards.take(count)`"*
366
+
367
+ 학생 자가 적용 (`Participant.takeCards(count: Int): List<TrumpCard> = cards.allCards.take(count)`).
368
+
369
+ → **위임 메서드 줄임 + Tell-Don't-Ask 정공** — PR #87 (Participant.getName, getCards 위임 6개) 결의 *불필요 위임 메서드 줄임*.
370
+
371
+ 다만 *현재 takeCards 도 cards.allCards.take 호출* = *2 단계 위임 여전*. **`cards.takeFirstN(count)`** 가 더 정공 — *ParticipantCards.takeFirstN 메시지*.
372
+
373
+ ### 3. `choice` 로직 Player ↔ BlackJackGame 이동 — 학생 자가 토론
374
+
375
+ reviewer (Thread 7):
376
+
377
+ > *"이 로직들이 Paticipants -> BlackJackGame 으로 옮겨진 배경은 무엇일까요?"*
378
+
379
+ 학생:
380
+
381
+ > *"`choice` 함수가 Player에 있을 때 `플레이어가 deck 자체를 아예 가지는 것이 아닌가?` 라는 의문이 들었고, 이는 블랙잭 게임에 어울리지 않는 상황이라 생각하여 옮기게 되었었습니다. 하지만 이번 리뷰를 반영하며 해당 로직이 Player와 Participants 내에 있어도 **Deck을 매개변수로 전달받아 필요할 때만 접근**하므로 Player가 Deck을 직접 소유하는 구조가 아니라는 것을 알게 되어 다시 수정하였습니다!"*
382
+
383
+ → **메서드 위치 토론 + 학생 자가 의문 + reviewer 의문 + 학생 자가 재정정**:
384
+
385
+ #### 3.1. *책임 위치 토론*
386
+
387
+ - **Player.choice(deck, ...)** = *Player 가 자가 결정 + deck 인자 받음 (소유 X)*.
388
+ - **BlackJackGame.choice(player, deck, ...)** = *외부 조정 + 명시적 분리*.
389
+ - **Participants.choice(deck, ...)** = *Participants 일급 컬렉션이 자가 처리* (현재 최종).
390
+
391
+ 학생의 자가 의문 = *"Player 가 deck 을 가지는 것 아닌가?"* → reviewer 의 *"deck 매개변수 전달 = 소유 X"* 깨달음. **객체 소유 vs 매개변수 전달 구분 자가 학습**.
392
+
393
+ **MCP 룰 `object-ownership-vs-parameter-passing` 후보** — *멤버 보유 vs 메서드 인자 = 소유 의미 구분*.
394
+
395
+ #### 3.2. *3 가지 트레이드오프*
396
+
397
+ | 안 | 장점 | 단점 |
398
+ |---|---|---|
399
+ | Player.choice(deck, ...) (학생 자가 재적용) | *Tell-Don't-Ask + 응집도* | *Player 가 deck 어휘 알아야 함* |
400
+ | Participants.choice(deck, ...) (중간 안) | *일급 컬렉션 + 위임 자연* | *Participants 가 각 Player 의 choice 호출* |
401
+ | BlackJackGame.processPlayerTurn(...) | *외부 조정 + 명시적 분리* | *Player 가 데이터 컨테이너 (god-object 위험)* |
402
+
403
+ reviewer 권유 = **Player.choice (Tell-Don't-Ask)**.
404
+
405
+ ### 4. 인스턴스 변수 2개 묶음 — name + money vs name + cards (학생 자가 의문)
406
+
407
+ reviewer (Thread 15·20):
408
+
409
+ > *"기존처럼 money를 Player가 갖고 있게 된다면 BlackJackTable 객체도 없어질 수 있을까요? 다만, 비비가 인스턴스 변수에 대한 우려가 있으시다면 아래 처럼 해보는건 어떨까요?*
410
+ > *(...) 이렇게 비슷한 성격의 그룹으로 묶으면 어떤 이점이 있을까요?"*
411
+
412
+ > *"name과 money를 묶어보면 어떨까 싶었습니다. 이 둘은 유저의 종속적인 정보라고 판단 할 수 있다고 생각했어요. 비비의 생각은 어떠신가요?"*
413
+
414
+ 학생 자가 의문:
415
+
416
+ > *"위처럼 묶으면 관련 데이터를 하나의 객체로 묶기 때문에 **의미를 명확하게** 할 수 있고, **가독성이 좋아진다**는 장점이 있습니다! (...) 하지만 이름과 베팅 금액, 카드 중에 2가지를 묶는다면 어떤 것들을 묶어야 할 지 잘 모르겠어요... 관련 데이터를 묶는다기엔 3가지 모두 플레이어가 가진 각각의 성격이 다른 데이터라는 생각이 들어요.*
417
+ >
418
+ > *`인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?` 라는 의문도 듭니다. 제이든은 어떻게 생각하시나요?? 🥲"*
419
+
420
+ → **학생 자가 *형식 규칙 vs 도메인 의미* 의문** — **형식 규칙 부산물 인공 객체 인지 모범**:
421
+
422
+ #### 4.1. *학생 자가 의문 모범*
423
+
424
+ 학생 *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?"* = **형식 규칙 부산물 인공 객체 자가 인지** — *MCP `oh-my-oop` 핵심 가치 (형식 규칙이 만든 인공 객체) 자가 발견*.
425
+
426
+ PR #87 (jaeyeongjo *ParticipantInfo* 자가 답변) 결의 *3 변수 제약 자가 학습* 와 **반대 시점** — *PR #87 = 학생 자가 적용 (regulation 따름) / PR #138 = 학생 자가 의문 (regulation 비판)*.
427
+
428
+ **MCP 룰 `form-rule-artificial-grouping-self-critique` 후보** — *형식 규칙 부산물 자가 비판*.
429
+
430
+ #### 4.2. *3 가지 대안 (가능)*
431
+
432
+ | 안 | 묶음 | 의미 |
433
+ |---|---|---|
434
+ | `Player(name, cards, money)` (현재) | *3 변수* | *형식 규칙 위반, 다만 cards = 객체* |
435
+ | `Player(playerInfo: PlayerInfo, cards)` | *(name+money) + cards = 2 변수* | *유저 종속 정보 묶음* |
436
+ | `Player(name, hand: Hand)` + `Hand(cards, money)` | *name + (cards+money)* | *손에 든 것 = 카드 + 베팅* (도메인 메타포 약함) |
437
+
438
+ reviewer 답변 보류 (DM 으로 토론) — **학생 자가 답변 가치 더 큼**.
439
+
440
+ ### 5. `tailrec` 키워드 미적용
441
+
442
+ reviewer (Thread 11·18):
443
+
444
+ > *"kotlin의 [tailrec](https://kotlinlang.org/docs/functions.html#tail-recursive-functions) 에 대해 찾아보셔도 좋습니다!"*
445
+
446
+ > *"재귀로 잘 구현해주셨네요 👍 tailrec 에 대해서도 한번 살펴보시면 도움이 될 것 같아요!"*
447
+
448
+ → **`tailrec` 키워드 = 컴파일러 최적화 (스택 오버플로우 방지)** — *Kotlin 어휘 추가 학습 권유*. 학생 자가 적용 X (다만 *문서 학습 권유*).
449
+
450
+ **MCP 룰 `tailrec-optimization-applicability` 후보** — *재귀 함수 + tailrec 의도 명시*.
451
+
452
+ ### 6. `Participant.getResult` open + super 키워드 — 다형성 + 공통 로직
453
+
454
+ §6 참조. **`open` 키워드 + `super` 호출 = 부모 공통 로직 + 자식 확장**.
455
+
456
+ 다만 *Participant.getResult 가 *복잡한 when 분기 6개* 보유* = *부모가 여전히 god-method*. reviewer (Thread 19) *"현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"* = *미션 종료 후 추가 학습 권유*.
457
+
458
+ #### 6.1. *2 가지 정공*
459
+
460
+ | 안 | 장점 | 단점 |
461
+ |---|---|---|
462
+ | Participant.getResult 공통 + 자식 override + super 호출 (현재) | *공통 로직 1 자리 + 자식 확장 간결* | *Participant 가 god-method (when 분기 ↑)* |
463
+ | 자식 모두 자가 override (Participant.getResult abstract) | *자식 별 명확 + 부모 부담 ↓* | *공통 로직 중복* |
464
+ | State 패턴 (sealed Result + Result.calculate(self, other)) | *Tell-Don't-Ask 정공* | *State/Result 객체 추가* |
465
+
466
+ reviewer 권유 = *현재 안 OK + 미션 종료 후 추가 학습*.
467
+
468
+ ### 7. `Player.isDrawable() = cards.sumOfCards <= BUST_STANDARD` — 룰 와전 가능
469
+
470
+ ```kotlin
471
+ override fun isDrawable(): Boolean = cards.sumOfCards <= BUST_STANDARD // ≤ 21
472
+ ```
473
+
474
+ → **Player 가 21 시점에도 hit 가능 (`≤`)** — *블랙잭 룰: 21 = 블랙잭 = stop, 21 미만 = hit 가능*.
475
+
476
+ 다만 *Player.isDrawable = 21 시 true → 22 가능 → bust* = *룰 모호*. *실제 블랙잭 = 21 시 stop (자가)*.
477
+
478
+ 대안: `cards.sumOfCards < BUST_STANDARD` — *21 미만 hit*.
479
+
480
+ 학생의 *21 시 hit 가능 = 사용자 선택* → *사용자가 선택해서 22 = bust* = *룰 정합*. 다만 *명시적 stop 조건 X*.
481
+
482
+ **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 11+ PR ⭐⭐⭐. *< vs ≤ 점검*.
483
+
484
+ ### 8. `Dealer.DEALER_MAX_SCORE = 16` + `<=` 비교 — 16 시 hit?
485
+
486
+ ```kotlin
487
+ override fun isDrawable(): Boolean {
488
+ if (cards.hasAce() && !cards.isBust(ACE_SOFT_SCORE)) {
489
+ return cards.sumOfCards + ACE_SOFT_SCORE <= DEALER_MAX_SCORE // ≤ 16
490
+ }
491
+ return cards.sumOfCards <= DEALER_MAX_SCORE // ≤ 16
492
+ }
493
+ ```
494
+
495
+ → **Dealer 16 시 hit (`<=`)** — *PR #129 결의 `<` 비교 (16 시 stay) 반대 시점*. **블랙잭 표준 = 16 이하 hit (16 시 hit)** — *현재 코드 정공*.
496
+
497
+ **PR #129 (`<` 16 시 stay = 룰 와전) vs PR #138 (`<=` 16 시 hit = 룰 정공) 반대 시점** = 학생 자가 정정. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화 + 학생 자가 학습 시간성**.
498
+
499
+ ### 9. `ParticipantCards.isBlackJack` — 초기 2장 + 21 조건
500
+
501
+ ```kotlin
502
+ fun isBlackJack(): Boolean = size == INITIAL_CARD_COUNT && finalScore() == BLACKJACK_SCORE
503
+ ```
504
+
505
+ → **블랙잭 = 초기 2장 + 21점 정확** — *PR #20·#64·#110·#28·#125·#147·#82·#36 결의 *Ace+10 두 장만 진짜 블랙잭* 룰 정공*. **MCP 룰 `blackjack-rule-fidelity` 강화** 누적 10+ PR ⭐⭐⭐.
506
+
507
+ 다만 *`size` private + 호출자는 isBlackJack 만 호출* — *isBlackJack 책임 ParticipantCards 에 자가 적용*.
508
+
509
+ ### 10. `getPlayerProfit(action: (String, Double) -> Unit)` — callback 람다 (PR #36 결)
510
+
511
+ ```kotlin
512
+ fun getPlayerProfit(action: (String, Double) -> Unit) {
513
+ participants.players.forEach { player ->
514
+ val result = player.getResult(participants.dealer)
515
+ val profit = result.calculatePlayerProfit(player.money)
516
+ action(player.name, profit)
517
+ }
518
+ }
519
+ ```
520
+
521
+ → **callback 람다 = View 결합** (PR #36·#129 결).
522
+
523
+ 대안: `getPlayerProfit(): List<Pair<String, Double>>` 반환 — *List 반환 후 Controller 가 View 처리*. **MCP 룰 `callback-action-for-result-aggregation` 강화** 누적 2+ PR (#129·#138).
524
+
525
+ ### 11. `getDealerProfit(): Double` 반환 = 의미 누수 (PR #129 결)
526
+
527
+ ```kotlin
528
+ fun getDealerProfit(): Double = ...
529
+ ```
530
+
531
+ → **`Double` 반환 = *수익 의미 누수***. *Money value class 활용 가능* (`Money(value)`).
532
+
533
+ 대안: `getDealerProfit(): Money` — *도메인 어휘 + value class 활용*.
534
+
535
+ **MCP 룰 `primitive-return-without-domain-meaning` 강화** 누적 3+ PR (#36·#129·#138).
536
+
537
+ ### 12. `Dealer.getResult` 의 `cards.isBust() && !other.cards.isBust() -> GameResult.LOSE` — 단일 경우만 처리
538
+
539
+ ```kotlin
540
+ override fun getResult(other: Participant): GameResult =
541
+ when {
542
+ cards.isBust() && !other.cards.isBust() -> GameResult.LOSE
543
+ else -> super.getResult(other)
544
+ }
545
+ ```
546
+
547
+ → **Dealer 만 자가 처리 = *Dealer Bust + Player !Bust* 한 가지 경우** + *나머지는 super 위임*.
548
+
549
+ 다만 *Player.getResult* 도 동일 패턴:
550
+ ```kotlin
551
+ override fun getResult(other: Participant): GameResult =
552
+ when {
553
+ cards.isBust() -> GameResult.LOSE // ← Player Bust = 즉시 LOSE
554
+ else -> super.getResult(other)
555
+ }
556
+ ```
557
+
558
+ → **Player 는 자가 Bust = 즉시 LOSE** (모든 시점), **Dealer 는 자가 Bust + Player !Bust 만 LOSE**.
559
+
560
+ #### 12.1. *블랙잭 룰 정공*
561
+
562
+ - Player Bust: 무조건 Lose (자가).
563
+ - Dealer Bust: 모든 살아있는 Player Win → Dealer Lose. 다만 *Player 도 Bust = Player Lose (Dealer 의 Bust 와 무관)*.
564
+
565
+ → *학생 코드 = 블랙잭 룰 정공*.
566
+
567
+ ### 13. `BlackJackGame.processDealerTurn(): Int` 반환 = `Int` 의미 모호 (PR #129 결)
568
+
569
+ §11 참조.
570
+
571
+ ### 14. `ParticipantCards.allCards: List<TrumpCard>` public getter — Tell-Don't-Ask 부분 누수
572
+
573
+ ```kotlin
574
+ class ParticipantCards(private val _cards: MutableList<TrumpCard> = mutableListOf()) {
575
+ val allCards: List<TrumpCard> get() = _cards.toList()
576
+ }
577
+ ```
578
+
579
+ → **`allCards: List<TrumpCard>` public 노출** + *Participant.takeCards = cards.allCards.take(count)* = *외부 가져옴*. **Tell-Don't-Ask 부분 누수**.
580
+
581
+ 대안: `ParticipantCards.takeFirstN(count: Int): List<TrumpCard>` — *메시지 던지기*.
582
+
583
+ PR #36·#87·#117·#129 결의 *Tell-Don't-Ask 정공* 어휘.
584
+
585
+ ### 15. `Money(1000)` 최소 금액 `MINIMUM_BETTING_MONEY = 1000` — 도메인 룰 와전 가능
586
+
587
+ ```kotlin
588
+ const val MINIMUM_BETTING_MONEY = 1000
589
+ ```
590
+
591
+ → **실제 블랙잭 = 최소 베팅액 카지노마다 다름** ($5, $10, $25). *1000원 = 임의 결정*. reviewer (Thread 2) 의문 어휘 일치: *"1000원 이상을 입력해야 하는 룰이 주어졌었나요?"*.
592
+
593
+ 학생 자가 답변 = *블랙잭 룰 자가 학습 (실제 카지노 최소 베팅액)*.
594
+
595
+ **MCP 룰 `domain-rule-arbitrary-constant` 후보** — *도메인 룰 vs 임의 상수 구분*.
596
+
597
+ ### 16. `Player.choice` 재귀 = `tailrec` 미적용
598
+
599
+ ```kotlin
600
+ fun choice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
601
+ if (!isDrawable()) return
602
+ if (getPlayerChoice(name)) {
603
+ receiveCard(deck.pop())
604
+ onPlayerStateUpdated(this)
605
+ choice(deck, getPlayerChoice, onPlayerStateUpdated) // ← tailrec 미적용
606
+ }
607
+ }
608
+ ```
609
+
610
+ → **재귀 호출이 if 안에 있음 + 마지막 표현식** → `tailrec` 키워드 추가 가능. 다만 *조건부 재귀 (`if (drawable) recurse`)* = *tailrec 조건 만족 (마지막 표현식이 자가 호출)*.
611
+
612
+ §5 참조.
613
+
614
+ ### 17. `ShuffledDeck.pop()` 재귀 + currentDeckIndex 변경 — 부작용 + 재귀
615
+
616
+ ```kotlin
617
+ override fun pop(): TrumpCard {
618
+ val currentDeck = deckPool.getOrNull(currentDeckIndex) ?: throw ...
619
+ return if (currentDeck.isNotEmpty()) {
620
+ currentDeck.pop() // ← currentDeck 변경 (부작용)
621
+ } else {
622
+ currentDeckIndex++ // ← currentDeckIndex 변경 (부작용)
623
+ pop() // ← 재귀
624
+ }
625
+ }
626
+ ```
627
+
628
+ → **재귀 + 부작용 (currentDeckIndex 변경)** = *함수형 정공 X*. 다만 *Singleton Deck 객체 = mutable state 보유* → *부작용 불가피*.
629
+
630
+ 대안: **immutable Deck + (Deck, TrumpCard) 반환** — *부작용 X*. 다만 *블랙잭 도메인 = mutable 자연 (카드 사용 후 사라짐)* → *현재 안 OK*.
631
+
632
+ **MCP 룰 `recursive-with-side-effect-vs-immutable` 후보**.
633
+
634
+ ### 18. `Player.money` public val — 외부 노출
635
+
636
+ ```kotlin
637
+ class Player(val name: String, cards: ParticipantCards, val money: Money) : Participant(cards)
638
+ ```
639
+
640
+ → **`money: Money` public val** = *외부에서 player.money 접근 가능* + *BlackJackGame.getDealerProfit = result.calculateDealerProfit(player.money)* 외부 호출. **Tell-Don't-Ask 부분 누수**.
641
+
642
+ 대안: `Player.calculateProfit(other: Participant): Money` — *Player 가 자가 계산*.
643
+
644
+ PR #87·#129 결의 *Tell-Don't-Ask 정공*.
645
+
646
+ ### 19. `Participants` 의 `getChoice` 위임만 — 단순 위임 (PR #129 결)
647
+
648
+ ```kotlin
649
+ // Participants (PR #129 결 같은 단순 위임)
650
+ fun getChoice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
651
+ players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
652
+ }
653
+ ```
654
+
655
+ → **단순 위임 메서드 = 추가 책임 X = 메서드 인공** — PR #129 결 강화. **MCP 룰 `simple-delegation-method-unnecessary` 강화** 누적 3+ PR (#129·#87·#138).
656
+
657
+ ### 20. `GameResult.WIN(1.0, 1.0)` 부호 양가성
658
+
659
+ §3.1 참조. **MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보**.
660
+
661
+ ## 리뷰어 의견 요지
662
+
663
+ - **PR 본문 자가 의문 2개에 reviewer 답변** — *8 덱 도메인 룰 자가 학습 + ParticipantCards 책임 이동 자가 적용 (reviewer 선제 칭찬)*.
664
+ - **value class + @JvmInline = Kotlin 어휘 자가 학습** — *어떤 상황 / 어떤 이점 / 어떤 역할 3 질문*.
665
+ - **require 예외 vs runCatching 재입력 (유저 경험)** — *블랙잭 도메인 룰 학습*.
666
+ - **getResult 다형성 + super 키워드 = 공통 로직 + 자식 확장** — *4 스레드 학습 흐름*.
667
+ - **수익률 계산 = GameResult 책임 (BlackJackGame X)** — *로또 미션 결과 객체 결*.
668
+ - **재귀 함수 + tailrec 학습 권유** — *명령형 vs 함수형*.
669
+ - **getAllCards 위임 → cards.take 직접 (Tell-Don't-Ask)**.
670
+ - **choice 로직 위치 토론 + 학생 자가 정정** — *객체 소유 vs 매개변수 전달*.
671
+ - **BlackJackTable 형식 규칙 부산물 자가 인정** + **인스턴스 변수 2개 묶음 자가 의문** — *형식 규칙 vs 도메인 의미*.
672
+ - **디미터 법칙 + 외부글 (mangkyu.tistory) + 학생 자가 깨달음** (table.deck 깊이).
673
+ - **getOrNull = 논리오류 처리 (로또 미션 결)**.
674
+ - **캐싱 (companion lazy) + 트럼프 카드 효율 사용**.
675
+ - **Dealer/Player 한 가지 경우만 자가 override + super 호출** (Thread 13·14·19).
676
+ - **버스트 케이스 추가 학습 미션 종료 후 권유** — *학생 부담 최소화*.
677
+
678
+ ## 대표 인용
679
+
680
+ > [rosemin928 PR 본문]
681
+ > *"1단계 merge하며 주신 리뷰 중 `deck을 전부 사용했을 때 어떻게 할 것인가?`를 고민하다가 **블랙잭의 최대 플레이 인원은 8명이다**, **블랙잭은 총 8개의 덱을 사용한다**라는 규칙이 있다는 것을 알게 되었습니다."*
682
+
683
+ → **학생 자가 도메인 룰 학습 + 1단계 → 2단계 사이 학습**. *MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점*.
684
+
685
+ > [rosemin928 PR 본문]
686
+ > *"이번에 각 객체들의 역할과 책임에 대해 고민해보다가 `isBust`, `isBlackJack`, `finalScore` 이 세 가지 함수를 ParticipantCards로 옮기게 되었습니다."*
687
+
688
+ → **학생 자가 책임 이동 = reviewer 권유 전 선제 적용** — 학습 가시화 정점.
689
+
690
+ > [KwonDae Thread 3]
691
+ > *"좋습니다 👍 2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요"*
692
+
693
+ → **reviewer 가 학생 선제 적용 인정 + 학생 자가 학습 정점**.
694
+
695
+ > [KwonDae Thread 8]
696
+ > *"결과를 판단하는 로직이 게임 규칙상 굉장히 복잡하죠. 또한, 딜러와 플레이어 양쪽으로 중복되는 로직과 차이점이 동시에 존재합니다. 이런 상황에서 다형성을 활용해볼 수 있습니다."*
697
+
698
+ → **다형성 활용 어휘 + 외부글 (위키)**.
699
+
700
+ > [KwonDae Thread 13]
701
+ > *"식으로 다형성을 활용해볼 수 있을거에요 (super 키워드 코드 예시). 여기서 다형성과 super 키워드에 대해 생각해보시면 좋습니다"*
702
+
703
+ → **super 키워드 코드 힌트** — *학생 자가 적용 가능*.
704
+
705
+ > [rosemin928 Thread 15]
706
+ > *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나? 라는 의문도 듭니다. 제이든은 어떻게 생각하시나요?? 🥲"*
707
+
708
+ → **학생 자가 형식 규칙 vs 도메인 의미 의문** — *MCP `oh-my-oop` 핵심 가치 자가 발견*.
709
+
710
+ > [KwonDae Thread 16]
711
+ > *"BlackJackTable 을 생성함으로써 어느 부분의 역할이 가벼워졌을까요? 처음 이 객체를 본 동료 개발자도 Table에 deck, bettingMoney만 있는걸 쉽게 알아차릴 수 있을까요? 🧐"*
712
+
713
+ → **동료 개발자 시점 어휘** (maintainer perspective locator) + *학생 자가 부산물 인정 트리거*.
714
+
715
+ > [rosemin928 Thread 16]
716
+ > *"Table에 deck과 bettingMoney만 있는걸 쉽게 알아차리기는 어려울 것 같아요. 사실 인스턴스 변수를 2개를 유지하기 위해 BlackJackTable을 만들었었는데 Player에서 인스턴스 변수 2개를 유지할 수 있다는 장점을 제외하고는 스스로도 납득이 가는 장점이 크지는 않았던 것 같아요."*
717
+
718
+ → **학생 자가 부산물 인정 + 자가 제거** 어휘 — *형식 규칙 비판 모범*.
719
+
720
+ > [KwonDae Thread 17]
721
+ > *"table이라는 객체가 생기면서 객체 지향 프로그래밍에서 이야기하는 디미터의 법칙에 대해 한번 찾아보셔도 도움이 될 것 같아요 🙂"*
722
+
723
+ → **디미터 법칙 + 외부글** 어휘. PR #87·#129·#36 결.
724
+
725
+ > [rosemin928 Thread 17]
726
+ > *"table이 있을 때에는 table 내에서 deck을 가져와야 해서 응집도와 캡슐화를 해치게 되네요... 😢 앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*
727
+
728
+ → **학생 자가 디미터 깨달음 + 미래 학습 의지**.
729
+
730
+ > [KwonDae Thread 19]
731
+ > *"이부분은 미션이 끝나고 한번 해보셔도 도움이 될 것 같아요. 현재 Participant에 있는 '나' 와 'other' 의 많은 케이스들을 Dealer와 Player로 옮겨 조건문 복잡도를 줄일 수 있을거에요!"*
732
+
733
+ → **미션 종료 후 추가 학습 권유** — *학생 부담 최소화*.
734
+
735
+ > [KwonDae Thread 20]
736
+ > *"이 질문이 이해를 잘 하지 못했는데, `인스턴스 변수 유지` 요구사항이 어떤 사항을 말씀하시는걸까요? DM으로 말씀주시면 좋을 것 같습니다 🙂"*
737
+
738
+ → **DM 으로 추가 토론 + reviewer 가 사용자에게 자가 의문 명시** — *양방향 토론 깊이*. PR #129 (커뮤니케이션 메타) 결.
739
+
740
+ ## 얻은 교훈 (보편)
741
+
742
+ 1. **PR 본문 자가 의문 2개 + 1단계 → 2단계 사이 자가 도메인 학습** — *MCP `oh-my-oop` *학습 = 시간 두고 반복* 어휘 정점*. **MCP 룰 `multi-stage-domain-self-learning` 후보**.
743
+
744
+ 2. **학생 자가 책임 이동 = reviewer 권유 전 선제 적용** — *학습 가시화 정점*. *reviewer 가 학생 선제 적용 인정* 어휘. 누적 3+ PR (#138·#147·#39).
745
+
746
+ 3. **value class + @JvmInline = Kotlin 어휘 자가 학습 (어떤 상황 / 어떤 이점 / 어떤 역할 3 질문)** — *reviewer 가 *왜* 묻기 + 학생 자가 *답* 하기*. **MCP 룰 `value-class-application-and-rationale` 후보**.
747
+
748
+ 4. **require 예외 vs runCatching 재입력 (유저 경험)** — **MCP 룰 `require-exception-vs-graceful-retry` 후보**.
749
+
750
+ 5. **getResult 다형성 + super 키워드 = 공통 로직 + 자식 확장** — *4 스레드 학습 흐름 (의문 → 자가 의문 → 코드 힌트 → 자가 적용)*. **MCP 룰 `super-keyword-for-shared-logic` 후보**.
751
+
752
+ 6. **수익률 계산 = GameResult 책임 (로또 미션 결)** — *enum 멤버 + 메서드 = 책임 강화*. PR #133·#108·#46·#39·#88·#90·#131 결.
753
+
754
+ 7. **재귀 함수 + tailrec = 명령형 → 함수형** — **MCP 룰 `recursive-vs-while-functional` 후보** + **MCP 룰 `tailrec-optimization-applicability` 후보**.
755
+
756
+ 8. **getAllCards 위임 → cards.take 직접 (Tell-Don't-Ask)** — *위임 메서드 줄임*. PR #87·#129·#36 결.
757
+
758
+ 9. **객체 소유 vs 매개변수 전달 구분 (choice 위치 토론)** — *멤버 보유 vs 메서드 인자 = 소유 의미 구분*. **MCP 룰 `object-ownership-vs-parameter-passing` 후보**.
759
+
760
+ 10. **형식 규칙 부산물 인공 객체 자가 비판 (BlackJackTable 자가 제거)** — *학생 자가 *인스턴스 변수 유지 요구사항이 묶지 않아도 될 것을 계속 묶고 있나?* 의문*. **MCP 룰 `form-rule-artificial-grouping-self-critique` 후보** + **MCP 룰 `instance-variable-limit-artificial-grouping` 강화** 누적 7+ PR.
761
+
762
+ 11. **디미터 법칙 + table.deck 깊이 + 외부글** — **MCP 룰 `law-of-demeter-violation-depth` 강화** 누적 7+ PR.
763
+
764
+ 12. **getOrNull = 논리오류 처리 (로또 미션 결)** — *Kotlin 어휘 + 즉시 감지*. **MCP 룰 `get-vs-getOrNull-exception-timing` 후보**.
765
+
766
+ 13. **캐싱 (companion lazy)** — *Singleton 효율 사용*. **MCP 룰 `lazy-init-companion-vs-instance-pool` 후보**.
767
+
768
+ 14. **enum 양쪽 시점 multiplier 묶음 = 부호 양가** — *Player vs Dealer 시점 명시 X*. **MCP 룰 `enum-bidirectional-multiplier-ambiguity` 후보**.
769
+
770
+ 15. **미션 종료 후 추가 학습 권유** — *학생 부담 최소화*. PR #87·#129·#36·#117 결.
771
+
772
+ 16. **DM 으로 추가 토론** — *양방향 토론 깊이 + reviewer 자가 의문 명시*. PR #129 (커뮤니케이션 메타) 결.
773
+
774
+ 17. **학생 자가 도메인 룰 학습 (8 덱 / 최소 베팅액 1000원)** — *블랙잭 실제 카지노 룰 자가 학습*. **MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점**.
775
+
776
+ 18. **재귀 + 부작용 (currentDeckIndex 변경)** — *immutable vs mutable 트레이드오프*. PR #87·#137·#148 결.
777
+
778
+ 19. **단순 위임 메서드 = 추가 책임 X (PR #129·#87 결 강화)** — 누적 3+ PR.
779
+
780
+ 20. **`<` vs `<=` 점검 (블랙잭 룰 정확성)** — *Dealer 16 시 hit 정공 (현재) vs PR #129 16 시 stay 와전 (자가 정정)*. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 11+ PR ⭐⭐⭐.
781
+
782
+ ## 얻은 교훈 (도메인)
783
+
784
+ 1. **블랙잭 8 덱 도메인 룰** — *최대 플레이 인원 8명 + 총 8개 덱*. 학생 자가 학습. **MCP 룰 `multi-deck-domain-rule` 강화** PR #58 (6덱 메타포) 결 + PR #138 (8덱 정공).
785
+
786
+ 2. **블랙잭 최소 베팅액 = 카지노 도메인 룰 (1000원 임의)** — *블랙잭 카지노마다 다름 ($5-$25)*. 학생 자가 학습.
787
+
788
+ 3. **`Dealer.isDrawable() = sum <= 16` (Soft Ace 적용)** — *블랙잭 표준 룰 정공*. PR #129 의 `<` 16 시 stay 자가 정정.
789
+
790
+ 4. **`Player.isDrawable() = sum <= 21`** — *Player 21 시 hit 가능 (자가 결정)*. 블랙잭 룰 정합.
791
+
792
+ 5. **`isBlackJack = size == 2 && finalScore == 21`** — *초기 2장 + 21점*. PR #20·#64·#110·#36·#26·#147·#88·#93·#136·#152·#133·#129 누적 결.
793
+
794
+ 6. **`BLACKJACK(1.5, 1.0)` enum 멤버** — *블랙잭 1.5배 별도 멤버* 정공. 누적 11+ PR ⭐⭐⭐.
795
+
796
+ 7. **`Ace Soft 1↔11 단일 +10 룰`** — PR #36·#129 결의 *Multi-Ace 한 가지 처리* 일치.
797
+
798
+ ## MCP 룰 후보 신규 + 강화 (PR #138)
799
+
800
+ | 룰 | 신규 / 강화 | 누적 PR |
801
+ |---|---|---|
802
+ | `multi-stage-domain-self-learning` | 신규 | 1 (#138) — *1단계 → 2단계 사이 자가 도메인 학습* |
803
+ | `value-class-application-and-rationale` | 신규 | 1 (#138) |
804
+ | `require-exception-vs-graceful-retry` | 신규 | 2+ (#129·#138) |
805
+ | `super-keyword-for-shared-logic` | 신규 | 1 (#138) |
806
+ | `recursive-vs-while-functional` | 신규 | 1 (#138) |
807
+ | `tailrec-optimization-applicability` | 신규 | 1 (#138) |
808
+ | `object-ownership-vs-parameter-passing` | 신규 | 1 (#138) |
809
+ | `form-rule-artificial-grouping-self-critique` | 신규 | 1 (#138) |
810
+ | `instance-variable-limit-artificial-grouping` | 강화 | 7+ (#133·#88·#132·#136·#93·#87·#138) |
811
+ | `law-of-demeter-violation-depth` | 강화 | 7+ |
812
+ | `get-vs-getOrNull-exception-timing` | 신규 | 1 (#138) |
813
+ | `lazy-init-companion-vs-instance-pool` | 신규 | 1 (#138) |
814
+ | `enum-bidirectional-multiplier-ambiguity` | 신규 | 1 (#138) |
815
+ | `recursive-with-side-effect-vs-immutable` | 신규 | 1 (#138) |
816
+ | `multi-deck-domain-rule` | 강화 | 2+ (#58·#138) |
817
+ | `domain-rule-arbitrary-constant` | 신규 | 1 (#138) |
818
+ | `blackjack-rule-fidelity-comparison` | 강화 | 11+ ⭐⭐⭐ |
819
+ | `interface-for-test-substitution` | 강화 | 5+ |
820
+ | `simple-delegation-method-unnecessary` | 강화 | 3+ (#129·#87·#138) |
821
+ | `callback-action-for-result-aggregation` | 강화 | 2+ (#129·#138) |
822
+ | `primitive-return-without-domain-meaning` | 강화 | 3+ (#36·#129·#138) |
823
+
824
+ ## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점 유지)
825
+
826
+ - ***학생 자가 책임 이동 + reviewer 권유 전 선제 적용*** — rosemin928 PR #138 — *reviewer 가 *2단계로 오면서 참가자의 카드의 정보를 따로 분리하는 것에 대해 이야기 하려 했는데 이미 반영을 해주셨군요* 인정* — **학습 가시화 정점**.
827
+ - ***1단계 → 2단계 사이 자가 도메인 학습*** — rosemin928 PR #138 — *8 덱 룰 + 최소 베팅액 자가 학습*. **MCP `oh-my-oop` *학습 = 시간 두고 반복* 정점**.
828
+ - ***학생 자가 형식 규칙 vs 도메인 의미 의문*** — rosemin928 PR #138 — *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?"* — **형식 규칙 부산물 자가 비판** = *MCP `oh-my-oop` 핵심 가치 자가 발견*.
829
+ - ***학생 자가 디미터 깨달음 + 미래 학습 의지*** — rosemin928 PR #138 — *"앞으로 해당 사항 신경 쓰며 구현해보도록 하겠습니다!"*.
830
+ - ***reviewer 가 *왜* 묻기 + 학생 자가 *답*하기 (Kotlin 어휘 자가 학습)*** — KwonDae/rosemin928 PR #138 — *value class / @JvmInline / getOrNull / tailrec 모두 *왜* 질문 형식*. **MCP `oop_propose_alternatives` 핵심 가치 (학생 자가 학습 권유)**.
831
+ - ***DM 으로 추가 토론*** — KwonDae PR #138 — *"DM으로 말씀주시면 좋을 것 같습니다 🙂"* — *공개 토론 + 사적 토론 분리 어휘*. **PR #129 (커뮤니케이션 메타) 결 강화**.
832
+ - ***모든 20 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 4+ 회*** — rosemin928 PR #138 — *학생 자가 학습 가시화 정점* (PR #117·#129 결 강화).
833
+
834
+ → **13 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **batch 20 신규 발견 = *학생 자가 *선제 적용* + reviewer 인정* 패턴** (학습 가시화 정점).
835
+
836
+ ## 비교 (PR #129 → #138 진화 — 사족 X, 안티패턴 명시만)
837
+
838
+ - **1단계 #129 학생 자가 의문 5+ 회 → 2단계 #138 PR 본문 자가 의문 2개 + 라인 자가 의문 4+ 회** — *학생 자가 학습 정점 유지*.
839
+ - **1단계 deck.pop 예외 처리 의문 → 2단계 8 덱 도메인 룰 자가 학습** — *1단계 → 2단계 사이 학습*.
840
+ - **1단계 추상화 활용 점검 (isDrawable) → 2단계 super 키워드 활용 (getResult)** — *추상화 학습 시간성*.
841
+ - **1단계 ParticipantCards 자가 생성 → 2단계 책임 이동 자가 적용 (isBust/isBlackJack/finalScore)** — *학습 가시화 정점*.
842
+ - **1단계 `<` 비교 16 시 stay 가능 → 2단계 `<=` 비교 16 시 hit 정공** — *블랙잭 룰 자가 정정*.
843
+ - **1단계 시간 압박 인정 → 2단계 자가 도메인 학습 + 자가 선제 적용** — *학생 학습 깊이 진화*.
844
+
845
+ → *진화 비교 = 사족 아님 (안티패턴 코드 위치 명시)* + *학생 자가 학습 정점 진화 일관*.