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,238 @@
1
+ # PR #74 — [블랙잭 1단계] 알송 미션
2
+
3
+ - **Reviewee:** [@songpink](https://github.com/songpink)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/74
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun (말리빈)
7
+ - **라인 코멘트:** 29 스레드 / 학생 자가 학습 풍부 — *불변 vs 가변, Delegate vs 일급컬렉션, abstract vs open, 도메인 모르는 개발자 시나리오*
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Delegate 일급 컬렉션 자가 학습 + 트레이드오프** — 학생 자가 답변: *"직접 구현하는 것에 비해 delegate를 사용할 경우 래핑되는 인터페이스의 메서드를 Deck의 인스턴스에서 바로 사용할 수 있다는 점이 편리하다고 생각했습니다. 사실 이번 블랙잭 미션에서 사용되지는 않는 기능인데, 수업에서 배운 기능이라 연습겸 써보았습니다."*. 말리빈 답변: *"연습으로 사용해본 것은 정말 잘 해주셨어요👍 ... 저는 일급 컬렉션에 delegate 활용을 선호하지 않아요. 이 이유에 대해 한 번 고민해보세요"*. 학생 자가 답변: *"위임하지 말아야 할 메서드들도 위임하기 때문일까요?"* + 말리빈 인정: *"Delegate를 활용한다면, 일급 컬렉션이 필요 이상으로 기능들을 노출시킨다고 생각해요"*. **Kotlin Delegate vs 일급 컬렉션 트레이드오프 자가 학습 모범**.
12
+ - **불변 객체 자가 학습 + 자가 인식** — 학생 자가 답변 인용: *"먼저 제가 불변객체에 대해 잘못 알고 있었군요! 외부에서만 바꾸지 못하면 불변객체라고 생각했는데 내부에서도 변경이 불가능해야 불변객체이군요. 알려주셔서 감사합니다😄"*. **불변 객체 정의 자가 학습 모범**. PR #85·#137·#148 와 같은 결.
13
+ - **GameResult → Referee → Dealer 책임 자가 토론** — 학생 자가 답변: *"최초 구상은 GameResult를 블랙잭 게임의 심판 역할을 하는 객체로 설계하는 것이었는데요, 굳이 심판을 둔 이유는 카드의 수를 비교하는 행동은 딜러와 플레이어 둘 사이에서 카드를 상호 확인하고 그에 따른 승패를 서로 동의하는 것이라고 생각했기 때문에, 딜러나 플레이어 둘 중 한쪽이 승패를 결정하는 것이 아니라 승패를 판정하는 심판이 저의 소프트웨어 세계에서는 필요하다고 생각했기 때문입니다."* — *현실 메타포 자가 정당화 + 코드 적용 후 변경*. 말리빈: *"둘 다 구현해보고 비교해보셔도 좋겠어요 :) 다만, 현실세계의 블랙잭 게임에서는 정말 \"심판\"이 따로 있는지 고민해보시면 좋겠네요!"*. 학생 자가 결정: *"둘다 구현해보고 비교해본 결과 굳이 심판이 필요하지는 않겠다는 생각이 듭니다! 판정 책임을 딜러에게 넘기니 코드량이 줄어들더라구요"*. **현실 메타포 vs 도메인 정합 자가 학습 모범**.
14
+ - **카지노 무한 게임 메타포 자가 학습** — 말리빈 진단 *"한창 진행중이고 특정 플레이어는 블랙잭을 가져서 기뻐하고있었는데, 모든 카드 덱의 소모로 갑자기 게임이 결과 없이 끝나버린다면, 사용자에게 좋은 경험일지 고민해보시면 좋겠어요!"* + 학생: *"덱을 리필해서 참가자들에게 나눠주어야 겠습니다."*. PR #108·#133·#136·#41 와 같은 결.
15
+ - **`Card` 캐싱 + Factory 자가 반영** — 말리빈: *"카드를 사용하는 경우는 얼마나 될까요? 동일한 값을 가지는 인스턴스를 재활용 해 볼 수 있을까요?"* + 학생: *"팩토리함수를 통해 카드들을 캐싱하고 재활용 할 수 있게 했습니다!"* + 후속: *"카드 인스턴스를 재활용할 수 있게 캐싱해주셨지만, 여전히 다른 개발자들은 같은 값을 지닌 다른 인스턴스를 생성할 수 있겠어요. 늘 똑같은 인스턴스만을 사용할 수 있도록 제한해보는 건 어떨까요?"*. PR #108·#133·#136 와 같은 결.
16
+ - **Rank 의 보너스 점수 = 로직으로 표현 자가 반영** — 말리빈 진단 *"ACE 하나 때문에 보너스 점수라는 것을 enum 모두가 알고 있는 것이 적절할까요? 보너스 점수는 로직으로 표현해보는 건 어떨까요?"* + 학생: *"포인트 계산 로직이 보너스번호를 갖고 있도록 수정했습니다."*. **enum 부가속성 vs 로직 분리 자가 학습**.
17
+ - **abstract vs open vs interface 자가 학습** — 말리빈 진단 *"이 클래스는 abstract로 선언되어있는데 abstract의 요소가 전혀 없네요. abstract class와 interface의 차이는 무엇일까요?"* + 학생 자가 답변 깊음 (abstract = 다중상속 X + 백킹필드 + 구현 메서드 vs interface = 다중구현 + 동일 동작 보장) + 결론: *"본 블랙잭 게임에서는 '참여자'라는 추상적인 개념을 '딜러'와 '플레이어'로 구체화해 사용하고 있기 때문에 abstract class를 쓰는 것이 더 적합하다고 생각합니다. Participant의 행위를 딜러와 플레이어가 더욱 구체화하도록 수정하겠습니다!"* + 말리빈 답변: *"abstract class는 가끔 고장난 클래스라는 별명이 있답니다. 빵꾸를 뚫어 고장내놓고, 사용자가 상속받아 사용할 때, 고장낸 부분을 사용자가 구현해야만 할 수 있게 만드는 것이지요. 그런 abstract 메서드들이 없어서 abstract 키워드를 사용한 게 어색했어요. open class 같은 \"open\" 키워드에 대해 알아보셔도 좋겠어요"*. **MCP 룰 후보 — `abstract-without-abstract-method`** (말리빈/페로로/두루 공통 진단). PR #108·#133·#137·#147 와 같은 결.
18
+ - **양방향 의존 자가 해소** — 말리빈 진단 *"Deck과 Card가 양방향 의존성을 지니게 되었네요! 양방향 의존성은 무엇일까요? 어떤 문제점이 생길 수 있을까요?"* + 학생 자가 답변: *"두 객체가 서로 의존하고 서로 필요로 하고 있는 상황이군요.. 꼼꼼하지 못했습니다. 수정했습니다! 양방향 의존을 하게 될 경우 두 객체 사이의 결합도가 너무 높아져 한 객체의 변경이 다른 객체에 큰 영향을 미치게 됩니다."*. PR #93 와 같은 결의 *bidirectional-dependency*.
19
+ - **방어적 복사 자가 반영** — 말리빈 진단 *"외부에서 Deck의 값을 변경해버릴 수 있는 문제가 있군요.. 방어적복사를 사용해 외부에서 값을 변경할 수 없도록 수정했습니다!"*. PR #108·#132·#133·#85·#58·#137·#148 와 같은 결.
20
+ - **추상 클래스 + Participant 통합** — 말리빈: *"딜러와 플레이어는 공통의 역할을 가지고 있네요!"* + 학생: *"추상클래스 Participant를 이용해 공통 로직을 묶어주었습니다!"*. PR #49·#108·#133·#132·#136 와 같은 결.
21
+
22
+ ## 못한 점 (설계 관점)
23
+
24
+ ### 1. `gradle 수정` vs *근본 원인 해결*
25
+
26
+ 말리빈 진단 (build.gradle.kts): *"어떤 이유에서 이 설정이 필요하셨나요 ?_?"* + 학생 자가 답변: *"사실 다른 크루가 넣었던 코드를 생각 없이 따라 작성한 코드였습니다.."* + 말리빈: *"PC의 타겟 버전을 고쳐보는 것도 좋은 경험이 될 수 있겠어요! gradle 수정 보다는 근본적인 원인을 먼저 고쳐보셔도 좋겠어요"*.
27
+
28
+ → **근본 원인 해결 vs 우회 = 학습 가치**. *복사 코드 + 이해 없음 = 함정*. **MCP 룰 후보 — `copy-paste-without-understanding`** (Kotlin 어휘 학습).
29
+
30
+ ### 2. `JvmStatic` 자가 학습 + 필요성 검증
31
+
32
+ 말리빈: *"`@JvmStatic` 을 작성하신 이유가 궁금해요 :)"* + 학생: *"사실은 페어의 의견이었는데요, 자바와의 상호운용성과 확장성을 위해 작성했습니다. 필요가 없다면 삭제하도록 하겠습니다."* + 말리빈: *"`@JvmStatic`에 대해 정확히 알고 계신 것 같네요 :) \"필요가 없음\"에 대해서는 알송이 판단해주시면 좋겠어요!"*
33
+
34
+ → **`@JvmStatic` = Java interop = 순수 Kotlin 시 불필요**. *PR #58 (수달) 의 @JvmField* 와 같은 결.
35
+
36
+ ### 3. `26명 플레이어 시 게임 종료?` — 카드 부족 시나리오
37
+
38
+ 말리빈: *"26명의 플레이어가 모두 카드를 2장씩 나눠가진 상태라면, 게임이 종료되어야할까요?"* + 학생: *"카드를 모두 소모하게 되면 게임이 그대로 종료되어야 할 것 같습니다."* + 말리빈 후속: *"한창 진행중이고 특정 플레이어는 블랙잭을 가져서 기뻐하고있었는데, 모든 카드 덱의 소모로 갑자기 게임이 결과 없이 끝나버린다면, 사용자에게 좋은 경험일지 고민해보시면 좋겠어요!"*
39
+
40
+ → **UX + 도메인 룰**. 학생 후속 반영. PR #108·#133·#136·#41 와 같은 결.
41
+
42
+ ### 4. `Deck.Companion @JvmStatic` 부생성자 권고
43
+
44
+ 말리빈: *"부생성자를 활용해보는 건 어떨까요?"*
45
+
46
+ → Kotlin 어휘 = secondary constructor. *factory function vs 부생성자 트레이드오프*.
47
+
48
+ ### 5. `ParticipantsHandCards.cards.size < 2 도 정상 작동` — *도메인 모르는 개발자 시나리오 (말리빈 명진단)*
49
+
50
+ 학생 자가 답변: *"최초 분배되는 카드의 개수가 2개이고 최소한 딜러 한명에게 카드 2장이 주어지기 때문에 cards가 2미만이 될 경우는 없다고 생각했습니다. 혹시 이 생각이 잘못된 것일까요?"*
51
+
52
+ 말리빈 답변 핵심: *"\"현 로직\" 상에서는 문제가 없겠지요! 다른 개발자가 리팩터링이나 기능 추가를 해야할 때, 블랙잭 게임에 대한 모든 룰과 제약조건에 대해 정확히 알고 있을까요? \"도메인을 모르는 데 어떻게 개발에 투입되냐?\" 라는 생각이 들 수도 있겠지만, 그렇게 된다면 현실적으로 주니어 개발자는 취업을 할 수 없겠지요.."*
53
+
54
+ → **도메인 모르는 개발자 시나리오 = 명시적 invariant 강제 정공**. *require + 상수화*가 *다른 개발자 안전망*. **MCP 룰 후보 — `implicit-invariant-on-known-rule`**. PR #137·#88 와 같은 결.
55
+
56
+ ### 6. `Player MutableList<Card>` 직접 보유 + 백킹 프로퍼티 + 안정성 트레이드오프 학생 자가 토론
57
+
58
+ 학생 자가 답변 (Player MutableList vs HandCards): *"플레이어의 손패는 Player객체의 프로퍼티로 가지고 있는 것이 자연스러운데, 손패는 계속 추가되는 것이기 때문에 MutableList타입을 가져야 했습니다. 그런데 MutableList는 외부에서 수정이 가능하기 때문에 이를 방지하기 위해 백킹 프로퍼티를 사용했습니다. HandCards의 cards를 MutableList로 바꾸고 플레이어가 HandCards를 직접 가지게 한다면 구조는 간단해 지겠지만 안정성이 떨어질 것 같습니다."*
59
+
60
+ 말리빈 답변: *"Player가 MutableList를 가지는 것과, HandCards가 MutableList를 가지는 게 얼마나 큰 차이가 있는 지 잘 모르겠네요. 위치만 조금 바뀌었을 뿐, Player가 MutableList를 가지는 것에 \"비해서\" HandCards가 MutableList를 가지는 것이 안정성이 떨어진다는 의견은 동의하기 어렵네요."*
61
+
62
+ 학생 후속: *"아..! 확실히 그렇네요!"*
63
+
64
+ → **위치만 변경 ≠ 안정성 차이**. *책임 응집 (HandCards 가 자기 카드 관리)* + *Player.handCards = val*. **자가 학습 모범**.
65
+
66
+ ### 7. `hit(card) = handCards.plus(card)` 함수형 plus 활용 자가 학습
67
+
68
+ 말리빈 권고: *"`handCards = handCards.plus(card)`"* + 학생: *"제안주신 plus함수를 사용하면 MutableList를 사용하지 않아도 손패를 추가할 수가 있겠군요! 그런데 대신 val이 아니라 var로 수정해야 하는데, 이 때문에 결국 가변객체의 상태가 아닌가 하는 생각이 듭니다.. private set으로 외부 변경이 불가능하게 만들기는 했지만 이 방법이 좋은 방법일까요?"* + 말리빈: *"프로젝트 전체적으로 불변성을 적용하지 않으면 어딘가에서는 반드시 가변적인 코드를 작성할 수 밖에 없겠지요. 불변 객체를 하나 적용한 곳에서, 가변인 곳이 발견된다면 그곳도 불변하게끔 변경하면서, 점진적으로 불변하는 객체가 존재할 수 있는 범위를 확장해나갈 수 있겠지요."*
69
+
70
+ → **함수형 plus + var private set vs 완전 불변 트레이드오프 점진적 적용**. PR #85·#148·#137 와 같은 결.
71
+
72
+ ### 8. `Hand.score 전략 분리` — *오버엔지니어링 가능성*
73
+
74
+ 말리빈: *"오호! 카드 점수를 구하는 전략을 분리해주셨네요!👍 블랙잭 게임에서 패의 총합을 구하는 방법이 여러개로 나뉠 가능성이 있는지는 고민해보시면 좋겠네요! 오버엔지니어링일 수도 있을지 스스로 판단해보면 좋겠어요"*
75
+
76
+ → **YAGNI vs 추상화 트레이드오프**. *전략 분리 = 미래 가능성*. *현재 1가지 계산 룰 = 단순 메서드*. PR #146·#147 와 같은 결.
77
+
78
+ ### 9. `Hand.totalScore` 호출 = `player.hand.score` Demeter 진단
79
+
80
+ 말리빈 진단: *"각 플레이어에게 score가 무엇인지 메세지를 던져 물어보는 것은 어떨까요? 디미터의 법칙에 대해 알아보셔도 좋겠어요"* + 예시: *"`val score1 = player.hand.score` `val score2 = player.score`. 아래 두 줄 중 디미터의 법칙을 지키고 있는 것은 어느것일까요?"*
81
+
82
+ → **`player.score` (위임 메서드) vs `player.hand.score` (Demeter 위반)**. PR #146·#88·#137·#93·#133 와 같은 결.
83
+
84
+ ### 10. `Dealer + Player Bust 룰 = 블랙잭 고려 부재`
85
+
86
+ 말리빈: *"딜러가 스페이드 A와 10을 가지고 있고, 플레이어가 4장의 카드와 합산 점수가 21이라면, 누구의 승리일까요?"* + 학생: *"블랙잭을 고려하지 않았군요.. 로직을 추가했습니다!"*
87
+
88
+ → **블랙잭 룰 정확성 = 2장 + 21 우선 = 3장 21 ≠ 블랙잭**. PR #148·#108·#125·#114·#131·#136·#137·#151 와 같은 결.
89
+
90
+ ### 11. `Dealer + Player canHit` 동일 메서드 강제 안티 다형성
91
+
92
+ 학생 자가 답변: *"이렇게 했던 이유는 Participant 추상클래스에서 구현된 메서드를 딜러와 플레이어가 똑같이 상속해서 사용하기 위해 억지로 메서드의 구현을 똑같이 맞추었기 때문에 컨트롤러가 딜러에게 canHit을 물어보는 상황이 되었습니다.. 딜러와 플레이어의 히트가능 조건이 다른 만큼 꼭 같은 메서드를 사용할 필요가 없었다고 생각합니다. ... 이렇게 수정하면 딜러의 hit 메서드에서 canHit을 부를 수 있게 되는데요, 이렇게 하면 딜러 객체의 자율성과 응집도가 더욱 높아질 것 같습니다!"*
93
+
94
+ → **다형성 강제 통일 vs 자율성 트레이드오프 자가 학습 모범**. *Player.canHit (입력) vs Dealer.canHit (16 이하)* 서로 다른 룰 = *abstract method 다형성* 또는 *Player/Dealer 자기 메서드*. PR #49·#108·#133·#132·#136 와 같은 결.
95
+
96
+ ### 12. `Rank.label` View 어휘
97
+
98
+ 말리빈: *"label은 사실 View의 요소는 아니었을지 고민해보셔도 좋겠어요 :)"*
99
+
100
+ → **enum 부가속성 = UI value 안티패턴**. PR #75·#124·#28·#78 와 같은 결.
101
+
102
+ ### 13. `WinningState.from(compared = -1)` — 의미 모호 인자
103
+
104
+ 말리빈 진단: *"compared가 뜻하는 숫자 범위에 대해서 다른 개발자들도 한 번에 알 수 있을까요? 옆에 있는 아무 사람이나 붙잡아서, 아래 코드만 보고, 승 패 무 중 무엇일 것 같냐고 물어본다면, 한 번에 맞출 수 있을까요? `WinningState.from(compared = -1)`"*
105
+
106
+ → **`Int` 인자 = 의미 모호**. *`compareTo` 결과 직접 노출 = 호출자가 -1/0/1 해석 필요*. PR #137·#90·#75 와 같은 결의 *원시값 포장*.
107
+
108
+ ### 14. `Participant abstract 의 요소 부재` — 메이저 진단
109
+
110
+ 말리빈: *"이 클래스는 abstract로 선언되어있는데 abstract의 요소가 전혀 없네요. abstract class와 interface의 차이는 무엇일까요?"* + 후속: *"abstract class는 가끔 고장난 클래스라는 별명이 있답니다. 빵꾸를 뚫어 고장내놓고, 사용자가 상속받아 사용할 때, 고장낸 부분을 사용자가 구현해야만 할 수 있게 만드는 것이지요. 그런 abstract 메서드들이 없어서 abstract 키워드를 사용한 게 어색했어요."*
111
+
112
+ → **`abstract` = 고장난 부분 강제 + 사용자가 채움**. *abstract method 0 + open property 0 = abstract 의미 부재*. **MCP 룰 후보 — `abstract-without-abstract-method`** (말리빈/페로로/두루 공통). PR #108·#133·#137·#147 와 같은 결.
113
+
114
+ ### 15. `CsvSource(delimiter = ":")` — 기본 어휘 위반
115
+
116
+ 말리빈: *"CsvSource에서 delimiter 정의를 \":\"로 명시한 특별한 이유가 있으셨나요 ?_?"* + 학생: *"특별한 이유는 없었고 보기 좋아서 \":\"로 사용했습니다!😅 혹시 좋지 않은 습관일까요?"* + 말리빈: *"아하! 좋지 않은 습관이라기 보다는, 저는 필요에 의해서 기능을 활용하는 것을 선호해서요! Comma Seperated Value, 즉 `,`로 나누어진 Value라는 의미이기에, `,`를 직접 문자열로 사용할 게 아니라면 구분자를 변경할 필요는 없다고 생각해요"*
117
+
118
+ → **CSV = Comma Seperated Value = 기본 구분자 의미**. *기능 의미 변경 = 명시 필요*. **MCP 룰 후보 — `csv-delimiter-deviation`** (테스트 어휘 미세).
119
+
120
+ ### 16. `참가자 같은 비즈니스 로직 묶기 부재` (Participant, ParticipantHand, Hand 결합도)
121
+
122
+ 말리빈: *"Participant, ParticipantHand, Hand 등등... 비슷한 역할을 가진 로직들이 응집도 있게 모여있지 않아보여요. 상호 클래스간 결합도가 매우 높은 느낌을 받았어요. 비슷한 역할들을 적절한 객체에게 응집도 있게 모아보는 것은 어떨까요?"*
123
+
124
+ → **유사 책임 분산 = 응집도 ↓**. *역할별 책임 응집* 정공. PR #147 (state × actor 폭증) 와 같은 결의 *책임 분산 안티패턴*.
125
+
126
+ ### 17. `Deck` 가 *플레이어 수에 관심* — 책임 누수
127
+
128
+ 말리빈: *"Deck이 player의 수에 대한 관심을 가지는 것은 적절할까요?"*
129
+
130
+ → **Deck = 카드 풀, Player 수 = Players 책임**. *책임 응집*. PR #108·#133 와 같은 결.
131
+
132
+ ### 18. `Card 보너스 점수 enum 전체에 강요` — 자가 반영
133
+
134
+ 말리빈: *"ACE 하나 때문에 보너스 점수라는 것을 enum 모두가 알고 있는 것이 적절할까요? 보너스 점수는 로직으로 표현해보는 건 어떨까요?"* + 학생 자가 반영.
135
+
136
+ → **enum 부가속성 vs 로직 분리**. *Ace 만 적용되는 룰 → 로직 표현*. PR #146·#137·#136 와 같은 결.
137
+
138
+ ## 리뷰어 의견 요지
139
+
140
+ - **Delegate 일급 컬렉션 = 필요 이상 기능 노출 위험** — *말리빈 선호 X*.
141
+ - **불변 객체 = 내부 + 외부 모두 변경 불가** — *학생 자가 정의 확립*.
142
+ - **현실 메타포 vs 도메인 정합** — *Referee 자가 토론*.
143
+ - **카지노 무한 게임 메타포 vs 카드 부족 종료**.
144
+ - **`abstract` 키워드 = abstract method 강제** ("고장난 클래스 별명") — 메이저 진단.
145
+ - **도메인 모르는 개발자 시나리오 = 명시적 invariant** — 메이저.
146
+ - **함수형 plus + 점진적 불변성 적용**.
147
+ - **양방향 의존성 = 결합도 ↑ + 변경 파급**.
148
+ - **Demeter = `player.score` (위임) vs `player.hand.score` (위반)**.
149
+ - **블랙잭 룰 정확성 = 2장 + 21 우선 (3장 21 ≠ 블랙잭)**.
150
+ - **`Int` 인자 의미 모호 = compareTo 결과 노출 X**.
151
+ - **CSV delimiter = 기본 의미 = 변경 X**.
152
+ - **Card 캐싱 + 외부 다른 인스턴스 생성 차단 = private constructor**.
153
+ - **gradle 우회 < 근본 원인 해결**.
154
+
155
+ ## 대표 인용
156
+
157
+ **말리빈 (abstract = 고장난 클래스 별명, Participant.kt):**
158
+ > abstract class는 가끔 고장난 클래스라는 별명이 있답니다. 빵꾸를 뚫어 고장내놓고, 사용자가 상속받아 사용할 때, 고장낸 부분을 사용자가 구현해야만 할 수 있게 만드는 것이지요.
159
+ > 그런 abstract 메서드들이 없어서 abstract 키워드를 사용한 게 어색했어요.
160
+ > open class 같은 "open" 키워드에 대해 알아보셔도 좋겠어요 :)
161
+
162
+ **말리빈 (도메인 모르는 개발자 시나리오, ParticipantsHandCards.kt):**
163
+ > "현 로직" 상에서는 문제가 없겠지요!
164
+ > 다른 개발자가 리팩터링이나 기능 추가를 해야할 때, 블랙잭 게임에 대한 모든 룰과 제약조건에 대해 정확히 알고 있을까요?
165
+ >
166
+ > "도메인을 모르는 데 어떻게 개발에 투입되냐?" 라는 생각이 들 수도 있겠지만,
167
+ > 그렇게 된다면 현실적으로 주니어 개발자는 취업을 할 수 없겠지요..
168
+
169
+ **말리빈 (Delegate vs 일급 컬렉션 선호, Deck.kt):**
170
+ > Delegate를 활용한다면, 일급 컬렉션이 필요 이상으로 기능들을 노출시킨다고 생각해요 :)
171
+
172
+ **말리빈 (Demeter = `player.score` vs `player.hand.score`, Dealer.kt:25):**
173
+ > 어떻게 양방향 의존성이 생겨나는걸까요 ?_?
174
+ >
175
+ > 아래 두 줄 중 디미터의 법칙을 지키고 있는 것은 어느것일까요?
176
+ > ```kotlin
177
+ > val score1 = player.hand.score
178
+ > val score2 = player.score
179
+ > ```
180
+
181
+ **말리빈 (점진적 불변성, Player.kt):**
182
+ > 프로젝트 전체적으로 불변성을 적용하지 않으면 어딘가에서는 반드시 가변적인 코드를 작성할 수 밖에 없겠지요.
183
+ > 불변 객체를 하나 적용한 곳에서, 가변인 곳이 발견된다면 그곳도 불변하게끔 변경하면서, 점진적으로 불변하는 객체가 존재할 수 있는 범위를 확장해나갈 수 있겠지요.
184
+
185
+ **말리빈 (CSV delimiter 기본 의미, HandTest.kt:16):**
186
+ > Comma Seperated Value, 즉 `,`로 나누어진 Value라는 의미이기에, `,`를 직접 문자열로 사용할 게 아니라면 구분자를 변경할 필요는 없다고 생각해요
187
+
188
+ **학생 자가 학습 (불변 객체 정의 자가 인식, Player.kt):**
189
+ > 먼저 제가 불변객체에 대해 잘못 알고 있었군요! 외부에서만 바꾸지 못하면 불변객체라고 생각했는데 내부에서도 변경이 불가능해야 불변객체이군요. 알려주셔서 감사합니다 😄
190
+
191
+ **학생 자가 학습 (Referee 자가 토론 + 결정, GameResult.kt):**
192
+ > 최초 구상은 GameResult를 블랙잭 게임의 심판 역할을 하는 객체로 설계하는 것이었는데요, 굳이 심판을 둔 이유는 카드의 수를 비교하는 행동은 딜러와 플레이어 둘 사이에서 카드를 상호 확인하고 그에 따른 승패를 서로 동의하는 것이라고 생각했기 때문에, 딜러나 플레이어 둘 중 한쪽이 승패를 결정하는 것이 아니라 승패를 판정하는 심판이 저의 소프트웨어 세계에서는 필요하다고 생각했기 때문입니다.
193
+ > ...
194
+ > 둘다 구현해보고 비교해본 결과 굳이 심판이 필요하지는 않겠다는 생각이 듭니다! 판정 책임을 딜러에게 넘기니 코드량이 줄어들더라구요, 심판을 만들지 않는 것으로 수정했습니다.
195
+
196
+ **학생 자가 학습 (다형성 강제 통일 vs 자율성, BlackJackController.kt:32):**
197
+ > 이렇게 했던 이유는 Participant 추상클래스에서 구현된 메서드를 딜러와 플레이어가 똑같이 상속해서 사용하기 위해 억지로 메서드의 구현을 똑같이 맞추었기 때문에 컨트롤러가 딜러에게 canHit을 물어보는 상황이 되었습니다..
198
+ > ...
199
+ > 딜러와 플레이어의 히트가능 조건이 다른 만큼 꼭 같은 메서드를 사용할 필요가 없었다고 생각합니다.
200
+ > 이렇게 수정하면 딜러의 hit 메서드에서 canHit을 부를 수 있게 되는데요, 이렇게 하면 딜러 객체의 자율성과 응집도가 더욱 높아질 것 같습니다!
201
+
202
+ ## 얻은 교훈
203
+
204
+ 1. ***`abstract` = abstract method 강제 = "고장난 클래스 별명"*** — 말리빈/페로로/두루 공통 진단. *abstract method 0 + open property 0 + abstract 키워드 = 의미 부재*. **MCP 룰 후보 — `abstract-without-abstract-method`** (메이저). PR #108·#133·#137·#147 와 같은 결.
205
+
206
+ 2. ***도메인 모르는 개발자 시나리오 = 명시적 invariant 강제***. *"현 로직 상에서는 문제가 없겠지만 도메인 모르는 개발자가 들어오면..."* = *주니어 안전망*. **MCP 룰 후보 — `implicit-invariant-on-known-rule`**.
207
+
208
+ 3. ***불변 객체 = 외부 + 내부 모두 변경 불가***. *학생 자가 정의 확립 모범*. PR #85·#148·#137 와 같은 결.
209
+
210
+ 4. ***현실 메타포 vs 도메인 정합 트레이드오프*** — *Referee 자가 토론 + 둘 다 구현 + 비교*. PR #58·#108·#137 와 같은 결.
211
+
212
+ 5. ***Delegate 일급 컬렉션 = 필요 이상 기능 노출***. *말리빈 선호 X*. *직접 구현 + 메서드 선택*이 정공. PR #146·#136 와 같은 결.
213
+
214
+ 6. ***점진적 불변성 적용***. *일부 불변 + 점차 확장*. *완전 불변은 어려움 + 부분 적용 가치*. PR #85 와 같은 결.
215
+
216
+ 7. ***Demeter = `player.score` (위임) vs `player.hand.score` (위반)*** — 말리빈 명료한 비교 예시. PR #146·#88·#137·#93·#133 와 같은 결.
217
+
218
+ 8. ***함수형 plus + var private set vs 완전 불변 트레이드오프***. *Kotlin `cards + card` immutable expression* 활용. PR #85·#148·#137 와 같은 결.
219
+
220
+ 9. ***양방향 의존성 = 결합도 ↑ + 변경 파급***. *Deck ↔ Card 양방향* 자가 해소. PR #93 와 같은 결.
221
+
222
+ 10. ***Hand.score 전략 분리 = 오버엔지니어링 가능성 (YAGNI)***. *블랙잭 1 룰 = 단순 메서드*. PR #146·#147 와 같은 결.
223
+
224
+ 11. ***다형성 강제 통일 vs 자율성 트레이드오프***. *Player.canHit (입력) vs Dealer.canHit (16) 다른 룰*. *abstract method 다형성* 또는 *각자 메서드 + 자율성*. PR #49·#108·#133·#132·#136 와 같은 결.
225
+
226
+ 12. ***`Int` 인자 = 의미 모호 (compareTo 결과 -1/0/1 노출 X)***. *value class 포장 + 의미 명시*. PR #137·#90·#75 와 같은 결.
227
+
228
+ 13. ***Card 캐싱 + private constructor = 외부 다른 인스턴스 차단***. *factory만 가능*. PR #108·#133·#136 와 같은 결.
229
+
230
+ 14. ***gradle 우회 vs 근본 원인 해결 = 학습 가치***. *복사 코드 + 이해 없음 안티패턴*. **MCP 룰 후보 — `copy-paste-without-understanding`**.
231
+
232
+ 15. ***`@JvmStatic` / `@JvmField` = Java interop = 순수 Kotlin 시 불필요***. PR #58 와 같은 결.
233
+
234
+ 16. ***CSV delimiter = 기본 의미 (Comma Seperated Value)***. *기능 의미 변경 = 명시 필요*. *기본 어휘 우선*. **MCP 룰 후보 — `csv-delimiter-deviation`**.
235
+
236
+ 17. ***`Hand.score` 전략 패턴 (`Hand.scoreStrategy`) = 오버엔지니어링 vs 미래 확장 트레이드오프***. *현재 1 룰 = 단순 메서드*. PR #146 와 같은 결.
237
+
238
+ 18. ***학생 자가 학습 + 자가 답변 + 트레이드오프 양방향 인식 풍부 = 학습 가시화 최고 수준***. *Delegate / 불변 객체 / Referee / abstract / 다형성 강제 통일 자가 토론*. PR #146·#148·#151·#137 와 같은 결.
@@ -0,0 +1,216 @@
1
+ # PR #95 — [블랙잭 2단계] 알송 미션
2
+
3
+ - **Reviewee:** [@songpink](https://github.com/songpink)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/95
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun (말리빈)
7
+ - **라인 코멘트:** 13 스레드 + **학생 자가 의문 1개** (open vs abstract 다시 학습) + **말리빈 매우 긴 메타 답변** (자기 논리의 한계 자가 인정 + "옳고 그름 없음, 장단점만")
8
+ - **양 단계 분석 reviewee** (1단계 #74 별도)
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ - **학생 자가 의문 후 reviewer 가 자기 진단의 한계 자가 인정 + 메타 학습 어휘 답변** — 학생 의문: *"하위 클래스에서 구현이 모두 같은데도 굳이 추상클래스로 만들고 override를 하는 것이 좋은지, 아니면 인스턴스가 없더라도 open클래스로 만드는 것이 좋은지 입니다."* + 말리빈 답변: *"꼭 Player와 Dealer가 같은 부모를 상속 받아야만 한다는 규칙은 없으니까요 :) Player가 최상위고, Dealer는 Player의 변종 정도로 생각하는 것은 부자연스러울까요?"* + *"개발에 옳고 그름은 없으니, 틀린방법은 없어요. 위에서 짚어드린 내용 조차도, '틀린' 내용이 아니예요. 그저 저는 공감하기 어려웠고, 지키고 싶은 여러 요소들을 지킬 수 있는 다른 방법들이 떠올랐기 때문에 다른 방법을 제시해볼 수 있을 거라 생각했어요 :)"*. **양방향 reviewer/학생 메타 토론 + reviewer 자기 한계 자가 인정 모범** — PR #133·#137·#146·#147·#148·#151 와 같은 결.
13
+ - **PR 본문에 자가 의문 + 자가 정당화** — *"플레이어들이 예산(budget)을 프로퍼티로 갖게 한 것이 있는데요, 이번 미션에서 사용되지는 않는 프로퍼티이기는 한데, 수익(profit)을 플레이어들이 프로퍼티로 가지고 있으려면 예산도 가지고 있는 것이 자연스럽더라구요.. 일단 만들어 두었다가 사용되지 않아서 지웠는데, 지우니까 상당히 어색해져서 다시 만들었습니다."*. **학생이 *불필요해 보이는 프로퍼티의 자가 정당화 → reviewer 가 다른 의견 제시* 시드**. (말리빈은 *"손익은 PlayerResult 가 가져야"* 로 반박 — 아래 §6).
14
+ - **Tell-Don't-Ask 자가 인정 + 자가 반영** — 말리빈 진단 *"카드들에게 현 상태가 블랙잭인지 메시지를 던져 물어보는 건 어떨까요?"* + 학생: *"Hand에게 해당 메서드가 있음에도 사용하지 않았군요.. 수정했습니다."*. *PR #74 1단계의 Tell-Don't-Ask 학습 누락 → 2단계 자가 인정 + 반영*.
15
+ - **사이드 이펙트 vs 결과 객체 반환 자가 학습** — 말리빈: *"객체의 사이드 이펙트를 발생시키지 않고, 결과 객체를 만들어 반환하도록 구성해보는 건 어떨까요?"* + 학생: *"확실히 의존성을 주입하도록 수정하면 결합도를 낮출 수 있겠네요. 수정했습니다."*. *책임 분리 + 함수형 결과 반환 자가 학습* — PR #133·#136·#90 와 같은 결.
16
+ - **when 6번 합산 → 변수 저장 자가 반영** — 말리빈: *"when절의 3번째 분기까지 간다면, 총합을 구하는 연산을 총 6번을 해야하네요. 비효율적인 연산을 줄일 수 있는 방법이 있을까요?"* + 학생: *"계산된 값을 담는 새로운 변수를 선언해 사용하도록 변경했습니다."*. *공통 연산 추출 + 가독성 향상*.
17
+ - **1단계 Deck 안전성 PR #74 자가 참조** — 말리빈: *"이 코드는 아래 코드에 대해 여전히 안전할까요? https://github.com/woowacourse/kotlin-blackjack/pull/74#discussion_r1521166706"* + 학생: *"꼼꼼하지 못해 죄송합니다.. 😅 수정했습니다!!"*. **1단계 권고 자가 참조 + 2단계 반영 누락 자가 인정**. PR #74 의 *방어적 복사* / *카드 캐싱* / *Card private constructor + Factory* 결.
18
+ - **Random 테스트 가능성 → interface + 구현체 분리 자가 학습 권고** — 말리빈: *"자동차 경주와 로또에서 배웠던 랜덤 테스트에 대해 꼭 복습해보세요. 랜덤의 요소를 최소한으로 만들어서 테스트 해볼 수 있게끔 구성하길 바랐어요. 파라미터로 값을 받아 랜덤에 대한 요소를 줄여내볼 수도 있었고, interface 와 구현체를 활용해서도 랜덤에 대한 요소를 줄여내볼 수 있었지요."*. **lotto/racingcar 학습 자가 연결 권고** — 학생 미반영 (양 단계 머지 시점까지).
19
+ - **Participant 공통 추출 자가 반영** — 말리빈: *"플레이어와 딜러가 공통적으로 갖고 있는 것들도 Participant에 묶어보는 건 어떨까요?"* + 학생: *"묶어주었습니다! 그런데 그 과정에서 궁금한 점이 생겼네요.. 다음 요청때 질문드리겠습니다."* → *학생 자가 의문 → 본문 코멘트로 의문 명시 후속 토론* 시드. PR #49·#108·#133·#132·#136 와 같은 결.
20
+
21
+ ## 못한 점 (설계 관점)
22
+
23
+ ### 1. `abstract Participant + Player/Dealer 동일 구현 override` — *학생 자가 의문 + 말리빈 매우 긴 메타 답변*
24
+
25
+ 학생 자가 의문 (PR 본문 코멘트):
26
+
27
+ > *"Participant 추상클래스에 있는 hit과 setInitialHand는 Player와 Dealer에서 구현이 바뀌지 않고 동일하게 사용됩니다. 저는 처음에 구현이 똑같기 때문에 굳이 각각의 객체가 이 메서드들을 override하지 않고 추상클래스의 메서드를 그대로 사용하면 되겠다고 생각을 했습니다. 그런데 이렇게 했을 때 말리빈께서 'Participant가 abstract의 성격을 가지고 있지 않다'라고 피드백을 주셨습니다. 저는 그래서 이 때 Participant를 open클래스로 바꿀까도 생각을 했지만 이 경우 Participant의 인스턴스를 만들고 있지 않기 때문에 open클래스를 쓰면 안된다는 다른 크루의 말을 들었습니다. 그래서 abstract로 유지하되, hit과 setInitialHand의 구현을 플레이어와 딜러가 똑같이 override하는 방식으로 수정했습니다. 이 방법이 옳은걸까요?"*
28
+
29
+ 말리빈 매우 긴 답변 (메타 학습 어휘):
30
+
31
+ > *"'Participant의 인스턴스를 만들고 있지 않기 때문에 open클래스를 쓰면 안된다는 다른 크루의 말을 들었습니다' 요건 왜 안되는지 그 크루는 논리적으로 알송을 설득한 것일까요? 저는 왜 안되는지 좀 더 물어봤을 것 같네요!"*
32
+ >
33
+ > *"꼭 Player와 Dealer가 같은 부모를 상속 받아야만 한다는 규칙은 없으니까요 :) Player가 최상위고, Dealer는 Player의 변종 정도로 생각하는 것은 부자연스러울까요?"*
34
+ >
35
+ > *"개발에 옳고 그름은 없으니, 틀린방법은 없어요. 위에서 짚어드린 내용 조차도, '틀린' 내용이 아니예요. 그저 저는 공감하기 어려웠고, 지키고 싶은 여러 요소들을 지킬 수 있는 다른 방법들이 떠올랐기 때문에 다른 방법을 제시해볼 수 있을 거라 생각했어요 :)"*
36
+ >
37
+ > *"제가 한 말에 대해서도 논리적인 반박을 할 수 있었을 거예요! '말리빈께서 Participant가 abstract의 성격을 가지고 있지 않다'라고 했으나, 여기에는 알송이 말씀하신 한 가지 요소가 결여되어있네요. 'Participant의 인스턴스를 만들고 있지 않기 때문에' 에서, abstract class 이기에 원하지 않는 객체의 인스턴스를 만들어내고 싶지 않았다, 라는 논리였다면 저는 이 논리에 대해 매우 공감하고, 납득했을 거예요."*
38
+ >
39
+ > *"개발의 세계에는 정답이 없으니, 정말 많은 고민을 하면서 미션을 수행해보세요. 옳고 그름은 없고, 장단점만이 있는 세계이니까요!"*
40
+
41
+ → **3 가지 메타 학습**:
42
+
43
+ #### 1.1. 다른 크루의 말 *그대로 따라하지 말기*
44
+
45
+ *"왜 안되는지 그 크루는 논리적으로 알송을 설득한 것일까요?"* — *권위 인용 (다른 크루) ≠ 논리적 설득*. *학생은 *논리를 묻고 자기가 납득해야* 자기 결정*.
46
+
47
+ #### 1.2. 상속 구조 자체 의문 권유
48
+
49
+ *"꼭 Player와 Dealer가 같은 부모를 상속 받아야만 한다는 규칙은 없으니까요"* — *블랙잭에서 Player와 Dealer 가 *같은 추상 부모를 가져야 한다* 는 가정 자체 의문 권유*.
50
+
51
+ 대안:
52
+ - (A) **`Dealer extends Player`** = *Dealer 는 Player 의 변종 (자동 hit ≤16 외엔 동일)*. *공통 코드 직접 상속 + abstract 키워드 불필요*.
53
+ - (B) **`abstract Participant`** = *공통 추상 + 각각 구현*. *학생 현재 코드*.
54
+ - (C) **`interface Participant`** + *각각 별도 구현* = *상속 회피 + 다중 인터페이스 가능*.
55
+ - (D) **`Dealer`/`Player` 무관계 + 공통 코드는 협력자에게 위임** = *상속 회피 + 컴포지션*.
56
+
57
+ 학생 자가 결정 = (B) — *현실 메타포 (참가자 abstract) 우선*. 말리빈은 *(A) 도 가능* 제시 + *정답 강요 X*.
58
+
59
+ #### 1.3. *"개발에 옳고 그름은 없고, 장단점만이 있는 세계"* — **조영호 메타 가르침과 일치**
60
+
61
+ → **MCP `oh-my-oop` 의 핵심 어휘 = *단일 답 X, N개 대안 + 트레이드오프***. 말리빈의 답변은 이 어휘를 자가 사용. *학생이 reviewer 의 한 가지 의견을 *절대 답*으로 오해하지 않도록 *메타 학습 어휘 명시***.
62
+
63
+ → **PR #75·#147·#151 의 reviewer 자가 한계 인정** 결.
64
+
65
+ → **MCP 룰 후보 — `abstract-without-abstract-method`** (1단계 #74 의 학습 누락이 2단계에 재발 → 학생 자가 자가 의문화 → reviewer 메타 답변).
66
+
67
+ ### 2. `Controller → BlackjackGame.start() 결과 반환` — 학생 *이해 못함* + 두번 부연
68
+
69
+ 말리빈 진단:
70
+
71
+ ```kotlin
72
+ val game = BlackJackGame()
73
+ val result = game.start()
74
+ print(result)
75
+ ```
76
+
77
+ 학생 자가 의문: *"이해를 못했습니다.. 출력해야 할 사항이 여러개인데, 어떤 결과를 반환하도록 하라는 말씀이실까요..?"*
78
+
79
+ 말리빈 부연: *"마지막 게임이 종료되고 나서 출력해야할 게임의 결과물을 말씀드렸어요! 출력해야할 것들은 객체를 생성하거나, 메서드 파라미터 등으로 적절히 전달해주면 충분히 구성 가능하실거예요 :)"*
80
+
81
+ → **학생 자가 의문 = 이해 갭 명시 (자가 학습 모범)**.
82
+
83
+ 이해 갭 진단:
84
+ - *학생 코드*: Controller 가 *진행 중 단계별로 출력* (initial hand → hit 입력 → 결과 출력 → 수익 출력 4-5 단계).
85
+ - *말리빈 의도*: *게임의 진행과 출력 시점을 결과 객체에 응축* → *Controller 는 출력 명령만*.
86
+ - 그러나 *진행 중 출력*은 *블랙잭 도메인의 자연 흐름* — *초기 카드 후 → 각 플레이어 hit 입력* 단계 자체가 *결과 객체 반환 후 출력* 모델과 충돌.
87
+
88
+ 해결 대안:
89
+ - (A) **`game.start()` 가 *상태 전이 기록*을 담은 `GameLog` 반환** = *Controller 가 로그 재생 (replay)*. 그러나 *hit 입력 같은 양방향 IO 가 어려움*.
90
+ - (B) **`game.start(inputCallback, outputCallback)` 패턴** = *Inversion of Control + 콜백*. *학생 미적용*. PR #137 의 *onXX 콜백* 결.
91
+ - (C) **현재 학생 구조 유지 + Controller 가 진행 중 출력 명령** = *현실 절차에 가까운 모델 + 양방향 IO 자연*.
92
+
93
+ 학생 미반영 + 머지. *말리빈 권고가 *학생 도메인 모델과 충돌* → 학생이 *명확히 이해 못한 채 머지* 케이스*. **두 번 부연했음에도 학생 미반영** — 권고의 한계.
94
+
95
+ → **PR #98 의 *상태 패턴 효과 자가 의문*** 와 같은 결 *(권고 ≠ 학생 도메인 정합 시 미반영)*.
96
+
97
+ ### 3. `Dealer.hit(condition)` vs `Dealer.hit()` 시그니처 불일치 → 디폴트 파라미터 우회
98
+
99
+ 말리빈 진단: *"이 둘은 어떻게 다른가요? 딜러는 둘 둥 어떤 메서드를 써야할지 다른 개발자는 바로 알아차릴 수 있을까요?"*
100
+
101
+ 학생: *"추상클래스의 메서드를 딜러와 플레이어가 공통으로 상속하도록 하고 싶었는데, 딜러는 hit조건을 객체 내부에서 불러올 수 있기 때문에 condition파라미터가 필요가 없더라구요.. 그런데 상속을 할 때 메서드의 시그니처를 바꾸는 방법이 없어서, 별 수 없이 오버로드를 했습니다. 다른 방법을 일단 찾아보겠습니다.."* + 후속: *"디폴트 파라미터를 사용해 수정했습니다!"*
102
+
103
+ 말리빈 후속: *"음~ 사실 condition을 외부에서 받도록 구성하지 않았으면 했어요. BlackjackGame을 관제하는 하나의 객체가 있어서, 해당 객체와 적절히 협력하는 형태로 구성해도 좋겠다는 생각이 들었어요 :) 말씀해주신대로 딜러와 플레이어가 동일한 메서드를 호출해서 플레이하지 않을 수도 있으니까요!"*
104
+
105
+ → **3 단계 자가 학습 + reviewer 후속 권고**:
106
+
107
+ 1. **상속 시그니처 불일치 자가 진단** = *Player.hit(condition)* vs *Dealer.hit()* → *추상 메서드 시그니처 강제*.
108
+ 2. **디폴트 파라미터 우회** = *`hit(condition: () -> Boolean = { true })`* 같은 형태. 학생 자가 시도.
109
+ 3. **reviewer 후속 = 우회 X, *근본 원인* (외부에서 condition 받는 구조) 자체가 잘못** = *Player.hit 자체가 외부 의존 = 단순 명령 X*.
110
+
111
+ 대안:
112
+ - (A) **`Dealer` / `Player` 가 *같은 부모 X* + 각자 자기 책임의 hit()** (위 §1.2 (A)).
113
+ - (B) **상속 유지 + Player/Dealer 동일 시그니처 + 내부에서 자기 조건 판단** = *condition 인자 제거 + 자기 메서드에서 자기 조건*.
114
+ - (C) **`BlackjackGame` 관제 객체가 *언제 누구에게 hit 명령* 결정** + *Dealer/Player 는 단순 카드 수령*.
115
+
116
+ **MCP 룰 후보 — `strategy-default-param-pollution`** (lotto 의 기존 룰 변형) 결. *디폴트 파라미터 = 메서드 오버로드 우회 시 *시그니처 통일* 효과 + 단점은 *호출 컨텍스트별 의미 차이*.
117
+
118
+ ### 4. `Deck.draw()` 53장 시 테스트 가능성 X
119
+
120
+ 말리빈: *"53번째 카드는 정확히 무엇이 나올지 테스트를 작성할 수 있는 코드일까요?"*
121
+
122
+ 학생: *"테스트를 못하겠군요.. 할 수 있도록 수정했습니다."*
123
+
124
+ → **테스터빌리티 자가 학습**. 53번째 카드 = *덱이 비어 카드를 모두 소진한 후 다음 동작* 시나리오. *내부 랜덤 의존 = 테스트 불가능*.
125
+
126
+ 해결:
127
+ - *interface CardDealer + 구현체 분리* (말리빈 별도 권고 #11) = *테스트 시 결정적 구현체 주입*.
128
+
129
+ PR #74 1단계의 *카드 부족 시 게임 종료 UX* 자가 토론 결.
130
+
131
+ ### 5. `Deck.cards` 양방향 안전성 (PR #74 자가 참조 누락 자가 인정)
132
+
133
+ 말리빈: *"이 코드는 아래 코드에 대해 여전히 안전할까요?"* + PR #74 코멘트 URL 인용.
134
+
135
+ 학생: *"꼼꼼하지 못해 죄송합니다.. 😅 수정했습니다!!"*
136
+
137
+ → **1단계 권고가 2단계 코드에서 다시 등장 = 학생 자가 인정**. *reviewer 의 PR 자가 참조* (URL 첨부) = *학생이 1단계 권고 위치를 즉시 확인 가능*.
138
+
139
+ PR #74 1단계 §방어적 복사 자가 학습 / *Deck 외부 변경 가능성* 토론 결.
140
+
141
+ ### 6. `Player.profit` 책임 위치 = *Player vs PlayerResult*
142
+
143
+ 말리빈 진단: *"손익에 대한 건 게임의 결과라고 생각해요. 플레이어가 갖지 않고, 게임 결과를 담은 객체가 담고 있게 구성해보셔도 좋겠어요."* + 별도: *"베팅 머니 자체는 Player 객체가 가지고 있어도 좋아보이네요! 그렇다면 PlayerResult 스스로가 플레이어의 승패에 따라 베팅머니를 계산하는 역할을 맡아볼 수도 있겠어요."*
144
+
145
+ 학생 미반영 (머지 시점까지).
146
+
147
+ → **PR 본문 자가 의문 (예산 프로퍼티 자가 정당화) 의 반박**:
148
+
149
+ - 학생: *"수익을 플레이어들이 프로퍼티로 가지고 있으려면 예산도 가지고 있는 것이 자연스럽더라구요"*
150
+ - 말리빈: *수익은 *게임 결과* 의 책임* — *Player 는 베팅 머니까지*, *수익 (승패에 따라 계산되는 결과값) 은 PlayerResult*.
151
+
152
+ **역할 vs 상태 분리** — PR #148 의 *krrong (역할=Player, 상태=GameResult) 자가 학습* 결. **MCP 룰 후보 — `role-state-conflation`** 결.
153
+
154
+ ### 7. `Player` 손익 책임 누수 + `Dealer` 책임 비대
155
+
156
+ 말리빈: *"딜러 객체가 하는 일이 매우 많아졌네요. 하는 역할을 적절히 다른 객체에 분리해보는 연습을 시도해보셔도 좋겠어요."*
157
+
158
+ → **PR #74 1단계 §점수 계산이 Dealer 책임 위치 자가 토론 / Referee 자가 학습** 의 *2단계 재발*. *책임 분산 학습이 2단계에서 다시 누수*. 학생 미반영.
159
+
160
+ PR #28·#78·#112·#125·#147 의 *Controller god-object* 결의 *Dealer god-object*.
161
+
162
+ ### 8. `ind` 축약어 명명 — vague-name 결
163
+
164
+ 말리빈: *"ind가 index인지 다른 개발자들이 한 번에 알아챌 수 있을까요? 축약어는 최대한 사용을 지양하도록 노력해보세요 :)"*
165
+
166
+ → **변수명 축약어 = *짧기 위해 명확성 희생***. `index` / `i` (관용 한정) / `position` / `cardIdx` 가 대안. **MCP 기존 룰 `vagueName`** (lotto/racingcar `vagabond95` 인용) 결.
167
+
168
+ ## 리뷰어 의견 요지 (말리빈 / malibinYun)
169
+
170
+ 13 코멘트 + 매우 긴 메타 답변. 특징:
171
+
172
+ - **단순 진단보다 *학생 자가 의문 유발* 어휘** — *"~ 어떨까요?"*, *"~ 다른 개발자는 바로 알아차릴 수 있을까요?"*, *"~ 정말 '심판'이 따로 있는지"* — *학생이 자가 답변 작성하도록 유도*.
173
+ - **PR 자가 참조** — 1단계 PR #74 의 코멘트 URL 첨부. *학생이 1단계 학습 위치를 즉시 확인 가능*. PR #133·#136 의 *PR 자가 참조* 결.
174
+ - **자기 진단의 한계 자가 인정** — *"위에서 짚어드린 내용 조차도, '틀린' 내용이 아니예요. 그저 저는 공감하기 어려웠고..."*. PR #147 페로로 *"다형성 학습 진행 인정"* / PR #151 크롱 *"확장성 한계 자가 인정"* 결.
175
+ - **메타 학습 어휘 명시** — *"개발에 옳고 그름은 없고, 장단점만이 있는 세계"*. **MCP `oh-my-oop` 핵심 어휘와 일치**.
176
+ - **머지 시점 권유** — *"나중에 시간이 나게 된다면 미션을 처음부터 다시 만들어보는 시간을 가져보셔도 좋겠어요! 처음 만든 것과 완전히 다른 코드를 마주하게 될거예요 :)"*. **재구현 권유 = 학생 자가 진화 모범** — PR #98 chaehyuns 의 *"추후 시간이 될 때 다시한번 구현해보고 싶네요"* 결.
177
+
178
+ ## 대표 인용
179
+
180
+ > *"꼭 Player와 Dealer가 같은 부모를 상속 받아야만 한다는 규칙은 없으니까요 :) Player가 최상위고, Dealer는 Player의 변종 정도로 생각하는 것은 부자연스러울까요?"* — malibinYun (상속 구조 자체 의문 권유)
181
+
182
+ > *"개발에 옳고 그름은 없으니, 틀린방법은 없어요. 위에서 짚어드린 내용 조차도, '틀린' 내용이 아니예요. 그저 저는 공감하기 어려웠고, 지키고 싶은 여러 요소들을 지킬 수 있는 다른 방법들이 떠올랐기 때문에 다른 방법을 제시해볼 수 있을 거라 생각했어요 :)"* — malibinYun (자기 진단의 한계 자가 인정)
183
+
184
+ > *"제가 생각하고 있는 무언가들도 누군가에게는, 그들이 지켜내고 싶은 특정 요소들을 만족시키지 못할 거예요. 리뷰어한테 미션을 시키고 다른 리뷰어가 리뷰하더라도 모두가 다른 의견을 제시할거예요."* — malibinYun (reviewer 다양성 = 절대 답 X)
185
+
186
+ > *"개발의 세계에는 정답이 없으니, 정말 많은 고민을 하면서 미션을 수행해보세요. 옳고 그름은 없고, 장단점만이 있는 세계이니까요!"* — malibinYun (조영호 메타 가르침과 일치)
187
+
188
+ > *"하위 클래스에서 구현이 모두 같은데도 굳이 추상클래스로 만들고 override를 하는 것이 좋은지, 아니면 인스턴스가 없더라도 open클래스로 만드는 것이 좋은지 입니다."* — songpink (학생 자가 의문 = 학습 갭 명시)
189
+
190
+ > *"이해를 못했습니다.. 출력해야 할 사항이 여러개인데, 어떤 결과를 반환하도록 하라는 말씀이실까요..?"* — songpink (학생 자가 이해 갭 명시 = 학습 모범)
191
+
192
+ ## 얻은 교훈
193
+
194
+ 1. **reviewer 의 메타 답변 = *"옳고 그름 X, 장단점만"*** — *조영호 「객체지향의 사실과 오해」 와 MCP `oh-my-oop` 의 핵심 어휘*. *말리빈의 답변이 이 어휘를 직접 사용* = *학생이 *reviewer 의견을 절대 답으로 오해하지 않도록 메타 학습 어휘 명시***. **MCP 의 핵심 가치가 실제 리뷰 현장에서 동일하게 작동**.
195
+
196
+ 2. **다른 크루의 말 *그대로 따라하지 말기*** — *권위 인용 ≠ 논리적 설득*. 학생이 *논리를 묻고 자기가 납득해야* 자기 결정. *말리빈의 *"왜 안되는지 그 크루는 논리적으로 알송을 설득한 것일까요?"*. PR #147·#151·#137 의 *학생/reviewer 메타 토론* 결.
197
+
198
+ 3. **상속 구조 자체 의문 권유** — *Player extends Dealer? Dealer extends Player? 둘 다 같은 부모? 무관계?* — *기본 가정 자체 다시 보기*. PR #49·#108·#133·#132·#136 의 *추상 클래스 + Participant 통합* 결의 *반대 시점*.
199
+
200
+ 4. **`abstract class` vs `open class` vs `interface` 자가 학습**:
201
+ - *`abstract class`* = *인스턴스 생성 차단 + 추상 메서드 가능 + 단일 상속*.
202
+ - *`open class`* = *인스턴스 생성 가능 + 상속 가능*.
203
+ - *`interface`* = *다중 구현 + 구현 메서드 (default impl) 가능 + 백킹 필드 X*.
204
+ - *블랙잭 Participant 처럼 *인스턴스 X + 공통 코드 100%* = *abstract 이지만 abstract 메서드 X* → *어색함* → *open class (인스턴스 X 강제 X) 또는 interface (다중 구현) 정공*. **MCP 룰 후보 `abstract-without-abstract-method`** = PR #74·#108·#133·#137·#147 결.
205
+
206
+ 5. **PR 본문 자가 의문 + 자가 정당화 + 본문 코멘트로 자가 의문 명시** — *학생이 *불필요해 보이는 프로퍼티 / 어려운 구조 변경 / 학습 갭* 을 *PR 본문 + 본문 코멘트에 명시 = 학습 가시화 모범*. PR #128·#135·#108·#133·#136·#137·#148·#151·#98 와 같은 결.
207
+
208
+ 6. ***이해 못함* 자가 명시 = 학습 모범** — *"이해를 못했습니다.. 어떤 결과를 반환하도록 하라는 말씀이실까요?"* — *reviewer 권고를 *그대로 반영 X* + *자가 이해 갭 명시 후 부연 요청*. *학생이 *모르는 채로 머지하지 않으려는 자가 의식*.
209
+
210
+ 7. **권고가 학생 도메인 모델과 충돌 시 미반영** — *Controller → BlackjackGame.start() 결과 반환* 처럼 *학생의 진행 중 출력 흐름 (양방향 IO)* 과 *결과 객체 응축* 이 충돌 → *학생 미반영 + 머지*. **권고 ≠ 절대 답** 의 실증.
211
+
212
+ 8. **1단계 PR 자가 참조 + URL 인용** — *2단계에서 1단계 동일 안티패턴 재발 시 reviewer 가 1단계 코멘트 URL 첨부* → *학생이 즉시 1단계 학습 위치 확인 + 자가 인정*. **양 단계 본 reviewer 만 가능한 권유 형식**.
213
+
214
+ 9. **`Player.profit` 책임 위치 = *Player vs PlayerResult* (역할 vs 상태)** — *역할 (Player) 은 베팅 머니까지 / 상태 (수익 계산 결과) 는 PlayerResult*. **MCP 룰 후보 `role-state-conflation`** — PR #148 의 krrong (역할 vs 상태 자가 학습) 결.
215
+
216
+ 10. **재구현 권유 = 학생 자가 진화 모범** — *"나중에 시간이 나게 된다면 미션을 처음부터 다시 만들어보는 시간을 가져보셔도 좋겠어요! 처음 만든 것과 완전히 다른 코드를 마주하게 될거예요"*. *학습 = 한 번에 X + 시간 두고 반복*. PR #98 chaehyuns *"추후 시간이 될 때 다시한번 구현해보고 싶네요"* 결.
@@ -0,0 +1,132 @@
1
+ # PR #15 — [블랙잭 1단계] 하티 미션
2
+
3
+ - **Reviewee:** [@sujin9](https://github.com/sujin9)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/15
5
+ - **단계:** 1단계
6
+ - **리뷰어:** [@BeokBeok](https://github.com/BeokBeok) (벅벅) — 2023 코호트 reviewer
7
+ - **라인 코멘트:** 13 스레드 — *PR 본문 자가 의문 (enum 출력 표기 위치 + mark vs view 변환 예시 코드) + abstract vs open 학생 자가 깊은 학습 (인스턴스화 여부) + 다국어 어휘 + on 전치사 = 콜백 어휘 + 함수명 vs 구현부 일치 + Ace 관리 위치 + private constructor + 팩토리 칭찬*
8
+ - **신규 reviewee** (2023 코호트, 새 1단계).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 + 코드 예시
13
+
14
+ PR 본문:
15
+
16
+ > *"enum 클래스가 출력 시 표기되는 부분은 어느 부분에 정의하는 것이 책임에 옳은건가 하는 의문이 들었습니다."*
17
+
18
+ → **PR 본문 자가 의문 + 코드 예시** = PR #35·#126 결 합류.
19
+
20
+ ### 2. abstract vs open 학생 자가 깊은 학습 (Thread 5)
21
+
22
+ reviewer: *"abstract와 open의 차이점은 무엇일까요?"*
23
+
24
+ 학생 자가 답변:
25
+
26
+ > *"**open** : 상속을 **받을 수 있는** 클래스 또는 함수입니다. open class는 상속 받는 대상이 없어도 인스턴스화 할 수 있고, open fun은 상속 받는 대상이 그대로 사용할 수도, override하여 재정의할 수도 있습니다.*
27
+ >
28
+ > ***abstract** : 상속을 **받아야만 하는** 클래스 또는 함수입니다. abstract class는 상속 받는 대상이 없다면 인스턴스화할 수 없습니다. abstract fun은 반드시 재정의되어야 합니다.*"
29
+
30
+ reviewer:
31
+
32
+ > *"open과 abstract의 차이점에 대해서 잘 정리해주셨네요. 👍 볼드체하신 부분도 중요하지만, 가장 큰 차이점은 \"인스턴스화\" 여부도 중요합니다. 😄 Participant 자체가 인스턴스가 생성되면 안되기 때문에, open보다 abstract가 더 적합합니다."*
33
+
34
+ → **Kotlin 어휘 깊은 자가 학습 + reviewer 정정 (인스턴스화 여부 핵심)** = PR #19·#129·#126·#138·#142·#143·#113·#69·#102 결 누적 10+ PR.
35
+
36
+ ### 3. 다국어 어휘 (Thread 8)
37
+
38
+ reviewer:
39
+
40
+ > *"같은 enum 타입이여도 다른 화면에서는 다르게 보여줘야하는 경우가 있습니다. 또한, 추후 안드로이드 개발을 하시게 되면 \"다국어\" 기능을 염두에 두고 개발을 하시게 될텐데, \"다국어\" 지원을 하기 위해서는 View에서 보여주도록 하는 것이 대응하기가 용이합니다. 😄"*
41
+
42
+ → **다국어 어휘 + 안드로이드 미래 학습** = PR #130 (medAndro 안드로이드 리소스 파일) + PR #118 (Shape 안드로이드 이식) 결 합류.
43
+
44
+ **MCP 룰 `i18n-multi-language-as-view-responsibility` 후보** — *다국어 = View 책임*.
45
+
46
+ ### 4. 추가 칭찬
47
+
48
+ - Thread 12: *"대체로 팩터리 메서드를 활용하고, 생성자로 객체를 만들지 못하도록 private constructor를 잘 활용해주셨네요. 👍"*.
49
+ - Thread 13: *"when을 exhaustive하게 잘 작성해주셔서 enum이 추가되거나 삭제되더라도 변경을 쉽게 인지할 수 있겠네요. 👍"*.
50
+
51
+ ## 못한 점 (설계 관점)
52
+
53
+ ### 1. 승패 로직 테스트 가능 (Thread 1)
54
+
55
+ reviewer: *"이 로직은 승패와 관련된 로직을 담고 있습니다. 블랙잭 미션에서 핵심 로직 중 하나라고 볼 수 있습니다. 그렇다면 테스트가 가능하도록 코드를 개선해보면 어떨까요?"*
56
+
57
+ → **테스트 가능성 = 객체 설계 지표** = 누적 다수.
58
+
59
+ ### 2. Ace 관리 위치 (Thread 2)
60
+
61
+ reviewer: *"Ace라는 값을 어디에서 관리를 하고 있는지 고민해보시면 좋을 것 같아요. Ace 값을 관리하는 곳에서 메시지를 보내서 판단하도록 코드를 개선해보면 어떨까요?"*
62
+
63
+ → **Tell-Don't-Ask + Ace 책임 위치** = 누적 다수.
64
+
65
+ ### 3. CardNumber.value 프로퍼티 불필요 (Thread 3)
66
+
67
+ reviewer: *"CardNumber의 value를 조회하는 프로퍼티를 구현해주셨네요. 👍 하지만, 이 프로퍼티가 없이 value를 조회할 수 있지 않을까요?"*
68
+
69
+ → **불필요한 프로퍼티** = PR #141·#149 (Money.toInt() 불필요) 결 합류.
70
+
71
+ ### 4. value class 포장 (Thread 6)
72
+
73
+ reviewer: *"스코어(Int)도 위 요구사항을 반영해보면 어떨까요?"*
74
+
75
+ → **원시값 포장** = 누적 다수.
76
+
77
+ ### 5. companion object import 가독성 (Thread 7)
78
+
79
+ reviewer:
80
+
81
+ > *"companion object를 import하게되면 간편하게 사용할 수 있는 장점이 있습니다. 반면, 이 값이 어느 곳에서 정의가 되었는지 알기가 어렵습니다. 어떤 companion object에 정의가 되어있는지 알기 쉽도록 코드를 개선해보면 어떨까요?"*
82
+
83
+ → **import 가독성 트레이드오프** = **MCP 룰 `companion-object-import-readability` 후보**.
84
+
85
+ ### 6. on 전치사 = 콜백 어휘 (Thread 11) + 외부글
86
+
87
+ reviewer:
88
+
89
+ > *"함수명 앞에 \"on\"이라는 전치사를 사용해주셨네요. 👍 대체로 앞에 \"on\"이라는 전치사를 사용하여 함수를 작성하는 경우, 일반 함수가 아닌 \"콜백\" 함수를 의도합니다. 이 함수는 콜백함수가 아니므로, 전치사를 제거해보면 어떨까요?*
90
+ >
91
+ > *ref. https://android.googlesource.com/platform/developers/docs/+/975a589941f728f6c6ce6fbbd7517ca854bc61ba/api-guidelines/index.md#callback-method-nami"*
92
+
93
+ → **on 전치사 콜백 어휘 + 안드로이드 외부글** = PR #137 (HamBeomJoon `onXX` 콜백 어휘) + PR #35 (`onXxx` 도메인 어휘) 결 합류 누적 3+ PR.
94
+
95
+ ### 7. 함수명 vs 구현부 일치 (Thread 9)
96
+
97
+ reviewer: *"테스트 코드에서는 \"모든 경우의 카드를 뽑을 수 있다\" 라고 언급이 되어있지만, 구현부는 52장인지 아닌지에 대한 여부를 판단하고 있네요."*
98
+
99
+ → **함수명 = 구현 의도 일치** = 누적 14+ PR.
100
+
101
+ ### 8. 테스트 명명 *일부의 가치* 모호 (Thread 10)
102
+
103
+ reviewer: *"\"일부의 가치\"에서 \"일부\"는 어떤 것을 의미할까요? 어떤 것을 테스트를 하려고 하는지 좀 더 명확하게 작성해보면 어떨까요? 가령, \"ACE가 3장이면 한 장은 11이고 나머지는 1이다\"와 같이 작성할 수 있을 것 같아요."*
104
+
105
+ → **테스트 명명 구체성** = PR #109 (BDD given-when-then) 결 합류.
106
+
107
+ ### 9. 커스텀 Deck 테스트 (Thread 4)
108
+
109
+ reviewer: *"내가 원하는 카드 리스트를 가지고 Deck을 만들 수 있도록 테스트 코드를 작성해보면 어떨까요?"*
110
+
111
+ → **Deck DI** = 누적 8+ PR.
112
+
113
+ ## 대표 인용
114
+
115
+ > [BeokBeok Thread 5]
116
+ > *"가장 큰 차이점은 \"인스턴스화\" 여부도 중요합니다."*
117
+
118
+ → **abstract vs open 인스턴스화 어휘**.
119
+
120
+ > [BeokBeok Thread 8]
121
+ > *"\"다국어\" 지원을 하기 위해서는 View에서 보여주도록 하는 것이 대응하기가 용이합니다."*
122
+
123
+ → **다국어 = View 어휘**.
124
+
125
+ ## 얻은 교훈 (보편)
126
+
127
+ 1. **abstract vs open 인스턴스화 여부 핵심** = 누적 10+ PR.
128
+ 2. **다국어 = View 책임** — **MCP 룰 `i18n-multi-language-as-view-responsibility` 후보**.
129
+ 3. **on 전치사 = 콜백 어휘 + 안드로이드 외부글** = 누적 3+ PR.
130
+ 4. **companion object import 가독성** — **MCP 룰 `companion-object-import-readability` 후보**.
131
+ 5. **함수명 = 구현 의도 일치** = 누적 14+ PR.
132
+ 6. **테스트 명명 구체성**.