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,253 @@
1
+ # PR #23 — [블랙잭 1단계] 멘델 미션
2
+
3
+ - **Reviewee:** [@rhthrhrl0](https://github.com/rhthrhrl0)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/23
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun (말리빈)
7
+ - **라인 코멘트:** 28 스레드 — *학생 자가 답변 + 학습 풍부* + 말리빈 매우 긴 메타 답변 (점수 계산 책임 위치 그림 첨부) + 외부 글 추천
8
+ - **신규 reviewee** (2023년 3월 PR — 시기적으로 다른 코호트)
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ - **View 람다 콜백 분리 칭찬 2회** — 말리빈 *"View에 대한 요소를 람다를 통해 전달해주셨네요 👍"* + *"View에 대한 내용을 람다로 잘 전달해주신 게 정말 인상 깊네요! 👍👍"*. **`onXX` 콜백 어휘 = Inversion of Control 정공** — PR #99 (s6m1n 자가 학습) / PR #137·#132 의 *외부 자료 + 콜백* 결.
13
+ - **다형성 활용** — 말리빈 *"다형성을 활용해주셨네요 👍"* — Player/Dealer 추상화.
14
+ - **방어적 복사 자가 학습** — 말리빈 *"방어적 복사가 잘 이뤄졌네요 👍"*. PR #108·#132·#133·#85·#58·#137·#148·#74 와 같은 결.
15
+ - **`Card` 가짜 생성자 (Factory) 외부 글 추천 + 학생 자가 학습** — 말리빈: *"Card를 만들기 불편해보이고, 테스트 가독성도 나빠져 보여요. 테스트에서 사용할 Card의 가짜 생성자를 만들어보는 것은 어떨까요? 가짜 생성자는 아래의 글을 참고해보세요"* + [Kotlin 공식 문서 - concrete-type-constructors](https://kotlinlang.org/docs/constructing-collections.html#concrete-type-constructors) + [Item 30 - Consider Factory Functions](https://blog.kotlin-academy.com/item-30-consider-factory-functions-instead-of-constructors-e1c747fc475) — *외부 학습 자료 첨부*. 학생: *"재밌게 읽었습니다. 좋은 글 추천해주셔서 감사합니다!"*. **MCP `oh-my-oop` 룰에 외부 자료 인용 패턴**.
16
+ - **`assertAll` 자가 학습 + 병행 처리 어휘** — 말리빈 메타 질문: *"검증문을 나열하는 것과 assertAll로 감싸는 것은 어떤 차이가 있을까요?"* + 학생 자가 답변: *"이걸 사용하면 순차처리가 아닌 병행 처리가 가능해진다고 확인했습니다. 덕분에 에러가 발생하면 멈추고 뒤에 것이 테스트 안되는게 아니라 이 하나의 전체 그룹에서 발생한 모든 오류를 체크 가능하다는 글을 읽었습니다. 알려주셔서 감사합니다!!"*. **테스트 어휘 자가 학습 + 자가 의미 정리 모범**. PR #99·#88·#85 의 *테스트 어휘* 결.
17
+ - **새 게임 객체 재사용 자가 반영 (페이즈 객체 도입)** — 말리빈 진단 *"하나의 블랙잭 게임 객체는, 한 번의 게임만 실행할 수 있겠네요 :) 객체는 한 개만 만들고, 게임은 여러 번 진행할 수 있게 만들어보는 것은 어떨까요?"* + 후속: *"game은 한 번만 생성하고, 내부에서는 사이드 이팩트를 발생 시키지 않으면서, 플레이어와 딜러에 대한 상태를 가지지 않게 만들어보는 것을 시도해보세요 :)"* + 학생 자가 반영: *"게임의 각 진행 단계를 페이즈라는 개념의 객체들로 만들고 게임을 실행하면 페이즈 객체들을 연속실행 시키는 방법으로 수정했습니다!"*. **싱글톤 vs 1회용 자가 학습 + 페이즈 객체 도입 자가 진화** — PR #98 의 *State 패턴* / PR #99 의 *람다 콜백* 결.
18
+ - **`RandomCardDrawer` 카드 목록 캐싱 자가 반영** — 말리빈 진단 *"카드 목록은 RandomCardDrawer를 생성할 때마다 새로 생성되겠네요 :) 카드 목록을 한 번만 생성해서 재활용해보는 것은 어떨까요?"* + 학생 자가 반영 (companion object + private val CARD_DECK). PR #74·#108·#133 의 *카드 캐싱* 결.
19
+ - **`else` 자가 학습 (극단 회피 인정)** — 말리빈: *"아래 두 줄은 첫 줄의 if문의 else 로도 표현이 가능하겠네요 :)"* + 학생: *"else를 지양하라는 말에 너무 집중하다보니 극단적으로 else를 안쓰게 된 것 같습니다. 지적해주셔서 감사합니다."*. **원칙 극단 적용 자가 인정 + 균형 학습**. PR #146 의 *YAGNI* / PR #151 의 *반란군 비유* 결.
20
+ - **머지 후 후속 코멘트 + 학생 자가 후속 학습** — 머지 시점 이후에도 *3월 8·9·12일* 코멘트 활발 = *피드백 후 학습 지속*. 말리빈/멘델 양측 모두 후속 토론 — *PR 머지가 학습 종료 X* 모범.
21
+
22
+ ## 못한 점 (설계 관점)
23
+
24
+ ### 1. `점수 계산 Dealer 책임` + `Player vs Player 비교 어려움` — 말리빈 매우 긴 답변 + 그림 첨부
25
+
26
+ 말리빈 진단:
27
+
28
+ > *"점수를 계산하는 부분은 Dealer만 가지고 있으면 좋겠어요. 플레이어와 플레이어는 사실 경쟁 상대가 아니기 때문이에요. 플레이어끼리 결과를 비교하면, 어떤 플레이어가 이겼는 지 알기도 어려울 것으로 예상돼요. (Player.getGameResult()) 또, 승패를 결정하는 룰은 딜러와 플레이어 간 연관이 있기도 해서요. 그러면 자연스럽게 Players 에게 메시지를 던지는 형태도 사라질 수도 있겠어요 :) 멘델의 생각은 어떠신가요?"*
29
+
30
+ 학생 자가 답변 (자가 정당화):
31
+
32
+ > *"저는 플레이어의 승패가 딜러보다 먼저 결정나고('플레이어가 버스트 된다면 플레이어는 딜러가 버스트 되더라도 진다'라는 규칙) 또한, 딜러의 승패 종합 결과는 플레이어들에 의해 정해진다고 생각했습니다. 그래서 플레이어 기준의 승패 결과가 중요하다고 생각을 해서 플레이어쪽에 게임 결과 반환 메소드가 있는것이 적절할것 같다고 생각했습니다. 그래서 이번에 수정하면서 딜러쪽에서 게임의 승패를 반환하는 메소드는 제거 시켰습니다. 혹시 수정 이후에도 아직 부자연스러워 보이시면 해당 로직을 딜러쪽으로 이동시켜보겠습니다!"*
33
+
34
+ 말리빈 매우 긴 답변 (3 메타 시점 + 그림 첨부):
35
+
36
+ > *"저는 딜러쪽이 좀 더 특수하다고 생각해요 :) 일반적이라면 카드 점수와 개수 만으로 결과가 나오지만, 블랙잭의 경우는 딜러가 블랙잭일 때 특수 룰이 적용된다 생각해요. 그리고 현실 세계에서는 딜러가 결과를 알려주기 때문이에요.*
37
+
38
+ > *위 같은 의견도 있지만, 아래는 제 개인적인 의견입니다 ㅎ_ㅎ 저는 딜러도, 플레이어도 아닌, 그 부모 객체인 Participant에 위치해도 좋다는 생각이에요. 사실 결과 자체는 누가 가지고 있는 지 보다, 카드더미만 있으면 알 수 있으니까요.*
39
+
40
+ > *좀 더 의존 관계에 대해 짚어보면, 현재는 플레이어는 Dealer를 알고 있습니다. (의존 관계 그림 첨부)"*
41
+
42
+ 학생 후속 답변: *"열정적으로 피드백과 의견을 달아주셔서 감사합니다! 말리빈님의 글을 읽어보니 왜 그렇게 하기를 원하셨는지 알겠습니다. 더 수정해보겠습니다!"*
43
+
44
+ → **4 가지 메타 학습**:
45
+
46
+ #### 1.1. *점수 계산 책임 위치 = 3 후보*
47
+
48
+ - (A) **`Dealer.compareResult(player)`** — 말리빈 *공식 의견*. *블랙잭 특수 룰 (딜러 블랙잭) + 현실 메타포 (딜러가 결과 알려줌)*.
49
+ - (B) **`Player.getGameResult(dealer)`** — 학생 자가 선택. *플레이어 승패가 딜러보다 먼저 결정 + 플레이어 기준 결과 중요*.
50
+ - (C) **`Participant.compareWith(other)`** — 말리빈 *개인 의견*. *카드더미만으로 결과 알 수 있음 + 의존 관계 단순*.
51
+
52
+ #### 1.2. *플레이어 vs 플레이어 비교 어려움*
53
+
54
+ 말리빈의 핵심 진단 = *"플레이어와 플레이어는 사실 경쟁 상대가 아니기 때문이에요. 플레이어끼리 결과를 비교하면, 어떤 플레이어가 이겼는 지 알기도 어려울 것으로 예상돼요."*
55
+
56
+ → **블랙잭 도메인 룰 = *플레이어 vs 플레이어 비교 X***. *각 플레이어 vs 딜러 1:1 비교*. *학생의 `Player.getGameResult()` = "이 플레이어가 이겼는가" 의 *상대* 가 불명확*.
57
+
58
+ 대안:
59
+ - **`Player.getGameResultAgainst(dealer)`** — 명시적 상대.
60
+ - **`Dealer.compareResult(player)`** — 딜러 기준 (위 A).
61
+
62
+ #### 1.3. *현실 메타포 + 도메인 룰 = 같은 결*
63
+
64
+ *"현실 세계에서는 딜러가 결과를 알려주기 때문이에요"* — *현실 메타포 = 딜러가 결과 발표* + *도메인 룰 = 딜러 vs 각 플레이어 비교* = **같은 결**. PR #70 (chaehyuns 1단계) 의 *현실 메타포 (Dealer 판단) vs 확장성 (Participant vs Participant)* 트레이드오프 결.
65
+
66
+ #### 1.4. *공식 의견 + 개인 의견 분리 메타 어휘*
67
+
68
+ 말리빈의 *"제 개인적인 의견입니다 ㅎ_ㅎ"* — *공식 권고 (Dealer 책임)* + *개인 의견 (Participant 부모 책임)* 명시 분리. **MCP `oh-my-oop` 의 *단일 답 X + N개 대안 + 트레이드오프* 어휘와 일치**. PR #95 (말리빈 *"옳고 그름 없고 장단점만"*) 결.
69
+
70
+ PR #74 (송핑크 *Referee*) / PR #148·#151 (krrong *역할 vs 상태*) / PR #49·#132 (참가자 vs 참가자 일반화) 결.
71
+
72
+ ### 2. `State.Burst, State.NoBurst` 외부 분기 → Tell-Don't-Ask 자가 학습
73
+
74
+ 말리빈 진단: *"이 함수들은 결국 Burst 인지 아닌지 구별하는 것으로 주로 쓰이고 있네요 :) 외부에서 State.Burst, State.NoBurst를 구분하기보다, Cards에게 물어보는 것은 어떨까요? 또, Cards에게 점수를 물어보면, 내부에서 계산을 마치고 합산 점수만 반환하게 만들어보세요 :)"*
75
+
76
+ → **Tell-Don't-Ask = *상태를 외부에서 분기 X, 객체에 메시지 명령***.
77
+
78
+ 대안:
79
+ - *`if (cards.state == Burst)`* < *`if (cards.isBurst())`* (외부 분기 X).
80
+ - *`cards.calculateScore()`* 반환 < *외부에서 합산 로직* (책임 응집).
81
+
82
+ PR #74 (송핑크 *Tell-Don't-Ask 자가 인정*) / PR #98 (chaehyuns *Hand 메시지*) / PR #99 (s6m1n *Hand 클래스 도입*) 결.
83
+
84
+ ### 3. `Dealer 가 players 의 값을 꺼내 호출` → 메시지 권고
85
+
86
+ 말리빈: *"players에서 값을 꺼내서 호출하기 보다, players에게 메시지를 던져보는 것은 어떨까요?"*
87
+
88
+ → **`getter 호출 + 외부 로직` < `객체에 메시지 + 내부 로직`** = *Tell-Don't-Ask + 디미터 법칙*. PR #99 (s6m1n *Players 일급 컬렉션*) / PR #133·#136·#137 의 *Tell-Don't-Ask* 결.
89
+
90
+ ### 4. `CardDrawer` 명명 — Drawer = 서랍 안티패턴
91
+
92
+ 말리빈: *"Drawer의 일반적인 뜻은 '서랍'이에요 :) ~~~er 접두사를 많이 사용하다 보면 나오는 흔한 오류라고 생각해요. 더 구체적인 다른 이름을 찾아볼까요? 🙂"*
93
+
94
+ → **`~~~er` 접두사 함정**:
95
+ - *`Drawer`* = *카드를 뽑는 자* 의도, 그러나 *Drawer = 서랍* 의 일반 의미가 강함.
96
+ - *`Drawer`* 같은 동사+er 명명 = *영어 사전상 다른 의미와 충돌* 시 *의도 전달 실패*.
97
+
98
+ 대안:
99
+ - **`CardDealer`** — 도메인 어휘 (카드 분배자).
100
+ - **`CardSupplier`** — 추상화 (공급자).
101
+ - **`Deck`** — 직접적 도메인 명사.
102
+ - **`Shoe`** — 카지노 블랙잭 어휘 (카드를 담는 통).
103
+
104
+ **MCP 기존 룰 `vagueName`** 변형 — *`~~~er` 접두사 검사*. PR #67 (s6m1n *DealingShoe*) / PR #74 (송핑크 *Deck*) 결.
105
+
106
+ ### 5. `Cards(Set<Card>)` — 여러 벌 카드 요구사항 시 한계
107
+
108
+ 말리빈: *"Cards를 생성할 때 Set을 받으셨네요! 중복된 카드를 받지 않을 수 있는 장점이 생길 수 있지만, 블랙잭 게임에서 여러 벌의 카드를 사용하는 요구사항이 추가되면 어떤 일이 생길 수 있을까요?"*
109
+
110
+ → **자료구조 선택 트레이드오프**:
111
+ - **`Set<Card>`** = *중복 차단 + 카드 1벌 한정*. *여러 벌 사용 시 동일 카드 중복 = Set이 차단 → 동작 깨짐*.
112
+ - **`List<Card>`** = *순서 + 중복 허용 + 여러 벌 가능*.
113
+ - **`MutableList<Card>` + draw 시 remove** = *덱 자료구조 + 카드 소진 모델링*.
114
+ - **`ArrayDeque<Card>`** = *FIFO 덱 + draw 효율*.
115
+
116
+ **MCP 룰 후보 — `set-vs-list-multiset`** = *중복 허용 시나리오 검토*. PR #58 (otter66 *카지노 6덱 메타포*) 결.
117
+
118
+ ### 6. `pattern 안 "스페이드" View 영역 누수` — 학생 자가 의문 + 말리빈 메타 답변
119
+
120
+ 말리빈: *"pattern 안의 값은 뷰의 영역이에요 :) '스페이드' 는 '♠' 로도 충분히 변경이 가능해보입니다 🙂"*
121
+
122
+ 학생: *"이모지를 써야하는 이유를 잘 모르겠습니다!! 혹시 특별한 이유가 있을까요??"*
123
+
124
+ 말리빈 부연 (메타 어휘):
125
+
126
+ > *"이모지를 써야만 한다는 의미가 아니었어요. 카드 심볼에 대한 View의 출력 형태는 언제든지 변경 가능하다는 의미였습니다 :) 이모지 뿐만 아니라, 영어 등의 다른 언어로도 출력이 가능하겠지요 🙂*
127
+
128
+ > *그렇다면, 이 모든 변경 가능할 요소들을 domain이 가지고 있는 게 맞을 지에 대한 질문이었어요!"*
129
+
130
+ → **3 가지 메타 학습**:
131
+
132
+ #### 6.1. *학생 자가 의문 = 학습 모범*
133
+
134
+ *"이모지를 써야하는 이유를 잘 모르겠습니다!!"* = *reviewer 의 *의도* 가 학생에게 닿지 않음 + 자가 명시*. **학습 갭 명시 모범**. PR #95 (송핑크 *"이해를 못했습니다"*) 결.
135
+
136
+ #### 6.2. *reviewer 부연 = 의도 명시*
137
+
138
+ 말리빈의 *"이모지를 써야만 한다는 의미가 아니었어요"* — *학생의 표면적 해석 (이모지 강제) 을 부정 + 본 의도 (View 표현 가변성) 명시*. PR #95·#99 의 *두 번 부연* 결.
139
+
140
+ #### 6.3. *Domain vs View 어휘*
141
+
142
+ *도메인 = 게임 룰 (스페이드/하트/다이아/클럽)* + *View = 표현 (♠ vs "스페이드" vs "Spade" vs 그림)*. **MCP 기존 룰 `enum-with-ui-value`** (lotto 어휘) 의 *블랙잭 변형*. PR #28·#78·#112·#125·#147 의 *enum koreanText/description* 결.
143
+
144
+ ### 7. `BlackJackCardDeck` 카드 캐싱 (LottoNumber 참조)
145
+
146
+ 말리빈: *"이전 로또 미션에서 LottoNumber를 캐싱했던 것 처럼, 동일한 Card 객체가 중복으로 생성되지 않게 만들어보는 것은 어떨까요?"*
147
+
148
+ → **이전 미션 학습 자가 연결 권고**. *LottoNumber 1-45 캐싱* → *Card 52장 캐싱* = *동일 패턴 자가 적용*. PR #74·#108·#133·#136 의 *Card private constructor + Factory + 캐싱* 결.
149
+
150
+ ### 8. `재귀 호출 의도 자가 정당화` — *마지막 if 중복 자가 인정 X*
151
+
152
+ 말리빈 진단: *"마지막 줄의 if 문은 중복 코드로 보입니다. 어떤 의도인지 알기 어려워서, 한 번만 검사하는 것과 어떤 점이 다른가요?_?"*
153
+
154
+ 학생 자가 정당화:
155
+
156
+ > *"카드를 추가하지 않겠다고 n을 입력하더라도 플레이어의 카드 목록을 출력해야합니다. 떄문에 카드를 더한다고 y를 입력하면 카드를 더하고 카드목록을 출력하고, 만약 n을 입력하면 카드를 더하지 않고 출력하도록 되어있습니다. 또한, 만약 카드를 더하겠다고 y를 입력하면 버스트 되지 않는한 계속 물어봐야 하기 때문에 마지막 if문에서 재귀 호출을 했습니다."*
157
+
158
+ → **학생 자가 정당화 = *재귀 호출 의도 명시***. *말리빈은 *코드만 보고 중복 인식* 했으나 학생의 의도 (카드 출력 양분기 + 재귀 종료 조건) 가 명확*. **재귀 호출의 의도 = 주석 또는 함수 분리로 가독성 향상** 가 정공:
159
+
160
+ - (A) **`hitOrStay()` 함수 분리** — *재귀 의미 명시 + 매개변수로 종료 조건*.
161
+ - (B) **반복문 + 명시적 break 조건** — *재귀 회피*.
162
+ - (C) **State 패턴** = *Hit 상태 → 다음 상태 전이* (PR #98 의 상태 패턴 토론).
163
+
164
+ 학생 머지 시점 미반영 (자가 정당화로 종결).
165
+
166
+ ### 9. `BlackJackCardDeckTest` 갯수만 검증 = 무의미
167
+
168
+ 말리빈: *"갯수만을 검증하는 것은 테스트에 큰 의미를 부여하기 어렵습니다. 랜덤에 대해 제어할 수 있게 만들어보시고, 정확히 예측 가능한 카드로 검증문을 구성해보세요 :)"*
169
+
170
+ → **갯수 검증 < 결정적 검증**:
171
+ - *`assertEquals(2, deck.draw().size)`* = *갯수만* — *어떤 카드든 통과*. *버그 잡기 어려움*.
172
+ - *`assertEquals(Card.SPADE_ACE, deck.draw())`* = *결정적* — *덱이 정확히 어떤 카드를 반환하는지 검증*.
173
+
174
+ 해결 = *interface CardDeck + 결정적 구현체 주입* (PR #74·#95·#99 의 *Random 테스트* 결).
175
+
176
+ ### 10. `input/output/choice` 변수명 모호
177
+
178
+ 말리빈: *"input, output, choice는 다른 개발자들이 이름만 보고 어떤 의미인지 한 번에 파악할 수 있을까요?"*
179
+
180
+ → **MCP 기존 룰 `vagueName`** (lotto/racingcar `vagabond95` 인용) 결. *추상 명사 (`input`/`output`) 가 *컨텍스트 모호* + *위치별로 다른 의미* 위험*. 대안 = `playerNameInput` / `gameResultOutput` / `hitOrStayChoice`.
181
+
182
+ ### 11. `Answer.kt` 도메인에 "y","n" View 요소 누수
183
+
184
+ 말리빈: *"Answer를 domain으로 분류해주셨네요 :) 'y', 'n'는 뷰의 요소이니 분리해주세요 :)"*
185
+
186
+ → **도메인-뷰 경계 명확화**. *Answer enum 자체는 도메인 (`Hit`/`Stay`)* + *"y","n" 입력 표현은 View*. *View → Answer 변환은 ViewModel/Mapper 영역*. PR #28·#78·#112·#125·#147 의 *enum koreanText/description* 결.
187
+
188
+ ### 12. `프로덕션 코드 + 테스트용 로직` — 분리 권고
189
+
190
+ 말리빈: *"테스트 코드에서만 사용되는 로직을 프로덕션 코드에 넣는 것은 지양해주세요 :)"*
191
+
192
+ → **테스트 전용 코드 = 테스트 모듈에**. *프로덕션 코드 + 테스트 헬퍼* = *프로덕션 API 오염 + 의도 모호*. PR #99 (s6m1n *Test Fixture 함수 분리*) 결.
193
+
194
+ ### 13. 딜러 16/17 룰 미준수 — 블랙잭 룰 정확성
195
+
196
+ 말리빈: *"딜러의 점수가 16이하이면 17이상이 될 때까지 카드를 계속 받아야합니다 :) 블랙잭 규칙을 로직에 잘 반영해주세요!"*
197
+
198
+ → **MCP 룰 후보 — `blackjack-rule-fidelity`** (도메인 특수). *딜러 자동 hit ≤16 / Ace+10 두 장 블랙잭 / Bust 개별 판정* 등 *블랙잭 룰 정확성*. PR #20·#64·#110·#120·#29·#63 의 *블랙잭 룰 오해* 결.
199
+
200
+ ## 리뷰어 의견 요지 (말리빈 / malibinYun)
201
+
202
+ 28 코멘트 특징 (PR #74 와 동일한 reviewer):
203
+
204
+ - **메타 질문 어휘** — *"~ 어떨까요?"*, *"~ 어떤 점이 다른가요?_?"*, *"~ 어떤 일이 생길 수 있을까요?"* — 학생 자가 답변 유도. PR #74·#95 와 동일.
205
+ - **외부 자료 첨부** — *Kotlin 공식 문서 + Kotlin Academy 블로그 (Item 30)*. **MCP `oh-my-oop` 의 *외부 자료 인용* 어휘**. PR #95·#67·#74 결.
206
+ - **공식 의견 + 개인 의견 분리** — *"위 같은 의견도 있지만, 아래는 제 개인적인 의견입니다 ㅎ_ㅎ"* — **MCP `oop_propose_alternatives` 의 *N 안 + 트레이드오프* 어휘와 일치**. PR #95 (*"옳고 그름 없고 장단점만"*) 결.
207
+ - **그림 첨부 의존 관계** — *플레이어 → Dealer 의존 그림* (이미지 URL 첨부) — 텍스트 < 시각화. PR #98·#99·#146·#148 의 *다이어그램* 결.
208
+ - **이전 미션 학습 자가 연결 권고** — *"이전 로또 미션에서 LottoNumber를 캐싱했던 것 처럼"* — *racingcar/lotto 학습 자가 자가 적용 권유*. PR #95·#67 결.
209
+ - **머지 후 후속 코멘트 활발** — *3월 8·9·12일* 양측 코멘트. *PR 머지 = 학습 종료 X*.
210
+
211
+ ## 대표 인용
212
+
213
+ > *"플레이어와 플레이어는 사실 경쟁 상대가 아니기 때문이에요. 플레이어끼리 결과를 비교하면, 어떤 플레이어가 이겼는 지 알기도 어려울 것으로 예상돼요."* — malibinYun (도메인 룰 + 점수 책임 위치)
214
+
215
+ > *"위 같은 의견도 있지만, 아래는 제 개인적인 의견입니다 ㅎ_ㅎ 저는 딜러도, 플레이어도 아닌, 그 부모 객체인 Participant에 위치해도 좋다는 생각이에요. 사실 결과 자체는 누가 가지고 있는 지 보다, 카드더미만 있으면 알 수 있으니까요."* — malibinYun (공식 의견 + 개인 의견 메타 분리)
216
+
217
+ > *"이모지를 써야만 한다는 의미가 아니었어요. 카드 심볼에 대한 View의 출력 형태는 언제든지 변경 가능하다는 의미였습니다. (...) 그렇다면, 이 모든 변경 가능할 요소들을 domain이 가지고 있는 게 맞을 지에 대한 질문이었어요!"* — malibinYun (학생 표면 해석 → 본 의도 부연)
218
+
219
+ > *"저는 플레이어의 승패가 딜러보다 먼저 결정나고('플레이어가 버스트 된다면 플레이어는 딜러가 버스트 되더라도 진다'라는 규칙) 또한, 딜러의 승패 종합 결과는 플레이어들에 의해 정해진다고 생각했습니다."* — rhthrhrl0 (학생 자가 도메인 룰 정당화)
220
+
221
+ > *"else를 지양하라는 말에 너무 집중하다보니 극단적으로 else를 안쓰게 된 것 같습니다. 지적해주셔서 감사합니다."* — rhthrhrl0 (원칙 극단 적용 자가 인정)
222
+
223
+ > *"이걸 사용하면 순차처리가 아닌 병행 처리가 가능해진다고 확인했습니다. 덕분에 에러가 발생하면 멈추고 뒤에 것이 테스트 안되는게 아니라 이 하나의 전체 그룹에서 발생한 모든 오류를 체크 가능하다는 글을 읽었습니다. 알려주셔서 감사합니다!!"* — rhthrhrl0 (assertAll 자가 학습 + 의미 정리)
224
+
225
+ ## 얻은 교훈
226
+
227
+ 1. **점수 계산 책임 위치 = *Dealer / Player / Participant* 3 후보 + 도메인 룰 + 현실 메타포** — *블랙잭 = Dealer vs 각 Player 1:1 비교* + *Player vs Player 비교 X* + *Dealer 가 결과 알려주는 현실 메타포*. **MCP 룰 후보 — `dealer-vs-player-result-locus`** (도메인 특수). PR #70·#74·#148·#151·#49·#132 결.
228
+
229
+ 2. ***공식 의견 + 개인 의견 메타 분리*** = **MCP `oh-my-oop` 의 *N 안 + 트레이드오프* 어휘와 일치**. *reviewer 가 *권위적 단일 답* 이 아니라 *주된 권고 + 개인 의견 + 학생 선택지* 명시*. PR #95 (*"옳고 그름 없고 장단점만"*) 결.
230
+
231
+ 3. ***학생 표면 해석 → reviewer 본 의도 부연*** — *학생이 *"이모지를 써야 하나요?"* 표면 의문 → reviewer *"카드 심볼 표현이 가변임을 의미"* 본 의도 부연*. **학생이 모르는 채로 두지 않으려는 자가 명시 + reviewer 의 명확화 어휘**. PR #95·#99 결.
232
+
233
+ 4. **`~~~er` 접두사 명명 함정** — *`Drawer = 서랍` 의 영어 사전 의미* 와 *`카드 뽑는 자` 의도* 충돌. **MCP 룰 후보 — `er-suffix-collision`** = *영어 사전 다중 의미 충돌 검사*.
234
+
235
+ 5. **`Set<Card>` vs `List<Card>` 자료구조 선택** = *중복 차단 vs 여러 벌 카드 요구사항*. **자료구조 선택 = 요구사항 확장 가능성 고려**. PR #58 의 *카지노 6덱 메타포* 결.
236
+
237
+ 6. **갯수만 검증 = 무의미 테스트** — *결정적 카드 검증 + 랜덤 제어 (interface + 구현체) 정공*. PR #74·#95·#99 의 *Random 테스트* 결.
238
+
239
+ 7. **이전 미션 학습 자가 연결 권고** — *"로또 미션의 LottoNumber 캐싱"* → *블랙잭 Card 캐싱* — *racingcar/lotto/blackjack 미션 간 학습 연쇄*. **양 단계 + 양 미션 본 reviewer 만 가능한 권유**.
240
+
241
+ 8. **외부 자료 첨부** = *공식 문서 + 블로그 + Kotlin Academy Item 시리즈* — *학생 자가 학습 채널 확장*. *PR 코멘트 = 짧은 텍스트* + *외부 자료 = 깊은 학습*. PR #95·#67·#74 결.
242
+
243
+ 9. **그림 첨부 의존 관계** = *텍스트 < 시각화*. *Player → Dealer 의존 그림* = *학생이 *의존 방향*을 시각적으로 파악*. PR #98·#99·#146·#148 의 *다이어그램* 결.
244
+
245
+ 10. **`else` 자가 학습 (원칙 극단 적용 자가 인정)** — *"else를 지양하라는 말에 너무 집중하다보니 극단적으로 else를 안쓰게 된 것 같습니다"*. **원칙 = 일률 적용 X + 컨텍스트 균형**. PR #146 (*YAGNI*) / PR #151 (*반란군 비유*) / PR #98 (*상태 패턴 효과 의문*) 결.
246
+
247
+ 11. ***머지 후 후속 코멘트 = 학습 지속*** — *3일 후, 6일 후 양측 코멘트* — *PR 머지 = 학습 종료 X*. PR #128·#135·#108·#136 의 *학생 자가 토론 지속* 결.
248
+
249
+ 12. **블랙잭 룰 정확성 = 도메인 특수 진단** — *딜러 ≤16 자동 hit* = *블랙잭 도메인 룰 미준수 가능성* — **MCP 룰 후보 `blackjack-rule-fidelity`**. PR #20·#64·#110·#120·#29·#63 결.
250
+
251
+ 13. **`Answer enum + "y"/"n" View 누수`** = *도메인-뷰 경계 명확화*. PR #28·#78·#112·#125·#147 의 *enum koreanText/description* 결의 *블랙잭 변형*.
252
+
253
+ 14. **`재귀 호출 의도 자가 정당화`** — *학생이 *코드 표면 (중복)* 이 아닌 *의도 (양분기 + 종료 조건)* 명시*. **자가 정당화 ≠ 권고 거부**. *학생이 *왜 이렇게 작성했는지* 명시 + reviewer 가 *그 의도가 잘 전달되는지* 평가* — 양방향 토론 모범.
@@ -0,0 +1,238 @@
1
+ # PR #39 — [블랙잭 2단계] 멘델 미션
2
+
3
+ - **Reviewee:** [@rhthrhrl0](https://github.com/rhthrhrl0)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/39
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun (말리빈)
7
+ - **라인 코멘트:** 23 스레드 — *1단계 권고 적극 자가 반영 + State/Phase 패턴 도입 + 그러나 과도한 일급화·deepCopy 새 안티패턴*
8
+ - **양 단계 분석 reviewee** (1단계 #23 별도). 학생 자가 마감 당일 사과 + 상태 패턴 처음 시도 자가 명시.
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ - **`Phase` 추상화 = View 분리 정공 — 말리빈 놀람 칭찬** — *"view에 대한 요소들을 Phase로 추상화한 것은 정말 신선한 발상이네요!! 👍"* / *"View를 Phase로 추상화한 형태가 매우 흥미롭네요 👍"*. **학생 자가 *진행 단계 (Phase) 객체화* 발상** — *명령형 절차 < 단계 객체 시퀀스*. PR #98·#99·#137 의 *진행 흐름 추상화* 결.
13
+ - **상태 패턴 자가 학습 (1단계 후 새로 학습)** — PR 본문: *"이번에 새로 배운 상태 패턴 개념을 추가해서 적용하는데 시간이 좀 걸려서 리뷰 요청이 늦어졌습니다."* + *"상태 패턴 적용이 처음이라서 잘못된 부분들을 지적해주시면 감사하겠습니다!!"*. 말리빈 머지 시점 칭찬: *"상태 패턴을 열심히 구현해주셨네요 👍👍 처음 구현해보기에는 어려우셨을텐데 잘 구현해주셨네요!"*. **자가 학습 + 자가 명시 모범** — PR #98 (chaehyuns *상태 패턴 처음*) 결.
14
+ - **1단계 PR URL 본문 자가 참조** — *"저번 step1때 달렸던 나머지 피드백들도 최대한 반영해봤고 달렸던 코멘트들에 대해서도 제 생각과 궁금점들을 코멘트로 달아놨습니다. https://github.com/woowacourse/kotlin-blackjack/pull/23"*. **양 단계 본 reviewer 만 가능한 1단계 코멘트 답변 + 2단계 PR 본문 URL 자가 참조** — PR #99·#95 의 *1단계 코멘트 URL 자가 참조* 결.
15
+ - **카드 캐싱 + elvis 활용 권고 (1단계 권고 자가 반영)** — 말리빈: *"카드를 잘 캐싱해주셨네요! 👍👍 of 메서드는 ?: (elvis operator)의 활용을 도전해보세요 :)"*. PR #23 1단계의 *LottoNumber 캐싱* 권고 자가 반영. PR #74·#108·#133·#136·#23·#26 와 같은 결.
16
+ - **Score `compareTo` 오버로딩 권고** — 말리빈: *"compareTo 연산자를 오버로딩 해볼 수도 있어요 :)"*. **Kotlin 연산자 오버로딩 어휘** — PR #93·#136·#152 의 *State.compareTo* 다형성 결.
17
+ - **suggestion 블록 활용** — `if (cardsState is BustState) return true else return false` → `return cardsState is BustState`. **Kotlin 표현식 함수** — PR #26 (잭슨 `isPossibleDrawCard` suggestion) 결.
18
+ - **머지 시점 학생 자가 회고** — *"그동안 감사했습니다!! 아래 달아주신 코멘트들에 대해서 좀 더 고민해보고 다음 미션 때 적용시켜보겠습니다 :)"*. PR #95·#98·#99 의 *학생 자가 회고* 결.
19
+
20
+ ## 못한 점 (설계 관점)
21
+
22
+ ### 1. `NameAndBet` 명명 + `PlayersNameAndBet` 일급 컬렉션 과적용
23
+
24
+ 말리빈 진단 1: *"플레이어의 정보를 나타내고 싶은 class 같은데, 이름에 큰 의미를 부여하긴 어려워 보이네요. 더 나은 이름을 고민해볼까요? 🤔"*
25
+
26
+ 말리빈 진단 2: *"이 객체는 값을 갖고만 있고, 특별한 역할을 하지 않아 쓸모를 느끼기 어려워요. 모든 컬렉션을 반드시 일급 컬렉션으로 래핑할 필요는 없다고 생각해요 🙂"*
27
+
28
+ → **2 가지 학습**:
29
+
30
+ #### 1.1. *`NameAndBet` = and 접속어 명명 안티패턴*
31
+
32
+ - *`NameAndBet`* = *Name + Bet 두 속성 이어붙임* = *도메인 어휘 X + 책임 모호*.
33
+ - 대안:
34
+ - **`PlayerInfo`** — 추상 명사, 여전히 모호.
35
+ - **`PlayerProfile`** — *기본 정보 + 베팅 = "프로필"* 어휘.
36
+ - **`Bettor` / `PlayerRegistration`** — *책임 (베팅하는 자 / 게임 참가 등록 정보) 중심*.
37
+ - **MCP 룰 후보 — `and-conjunction-name`** = *Name + Bet, Hand + Wallet 같은 *접속어 명명* 검사*. PR #133·#88·#132·#136·#93 의 *3 변수 제약 부산물 인공 객체* 결.
38
+
39
+ #### 1.2. *모든 컬렉션 일급 X — 일급 컬렉션 과적용 안티패턴*
40
+
41
+ - *`PlayersNameAndBet`* = `List<NameAndBet>` 일급 화 + *행동 없음*.
42
+ - *일급 컬렉션 = *컬렉션 + 도메인 행동* 의 조합*. *행동 없는 일급 화 = 의미 없는 래퍼*.
43
+
44
+ **MCP 룰 후보 — `first-class-collection-without-behavior`** = *lotto 의 `collection-wrapper-without-behavior` 변형*. PR #133·#74·#108·#99 의 *일급 컬렉션 자가 학습* 결의 *역효과*.
45
+
46
+ ### 2. `BlackJackCardDeck` 카드 개수 별도 상태
47
+
48
+ 말리빈: *"카드 개수의 상태를 따로 갖고 있는 것 보단, 카드 목록을 컬렉션에 넣어서 뽑아 쓰는 방식은 어떠신가요? 🙂"*
49
+
50
+ → **컬렉션 자체 = 개수 정보 포함**. *`cards.size` 가 *상태* 그 자체*. *`var remainingCount: Int` 별도 = *컬렉션 + 카운터 = 동기화 책임 + 버그 위험*.
51
+
52
+ PR #23 1단계의 *Set vs List* / PR #26 1단계의 *카드 뽑기 + 제외* 결. **`redundant-state` 안티패턴**.
53
+
54
+ ### 3. `Cards.deepCopy` — *정말 deepCopy 인가?*
55
+
56
+ 말리빈: *"deepCopy가 정말 필요할까요? 정말로 'deepCopy'가 이루어지고 있을까요?"*
57
+
58
+ → **2 가지 메타 의문**:
59
+
60
+ #### 3.1. *deepCopy 필요성*
61
+
62
+ - *Cards 가 불변이라면 deepCopy 불필요* — *동일 인스턴스 공유 무해*.
63
+ - *Cards 가 가변이라면* deepCopy 정공.
64
+ - *학생 코드 = *불변 의도* 인데 deepCopy 잔재* = **불필요한 방어**.
65
+
66
+ #### 3.2. *정말 deepCopy 인가?* — 명명 vs 실제
67
+
68
+ - *`deepCopy()`* 명명 = *재귀적 깊은 복사 의미*.
69
+ - *학생 코드*가 *얕은 복사 (shallow copy, e.g., `cards.toList()`)* 라면 *명명 거짓*.
70
+ - **MCP 기존 룰 `defensive-copy-on-immutable`** (batch 10·11) + *명명 정확성*.
71
+
72
+ PR #137·#148 의 *방어적 복사 강박 자가 학습* 결.
73
+
74
+ ### 4. `Cards 불변 의도 + 가변 내부` + 매번 계산
75
+
76
+ 말리빈: *"Cards를 불변 객체로 만들어주신 것 같아요. 불변 객체를 의도하셨지만 내부는 가변 객체를 가지고 있네요 :) 반드시 가져야할 가변 객체일까요? 컬렉션에도 + operator가 오버로딩 되어있답니다 😊 또, 불변 객체이면, 위 프로퍼티들을 호출할 때마다 계산하는 함수들을 매번 호출해주어야할까요?"*
77
+
78
+ → **3 가지 학습**:
79
+
80
+ #### 4.1. *불변 의도 + 가변 내부 = 의도 누수*
81
+
82
+ - *`Cards(val cards: List<Card>)`* — *List 자체는 불변 인터페이스* 이지만 *백킹 객체가 `MutableList`* 라면 *외부 캐스팅으로 변경 가능*. PR #74 (송핑크 *불변 객체 자가 학습*) 결.
83
+
84
+ #### 4.2. *컬렉션 `+ operator` 오버로딩*
85
+
86
+ - *`cards + newCard`* = *불변 List + 새 Card → 새 List 생성*. Kotlin 표준 라이브러리.
87
+ - *학생 코드의 `add(card: Card): Cards = Cards(this.cards + card)` 같은 형태* 가 정공.
88
+
89
+ #### 4.3. *불변 + 매번 계산 함수 호출 = 비효율*
90
+
91
+ - *`fun sum() = cards.sumOf { it.value }`* — *매 호출마다 N 회 합산*.
92
+ - *불변 객체 + 생성 시점 계산* = *`val score: Int = cards.sumOf { it.value }`* 한 번 + 캐시.
93
+
94
+ **MCP 룰 후보 — `immutable-recompute-on-call`** = *불변 객체의 비싼 계산이 매 호출마다 반복 = 캐싱 정공*.
95
+
96
+ ### 5. `Cards.sum + ACE_ADDITIONAL_VALUE` 중복 연산
97
+
98
+ 말리빈: *"sum + ACE_ADDITIONAL_VALUE 연산을 중복으로 수행하네요 :) 한 번만 수행하도록 지역 변수에 할당해볼까요? 😊"*
99
+
100
+ → **중복 연산 = 지역 변수 추출**. PR #95 (송핑크 *when 6번 합산 → 변수 저장*) 결.
101
+
102
+ ### 6. `BlackJackGame.run()` 결과 반환
103
+
104
+ 말리빈: *"phases.run()을 하면, Result를 반환하게 만들어보는 것은 어떨까요?"*
105
+
106
+ → **사이드 이펙트 < 결과 객체 반환** — PR #95·#99·#23 의 *결과 객체 반환* 결.
107
+
108
+ ### 7. `State 생성자 주입` 권유
109
+
110
+ 말리빈: *"State도 생성자로 받는다면, 어떤 장점이 생길 수 있을까요? 😊"*
111
+
112
+ → **State 객체 외부 주입 가능성**:
113
+ - *`Participant(name: Name, state: State = InitialState)`* — *State 외부 주입 = 테스트 시 임의 상태 시작 + 다양한 시나리오*.
114
+ - *내부 고정 (`InitialState` 만)* = *테스트 시 N 번 카드 추가 후 특정 상태 도달 시뮬레이션 필요*.
115
+
116
+ 테스터빌리티 + 유연성. PR #98 (chaehyuns *State 객체 데이터 = 행동에 필요 최소*) 결.
117
+
118
+ ### 8. `BetProfitResultTest` 에 `Participants` 불필요
119
+
120
+ 말리빈: *"이 테스트에 정말로 Participants 객체가 필요할까요?"*
121
+
122
+ → **테스트 최소 의존**. *`BetProfitResult` 테스트인데 *Participants* 까지 생성 = *과한 객체 그래프*. PR #99·#26 의 *Test Fixture 품질* 결.
123
+
124
+ ### 9. `BlackJackCardDeckTest` 51장 동일 카드 — 무의미
125
+
126
+ 말리빈: *"테스트에 동일 카드를 51장 넣어야할까요? 실제로 2번째의 카드를 뽑았는지, 50번째 카드를 뽑았는지 판단하기는 어려워보여요. 필요한 만큼만 카드를 세팅해주는 것은 어떨까요?"*
127
+
128
+ → **테스트 입력 = 검증 가능한 최소**. *51장 동일 카드 = 어떤 카드를 뽑았는지 무관 = 검증 자체 무의미*. PR #23 1단계 *갯수만 검증 무의미* 결.
129
+
130
+ ### 10. `BlackJackGame` 테스트 가능성 — 랜덤 끌어올림
131
+
132
+ 말리빈: *"카드 덱에 대한 랜덤 요소를 더 끌어 올리면, BlackJackGame도 테스트할 수 있게 만들어볼 수 있겠네요 🙂"*
133
+
134
+ → **랜덤 = 가장 바깥 계층으로 끌어올림 (Functional Core, Imperative Shell)**:
135
+ - *내부 (BlackJackGame, Deck) = 결정적 + 주입된 카드 시퀀스 의존*.
136
+ - *외부 (Controller, main) = 랜덤 생성 + 주입*.
137
+
138
+ PR #23 1단계·#26·#95·#99·#74 의 *랜덤 테스트* 결.
139
+
140
+ ### 11. `ProfitMoney` 팩터리 + `Score` 생성자 — 기준 의문
141
+
142
+ 말리빈: *"생성자로 만들지 않고 팩터리 메서드로 만든 이유와 기준이 궁금하네요 :)"* (ProfitMoney)
143
+
144
+ 말리빈: *"value를 갖고있는 Primary 생성자가 더 자연스러워보이는데, 이렇게 생성자를 구성한 이유와 기준이 궁금하네요 :)"* (Score)
145
+
146
+ → **객체 생성 방식 = *명확한 의도***:
147
+ - *Primary constructor* = *기본 + 가장 단순*.
148
+ - *Secondary constructor* = *primary 의 변형 + 다른 인자 조합*.
149
+ - *Factory method (`companion object.of()`)* = *복잡한 유효성 검증 + 캐싱 + 명확한 명명* (e.g., `Card.of(SPADE, ACE)`).
150
+ - *학생 코드의 `ProfitMoney` 팩터리 + `Score` 비정상 생성자* = *기준 일관성 부재*.
151
+
152
+ **MCP 룰 후보 — `factory-vs-constructor-inconsistency`** = *동일 코드베이스 내 생성 방식 기준 통일 권고*.
153
+
154
+ ### 12. `i` 변수 모호 + `vagueName` 결
155
+
156
+ 말리빈: *"i가 어떤 의미인지 다른 개발자들은 한 번에 파악할 수 있을까요?"*
157
+
158
+ → **MCP 기존 룰 `vagueName`** + *짧은 변수명 (`i`, `j`, `n`)*. *반복문 인덱스 관용 `i`* 외에는 *명확한 의미 명명*. PR #95 (송핑크 *ind 축약어*) / PR #23 1단계 *input/output 모호* 결.
159
+
160
+ ### 13. `한 메서드 = 하나의 일`
161
+
162
+ 말리빈: *"한 메서드에서는 하나의 일만 하게 만들어주세요 :)"*
163
+
164
+ → **Single Responsibility Principle (메서드 수준)**. *PlayersResultInfo.엮인 책임 (계산 + 출력 + 변환)* 가능성. PR #98·#99·#137 의 *책임 분리* 결.
165
+
166
+ ### 14. `에러 메시지에 입력값 포함`
167
+
168
+ 말리빈: *"에러 메시지에 어떤 입력이 들어왔는지도 알려주는 것은 어떨까요?"*
169
+
170
+ → **`throw IllegalArgumentException("값이 잘못되었습니다")` < `throw IllegalArgumentException("값이 잘못되었습니다: input=$input")`**. *디버깅 친화도 + 사용자 친화도*. PR #146 (yrsel) 결.
171
+
172
+ ### 15. `덱 소진 후 테스트` — 모든 케이스 검증
173
+
174
+ 말리빈: *"덱을 모두 소진 한 뒤, 원하는 카드를 뽑는 테스트 코드를 작성할 수 있을까요?"*
175
+
176
+ → **경계 조건 테스트**. *덱이 비었을 때 = 도메인 경계*. *예외 발생 / 빈 옵셔널 반환 / 덱 리필* 등 *명확한 도메인 룰* 검증.
177
+
178
+ PR #74·#26 의 *카드 부족 시 게임 종료 UX* 결.
179
+
180
+ ### 16. `확장 함수 체이닝 도전`
181
+
182
+ 말리빈: *"확장 함수 체이닝으로의 변경을 도전해보아요 🙂"*
183
+
184
+ → **Kotlin 함수형 어휘**:
185
+ - *`for (player in players) { ... }`* (명령형) < *`players.map { ... }.filter { ... }.sumOf { ... }`* (선언형 체이닝).
186
+ - PR #26 (스캇 *forEach → map/groupingBy*) 결.
187
+
188
+ ## 리뷰어 의견 요지 (말리빈 / malibinYun)
189
+
190
+ 23 코멘트 특징 (PR #23 와 동일 reviewer):
191
+
192
+ - **메타 질문 어휘** — *"~ 어떨까요?"*, *"~ 어떤 장점이 생길 수 있을까요?"*, *"~ 정말 필요할까요?"*, *"~ 이유와 기준이 궁금하네요"* — 학생 자가 답변 유도. PR #23·#74·#95 와 동일.
193
+ - **명명 의문 어휘 다중** — *"이름에 큰 의미를 부여하긴 어려워 보이네요"* / *"이 객체는 값을 갖고만 있고, 특별한 역할을 하지 않아 쓸모를 느끼기 어려워요"* — *명명 ≠ 책임* 진단.
194
+ - **모든 컬렉션 일급 X 메타 어휘** — *"모든 컬렉션을 반드시 일급 컬렉션으로 래핑할 필요는 없다고 생각해요 🙂"* — **일급 컬렉션 *과적용 경고*** 어휘. *학생이 1단계 학습 후 *과도 적용* 한 안티패턴 자가 진단*.
195
+ - **신선한 발상 칭찬** — *"View를 Phase로 추상화한 형태가 매우 흥미롭네요 👍"*, *"정말 신선한 발상이네요!! 👍"* — **학생의 *창의적 추상화* 명시 인정**. PR #146 (yrsel typealias) / PR #148 (etama 추상화 확장) 결.
196
+ - **머지 시점 종합 코멘트** — *"상태 패턴을 열심히 구현해주셨네요 👍👍 처음 구현해보기에는 어려우셨을텐데 잘 구현해주셨네요!"* — *학생 자가 *상태 패턴 처음* 자가 사과* + *reviewer 인정* = *학습 진화 모범*. PR #98·#99 결.
197
+
198
+ ## 대표 인용
199
+
200
+ > *"이번에 새로 배운 상태 패턴 개념을 추가해서 적용하는데 시간이 좀 걸려서 리뷰 요청이 늦어졌습니다. 공식적 마감 당일날에 너무 많은 커밋을 한번에 올려서 죄송합니다.... 저번에 피드백 주신 것들은 최대한 반영해봤고 추가적으로 다른 부분들도 수정해봤습니다. 상태 패턴 적용이 처음이라서 잘못된 부분들을 지적해주시면 감사하겠습니다!!"* — rhthrhrl0 (학생 자가 학습 + 자가 사과 + 자가 명시 모범)
201
+
202
+ > *"모든 컬렉션을 반드시 일급 컬렉션으로 래핑할 필요는 없다고 생각해요 🙂"* — malibinYun (일급 컬렉션 과적용 경고)
203
+
204
+ > *"View를 Phase로 추상화한 형태가 매우 흥미롭네요 👍"* — malibinYun (학생의 창의적 추상화 인정)
205
+
206
+ > *"deepCopy가 정말 필요할까요? 정말로 'deepCopy'가 이루어지고 있을까요?"* — malibinYun (방어적 복사 강박 + 명명 정확성 메타 의문)
207
+
208
+ > *"불변 객체이면, 위 프로퍼티들을 호출할 때마다 계산하는 함수들을 매번 호출해주어야할까요?"* — malibinYun (불변 + 매번 계산 = 비효율 자가 학습 권유)
209
+
210
+ > *"상태 패턴을 열심히 구현해주셨네요 👍👍 처음 구현해보기에는 어려우셨을텐데 잘 구현해주셨네요!"* — malibinYun (머지 시점 학습 진화 인정)
211
+
212
+ > *"그동안 감사했습니다!! 아래 달아주신 코멘트들에 대해서 좀 더 고민해보고 다음 미션 때 적용시켜보겠습니다 :)"* — rhthrhrl0 (학생 머지 시점 자가 회고 + 후속 학습 의지)
213
+
214
+ ## 얻은 교훈
215
+
216
+ 1. ***모든 컬렉션 일급 X — 일급 컬렉션 과적용 안티패턴*** — *행동 없는 일급화 = 의미 없는 래퍼*. **MCP 룰 후보 `first-class-collection-without-behavior`** (lotto `collection-wrapper-without-behavior` 변형). PR #133·#74·#108·#99 의 *일급 컬렉션 자가 학습* 결의 *역효과*.
217
+
218
+ 2. **`and 접속어 명명`** = *`NameAndBet`, `HandAndWallet` 같은 *두 속성 이어붙임* = *도메인 어휘 X + 책임 모호***. **MCP 룰 후보 `and-conjunction-name`**. PR #133·#88·#132·#136·#93 의 *3 변수 제약 부산물 인공 객체* 결.
219
+
220
+ 3. **불변 의도 + 가변 내부 = 의도 누수** — *`Cards(val cards: List<Card>)` + 백킹 `MutableList` 가능*. *kotlin 의 List 인터페이스 자체는 불변 보장 X*. PR #74 (송핑크 *불변 객체 자가 학습*) 결.
221
+
222
+ 4. **불변 객체 + 매번 계산 함수 호출 = 비효율** — *`val score: Int = ...`* 1회 계산 vs *`fun score() = ...`* N회 계산. **MCP 룰 후보 `immutable-recompute-on-call`**.
223
+
224
+ 5. ***deepCopy 명명 vs 실제* 의문** — *명명 = 깊은 복사 의미 + 실제 = 얕은 복사 가능성*. **명명 정확성 + 방어적 복사 강박** — PR #137·#148 의 *defensive-copy-on-immutable* 결.
225
+
226
+ 6. **State 객체 외부 주입 = 테스터빌리티** — *Participant(state: State = InitialState)* = *임의 상태 시작 시뮬레이션 가능*. PR #98 (chaehyuns *State 객체 데이터 최소화*) 결.
227
+
228
+ 7. **랜덤 = 가장 바깥 계층으로 끌어올림 (Functional Core, Imperative Shell)** — *내부 = 결정적 + 외부 = 랜덤 주입*. PR #74·#23·#95·#99·#26 의 *Random 테스트* 결.
229
+
230
+ 8. **객체 생성 방식 = 명확한 의도 (factory vs constructor)** — *기본 = primary, 변형 = secondary, 복잡 = factory*. *동일 코드베이스 내 일관성*. **MCP 룰 후보 `factory-vs-constructor-inconsistency`**.
231
+
232
+ 9. **`Phase` 추상화 = 학생의 창의적 발상** — *진행 단계 객체화 → View 분리 + 흐름 명시*. PR #98 (chaehyuns State 패턴) / PR #99 (s6m1n 람다 콜백) 와 다른 *제3의 추상화*. **`phase-pattern`** = *블랙잭 진행 단계를 객체 시퀀스로 표현* — 도메인 특수 패턴.
233
+
234
+ 10. **학생 *상태 패턴 처음* 자가 사과 + reviewer 인정 = 학습 진화 모범** — *PR 본문 자가 사과 + 머지 시점 reviewer 인정 + 학생 자가 회고 (다음 미션 적용)* 3 단계. PR #98 (chaehyuns *추후 시간 될 때 다시*) / PR #95 (송핑크 *처음부터 다시 만들어보기*) 결.
235
+
236
+ 11. **PR 본문 + 1단계 PR URL 자가 참조** — *2단계 학생이 *1단계 코멘트 답변 + PR URL 첨부*. *양 단계 본 reviewer 만 가능한 학생 자가 학습 가시화*. PR #99·#95 결.
237
+
238
+ 12. **suggestion 블록 활용 (Kotlin 표현식 함수)** — `if return true else return false` → `return ...`. PR #26 (잭슨 `isPossibleDrawCard`) 결.