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,900 @@
1
+ # PR #87 — [블랙잭 2단계] 레오 미션
2
+
3
+ - **Reviewee:** [@jaeyeongjo](https://github.com/jaeyeongjo)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/87
5
+ - **단계:** 2단계
6
+ - **리뷰어:** [@ghojeong](https://github.com/ghojeong) (파이로) — 1단계 #73 동일 reviewer (학생-reviewer 페어 안정)
7
+ - **라인 코멘트:** 22 스레드 — *State Context 책임 명시 (State ↔ Context 양방향 참조 회피) + `is` 연산자 회피 (SOLID 위반 + 외부글) + 디미터 법칙 (외부글) + 테스트 = 객체 설계 명세서 어휘 (역할·책임·협력) + ParticipantInfo sealed class 의도 자가 답변 (3변수 제약) + WinningState 매직 넘버 → State 분리*
8
+ - **양 단계 완성 reviewee** (1단계 #73 batch 18 분석 완료 + 2단계 #87 = batch 19 추가).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. `sealed class ParticipantState` + 3개 자식 (Blackjack/Bust/Normal) — 진정한 State 패턴
13
+
14
+ ```kotlin
15
+ sealed class ParticipantState(private val hand: Hand, private val info: ParticipantInfo) {
16
+ abstract val isBlackjack: Boolean
17
+ abstract val isBust: Boolean
18
+ abstract val isFinished: Boolean
19
+
20
+ abstract fun calculateGameOutcome(opponent: ParticipantState): GameOutcome
21
+ abstract fun drawCard(card: Card): ParticipantState
22
+ ...
23
+ }
24
+
25
+ class Blackjack(hand: Hand, info: ParticipantInfo) : ParticipantState(hand, info) {
26
+ override val isBlackjack = true
27
+ override val isFinished = true
28
+ override fun calculateGameOutcome(opponent: ParticipantState): GameOutcome {
29
+ if (opponent.isBlackjack) return GameOutcome.Tie
30
+ return GameOutcome.WinWhenBlackjack
31
+ }
32
+ override fun drawCard(card: Card): ParticipantState = this
33
+ }
34
+ ```
35
+
36
+ → **State 자식들이 *abstract 함수 2개* 구현** (`calculateGameOutcome` + `drawCard`) — *Tell-Don't-Ask + 다형성*. PR #93·#136·#152·#98 결의 *State 자식 책임 부여* 정공.
37
+
38
+ reviewer 칭찬: *"State 에 다형성을 활용할 수 있게 abstract 문법을 더 적극적으로 활용해주셨군요 👍"* + *"Participant 가 ParticipantState 의 명시적인 Context 가 되었군요 👍 덕분에 State 를 관리하는 책임이 누구인지가 더 명확해진 것 같습니다."*
39
+
40
+ reviewer 메타 어휘:
41
+
42
+ > *"객체 설계의 핵심은 '역할', '책임', '협력' 입니다."*
43
+
44
+ → **조영호 「객체지향의 사실과 오해」 + Wirfs-Brock RDD 핵심 어휘**. *MCP `oh-my-oop` 의 책임 주도 설계 어휘 정점*.
45
+
46
+ ### 2. State Context 책임 명시 — Participant 가 ParticipantState 의 Context
47
+
48
+ 학생 자가 답변 (Thread 12):
49
+
50
+ > *"상태는 ParticipantState하나이고 context는 participant입니다. GameState은 상태가 아닙니다! 혼란이 없게끔 코드를 다시 정리해서 푸시해보겠습니다!"*
51
+
52
+ → **State Context 어휘 자가 학습** — *1단계 #73 reviewer 권고 (Context = Participant) → 2단계 자가 적용*. **MCP `oh-my-oop` 의 *역할·책임·협력* 어휘 학생 합류**.
53
+
54
+ reviewer 메타 어휘:
55
+
56
+ > *"저는 상태를 분석할 때는 상태를 저장하고 관리하는 책임을 가진 Context 객체가 무엇인지 꼭 살펴봅니다. (...) ParticipantState 와 GameState 를 멤버로서 가지고 있는 객체는 없어보이고 매번 Lazy 하게 계산하는 듯이 보이는데, 레오가 생각하기에 ParticipantState 와 GameState 를 관리하는 책임을 가지는 객체는 누구일지 궁금해서 여쭈어봅니다."*
57
+
58
+ → **Context 책임 명시 = State 패턴 정공의 핵심**. PR #73 *Context 어휘 도입* → 2단계 *자가 적용*.
59
+
60
+ ### 3. State ↔ Context 양방향 참조 회피 — 순환 참조 의식
61
+
62
+ reviewer (Thread 13):
63
+
64
+ > *"만약 ParticipantState 의 Context 가 Participant 라면, ParticipantState 가 다시 Participant 를 파라미터로 받는 것은 서로를 쌍방향으로 참조하게 하여, 객체의 관계를 혼란스럽게 하지 않을까 하는 생각을 했습니다. opponent 대신에 같은 레벨의 opponentParticipantState 를 파라미터로 받는 것은 어떻게 생각하세요?"*
65
+
66
+ 학생: *"서로 쌍방향으로 참조하는 경우를 없애서 다시 푸시해보겠습니다!"*
67
+
68
+ reviewer 후속 칭찬:
69
+
70
+ > *"Participant 와 ParticipantState 가 서로를 쌍방향으로 참조하지 않도록 수정해주셨군요. 👍 객체설계를 할 때 순환참조가 일어날 수 있는 여지는 항상 조심하는 편이 좋다고 저는 생각합니다."*
71
+
72
+ → **양방향 참조 회피 + 같은 레벨 참조 권유**:
73
+
74
+ ```kotlin
75
+ fun calculateGameOutcomeAgainst(opponent: Participant): GameOutcome =
76
+ state.calculateGameOutcome(opponent.getState())
77
+ ```
78
+
79
+ → *Participant 끼리 외부 호출* → *내부에서 state.calculateGameOutcome(opponent.getState())* → *State ↔ State 같은 레벨 협력*.
80
+
81
+ PR #93 (junjange 2단계 *State.compareTo 다형성*) 결 + PR #136 (whk06061 *State 자식 책임 부여*) 결.
82
+
83
+ **MCP 룰 `state-context-bidirectional-reference` 후보** — *State 가 Context 를 파라미터로 받기 = 양방향 참조 안티패턴*.
84
+
85
+ ### 4. `data object` + `enum class GameOutcome` 칭찬
86
+
87
+ ```kotlin
88
+ enum class GameOutcome(val scoreRecord: ScoreRecord, val payoutMultiplier: Double) {
89
+ WinWhenBlackjack(ScoreRecord(1, 0), 1.5),
90
+ Win(ScoreRecord(1, 0), 1.0),
91
+ Tie(ScoreRecord(0, 0), 0.0),
92
+ Lose(ScoreRecord(0, 1), -1.0),
93
+ }
94
+ ```
95
+
96
+ reviewer 칭찬 (Thread 11):
97
+
98
+ > *"그렇지 않아도 언급을 하려고 했었는데, data object 를 enum 선언해주신 점은 저도 참 좋은 아이디어 같습니다! 👍"*
99
+
100
+ → **`enum class` 멤버에 `scoreRecord` + `payoutMultiplier` 2 속성 묶음**:
101
+
102
+ - **블랙잭 1.5배 별도 멤버 `WinWhenBlackjack(ScoreRecord(1, 0), 1.5)`** — PR #36·#26·#147·#88·#93·#136·#152·#133 결. 누적 9+ PR ⭐⭐⭐.
103
+ - **`ScoreRecord(wins: Int, losses: Int)` + `payoutMultiplier` 동시 담음** — *enum 값 = 합산 가능 데이터*.
104
+
105
+ **MCP 룰 `enum-with-composite-state` 후보** — *enum 멤버에 여러 속성 묶음 + 합산 가능*.
106
+
107
+ ### 5. PR 본문 (간결) + 학생 자가 답변 6+ 회 풍부
108
+
109
+ PR 본문은 1단계 #73 (자가 의문 2개) 와 달리 *"잘 부탁드립니다 !"* 1줄. 다만 **라인 코멘트에서 자가 답변 풍부**:
110
+
111
+ - Thread 4: *3 파라미터 제약 자가 학습 답변* (ParticipantInfo 추상화).
112
+ - Thread 12: *상태 vs Context 자가 정정*.
113
+ - Thread 14: *ParticipantState 의 GameState Context 부적절* 자가 인정.
114
+ - Thread 17: *테스트 커버리지 자가 의문*.
115
+ - Thread 19: *디미터 법칙 자가 깨달음* (*"state에 필요한 함수를 생성해주고, Pariticipant는 state에게 요청을 하는듯하게 리팩토링하면 되겠군요!"*).
116
+ - Thread 22: *테스트 커버리지 자가 의문 → 자가 깨달음*.
117
+
118
+ → **학생 자가 토론 풍부 = 1100~1400 줄 분량 휴리스틱** + *학생 자가 답변 = 학습 가시화 모범*. PR #128·#135·#111·#120·#29·#63·#137·#148·#151·#146·#147·#88·#36 결.
119
+
120
+ ### 6. `ParticipantInfo` sealed class 부모 — 3 파라미터 제약 자가 학습
121
+
122
+ 학생 자가 답변 (Thread 4):
123
+
124
+ > ```kotlin
125
+ > class Player(name: ParticipantName, hand: Hand) : Participant(name, hand)
126
+ > ```
127
+ >
128
+ > *"기존 Player에 betAmount을 추가하는게 가장 간단하지만, 그럴 경우 클래스의 파라미터가 3개가 되어버려서, 파라미터 갯수를 2개이하로 유지하기 위해서 ParticipantInfo를 상속받는 PlayerInfo,DealerInfo을 구현했습니다..!"*
129
+
130
+ reviewer 인정:
131
+
132
+ > *"파라미터 갯수를 2개 이하로 유지해야한다는데 동의합니다! `ParticipantInfo` 와 관련된 리뷰는 수정 요청이 아니라, 코드를 읽는 동료가 이런 부분을 궁금해할 수도 있구나! 라는 경험으로 생각하고 넘어가셔도 좋을 것 같습니다."*
133
+
134
+ → **3 변수 제약 부산물 인공 객체 (ParticipantInfo / PlayerInfo / DealerInfo)** — *형식 규칙이 만든 인공 객체*. PR #133·#88·#132·#136·#93 누적 결.
135
+
136
+ **다만 reviewer 인정 = *동료 개발자 시점 메타 어휘***:
137
+
138
+ > *"코드를 읽는 동료가 이런 부분을 궁금해할 수도 있구나!"*
139
+
140
+ → **동료 개발자 시점 어휘 (maintainer perspective locator)** 합류. PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13 결의 *동료 개발자 시점*.
141
+
142
+ ### 7. 추가 칭찬
143
+
144
+ - **Player 추가 테스트 꼼꼼하게 작성 👍 어플리케이션 돌려보기 전에 미션 요구사항 만족 확인** (Thread 8).
145
+ - **Participants 의 playRound/playRoundForPlayers/playRoundForDealer → BlackjackController 로 이동** (Thread 10) — model → view 의존성 분리 자가 적용.
146
+
147
+ ## 못한 점 (설계 관점)
148
+
149
+ ### 1. `is` 연산자 회피 — SOLID 위반 + 외부글
150
+
151
+ reviewer (Thread 15):
152
+
153
+ > *"이건 정말 도전해 볼만한 내용이라서 말씀 드리는데, 클래스 타입에 대한 is 연산자를 사용하지 않도록 리팩토링해주세요. `OutputView.printGameResult` 를 포함하여 클래스 타입을 통한 조건 분기가 필요할 것 같으면, 차라리 Boolean 맴버 혹은 enum 맴버를 하나 더 추가하는 형식으로 리팩토링 부탁드립니다. 추가할 경우에는 파라미터 혹은 맴버의 갯수가 2개 이하가 되도록 객체 설계를 다시 고민해주시고요.*
154
+ >
155
+ > *코틀린의 is 처럼 자바에는 instanceof 연산자가 있는데, [왜 직접적인 클래스 타입 체크가 SOLID 원칙에 좋지 않은지](https://tecoble.techcourse.co.kr/post/2021-04-26-instanceof/)에 관한 글을 공유해봅니다."*
156
+
157
+ 학생: *"is 연산자를 사용하지 않고, 구현해보겠습니다!"*
158
+
159
+ → **`is` 클래스 타입 분기 = SOLID 위반 (OCP) + 외부글**:
160
+
161
+ #### 1.1. *`is` 연산자 회피 = 다형성 권유*
162
+
163
+ 현재 코드 (위 `Bust.calculateGameOutcome`):
164
+
165
+ ```kotlin
166
+ override fun calculateGameOutcome(opponent: ParticipantState): GameOutcome {
167
+ if (this.getInfo().isDealer() && opponent.isBust) return GameOutcome.Win
168
+ return GameOutcome.Lose
169
+ }
170
+ ```
171
+
172
+ → *`this.getInfo().isDealer()` Boolean 분기* = *State 패턴 안에서 다시 *Participant 타입* 분기*. **State 패턴 의도 누수**.
173
+
174
+ #### 1.2. *3 가지 대안*
175
+
176
+ | 안 | 장점 | 단점 |
177
+ |---|---|---|
178
+ | `is` (현재) | *간결 + Kotlin smart cast* | *SOLID OCP 위반 + 자식 추가 시 분기 누락 위험* |
179
+ | Boolean 멤버 (`isDealer`) | *접근 일정 + Kotlin when 활용* | *플래그 폭증 + 의도 의미 약함* |
180
+ | 다형성 (자식 추상 메서드) | *진정한 State 패턴 + 자식 추가 시 컴파일러 강제* | *추상 메서드 시그니처 설계 필요* |
181
+
182
+ reviewer 권유 = *Boolean 멤버 + enum 멤버 2 안* — *다만 다형성 안으로 가는 게 가장 정공*.
183
+
184
+ #### 1.3. *외부글 = tecoble instanceof + SOLID 원칙*
185
+
186
+ reviewer 외부 자료 `tecoble.techcourse.co.kr/post/2021-04-26-instanceof/` — **외부 자료 활용 메타 어휘**. PR #36·#23·#26·#108·#136·#151·#146·#148·#93·#133 결의 *외부 자료* + *학생 자가 학습*.
187
+
188
+ **MCP 룰 `is-operator-polymorphism-avoidance` 강화** — 누적 6+ PR (#147·#87·#136·#152·#93·#98). ⭐⭐⭐.
189
+
190
+ ### 2. 디미터 법칙 적용 — Participant → state → ... 깊게 타고 내려감
191
+
192
+ reviewer (Thread 19):
193
+
194
+ > *"Participant 가 ParticipantState 의 명시적인 Context 가 되었군요 👍 덕분에 State 를 관리하는 책임이 누구인지가 더 명확해진 것 같습니다. 다만 필요한 기능을 state 에서 함수로 제공하고 있지 않아, 깊게 타고 내려가는 것 같습니다. [디미터 법칙](https://tecoble.techcourse.co.kr/post/2020-06-02-law-of-demeter/) 을 고려해서 State 가 제공해야할 기능을 기반으로 함수들을 리팩토링 해주셨으면 합니다."*
195
+
196
+ 학생 자가 깨달음:
197
+
198
+ > *"그렇네요..! 개선하겠습니다 / state에 필요한 함수를 생성해주고, Pariticipant는 state에게 요청을 하는듯하게 리팩토링하면 되겠군요!"*
199
+
200
+ → **디미터 법칙 + 외부글 + 학생 자가 깨달음** — *Tell-Don't-Ask 변형* 어휘:
201
+
202
+ #### 2.1. *깊게 타고 내려가는 = 의존 깊이 ↑*
203
+
204
+ 현재 코드 (`Participant.getName()` → `state.getName()` → `info.getName()` → `name`):
205
+
206
+ ```kotlin
207
+ sealed class Participant(private var state: ParticipantState) {
208
+ fun getName() = state.getName()
209
+ fun getCards() = state.getCards()
210
+ fun getCardsSum() = state.getCardsSum()
211
+ ...
212
+ }
213
+ ```
214
+
215
+ → *Participant → state → info → name* = *3 단계 위임*. **디미터 법칙 위반 (a.b.c.d 호출)**.
216
+
217
+ #### 2.2. *3 가지 대안*
218
+
219
+ | 안 | 장점 | 단점 |
220
+ |---|---|---|
221
+ | Participant 가 state 위임 (현재) | *State 가 Context 역할 명확* | *위임 메서드 N개 + 깊게 타고 내려감* |
222
+ | Participant 가 직접 멤버 (name, hand) | *호출 1 단계* | *State 분리 의도 약화* |
223
+ | State 가 메시지 던지기 (`state.printSelf()`) | *Tell-Don't-Ask + 다형성* | *View 호출 메서드를 State 가 가짐 → View 결합* |
224
+
225
+ reviewer 권유 = **State 가 제공해야 할 기능 = 메시지 던지기** — *Tell-Don't-Ask 정공*.
226
+
227
+ #### 2.3. *외부글 = tecoble 디미터 법칙*
228
+
229
+ reviewer 외부 자료 `tecoble.techcourse.co.kr/post/2020-06-02-law-of-demeter/` — 누적 4+ PR (#93·#133·#146·#87).
230
+
231
+ **MCP 룰 `law-of-demeter-violation-depth` 강화** — 누적 6+ PR ⭐⭐.
232
+
233
+ ### 3. 테스트 = 객체 설계 명세서 어휘 — 역할·책임·협력 메타 어휘
234
+
235
+ 학생 자가 의문 (Thread 17 + 22):
236
+
237
+ > *"Participant의 calculateGameOutcomeAgainst을 테스트 함으로서, ParticipantState의 calculateGameOutcome을 테스트했다고 생각했는데, 혹시 제 생각이 잘못됐을까요 ?"*
238
+
239
+ reviewer 메타 어휘:
240
+
241
+ > *"ParticipantState 를 포함해서 테스트를 추가로 작성해달라는 요청은, 테스트 커버리지에 관련된 피드백이 아니라, 객체 설계에 관련된 피드백이라고 생각해주시면 좋을 것 같습니다.*
242
+ >
243
+ > *객체 설계의 핵심은 '역할', '책임', '협력' 입니다. 만약 Participant 의 테스트 만으로 ParticipantState 와 Participants 를 테스트할 게 없다면, 결국 ParticipantState 와 Participants는 Participant 에 굉장히 의존적인 역할을 가지고 있거나, 심지어 Participant 외에 Participants 혹은 ParticipantState 은 역할이 존재하지 않는 객체 설계라고 말할 수 있습니다.*
244
+ >
245
+ > *기능적인 면에서는 분영 Participant 에 테스트를 굉장히 잘 작성해주셨지만, 그렇다면 ParticipantState 와 Participants 의 역할은 무엇이고, Participant 와 어떻게 협력하고 있는지 표현해달라는 의미에서 테스트 코드의 작성을 부탁드렸습니다.*
246
+ >
247
+ > *테스트 코드는 커버리지를 통과하는 것보다, 이 객체를 앞으로 어떻게 유지보수할 것인지 동료 개발자에게 안내하는, 역할 및 책임에 관한 명세서로서 매우 유용하다는 점을 말씀 드리고 싶었습니다."*
248
+
249
+ reviewer 후속:
250
+
251
+ > *"모든 함수에 대한 테스트를 작성할 필요는 없지만, 최소한 이 객체는 어떠한 역할을 기대하고 만들었다는 의도를 표현할 수 있는 테스트가 객체 별로 존재했으면 해서 요청을 드렸습니다."*
252
+
253
+ 학생 자가 깨달음:
254
+
255
+ > *"생각해보니 calculateResult와 calculateFinalProfits만의 로직이 있기때문에, 따로 테스트가 필요해보입니다..! 반영해서 푸시하겠습니다"*
256
+
257
+ → **테스트 = 객체 설계 명세서 + 역할·책임·협력 어휘** — *Wirfs-Brock RDD 핵심 어휘* + **MCP `oh-my-oop` 핵심 가치 정점**.
258
+
259
+ #### 3.1. *테스트 = 객체 설계 명세서*
260
+
261
+ PR #26 (chws0508 1단계 *테스트 = 명세서*) 결 강화. *테스트가 객체 의도 + 역할 표현*.
262
+
263
+ #### 3.2. *역할·책임·협력 = 객체 설계의 핵심*
264
+
265
+ **조영호 「객체지향의 사실과 오해」 핵심 어휘** — *역할 (객체의 추상), 책임 (객체의 기능), 협력 (객체간 관계)*.
266
+
267
+ #### 3.3. *Participant 만 테스트 시 ParticipantState/Participants 의 역할이 의존적/없음 시사*
268
+
269
+ reviewer 의 진단: *테스트 작성 가능 여부 = 객체 역할 존재 여부 지표*. **MCP `oop_design_validate` 룰 후보 `no-role-no-test-no-design`**.
270
+
271
+ → **MCP 룰 `test-as-design-spec` 강화** — *테스트 가 객체 역할 표현* 어휘. 누적 3+ PR (#26·#87·#93). ⭐⭐⭐.
272
+
273
+ ### 4. `WinningState(1, 0)` 매직 넘버 → State 정의
274
+
275
+ reviewer (Thread 7):
276
+
277
+ > *"`WinningState(1, 0)` 와 `WinningState(0, 1)` 에 쓰인 1 과 0 모두 매직 넘버로 보입니다. 기왕 State 라는 네이밍을 할거고, WinningState 기반으로 분기처리 로직을 사용할 거라면, `WinningState(1, 0)` 인 경우와 `WinningState(0, 1)` 경우에 대한 State 를 Bust, Normal 의 경우처럼 따로 정의해주시는게 좋지 않을까 생각했습니다. 기왕 State 디자인패턴을 활용해주시고 계신데, WinningState 라는 data class 로 조건문 분기처리를 하고 있으니, 전부 State 로 합칠 수 있지 않을까 해서 제안해보았습니다."*
278
+
279
+ 학생: *"GameState를 따로 만들어서, 한번 개선해봤습니다!"*
280
+
281
+ → **매직 넘버 = State 정의 (Win / Lose / Tie)** — `data class WinningState(wins: Int, losses: Int)` → `enum GameState { WIN; LOSE; TIE }` 또는 *sealed class*.
282
+
283
+ 학생은 *GameState 따로 만듦* → 다만 reviewer 의 (Thread 12 + 14) 의 후속: *ParticipantState 는 상태, GameState 는 *상태 아님* (Lazy 계산)*.
284
+
285
+ #### 4.1. *Lazy 계산 = Context 멤버 X*
286
+
287
+ reviewer:
288
+
289
+ > *"현재 ParticipantState 와 GameState 를 멤버로서 가지고 있는 객체는 없어보이고 매번 Lazy 하게 계산하는 듯이 보이는데, 레오가 생각하기에 ParticipantState 와 GameState 를 관리하는 책임을 가지는 객체는 누구일지 궁금해서 여쭈어봅니다. Participant 혹은 Participants 인가요?"*
290
+
291
+ → *Context 가 State 멤버로 보관 vs Lazy 계산* 의 차이. *블랙잭 도메인에서 GameState 는 결과 (한 번 계산) → Context 멤버 보관 의미 X = State 아님*. 학생 자가 인정.
292
+
293
+ #### 4.2. *State 와 Value Object 구분*
294
+
295
+ reviewer (Thread 12):
296
+
297
+ > *"현재 제가 느끼기에 WinningState 는 Value Object 로서 활용되고 있고, '상태' 라고 부를 수 있는 것은 `sealed class ParticipantState` 와 `enum class GameState` 이 두가지라고 판단했습니다."*
298
+
299
+ → **State (상태) vs Value Object 명시적 구분** — *State 는 시간에 따라 변하는 것 + Context 에서 관리, Value Object 는 불변값*.
300
+
301
+ **MCP 룰 `state-vs-value-object` 후보** — *State 디자인 패턴 적용 vs Value Object 적용 차이*. 누적 2+ PR (#87·#136).
302
+
303
+ ### 5. model → view 의존성 — MVC 핵심 원칙
304
+
305
+ reviewer (Thread 6):
306
+
307
+ > *"model 은 **절대로** view 에 대해서 의존성을 가져서는 안됩니다. MVC 의 핵심은 model 을 view 로부터 의존성을 분리시키는데 있습니다. 앞으로 MVP, MVVM 등의 디자인패턴을 도입하게 되더라도, model 이 view 에 의존성을 가지면 안된다는 원칙은 꼭 지켜주시기 바랍니다."*
308
+
309
+ 학생: *"넵 ! 모델과 뷰를 분리하겠습니다"*
310
+
311
+ → **MVC 원칙 절대성 어휘**. **MCP 룰 `model-view-dependency-direction` 강화** — *Domain → UI X / UI → Domain OK*. 누적 7+ PR.
312
+
313
+ PR #88·#80·#76·#93·#107·#137·#90 결.
314
+
315
+ ### 6. `mutableMap` → `fold` 권유 — 함수형
316
+
317
+ reviewer (Thread 21):
318
+
319
+ > *"현재 최종 결과를 계산하기 위해 mutableMap 을 사용하고 있는데, 저는 이런 종류의 계산에는 fold 를 사용하면 mutable 한 요소를 없앨 수 있다고 생각합니다. 만약 어렵다면 욕심내지 않으셔도 된다고 생각합니다! 지금도 충분하니 mutable 을 없앨 수도 있다! 정도로 생각하고 넘어가시면 충분할 것 같습니다."*
320
+
321
+ 학생: *"아...그렇군요! fold를 사용해본적이없어서, 몰랐습니다! 찾아서 공부해보겠습니다"*
322
+
323
+ ```kotlin
324
+ fun calculateResult(): Map<Participant, ScoreRecord> {
325
+ val result = mutableMapOf<Participant, ScoreRecord>()
326
+ players.forEach { player ->
327
+ calculateDealerResult(result, player)
328
+ calculatePlayerResult(result, player)
329
+ }
330
+ return result.toMap()
331
+ }
332
+ ```
333
+
334
+ → **현재 mutableMap + forEach + 외부 함수에 result 전달** = *명령형*. **`fold` 대안**:
335
+
336
+ ```kotlin
337
+ fun calculateResult(): Map<Participant, ScoreRecord> =
338
+ players.fold(mapOf<Participant, ScoreRecord>()) { acc, player ->
339
+ acc + dealerRecordFor(acc, player) + (player to player.calculateGameOutcomeAgainst(dealer).scoreRecord)
340
+ }
341
+ ```
342
+
343
+ #### 6.1. *2 가지 트레이드오프*
344
+
345
+ | 안 | 장점 | 단점 |
346
+ |---|---|---|
347
+ | mutableMap + forEach (현재) | *읽기 자연* + *디버깅 쉬움* | *mutable 누수 + 함수 분리 시 result 전달* |
348
+ | `fold` | *immutable + Kotlin 함수형* | *acc + 새 항목 추가 어휘 익숙도 필요* |
349
+
350
+ reviewer 의 *"욕심내지 않으셔도 된다"* = *학생 학습 시간 인정* + *현재 안 OK*. PR #95·#23·#26·#36 결의 *학생 선택지 분리* 어휘.
351
+
352
+ **MCP 룰 `mutable-collection-vs-fold` 후보** — *명령형 mutableMap vs 함수형 fold*.
353
+
354
+ ### 7. Higher Order Function 추상화 — setup* 3개 모델로 이동
355
+
356
+ reviewer (Thread 5):
357
+
358
+ > *"readBetAmount 를 인터페이스 혹은 람다로 추상화해서, Higher Order Function 형태의 파라미터로 넘겨받으면, setupParticipants, setupDealer, setupPlayers 3개를 모두 model 의 영역으로 옮길 수 있지 않을까 해서 제안을 해봅니다."*
359
+
360
+ reviewer 후퇴:
361
+
362
+ > *"다시 생각해보니 이 피드백은 과한 감이 있다는 생각이 들어서 반영해주시지 않아도 괜찮습니다!"*
363
+
364
+ → **reviewer 자가 후퇴 어휘** — *학생 부담 최소화*. PR #95·#23·#26 결의 *개인 의견 + 학생 선택지 분리*.
365
+
366
+ #### 7.1. *Higher Order Function 추상화 시점 트레이드오프*
367
+
368
+ | 안 | 장점 | 단점 |
369
+ |---|---|---|
370
+ | Controller 에서 setup (현재) | *Controller 책임 명확* | *Controller god-object 위험 + 모델 로직 누수* |
371
+ | Higher Order Function 으로 model 이동 | *모델 책임 강화 + Controller 가벼움* | *model 이 람다 의존 + 추상화 깊이 ↑* |
372
+
373
+ reviewer 후퇴 = *현재 안 OK + 미래 학습 시점 명시*.
374
+
375
+ **MCP 룰 `setup-locus-controller-vs-model` 후보** — *setup 로직 위치 트레이드오프*.
376
+
377
+ ### 8. `Aginst` 오타 — 명명 정확성
378
+
379
+ reviewer (Thread 1):
380
+
381
+ > *"Aginst 가 아무리 보아도 오타같아서 언급을 해봅니다."*
382
+
383
+ 학생: *"오타네요.. 수정하겠습니다!"*
384
+
385
+ → **명명 정확성**. *영어 사전 어휘 정확*. PR #23 (rhthrhrl0 *Drawer = 서랍 영어 사전 의미 충돌*) 결.
386
+
387
+ **MCP 룰 `english-spelling-naming` 후보** — *영문 명명 오타 점검*.
388
+
389
+ ### 9. `ParticipantInfo` sealed class — reviewer 자가 의문 + 학생 자가 답변
390
+
391
+ reviewer (Thread 2):
392
+
393
+ > *"data class 에 대하여 굳이 부모 sealed class 인 `ParticipantInfo` 가 필요한지 저는 잘 이해가 가지 않아서 설명이 필요합니다. ParticipantInfo 에 재사용가능한 로직 혹은 인터페이스가 전혀 보이지 않기 때문입니다. 아마 `val name: ParticipantName` 을 재사용하고 싶어서 선언해주셨다고 이해했는데, 그로 인해서 어떤 부분이 간단해졌는지 레오가 생각하신 개선점이 궁금합니다. 가령 지금과 같은 상황에서 PlayerInfo 는 betAmount 에 접근하기 위하여, ParticipantInfo 로 추상화하지 못하고, 항상 PlayerInfo 로만 쓰게 될 것 같습니다."*
394
+
395
+ reviewer (Thread 3):
396
+
397
+ > *"`sealed class Participant` 에서 상속에 대비하여, ParticipantInfo 가 필요했다고 이해하면 될까요?"*
398
+
399
+ 학생: *"넵 맞습니다!"*
400
+
401
+ reviewer:
402
+
403
+ > *"그렇다면 저는 지금 구조 납득이 가는 것 같습니다! 설명 감사합니다!"*
404
+
405
+ → **reviewer 자가 의문 → 학생 자가 답변 → reviewer 자가 인정**. **양방향 reviewer/학생 토론** 모범. PR #137·#151·#133·#146·#147 결.
406
+
407
+ #### 9.1. *sealed class 의도 = 다형성 + 상속 대비*
408
+
409
+ 학생의 *Participant sealed class 자식 = Dealer/Player* 와 *ParticipantInfo sealed class 자식 = DealerInfo/PlayerInfo* = *대칭 구조* 의도.
410
+
411
+ 다만 **`ParticipantInfo` 의 *재사용 인터페이스 X (오직 name + isDealer + getBetAmount)*** = *상속이 추가 책임 부여 X* → **상속 인공 객체 위험**.
412
+
413
+ #### 9.2. *3 가지 대안*
414
+
415
+ | 안 | 장점 | 단점 |
416
+ |---|---|---|
417
+ | ParticipantInfo sealed (현재) | *Participant 와 대칭 + 3변수 제약 회피* | *추상화 인공 + getBetAmount 0 (DealerInfo) 의미 약함* |
418
+ | Player(name, hand, betAmount) 3변수 | *간결 + Info 객체 불필요* | *3변수 제약 위반 + Player vs Dealer 비대칭 (betAmount 만 Player)* |
419
+ | `data class Player(info: PlayerInfo, hand: Hand)` (Info 합성) | *2변수 + Info 분리 자연* | *Info 추상화 무용 (sealed 의미 약함)* |
420
+
421
+ reviewer 후퇴 = *현재 안 OK + 동료 시점 코멘트*.
422
+
423
+ **MCP 룰 `inheritance-without-shared-interface` 후보** — *재사용 인터페이스 X 인 sealed class = 인공 추상화*. 누적 3+ PR.
424
+
425
+ ### 10. `ParticipantInfo` `getBetAmount() = 0` (DealerInfo) — Dummy 값
426
+
427
+ ```kotlin
428
+ class DealerInfo(...) : ParticipantInfo(...) {
429
+ override fun getBetAmount() = 0
430
+ ...
431
+ }
432
+ ```
433
+
434
+ → **DealerInfo 의 getBetAmount = 0 = Dummy 값**. *Dealer 는 베팅하지 않음 도메인 의미를 *숫자 0 으로 표현* = *의미 누수***.
435
+
436
+ 대안:
437
+ - `getBetAmount(): Int?` (nullable) — *베팅 없음 명시*.
438
+ - `sealed class ParticipantInfo { abstract val name; ... }` + Bet 관련 메서드는 PlayerInfo 한정 — *Dealer 호출 시 컴파일러 에러*.
439
+ - *Dealer 에 baseAmount 멤버 X* — *호출 자리에서 Player/Dealer 분기*.
440
+
441
+ **MCP 룰 `dummy-zero-for-domain-absent` 후보** — *도메인 부재를 0 으로 표현* (PR #131 (`-0.0` Double IEEE 754 함정) 결의 *Dummy zero* 변형).
442
+
443
+ ### 11. `ktlinCheck` 통과 X — 린트 안내
444
+
445
+ reviewer (Thread 9):
446
+
447
+ > *"`./gradlew clean ktlinCheck` 를 했을 경우 린트를 현재 통과하지 못하고 있는 것 같은데, 확인 부탁드립니다."*
448
+
449
+ 학생: *"앗 다시 학인해보겠습니다!"*
450
+
451
+ → **린트 도구 안내**. *CI 단계 자가 점검* 어휘. PR #80·#76·#107·#82·#147 결.
452
+
453
+ **MCP 룰 X (도구 활용 메타 어휘)**.
454
+
455
+ ### 12. Participants 의 `calculateResult` / `calculateFinalProfits` 단위 테스트 X
456
+
457
+ reviewer (Thread 22):
458
+
459
+ > *"다만 Participants 에 관해서 단위테스트가 전혀 작성되어 있지 않은데, 테스트를 작성해주시면 좋을 것 같습니다."*
460
+
461
+ → §3 (테스트 = 객체 설계 명세서) 의 *Participants 테스트 부재 사례*. 학생 자가 깨달음.
462
+
463
+ ### 13. `Hand` `addCard` 가변 — Hand 멤버 mutable
464
+
465
+ ```kotlin
466
+ class Normal(...) : ParticipantState(...) {
467
+ override fun drawCard(card: Card): ParticipantState {
468
+ getHand().addCard(card) // ← Hand.addCard = mutable
469
+ return when {
470
+ getHand().calculateCardsSum() > THRESHOLD_BUST -> Bust(getHand(), getInfo())
471
+ else -> Normal(getHand(), getInfo())
472
+ }
473
+ }
474
+ }
475
+ ```
476
+
477
+ → **State 자식이 mutable Hand 변경 + 새 State 반환** = *부분 immutable*:
478
+
479
+ - *State 객체 자체는 immutable (Bust/Normal 새 인스턴스)*.
480
+ - *Hand 내부는 mutable (addCard)*.
481
+
482
+ reviewer 명시 X — 다만 *fold 권유 (§6) 와 같은 결의 함수형 어휘*. PR #93·#136·#152·#147·#137 결의 *immutable State + Hand mutable* 일치.
483
+
484
+ #### 13.1. *2 가지 트레이드오프*
485
+
486
+ | 안 | 장점 | 단점 |
487
+ |---|---|---|
488
+ | Hand mutable + 새 State (현재) | *카드 추가 자연* | *State 자식이 Hand 변경 = 부작용* |
489
+ | Hand immutable + Hand 새 인스턴스 | *완전 immutable* | *카드 1장 추가마다 새 List 복사 + GC 비용* |
490
+
491
+ **MCP 룰 `partial-immutability` 후보** — *State 객체 immutable + 내부 자료구조 mutable* 트레이드오프.
492
+
493
+ ### 14. State `getHand()` `getCardsSum()` `getCards()` getter 4종 — 위임 깊이
494
+
495
+ ```kotlin
496
+ sealed class ParticipantState(...) {
497
+ fun getHand() = hand
498
+ fun getInfo() = info
499
+ fun getCardsSum() = hand.calculateCardsSum()
500
+ fun getCards() = hand.getCards()
501
+ fun getName() = info.getName()
502
+ fun getBetAmount() = info.getBetAmount()
503
+ }
504
+ ```
505
+
506
+ → **위임 메서드 6 개** = *§2 (디미터 법칙) 의 깊이 원인*. *State 가 Hand/Info 호출 위임*.
507
+
508
+ 대안: **State 가 일하는 메시지** (위 §2 권유):
509
+
510
+ ```kotlin
511
+ sealed class ParticipantState {
512
+ abstract fun displayInitialCards(): List<Card>
513
+ abstract fun displayFinalScore(): String
514
+ abstract fun calculateProfit(opponent: ParticipantState, betAmount: Int): Double
515
+ }
516
+ ```
517
+
518
+ → *getter 위임 X + 메시지 던지기*. **Tell-Don't-Ask 정공**.
519
+
520
+ PR #93·#136·#137·#148·#152 결.
521
+
522
+ ### 15. `setupParticipants/setupDealer/setupPlayers` 분리 — Controller 책임 분산
523
+
524
+ reviewer 메모 (Thread 5, §7 참조):
525
+
526
+ > *"setupParticipants, setupDealer, setupPlayers 3개를 모두 model 의 영역으로 옮길 수 있지 않을까 해서 제안을 해봅니다."*
527
+
528
+ → **Controller 의 setup 3개 분산 = 책임 분할 의도** + *Model 이동 권유 (reviewer 자가 후퇴)*.
529
+
530
+ #### 15.1. *2 가지 트레이드오프*
531
+
532
+ | 안 | 장점 | 단점 |
533
+ |---|---|---|
534
+ | Controller 3 분할 (현재) | *책임 명확 + 단위 함수 작음* | *Controller god-object 위험 + 모델 로직 외부 누수* |
535
+ | Model 1 통합 + HoF | *모델 책임 강화* | *Model 람다 의존 + 추상화 ↑* |
536
+
537
+ **MCP 룰 `controller-setup-split-vs-model-locus` 후보** — *setup 위치 트레이드오프*.
538
+
539
+ ### 16. State `companion object calculateInitialParticipantState` — 정적 헬퍼 vs State 다형성
540
+
541
+ ```kotlin
542
+ companion object {
543
+ fun calculateInitialParticipantState(hand: Hand, info: ParticipantInfo): ParticipantState {
544
+ return when {
545
+ hand.calculateCardsSum() == THRESHOLD_BLACKJACK && hand.getCards().size == BLACKJACK_CARD_SIZE ->
546
+ Blackjack(hand, info)
547
+ hand.calculateCardsSum() > THRESHOLD_BUST -> Bust(hand, info)
548
+ else -> Normal(hand, info)
549
+ }
550
+ }
551
+ }
552
+ ```
553
+
554
+ → **State 정적 팩토리** = *Bust/Normal/Blackjack 분기 외부 (companion)* + *초기 State 결정*.
555
+
556
+ #### 16.1. *2 가지 트레이드오프*
557
+
558
+ | 안 | 장점 | 단점 |
559
+ |---|---|---|
560
+ | 정적 팩토리 (현재) | *State 자식 단순 + Hand 점수 기반 결정 한 자리* | *분기 외부 = State 자식 의도 일부 누수* |
561
+ | Normal 시작 + drawCard 자가 변환 | *State 자식이 자가 변환* | *초기 Blackjack 판정 (2장 21점) 처리 X* |
562
+
563
+ reviewer 명시 X — *현재 안 OK + 의도 명확*.
564
+
565
+ PR #36 (boogi-woogi *CardsState.valueOf(score, isInitialDraw)* 정적 팩토리) 결 동일.
566
+
567
+ ### 17. `Participant` `getBetAmount()` 위임 — Player/Dealer 분기 누락
568
+
569
+ ```kotlin
570
+ sealed class Participant(...) {
571
+ fun getBetAmount() = state.getBetAmount()
572
+ }
573
+
574
+ class Dealer(state) : Participant(state) {
575
+ // getBetAmount() = 0 (state.info.getBetAmount() = 0)
576
+ }
577
+ ```
578
+
579
+ → **Dealer.getBetAmount() = 0** = *DealerInfo.getBetAmount = 0 위임* (위 §10 참조).
580
+
581
+ `calculateProfitAgainst` (Dealer):
582
+ ```kotlin
583
+ override fun calculateProfitAgainst(opponent: Participant) =
584
+ -(opponent.getBetAmount() * (opponent.calculateGameOutcomeAgainst(this).payoutMultiplier))
585
+ ```
586
+
587
+ → *Dealer 의 수익 = -(상대 베팅 × 결과 배수)* = *상대 베팅을 가져옴*. **Dealer 가 *자기 베팅 0* 을 호출하지 않음** = *코드는 OK*.
588
+
589
+ 다만 *getBetAmount() 메서드 가 Participant 에 있음* = *Dealer 호출 시 0 반환 = 의미 누수* (위 §10).
590
+
591
+ ### 18. `Participant.getState()` getter — 디미터 위반 직접 노출
592
+
593
+ ```kotlin
594
+ sealed class Participant(...) {
595
+ fun getState() = state
596
+ }
597
+ ```
598
+
599
+ → **State 직접 노출 getter** — *Participant 외부에서 state 직접 접근* = *디미터 법칙 위반 + Encapsulation 부분 누수*.
600
+
601
+ `calculateGameOutcomeAgainst`:
602
+ ```kotlin
603
+ fun calculateGameOutcomeAgainst(opponent: Participant): GameOutcome =
604
+ state.calculateGameOutcome(opponent.getState())
605
+ ```
606
+
607
+ → *Participant 가 opponent.getState() 직접 호출* = *§3 디미터 법칙 위반*.
608
+
609
+ 대안: **`Participant.calculateOutcomeWith(opponent: Participant)`** = *opponent 가 메시지 받아서 self.state 와 비교*:
610
+
611
+ ```kotlin
612
+ fun calculateGameOutcomeAgainst(opponent: Participant): GameOutcome =
613
+ opponent.compareStateWith(state) // ← opponent 가 메시지 받음
614
+
615
+ fun compareStateWith(otherState: ParticipantState): GameOutcome =
616
+ state.calculateGameOutcome(otherState)
617
+ ```
618
+
619
+ → *getState() getter 불필요*. **Tell-Don't-Ask 정공**.
620
+
621
+ PR #93·#136·#137·#148 결.
622
+
623
+ ### 19. `ParticipantState.isFinished` `isBlackjack` `isBust` — 부울 멤버 3개
624
+
625
+ ```kotlin
626
+ abstract val isBlackjack: Boolean
627
+ abstract val isBust: Boolean
628
+ abstract val isFinished: Boolean
629
+ ```
630
+
631
+ → **Boolean 멤버 3 개 = *State 식별 변형***. *§1 (is 연산자 회피) reviewer 권유 = Boolean 멤버 추가* 와 일치.
632
+
633
+ #### 19.1. *Boolean 멤버 vs 다형성 트레이드오프*
634
+
635
+ | 안 | 장점 | 단점 |
636
+ |---|---|---|
637
+ | Boolean 멤버 (현재) | *State 식별 간결 + 클래스 타입 분기 회피* | *플래그 폭증 (State 추가 시 N+1 flag) + 의도 약함* |
638
+ | 다형성 추상 메서드 | *진정한 State 패턴* | *추상 시그니처 설계 필요* |
639
+
640
+ reviewer 권유 = Boolean 멤버 + enum 멤버 (§1).
641
+
642
+ **MCP 룰 `state-flag-vs-polymorphism` 후보** — *State Boolean 식별 vs 다형성*. 누적 4+ PR.
643
+
644
+ ### 20. `Participant.calculateProfitAgainst` 추상 + Player/Dealer 구현 차이
645
+
646
+ ```kotlin
647
+ abstract fun calculateProfitAgainst(opponent: Participant): Double
648
+
649
+ class Dealer(...) : Participant(...) {
650
+ override fun calculateProfitAgainst(opponent: Participant) =
651
+ -(opponent.getBetAmount() * (opponent.calculateGameOutcomeAgainst(this).payoutMultiplier))
652
+ }
653
+
654
+ class Player(...) : Participant(...) {
655
+ override fun calculateProfitAgainst(opponent: Participant) =
656
+ getBetAmount() * (calculateGameOutcomeAgainst(opponent).payoutMultiplier)
657
+ }
658
+ ```
659
+
660
+ → **Dealer.calculateProfitAgainst = -(상대 베팅 × 상대 결과)** vs **Player.calculateProfitAgainst = 자기 베팅 × 자기 결과**.
661
+
662
+ #### 20.1. *대칭 깨짐*:
663
+
664
+ - Player: *self.betAmount × self.outcome*.
665
+ - Dealer: *-(opponent.betAmount × opponent.outcome)*.
666
+
667
+ → *Dealer 의 수익 = 모든 Player 의 수익 합의 부호 반전* (PR #36 *operator fun not() 부호 반전* 결).
668
+
669
+ #### 20.2. *Tell-Don't-Ask 위반*
670
+
671
+ `Dealer.calculateProfitAgainst` 가 *opponent.getBetAmount() × opponent.calculateGameOutcomeAgainst(this).payoutMultiplier* 호출 = *opponent 의 데이터 가져와서 계산*.
672
+
673
+ 대안: **`Player.calculateProfitAgainst` 의 부호 반전 활용** — `Participants.calculateFinalProfits` 에서 *Player 합 부호 반전*:
674
+
675
+ ```kotlin
676
+ profits[dealer] = -players.sumOf { player -> player.calculateProfitAgainst(dealer) }
677
+ ```
678
+
679
+ → *Dealer.calculateProfitAgainst 불필요 → abstract 제거*.
680
+
681
+ **MCP 룰 `tell-dont-ask-asymmetric-method` 후보** — *대칭 깨진 메서드 = 한쪽이 다른쪽 데이터 가져옴*.
682
+
683
+ ### 21. `Participant.drawCard` `Participant.isGameFinished` — `protected` 멤버
684
+
685
+ ```kotlin
686
+ protected fun drawCard(card: Card) {
687
+ state = state.drawCard(card)
688
+ }
689
+
690
+ protected fun isGameFinished() = state.isFinished
691
+ ```
692
+
693
+ → **`protected` 멤버 = 자식 (Player/Dealer) 한정 접근**. *Player.playRound + Dealer.playRound 가 호출*.
694
+
695
+ #### 21.1. *protected 활용 트레이드오프*
696
+
697
+ | 안 | 장점 | 단점 |
698
+ |---|---|---|
699
+ | protected (현재) | *외부 호출 차단 + 자식 호출 OK* | *Kotlin 의 sealed class 한정 자식 = 사실상 internal* |
700
+ | private + 자식이 메서드 재선언 | *완전 캡슐화* | *코드 중복* |
701
+ | public + 외부 호출 가능 | *유연성* | *캡슐화 누수* |
702
+
703
+ → *현재 안은 sealed class + protected = 적절*. Kotlin 어휘 활용.
704
+
705
+ ### 22. `Participants` 의 `calculateDealerResult` 의 `MutableMap` 외부 전달
706
+
707
+ ```kotlin
708
+ private fun calculateDealerResult(
709
+ result: MutableMap<Participant, ScoreRecord>,
710
+ player: Player,
711
+ ) {
712
+ val originalDealerGameOutcome = result.getOrDefault(dealer, DEFAULT_WINNING_STATE)
713
+ val addDealerGameOutcome = dealer.calculateGameOutcomeAgainst(player).scoreRecord
714
+ result[dealer] = ScoreRecord(...)
715
+ }
716
+ ```
717
+
718
+ → **`MutableMap` 인자로 전달 + 함수 안에서 변경** = *부작용 함수 시그니처에 노출*.
719
+
720
+ §6 (fold) 의 변형. PR #98·#43·#107·#137·#148·#76·#86·#73 결의 *명령형 mutable* 안티패턴.
721
+
722
+ **MCP 룰 `mutable-collection-as-parameter` 후보** — *MutableMap/MutableList 외부 전달*.
723
+
724
+ ## 리뷰어 의견 요지
725
+
726
+ - **State Context 책임 명시** — *State 를 저장/관리하는 책임 객체 = Context*. 학생 자가 답변: *상태 = ParticipantState 하나, Context = Participant, GameState 는 상태 아님*.
727
+ - **State ↔ Context 양방향 참조 회피** — *State 가 Context 파라미터 받음 = 순환*. *opponentParticipantState* 또는 *isSelfDealer: Boolean* 권유.
728
+ - **`is` 연산자 회피 = SOLID OCP** — 외부글 (tecoble instanceof).
729
+ - **디미터 법칙 = State 가 메시지 던지기** — 외부글 (tecoble 디미터).
730
+ - **테스트 = 객체 설계 명세서 + 역할·책임·협력** — *Wirfs-Brock RDD 어휘 정점*.
731
+ - **WinningState 매직 넘버 → State 정의** — *State 디자인 패턴 도입 시 모든 분기 State 로*.
732
+ - **`ParticipantInfo` 의도 자가 의문 → 학생 자가 답변** — *3 파라미터 제약 부산물 인공 객체 + reviewer 인정*.
733
+ - **model → view 의존성 금지 = MVC 절대 원칙**.
734
+ - **mutableMap → fold 권유** — *학생 부담 최소화 어휘 동반*.
735
+ - **Higher Order Function 으로 setup 3개 모델 이동** — *reviewer 자가 후퇴*.
736
+ - **`Aginst` 오타** — 명명 정확성.
737
+ - **`ktlinCheck` 통과 X** — CI 도구.
738
+ - **State abstract 적극 활용 칭찬 (수정 후)**.
739
+ - **순환참조 회피 칭찬 (수정 후)**.
740
+ - **Player 추가 테스트 꼼꼼 칭찬**.
741
+ - **data object 를 enum 선언 칭찬**.
742
+
743
+ ## 대표 인용
744
+
745
+ > [ghojeong]
746
+ > *"객체 설계의 핵심은 '역할', '책임', '협력' 입니다. (...) 테스트 코드는 커버리지를 통과하는 것보다, 이 객체를 앞으로 어떻게 유지보수할 것인지 동료 개발자에게 안내하는, 역할 및 책임에 관한 명세서로서 매우 유용하다는 점을 말씀 드리고 싶었습니다."*
747
+
748
+ → **MCP `oh-my-oop` 핵심 가치 정점 어휘** — *조영호 「객체지향의 사실과 오해」 + Wirfs-Brock RDD 핵심 어휘*. **테스트 = 객체 설계 명세서** 어휘.
749
+
750
+ > [ghojeong]
751
+ > *"저는 상태를 분석할 때는 상태를 저장하고 관리하는 책임을 가진 Context 객체가 무엇인지 꼭 살펴봅니다. (...) 레오가 생각하기에 ParticipantState 와 GameState 를 관리하는 책임을 가지는 객체는 누구일지 궁금해서 여쭈어봅니다."*
752
+
753
+ → **State Context 책임 분석 메타 어휘**.
754
+
755
+ > [jaeyeongjo 자가 답변]
756
+ > *"상태는 ParticipantState하나이고 context는 participant입니다. GameState은 상태가 아닙니다! 혼란이 없게끔 코드를 다시 정리해서 푸시해보겠습니다!"*
757
+
758
+ → **학생 자가 State 정정 어휘**. *State vs 결과 (Lazy 계산) 구분 자가 깨달음*.
759
+
760
+ > [ghojeong]
761
+ > *"만약 ParticipantState 의 Context 가 Participant 라면, ParticipantState 가 다시 Participant 를 파라미터로 받는 것은 서로를 쌍방향으로 참조하게 하여, 객체의 관계를 혼란스럽게 하지 않을까 하는 생각을 했습니다. opponent 대신에 같은 레벨의 opponentParticipantState 를 파라미터로 받는 것은 어떻게 생각하세요?"*
762
+
763
+ → **양방향 참조 회피 어휘**.
764
+
765
+ > [ghojeong]
766
+ > *"다만 필요한 기능을 state 에서 함수로 제공하고 있지 않아, 깊게 타고 내려가는 것 같습니다. 디미터 법칙 을 고려해서 State 가 제공해야할 기능을 기반으로 함수들을 리팩토링 해주셨으면 합니다."*
767
+
768
+ → **디미터 법칙 + 메시지 던지기** 어휘.
769
+
770
+ > [jaeyeongjo 자가 깨달음]
771
+ > *"state에 필요한 함수를 생성해주고, Pariticipant는 state에게 요청을 하는듯하게 리팩토링하면 되겠군요!"*
772
+
773
+ → **학생 자가 Tell-Don't-Ask 깨달음** 어휘. *디미터 법칙 → Tell-Don't-Ask 자가 변환*.
774
+
775
+ > [ghojeong]
776
+ > *"`ParticipantInfo` 와 관련된 리뷰는 수정 요청이 아니라, 코드를 읽는 동료가 이런 부분을 궁금해할 수도 있구나! 라는 경험으로 생각하고 넘어가셔도 좋을 것 같습니다."*
777
+
778
+ → **동료 개발자 시점 어휘** (maintainer perspective locator). PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13 결.
779
+
780
+ > [ghojeong]
781
+ > *"이건 정말 도전해 볼만한 내용이라서 말씀 드리는데, 클래스 타입에 대한 is 연산자를 사용하지 않도록 리팩토링해주세요."*
782
+
783
+ → **`is` 연산자 SOLID 위반 + 도전 어휘**.
784
+
785
+ > [ghojeong]
786
+ > *"만약 어렵다면 욕심내지 않으셔도 된다고 생각합니다! 지금도 충분하니 mutable 을 없앨 수도 있다! 정도로 생각하고 넘어가시면 충분할 것 같습니다."*
787
+
788
+ → **reviewer 학생 부담 최소화 + 선택지 분리** 어휘. PR #95·#23·#26·#36 결.
789
+
790
+ > [ghojeong]
791
+ > *"다시 생각해보니 이 피드백은 과한 감이 있다는 생각이 들어서 반영해주시지 않아도 괜찮습니다!"*
792
+
793
+ → **reviewer 자가 후퇴** 어휘. *학생 부담 최소화 + 자가 의견 비판적 점검*.
794
+
795
+ ## 얻은 교훈 (보편)
796
+
797
+ 1. **State Context 책임 분석 = State 디자인 패턴 정공** — *Context = State 를 저장/관리하는 객체*. 학생 자가 합류. **MCP 룰 `state-context-locator` 후보**. 누적 4+ PR (#73·#87·#93·#136).
798
+
799
+ 2. **State ↔ Context 양방향 참조 회피** — *State 가 Context 파라미터 받음 = 순환 참조 + 객체 관계 혼란*. 같은 레벨 참조 (opponentState) 또는 단순 데이터 (Boolean) 권유. **MCP 룰 `state-context-bidirectional-reference` 후보**.
800
+
801
+ 3. **`is` 연산자 회피 = SOLID OCP 위반** — *Boolean 멤버 + enum 멤버 + 다형성 3 안*. 외부글 (tecoble instanceof). 누적 6+ PR. **MCP 룰 `is-operator-polymorphism-avoidance` 강화** ⭐⭐⭐.
802
+
803
+ 4. **디미터 법칙 = State 가 메시지 던지기 + Tell-Don't-Ask** — *a.b.c.d 깊이 = 위반*. 외부글 (tecoble 디미터). 학생 자가 Tell-Don't-Ask 자가 깨달음. 누적 6+ PR.
804
+
805
+ 5. **테스트 = 객체 설계 명세서 + 역할·책임·협력** — *Wirfs-Brock RDD 어휘 정점*. *테스트 작성 가능 여부 = 객체 역할 존재 여부 지표*. **MCP 룰 `test-as-design-spec` 강화** 누적 3+ PR ⭐⭐⭐.
806
+
807
+ 6. **`ParticipantInfo` 3변수 제약 부산물 인공 객체** — *형식 규칙이 만든 인공 추상화*. PR #133·#88·#132·#136·#93·#87 누적 결.
808
+
809
+ 7. **model → view 의존성 금지 = MVC 절대 원칙** — *MVC/MVP/MVVM 공통*. 누적 7+ PR.
810
+
811
+ 8. **mutableMap → fold = 명령형 vs 함수형** — *학생 부담 최소화 어휘 동반*. **MCP 룰 `mutable-collection-vs-fold` 후보**.
812
+
813
+ 9. **reviewer 자가 후퇴 + 학생 부담 최소화 + 선택지 분리** — *reviewer 가 자가 의견 비판적 점검*. **MCP `oop_propose_alternatives` 핵심 가치 합류**. 누적 12+ reviewer 어휘.
814
+
815
+ 10. **State vs Value Object 명시적 구분** — *State = 시간에 따라 변하는 것 (Context 멤버), Value Object = 불변값*. **MCP 룰 `state-vs-value-object` 후보**. 누적 2+ PR.
816
+
817
+ 11. **WinningState 매직 넘버 → State 정의** — *State 디자인 패턴 도입 시 모든 분기 State 로 + 단, Lazy 계산 = 상태 아님 구분*.
818
+
819
+ 12. **양방향 reviewer/학생 토론** — *reviewer 자가 의문 → 학생 자가 답변 → reviewer 자가 인정*. 누적 7+ PR.
820
+
821
+ 13. **동료 개발자 시점 어휘 (maintainer perspective locator)** — *코드를 읽는 동료가 이런 부분을 궁금해할 수도 있구나*. 누적 11+ PR ⭐⭐⭐.
822
+
823
+ 14. **State 자식이 abstract 함수 적극 활용 + 다형성 = 조건문 ↓** — *State 가 다양한 abstract 가지면 다형성으로 조건문 줄임*. 누적 6+ PR.
824
+
825
+ 15. **`Aginst` 오타 / 영문 명명 정확성** — *영어 사전 어휘 정확*. PR #23 결.
826
+
827
+ 16. **Higher Order Function 으로 setup 3개 모델 이동** — *Controller god-object 위험 vs 모델 책임 강화*. reviewer 자가 후퇴.
828
+
829
+ 17. **`protected` 멤버 = sealed class 자식 한정 접근** — Kotlin 어휘 활용.
830
+
831
+ 18. **순환 참조 회피 = 객체 관계 명확** — *수정 후 reviewer 칭찬*. 학생 자가 적용.
832
+
833
+ 19. **함수 명명 자가 답변 + 외부글 자가 학습** — *학생 자가 학습 가시화*. *학습 = 시간 두고 반복* 어휘.
834
+
835
+ 20. **Tell-Don't-Ask 의 부분 적용 = 부분 위반** — *State 가 getter 위임 6개 + 외부 가져옴*. *진정한 Tell-Don't-Ask = 메시지 던지기*.
836
+
837
+ ## 얻은 교훈 (도메인)
838
+
839
+ 1. **블랙잭 1.5배 별도 enum 멤버 `WinWhenBlackjack(ScoreRecord(1, 0), 1.5)`** — *enum 에 ScoreRecord + payoutMultiplier 묶음*. 누적 9+ PR ⭐⭐⭐.
840
+
841
+ 2. **블랙잭 룰 정확성**:
842
+ - *Bust 양측 시 Dealer Win* (Dealer 21 초과는 *룰 위반이 아닌 자가 처리* → Player.Bust + Dealer.Bust = Dealer Win? *블랙잭 표준 룰은 Player Bust 즉시 Lose, Dealer Bust → Player Win*).
843
+ - *현재 코드 `Bust.calculateGameOutcome` = `if (this.getInfo().isDealer() && opponent.isBust) return GameOutcome.Win` = *Dealer 가 Bust + Player 가 Bust → Dealer Win** = *룰 와전*?
844
+ - *실제 블랙잭 룰*: Player Bust = 즉시 Player Lose (Dealer 의 결과와 무관). Dealer Bust = 모든 살아있는 Player Win.
845
+ - 학생 자가 점검 필요 (reviewer 명시 X). **블랙잭 룰 정확성 점검 룰 후보**.
846
+
847
+ 3. **`ParticipantState.calculateInitialParticipantState`** — *2장 21점 = Blackjack, 21초과 = Bust (초기에 발생 X), else = Normal*. *isInitialDraw 플래그 없이 카드 size 체크* (PR #36 `isInitialDraw` 플래그 vs PR #87 `cards.size == 2` 체크 비교).
848
+
849
+ 4. **`Dealer.shouldDrawCardForDealer = getCardsSum() <= 16`** — *Dealer 자동 hit ≤16*. 블랙잭 표준 룰.
850
+
851
+ 5. **State 자식이 mutable Hand 변경 + 새 State 반환 = 부분 immutable** — *State 객체 immutable + 내부 Hand mutable*. **MCP 룰 `partial-immutability` 후보**.
852
+
853
+ 6. **`ParticipantBetAmount.MIN_BET_AMOUNTS = 1`** — *베팅 최소 1원*. 도메인 invariant. PR #36 (BattingMoney value > 0) 결.
854
+
855
+ 7. **`MAX_PLAYER_SIZE = 5`** — Participants invariant. 도메인 룰.
856
+
857
+ ## MCP 룰 후보 신규 + 강화 (PR #87)
858
+
859
+ | 룰 | 신규 / 강화 | 누적 PR |
860
+ |---|---|---|
861
+ | `state-context-locator` | 신규 | 4 (#73·#87·#93·#136) — Context = State 관리 책임 |
862
+ | `state-context-bidirectional-reference` | 신규 | 1 (#87) — State ↔ Context 양방향 참조 회피 |
863
+ | `is-operator-polymorphism-avoidance` | 강화 | 6+ (#147·#87·#136·#152·#93·#98) |
864
+ | `law-of-demeter-violation-depth` | 강화 | 6+ (#93·#133·#146·#87·#137·#148) |
865
+ | `test-as-design-spec` | 강화 | 3+ (#26·#87·#93) ⭐⭐⭐ |
866
+ | `inheritance-without-shared-interface` | 신규 | 3+ (#87·#147·#88) |
867
+ | `dummy-zero-for-domain-absent` | 신규 | 2+ (#131·#87) |
868
+ | `model-view-dependency-direction` | 강화 | 7+ |
869
+ | `mutable-collection-vs-fold` | 신규 | 1 (#87) |
870
+ | `mutable-collection-as-parameter` | 신규 | 1 (#87) |
871
+ | `state-flag-vs-polymorphism` | 신규 | 4+ (#147·#87·#136·#152) |
872
+ | `partial-immutability` | 신규 | 2+ (#87·#136) |
873
+ | `state-vs-value-object` | 신규 | 2+ (#87·#136) |
874
+ | `english-spelling-naming` | 신규 | 2+ (#23·#87) |
875
+ | `setup-locus-controller-vs-model` | 신규 | 1 (#87) |
876
+ | `tell-dont-ask-asymmetric-method` | 신규 | 1 (#87) |
877
+ | `state-children-method-vs-external-when` | 강화 | 7+ (#93·#136·#152·#98·#36·#87) |
878
+ | `blackjack-rule-fidelity` | 강화 | 9+ |
879
+ | `enum-with-composite-state` | 신규 | 1 (#87) — enum 멤버에 여러 속성 묶음 |
880
+
881
+ ## 메타 어휘 (12 reviewer + MCP 핵심 가치 합류)
882
+
883
+ - ***역할·책임·협력 = 객체 설계의 핵심*** — ghojeong PR #87 — *조영호 「객체지향의 사실과 오해」 + Wirfs-Brock RDD 핵심 어휘 합류*. **MCP `oh-my-oop` 핵심 가치 정점**.
884
+ - ***테스트 = 객체 설계 명세서*** — ghojeong PR #87 — *테스트가 객체 의도 + 역할 표현*. PR #26 결 강화.
885
+ - ***State Context 책임 분석 메타 어휘*** — ghojeong PR #87 — *State 를 저장/관리하는 책임 객체 = Context*.
886
+ - ***reviewer 자가 후퇴 + 학생 부담 최소화*** — ghojeong PR #87 — *"다시 생각해보니 이 피드백은 과한 감이 있다는 생각이 들어서 반영해주시지 않아도 괜찮습니다!"* — **MCP `oop_propose_alternatives` 핵심 가치 합류**.
887
+ - ***동료 개발자 시점 어휘 (maintainer perspective locator)*** — ghojeong PR #87 — *"코드를 읽는 동료가 이런 부분을 궁금해할 수도 있구나!"*. 누적 11+ PR ⭐⭐⭐.
888
+ - ***외부 자료 + 자가 학습*** — ghojeong PR #87 — tecoble instanceof + tecoble 디미터 법칙 2 외부글.
889
+ - ***학생 자가 Tell-Don't-Ask 깨달음*** — jaeyeongjo PR #87 — *"state에 필요한 함수를 생성해주고, Pariticipant는 state에게 요청을 하는듯하게 리팩토링하면 되겠군요!"* — *디미터 법칙 → Tell-Don't-Ask 자가 변환*.
890
+ - ***학생 자가 State 정정*** — jaeyeongjo PR #87 — *"상태는 ParticipantState하나이고 context는 participant입니다. GameState은 상태가 아닙니다!"* — *State vs 결과 (Lazy 계산) 구분 자가 깨달음*.
891
+
892
+ ## 비교 (PR #73 → #87 진화 — 사족 X, 안티패턴 명시만)
893
+
894
+ - **1단계 #73 신규 reviewer ghojeong → 2단계 #87 동일 reviewer = 학생-reviewer 페어 안정** (2 PR 누적).
895
+ - **1단계 State 디자인 패턴 사용 확인 → 2단계 State Context 책임 명시 + 자식 abstract 적극 활용 자가 적용** — *학습 시간성 + 자가 적용*.
896
+ - **1단계 `Set vs List` (removeLast) → 2단계 `mutableMap vs fold`** — *명령형 vs 함수형 어휘 진화*.
897
+ - **1단계 Hand 객체 분리 칭찬 → 2단계 State ↔ Hand 위임 깊이 (디미터 법칙)** — *Hand 분리 자가 적용 후속 학습 시점*.
898
+ - **1단계 PR 본문 자가 의문 2개 → 2단계 라인 자가 답변 6+ 회 풍부** — *자가 학습 형식 변화*.
899
+
900
+ → *진화 비교 = 사족 아님 (안티패턴 코드 위치 명시)* + *State 패턴 학습 시간성 일관*.