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,284 @@
1
+ # PR #10 โ€” [๋ธ”๋ž™์žญ 1๋‹จ๊ณ„] ์‚ฐ๊ตฐ ๋ฏธ์…˜
2
+
3
+ - **Reviewee:** [@s9hn](https://github.com/s9hn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/10
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„ (ํŽ˜์–ด)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @malibinYun (๋ง๋ฆฌ๋นˆ)
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 30 (๋ฆฌ๋ทฐ์–ด 17 / ๋ฆฌ๋ทฐ์ด 13)
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **View ์„ธ๋ถ„ํ™” โ€” `LoginView`/`PlayGameView`/`GameResultView`** (LoginView ๋ช…๋ช…์€ ๋ชปํ•œ ์  ยง11์—์„œ ํ† ๋ก ).
12
+ - **`abstract class Player` + `Dealer`/`User` ์ƒ์†** + ํ›„์†์— *ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜*๋กœ ์ƒ์„ฑ ํ†ต์ผ.
13
+ - **`Referee` ๊ฐ์ฒด ๋ถ„๋ฆฌ ์‹œ๋„ + ํ•™์ƒ ์ž๊ฐ€ ํ† ๋ก ** (๋ชปํ•œ ์  ยง10).
14
+ - **`Card private constructor + Card.valueOf(card)` ํŒฉํ† ๋ฆฌ + ์ต๋ช… ๊ฐ์ฒด๋กœ ์žฌ์‚ฌ์šฉ (ํ›„์† ๋ฐ˜์˜)** โ€” Flyweight ํŒจํ„ด.
15
+ - **`Deck` ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๋„์ž… (ํ›„์†)** + ๋นˆ ๋ฑ ๊ฒ€์ฆ `require()`.
16
+ - **ํ›„์† ๋ฐ˜์˜ โ€” `getCardPair โ†’ getCard(count)` ๋‹จ์ผ ๋ฉ”์„œ๋“œ + `Dealer.create()` ํŒฉํ† ๋ฆฌ + `Hand` ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ + ๋”œ๋Ÿฌ ๋ธ”๋ž™์žญ ๋ฃฐ (16 ์ดํ•˜๋ผ๋„ ์ž๊ธฐ ๋ธ”๋ž™์žญ์ด๋ฉด ๋ฌด์กฐ๊ฑด ์šฐ์Šน)**.
17
+
18
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
19
+
20
+ ### 1. `Answer("y"/"n")` ๋„๋ฉ”์ธ ๊ฐ์ฒด โ€” UI ์ž…๋ ฅ ํ˜•์‹ ๋ณด์œ 
21
+
22
+ ```kotlin
23
+ class Answer(val value: String) {
24
+ init { require((value == YES) or (value == NO)) { ERROR_ANSWER_FORMAT } }
25
+ companion object { const val YES = "y"; const val NO = "n" }
26
+ }
27
+ ```
28
+
29
+ ๋ฆฌ๋ทฐ์–ด: "Answer๋ฅผ *domain์— ๋ถ„๋ฅ˜*ํ•ด์ฃผ์…จ๋Š”๋ฐ์š”, *ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์€ View์˜ ์š”์†Œ*๋„ค์š” :) *๋„๋ฉ”์ธ๊ณผ ๋ทฐ๋ฅผ ๊ผญ ๋ถ„๋ฆฌ*ํ•ด์ฃผ์„ธ์š”!" โ€” *Y/N ์ž…๋ ฅ ํ˜•์‹*์€ UI. *enum Answer { YES, NO }* + InputView์—์„œ ๋งคํ•‘. PR #29ยท#63ยท#125ยท#128ยท#116๊ณผ ๊ฐ™์€ ๊ฒฐ.
30
+
31
+ ### 2. `Card.Value` enum โ€” *Value*๋ผ๋Š” ๋งŒ๋Šฅ ๋ช…์‚ฌ
32
+
33
+ ```kotlin
34
+ class Card(val shape: Shape, val value: Value) {
35
+ enum class Value(val number: Int, val cardSign: String) { ... }
36
+ }
37
+ ```
38
+
39
+ ๋ฆฌ๋ทฐ์–ด: "*Value๋ผ๋Š” ์ด๋ฆ„์€ ๋„ˆ๋ฌด ๋ฒ”์šฉ์ *์ž…๋‹ˆ๋‹ค. *๊ทธ ๋ฌด์—‡๋„ Value๋ผ๊ณ  ์นญํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์—ฌ์š”* :) *๋” ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„*์„ ์ง€์–ด๋ณผ๊นŒ์š”?" โ€” `Value` / `Information` / `Manager` / `Rule` ๋งŒ๋Šฅ ๋ช…์‚ฌ ํŒจํ„ด. `Rank` / `CardNumber` ๊ฐ™์€ *๋„๋ฉ”์ธ ์–ดํœ˜*. PR #92 `Information` ๋ณ€ํ˜•.
40
+
41
+ ### 3. `Card.Shape.pattern` / `Card.Value.cardSign` UI ํ‘œํ˜„
42
+
43
+ ```kotlin
44
+ enum class Shape(val pattern: String) {
45
+ HEARTS("ํ•˜ํŠธ"), DIAMONDS("๋‹ค์ด์•„๋ชฌ๋“œ"), CLUBS("ํด๋กœ๋ฒ„"), SPADES("์ŠคํŽ˜์ด๋“œ"),
46
+ }
47
+ enum class Value(val number: Int, val cardSign: String) { ... }
48
+ ```
49
+
50
+ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง์ ‘ ์ง€์ ์€ ์•ˆ ํ–ˆ์ง€๋งŒ PR ํ๋ฆ„์ƒ *Answer UI ๋ถ„๋ฆฌ* ๊ถŒ๊ณ ์™€ ๋™์ผ ๊ฒฐ. **enum UI value 9๊ฐœ PR ์—ฐ์†**.
51
+
52
+ ### 4. `CardMachine` ๊ฐ์ฒด โ€” Generator/Picker/Deck์˜ ๋˜ ๋‹ค๋ฅธ ๋ณ€ํ˜•
53
+
54
+ ```kotlin
55
+ class CardMachine {
56
+ private val cards: MutableList<Card> = mutableListOf()
57
+ init { addCards(); cards.shuffle() }
58
+ fun getNewCard() = cards.removeFirst()
59
+ fun getCardPair(): List<Card> { ... }
60
+ fun getCardPairs(count: Int): List<List<Card>> { ... }
61
+ }
62
+ ```
63
+
64
+ ๋ฆฌ๋ทฐ์–ด: "*์ดํ›„ 3์žฅ, 4์žฅ, 5์žฅ์„ ๋ฝ‘๋Š” ๊ทœ์น™๋“ค์ด ์ƒ๊ฒจ๋‚œ๋‹ค๋ฉด, ๋ฉ”์„œ๋“œ์˜ ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์•„์งˆ ๊ฒƒ์ด ์šฐ๋ ค*๋ผ์š”. `getCards(count)` ๋“ฑ์œผ๋กœ ์นด๋“œ๋ฅผ ๋ฝ‘์•„๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?" / "*count๋ฅผ ๋ฐ›์•„ List๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ๋ฉ”์„œ๋“œ๋ช…์ด ๋‹จ์ˆ˜ ํ˜•ํƒœ์ธ ๊ฑด ์กฐ๊ธˆ ์–ด์ƒ‰*ํ•ด๋ณด์ด๋„ค์š”." / "*CardMachine์˜ ๋žœ๋ค์— ๋Œ€ํ•œ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ๊ธฐ๋Šฅ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?* ๋กœ๋˜์™€ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์„ ์ž˜ ๋˜์ƒˆ๊ฒจ๋ณด๋ฉด์„œ, *๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์œผ๋กœ ๋ณ€๊ฒฝ*ํ•ด๋ณด์„ธ์š”"
65
+
66
+ โ†’ **`CardMachine`์ด๋ผ๋Š” ๋ช…์‚ฌ ์ž์ฒด = ๋˜ ๋‹ค๋ฅธ ๋งŒ๋Šฅ ์–ดํœ˜**. `Deck`์ด ๋„๋ฉ”์ธ ์–ดํœ˜๋กœ ์ž์—ฐ. ํ•™์ƒ ํ›„์†: `getCard(count): List<Card>` ๋‹จ์ผ ๋ฉ”์„œ๋“œ + `Deck` ํด๋ž˜์Šค ๋„์ž….
67
+
68
+ ### 5. `Dealer(name, cards: MutableList<Card>)` โ€” ๋ฐฉ์–ด์  ๋ณต์‚ฌ ๋ˆ„๋ฝ + ์™ธ๋ถ€ ์ฐธ์กฐ ๋ˆ„์ˆ˜
69
+
70
+ ```kotlin
71
+ class Dealer(name: String = DEALER_NAME, cards: MutableList<Card>) : Player(name, cards) { ... }
72
+ ```
73
+
74
+ ๋ฆฌ๋ทฐ์–ด: "*๋ฐฉ์–ด์  ๋ณต์‚ฌ์˜ ์˜๋ฏธ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๊ฒ ์–ด์š”* :) ์•„๋ž˜ ์ฝ”๋“œ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ ์ˆ˜ ์žˆ์„๊นŒ์š”? ```val mutableList = mutableListOf(1, 2, 3); Dealer("", mutableList); mutableList.clear()```" โ€” PR #79ยท#65ยท#24ยท#28๊ณผ ๋™์ผ *์™ธ๋ถ€ ์ฐธ์กฐ ๋ˆ„์ˆ˜* ํŒจํ„ด. ํ•™์ƒ ํ›„์†: `private constructor` + ํŒฉํ† ๋ฆฌ์—์„œ `toMutableList()` ๋ณต์‚ฌ.
75
+
76
+ ### 6. `Player.cards: List<Card> get() = _cards.toList()` โ€” ๋ฐฉ์–ด์  ๋ณต์‚ฌ + ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๋ฏธ๋„์ž…
77
+
78
+ ```kotlin
79
+ abstract class Player(
80
+ val name: String,
81
+ private val _cards: MutableList<Card>,
82
+ ) {
83
+ val cards: List<Card> get() = _cards.toList()
84
+ ...
85
+ }
86
+ ```
87
+
88
+ ๋ฆฌ๋ทฐ์–ด: "*์นด๋“œ๋“ค์„ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ตฌํ˜„*ํ•ด๋ณด์„ธ์š” :)" โ€” `Hand` ๋˜๋Š” `Cards` ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜. *๋ฐฉ์–ด์  ๋ณต์‚ฌ + ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜*์€ ๋ณ„๊ฐœ ๊ฐœ๋…. *์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋™์ž‘ ๋ณด์œ  + ๋ณ€๊ฒฝ ์ œ์–ด*. ํ•™์ƒ ํ›„์†: `Hand` ๋„์ž….
89
+
90
+ ### 7. `Player.validPlayerSum()` ํ•จ์ˆ˜๋ช… โ€” *๊ฒ€์ฆ์ธ์ง€ ํ•ฉ์‚ฐ์ธ์ง€ ๋ชจํ˜ธ*
91
+
92
+ ```kotlin
93
+ fun validPlayerSum(): Int {
94
+ if ((calculateCardValueSum() < ACE_CARD_PLUS_TEN) and (countAce() != NO_ACE)) {
95
+ return calculateCardValueSum() + ACE_CARD_PLUS_TEN
96
+ }
97
+ return calculateCardValueSum()
98
+ }
99
+ ```
100
+
101
+ ๋ฆฌ๋ทฐ์–ด: "๋ฉ”์„œ๋“œ๋ช…๋งŒ ๋ณด๋ฉด, *player ํ•ฉ๊ณ„๊ฐ€ valid ํ•œ์ง€ ๊ฒ€์ฆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ*๋กœ ๋ณด์—ฌ์š”. *๋” ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„*์„ ์ง€์–ด์ฃผ์–ด ๋ณผ๊นŒ์š”? ๐Ÿ™‚" โ€” `valid*` ์ ‘๋‘์‚ฌ๋Š” *๊ฒ€์ฆ ๋™์ž‘* ์—ฐ์ƒ. ์‹ค์ œ๋Š” *Ace ๋ณด์ • ์ ์šฉ ํ›„ ์ ์ˆ˜*. `scoreWithAceAdjusted()` ๋˜๋Š” `totalScore()` ๊ฐ™์€ *๊ฒฐ๊ณผ ๋™์‚ฌ*.
102
+
103
+ ### 8. `Player.countAce()` โ€” *๋ช‡ ์žฅ ์…€๊นŒ* vs *์žˆ๋Š”์ง€๋งŒ*
104
+
105
+ ```kotlin
106
+ private fun countAce(): Int = _cards.filter { it.value == Card.Value.ACE }.size
107
+ fun validPlayerSum(): Int {
108
+ if (... and (countAce() != NO_ACE)) { return ... + ACE_CARD_PLUS_TEN }
109
+ ...
110
+ }
111
+ ```
112
+
113
+ ๋ฆฌ๋ทฐ์–ด: "*์ •๋ง ACE๊ฐ€ ๋ช‡ ์žฅ์ธ์ง€ ์„ธ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ผ ์ง€ ๊ณ ๋ฏผ*ํ•ด๋ณด์„ธ์š” :)" โ€” *Ace๋ฅผ 11์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ๋ณด์ •*ํ•˜๋ฉด *๋ช‡ ์žฅ์ธ์ง€ ์…€ ํ•„์š” ์—†์Œ*. *์žˆ๋Š”์ง€(Boolean)*๋งŒ ๊ฒ€์‚ฌ. PR #79 (ii2001) ๋ฆฌ๋ทฐ์–ด ๊ถŒ๊ณ ์™€ ๋™์ผ (*Ace ๋‘ ์žฅ = +20์€ ํ•ญ์ƒ Bust*).
114
+
115
+ ๋˜: ๋ฆฌ๋ทฐ์–ด ๊ถŒ๊ณ  "`count{}` ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด๋ณด์„ธ์š”" โ€” `_cards.count { it.value == Card.Value.ACE }`๋กœ ๋‹จ์ˆœํ™”.
116
+
117
+ ### 9. `Referee(dealerScore: Int, userScore: List<Int>)` โ€” Int ๋น„๊ต + ์ •์  ๊ฐ์ฒด
118
+
119
+ ```kotlin
120
+ class Referee(private val dealerScore: Int, private val userScore: List<Int>) {
121
+ fun getResult(): List<GameResult> = userScore.map { score ->
122
+ when {
123
+ score > BUST -> GameResult.LOSE
124
+ dealerScore > BUST -> GameResult.WIN
125
+ ...
126
+ }
127
+ }
128
+ }
129
+ ```
130
+
131
+ ๋ฆฌ๋ทฐ์–ด: "*์‹ฌํŒ ๊ฐ์ฒด๋Š” ์ •๋ง ํ•„์š”ํ•œ ๊ฐ์ฒด์ผ๊นŒ์š”?* *๊ฐ์ฒด ๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋˜์ง€๋ฉด์„œ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ณ€๊ฒฝ*ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?" / "*๋ธ”๋ž™์žญ์„ ํ”Œ๋ ˆ์ดํ•˜๋Š” ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๋ฐ˜์˜*ํ•ด๋ณด์„ธ์š” :) *๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ฑ…์ž„์€ ๋ˆ„๊ตฌ์—๊ฒŒ ์žˆ์„๊นŒ์š”?* ๋”œ๋Ÿฌ์™€ ์œ ์ €๋ฅผ *์ƒ์†๊ด€๊ณ„๋กœ ๊ตฌํ˜„ํ•˜์…จ์œผ๋‹ˆ, ๋‘˜ ๋‹ค Player๋ผ๋Š” ์ ์„ ์žŠ์ง€ ๋ง์•„์š”* ๐Ÿ™‚"
132
+
133
+ ํ•™์ƒ ์ž๊ฐ€ ํ† ๋ก : "*Referee๊ฐ€ ํ•„์š”์—†๋‹ค๋ฉด, ์ ์ˆ˜๋น„๊ต ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๋Š” ๋กœ์ง์„ ๋ˆ„๊ฐ€ ์ˆ˜ํ–‰ํ•ด์ฃผ์–ด์•ผ ํ• ๊นŒ?* ํ˜„์žฌ ๋กœ์ง์ƒ(์ œ ์ƒ๊ฐ์—) Dealer ํ˜น์€ User ํด๋ž˜์Šค๊ฐ€ *๊ณ„์‚ฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•ด์ฃผ์–ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค*. User(<-> Dealer) ๋‚ด๋ถ€์—์„œ ๋”œ๋Ÿฌ์˜ ์ ์ˆ˜์™€ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. - *์œ ์ €(ํ˜น์€ ๋”œ๋Ÿฌ)๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๋Œ€์˜ ์ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฐ€?* - *์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค -> ์ด๋Ÿด๊ฑฐ๋ฉด Referee๊ฐ€ ๋‚ซ์ง€์•Š๋‚˜..?* ๋ผ๋Š” ์˜์‹์˜ ํ๋ฆ„์œผ๋กœ,, ๋„์ฐฉํ–ˆ์œผ๋‚˜, *๋‹ต์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ•˜๊ฒ ์–ด์„œ ์—ฌ์ญค๋ด…๋‹ˆ๋‹ค*..."
134
+
135
+ โ†’ **ํ•™์ƒ์ด ์ž๊ฐ€ ํ† ๋ก ์œผ๋กœ ํ•ต์‹ฌ ์˜๋ฌธ ๋„๋‹ฌ**. *์ƒ๋Œ€ ์ ์ˆ˜๋ฅผ ๋ชจ๋ฅด๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•˜๋Š”๊ฐ€*. ์ •๋‹ต: `player.match(other: Player): GameResult` โ€” *์ƒ๋Œ€ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ* ๋ฐ›์Œ. *์ƒ๋Œ€ ๊ฐ์ฒด ์ž์ฒด*๊ฐ€ ์ƒ๋Œ€์˜ ์ ์ˆ˜๋ฅผ ์•Œ๊ฒŒ ํ•จ. PR #28ยท#63ยท#125ยท#29ยท#24ยท#116๊ณผ ๊ฐ™์€ ๊ฒฐ. **Referee ๊ฐ์ฒด = ์ •์  ๋น„๊ต์ž**๋Š” ์ด ์ž๊ฐ€ ํ† ๋ก ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•จ.
136
+
137
+ ### 10. `Card.valueOf(card: Card): Card.Value` ์ •์  ๋ฉ”์„œ๋“œ โ€” *์นด๋“œ์˜ ์ ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ๋ณ€ํ™˜*
138
+
139
+ ```kotlin
140
+ companion object {
141
+ fun valueOf(card: Card): Card.Value = card.value
142
+ }
143
+
144
+ // Player์—์„œ
145
+ fun calculateCardValueSum(): Int = _cards.sumOf { Card.valueOf(it) } // โš  Card.valueOf(it).number ๋ˆ„๋ฝ?
146
+ ```
147
+
148
+ `Card.valueOf(card)`๋Š” *๊ทธ๋ƒฅ `card.value` ์ ‘๊ทผ์˜ wrapper*. *์ •์  ๋ฉ”์„œ๋“œ*๊ฐ€ *getter ์—ญํ• ๋งŒ*. ์˜๋ฏธ ์—†๋Š” ์šฐํšŒ.
149
+
150
+ ### 11. `LoginView` ๋ช…๋ช…
151
+
152
+ ๋ฆฌ๋ทฐ์–ด: "View์— ๊ฐ๊ธฐ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•œ ์ ์ด ์ธ์ƒ ๊นŠ๋„ค์š” ๐Ÿ™‚ *View๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ๋‚˜๋ˆ„๋‹ค๋ณด๋‹ˆ, ์ž‘๋ช…์ด ์–ด๋ ค์› ์„ ๊ฒƒ๋งŒ ๊ฐ™๋„ค์š”* ๐Ÿ˜‚ *LoginView๋ผ๋Š” ์ด๋ฆ„์€ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆด ์—ฌ์ง€๊ฐ€ ์žˆ์–ด๋ณด์—ฌ์š”*" โ€” *Login*์€ ์ธ์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค ์–ดํœ˜. ๊ฒŒ์ž„์—์„œ๋Š” *์ด๋ฆ„ ์ž…๋ ฅ*. `IntroView` / `GameIntroView` / `PlayerNameInputView` ๋“ฑ *๋„๋ฉ”์ธ ์–ดํœ˜ ํ™œ์šฉ*. ํ•™์ƒ ํ›„์†: `GameIntroView`.
153
+
154
+ ### 12. `Deck.addCard(card: List<Card>)` โ€” *๋ชจ๋“  ์นด๋“œ vs ์ฒซ ์นด๋“œ๋งŒ* ๋ถˆ์ผ์น˜
155
+
156
+ ```kotlin
157
+ fun addCard(card: List<Card>) {
158
+ _cards.add(card.first()) // โš  ์ธ์ž๋Š” List์ธ๋ฐ first()๋งŒ ์‚ฌ์šฉ
159
+ }
160
+ ```
161
+
162
+ ๋ฆฌ๋ทฐ์–ด: "*๋ฉ”์„œ๋“œ๋ช…์œผ๋กœ๋งŒ ๋ณด๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋“  ์นด๋“œ List๋ฅผ ๋ฑ์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด ๊ธฐ๋Œ€*๋˜๋Š”๋ฐ, *์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ์€ ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ์žฅ๋งŒ ์ถ”๊ฐ€*ํ•˜๋„ค์š”. *๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๋„ ํ•œ ๋ฒˆ์— ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘*์ผ๊นŒ์š”?" โ€” ํ•จ์ˆ˜๋ช… vs ๋™์ž‘ ๋ถˆ์ผ์น˜. *cards: List* ๋ฐ›์œผ๋ฉด `addAll`์ด ์ž์—ฐ. `card: Card` ๋‹จ์ˆ˜๋ฉด `add`. **๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ํ˜ธ์ถœ ์˜๋„๋ฅผ ๊ฑฐ์ง“๋ง**.
163
+
164
+ ### 13. `Deck.require(_cards.size != EMPTY)` โ€” `isNotEmpty()` ํ™œ์šฉ ๋ฏธํก
165
+
166
+ ```kotlin
167
+ init { require(_cards.size != EMPTY) { ERROR_EMPTY_DECK } }
168
+ ```
169
+
170
+ ๋ฆฌ๋ทฐ์–ด: "*List ๋‚ด๋ถ€์˜ ๋น„์–ด ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ํ•จ์ˆ˜*๋ฅผ ํ™œ์šฉํ•ด๋ณด์„ธ์š” :)" โ€” `_cards.isNotEmpty()`๊ฐ€ *์˜๋„ ๋ช…ํ™•*. *size != EMPTY (= 0)*๋ณด๋‹ค *์กฐ๊ฑด ์ž์ฒด๊ฐ€ ๊ฒ€์ฆ์˜ ์˜๋ฏธ*.
171
+
172
+ ### 14. `CardMachineTest`๊ฐ€ *size๋งŒ ๊ฒ€์ฆ*
173
+
174
+ ```kotlin
175
+ @Test fun `3๋ช…์ผ ๊ฒฝ์šฐ, ์นด๋“œ ์„ธ ์Œ์„ ๋ฝ‘๋Š”๋‹ค`() {
176
+ val cardMachine = CardMachine()
177
+ val actual = cardMachine.getCardPairs(3)
178
+ assertThat(actual).hasSize(3)
179
+ }
180
+ ```
181
+
182
+ ๋ฆฌ๋ทฐ์–ด: "*์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ํ…Œ์ŠคํŠธ์—์„œ, ์‚ฌ์ด์ฆˆ๋งŒ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์€ ํฐ ์˜๋ฏธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์–ด๋ ค์›Œ์š”* :) *๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์„œ, ์นด๋“œ๋ฅผ ๋ฝ‘์•˜์œผ๋‹ˆ, ์‹ค์ œ ๋“ค์–ด์žˆ๋Š” ์นด๋“œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ…Œ์ŠคํŠธ์— ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌ*ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚"
183
+
184
+ ํ•™์ƒ ์ž๊ฐ€ ์˜๋ฌธ: "1) *shuffle๋œ ์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ํ…Œ์ŠคํŠธ์ธ๋ฐ.. ์–ด๋–ป๊ฒŒ ์‹ค์ œ์นด๋“œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š”์ง€..?* 2) *์นด๋“œ๋จธ์‹ ์€ ์นด๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์„ž์–ด์ฃผ๊ณ , ๋ฝ‘์•„์ฃผ๋Š” ์—ญํ• *์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, getCard๋Š” ์นด๋“œ๋ฅผ ๋ฝ‘์•„์ค๋‹ˆ๋‹ค. *getCard๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋ชฉ์ ์€, ์ •ํ•ด์ง„ count๋งŒํผ ์นด๋“œ๊ฐ€ ์ž˜ ๋ฝ‘ํžˆ๋Š” ์ง€๋ฅผ ํ…Œ์ŠคํŠธ*ํ•˜๋Š” ๋ฐ, *์‹ค์ œ ๋“ค์–ด์žˆ๋Š” ์นด๋“œ๋ฅผ ์™œ ์˜ˆ์ธกํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค*๐Ÿ˜ข"
185
+
186
+ โ†’ ๋ฆฌ๋ทฐ์–ด ์˜๋„๋Š” **์™ธ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ถ„๋ฆฌ** (lotto/racingcar์˜ `non-newable` ํŒจํ„ด). *์…”ํ”Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด*๋Š” stdlib ์ฑ…์ž„์ด๊ณ  *์…”ํ”Œ ํ›„ ๊ฒฐ์ •์  ์ˆœ์„œ๋ฅผ ์ฃผ์ž…*ํ•˜๋ฉด *์นด๋“œ X๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋ผ๋ฉด draw ๊ฒฐ๊ณผ๋Š” X*. ํ•™์ƒ์ด *์™ธ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ถ„๋ฆฌ ๊ฐœ๋…*์„ *์•„์ง ๋ฏธ๋ฐœ๊ฒฌ*. (PR #65ยท#114ยท#28๊ณผ ๊ฐ™์€ ๊ฒฐ.)
187
+
188
+ ### 15. `Controller`๊ฐ€ *Dealer ์นด๋“œ + User ์นด๋“œ zip*
189
+
190
+ ```kotlin
191
+ private fun initUsers(userNames: List<String>, userCards: List<List<Card>>): List<User> {
192
+ val userNamesAndCards = userNames.zip(userCards)
193
+ return userNamesAndCards.map { userNameAndCard -> User.create(userNameAndCard) }
194
+ }
195
+ ```
196
+
197
+ ๋ฆฌ๋ทฐ์–ด: "*์ด๋ฆ„๊ณผ ์นด๋“œ๋“ค์„ ๋”ฐ๋กœ ๋ฐ›์•„์„œ Pair๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋ณด๋‹ค, ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์ด๋ฆ„๋ถ€ํ„ฐ, ์นด๋“œ๊ฐ€์ ธ์™€์„œ ์œ ์ €๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฐฉ๋ฒ•*์„ ๊ณ ๋ฏผํ•ด๋ณด์•„์š” ๐Ÿ™‚" โ€” `userNames.map { name -> User.create(name, deck.draw(2)) }` ๊ฐ™์€ *์ฒด์ด๋‹*์ด *zip + Pair ๋ณ€ํ˜•*๋ณด๋‹ค ์ž์—ฐ. *๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์˜ ๋‹จ๊ณ„*๊ฐ€ *์ฝ”๋“œ ๊ฐ€๋…์„ฑ*์— ์˜ํ–ฅ.
198
+
199
+ ### 16. `Controller`๊ฐ€ *๋ธ”๋ž™์žญ ๋ฃฐ ์ง์ ‘ ๋ถ„๊ธฐ* โ€” ๋”œ๋Ÿฌ 16 ์ดํ•˜ + ๋ธ”๋ž™์žญ 21์  ๊ฒ€์‚ฌ ๋ˆ„๋ฝ
200
+
201
+ ๋ฆฌ๋ทฐ์–ด๊ฐ€ *์‹ค์ œ 6์žฅ ์นด๋“œ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜* ํ›„ ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ: "์ž„์˜๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ, *6์žฅ์˜ ์นด๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฒŒ์ž„์—์„œ ๋ชจ๋‘๊ฐ€ ๋ธ”๋ž™์žญ์„ ๊ฐ–๊ฒŒ ์‹คํ–‰*ํ•ด๋ณด์•˜๋Š”๋ฐ์š”, *๋”œ๋Ÿฌ์˜ ์ ์ˆ˜๊ฐ€ 16์ดํ•˜์ธ ๊ฒฝ์šฐ*๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋”œ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ, *ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ธ”๋ž™์žญ์ด ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ํŒจ๋ฐฐ*ํ•˜๋Š” ๋ฃฐ์ด ์žˆ๋Š”๋ฐ์š”, *๋ธ”๋ž™์žญ์— ๋Œ€ํ•œ ๋„๋ฉ”์ธ์„ ๋” ํŒŒ์•…ํ•˜์‹œ๊ณ  ๊ฒŒ์ž„์„ ๊ตฌํ˜„*ํ•ด๋ณด์‹œ๋ฉด ์ข‹๊ฒ ์–ด์š” :)"
202
+
203
+ โ†’ **๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ๋ฃฐ ๋ˆ„๋ฝ ๋ฐœ๊ฒฌ**. ํ•™์ƒ: "๋”œ๋Ÿฌ๊ฐ€ *A+ J/Q/K์ผ ๋•Œ, ๋ธ”๋ž™์žญ์œผ๋กœ ๋ฌด์กฐ๊ฑด ์šฐ์Šนํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง*ํ•˜์˜€์Šต๋‹ˆ๋‹ค!" โ€” *๋ธ”๋ž™์žญ ๋ฃฐ์˜ ํ•ต์‹ฌ ๋ถ„๊ธฐ*(๋”œ๋Ÿฌ ๋ธ”๋ž™์žญ ์‹œ 16 ์ดํ•˜๋ผ๋„ ์ถ”๊ฐ€ ๋ฝ‘๊ธฐ ์•ˆ ํ•จ). PR #128ยท#116 *๋ธ”๋ž™์žญ ๋ฃฐ ์˜คํ•ด*์™€ ๊ฐ™์€ ๊ฒฐ.
204
+
205
+ ### 17. `dealerPickNewCardIfNeed`์˜ *๊นŠ์€ if ์ค‘์ฒฉ*
206
+
207
+ ```kotlin
208
+ private fun dealerPickNewCardIfNeed(dealer: Dealer) {
209
+ if (!dealer.isOverSumCondition()) {
210
+ if (dealer.addScoreTenIfHasAce() != 21) {
211
+ playGameView.printDealerPickNewCard()
212
+ val newCard = cardMachine.getCard(1)
213
+ dealer.addCard(newCard)
214
+ }
215
+ }
216
+ }
217
+ ```
218
+
219
+ *if ์ค‘์ฒฉ + ๋งค์ง๋„˜๋ฒ„ 21*. `if (!dealer.isOverSumCondition() && !dealer.isBlackjack())` ๋‹จ์ผ ์กฐ๊ฑด์ด ์ž์—ฐ. *Bust ๋˜๋Š” BlackJack์ด๋ฉด ๋” ์•ˆ ๋ฝ‘๋Š”๋‹ค*๊ฐ€ *๋„๋ฉ”์ธ ๋ฃฐ์˜ ํ‘œํ˜„*.
220
+
221
+ ### 18. ๋ฉ”์„œ๋“œ ๋ฆฌํ„ด ํƒ€์ž… ๋ช…์‹œ ํ† ๋ก 
222
+
223
+ ```kotlin
224
+ class CardMachine {
225
+ fun getNewCard() = cards.removeFirst() // โš  ๋ฆฌํ„ด ํƒ€์ž… ์ถ”๋ก 
226
+ }
227
+ ```
228
+
229
+ ๋ฆฌ๋ทฐ์–ด: "*๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ดํƒ€์ž…์€ ๋ชจ๋‘ ๋ช…์‹œ*ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? *๋ช…์‹œํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์€ ์–ด๋–ค ์ฐจ์ด์ ์ด ์ƒ๊ธธ๊นŒ์š”?* ๋จผ์ € ๊ณ ๋ฏผํ•ด๋ณด์‹œ๊ณ , ์•„๋ž˜ Effective Kotlin ์„œ์ ์˜ ์ฑ•ํ„ฐ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์Šค์Šค๋กœ ์ƒ๊ฐํ•ด๋ณธ ๊ฒƒ๊ณผ ๋น„๊ตํ•ด๋ณด์•„์š” ๐Ÿ˜€ - *Item 4 : Inferred Type์œผ๋กœ ๋ฆฌํ„ดํ•˜์ง€ ๋ง๋ผ* - *Item 14 : ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ™•์‹คํ•˜๊ฒŒ ์ง€์ •ํ•˜๋ผ*" โ€” **๊ณต๊ฐœ API์˜ ๋ฆฌํ„ด ํƒ€์ž…์€ ๋ช…์‹œ ๊ถŒ์žฅ**. *Inferred*๋Š” *๊ตฌํ˜„ ๋ณ€๊ฒฝ ์‹œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ*. PR #135 (ijh1298)์˜ *๋ชจ๋“  ๋ณ€์ˆ˜ ํƒ€์ž… ๋ช…์‹œ* ๊ณผ์ž‰๊ณผ๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ โ€” *๊ณต๊ฐœ API๋Š” ๋ช…์‹œ, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ถ”๋ก *์ด ๊ท ํ˜•.
230
+
231
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
232
+
233
+ - ***`Answer("y"/"n")` ๋„๋ฉ”์ธ = UI ํ˜•์‹ ๋ˆ„์ˆ˜***.
234
+ - ***`Value`/`CardMachine` = ๋งŒ๋Šฅ ๋ช…์‚ฌ*** โ€” `Rank`/`Deck` ๊ฐ™์€ ๋„๋ฉ”์ธ ์–ดํœ˜.
235
+ - ***`Card ํ•œ ๋ฒˆ ์ƒ์„ฑ ํ›„ ์žฌํ™œ์šฉ*** = Flyweight (ํ•™์ƒ ํ›„์† ๋ฐ˜์˜).
236
+ - ***Generator/Picker/Machine ํŒจํ„ด ํญ์ฆ*** โ€” `Deck`์ด ๋„๋ฉ”์ธ ์–ดํœ˜.
237
+ - ***์™ธ๋ถ€ ์ฐธ์กฐ ๋ˆ„์ˆ˜ = ๋ฐฉ์–ด์  ๋ณต์‚ฌ ๋˜๋Š” toMutableList()***.
238
+ - ***์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ vs ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋Š” ๋ณ„๊ฐœ*** โ€” ์ผ๊ธ‰์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋™์ž‘ ๋ณด์œ .
239
+ - ***`validPlayerSum` ๊ฐ™์€ ๋ชจํ˜ธ ๋™์‚ฌ*** โ€” *๊ฒฐ๊ณผ ๋™์‚ฌ*.
240
+ - ***Ace ๋ช‡ ์žฅ ์นด์šดํŠธ X*** โ€” *์žˆ๋Š”์ง€(Boolean)*๋งŒ + ํ•œ ๋ฒˆ ๋ณด์ •.
241
+ - ***Referee ์ •์  ๋น„๊ต์ž = ์ž์œจ์„ฑ ๋ถ€์žฌ*** โ€” `player.match(other)` ๋ฉ”์‹œ์ง€.
242
+ - ***`LoginView` = ๋น„๋„๋ฉ”์ธ ์–ดํœ˜***.
243
+ - ***`addCard(List<Card>)`์—์„œ first()๋งŒ = ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ฑฐ์ง“๋ง***.
244
+ - ***`isNotEmpty()` ํ™œ์šฉ***.
245
+ - ***ํ…Œ์ŠคํŠธ๊ฐ€ size๋งŒ ๊ฒ€์ฆ = ์™ธ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ฏธ๋ถ„๋ฆฌ***.
246
+ - ***zip + Pair < ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹*** (๊ฐ€๋…์„ฑ).
247
+ - ***๋”œ๋Ÿฌ ๋ธ”๋ž™์žญ ์‹œ 16 ์ดํ•˜๋ผ๋„ ์ถ”๊ฐ€ ๋ฝ‘๊ธฐ ์•ˆ ํ•จ*** โ€” ๋ธ”๋ž™์žญ ๋ฃฐ ํ•ต์‹ฌ.
248
+ - ***๊ณต๊ฐœ API ๋ฆฌํ„ด ํƒ€์ž… ๋ช…์‹œ***.
249
+
250
+ ## ๋Œ€ํ‘œ ์ธ์šฉ
251
+
252
+ > Answer๋ฅผ *domain์— ๋ถ„๋ฅ˜*ํ•ด์ฃผ์…จ๋Š”๋ฐ์š”, *ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์€ View์˜ ์š”์†Œ*๋„ค์š” :)
253
+ > โ€” @malibinYun on `Answer.kt`
254
+
255
+ > *์‹ฌํŒ ๊ฐ์ฒด๋Š” ์ •๋ง ํ•„์š”ํ•œ ๊ฐ์ฒด์ผ๊นŒ์š”?* *๊ฐ์ฒด ๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋˜์ง€๋ฉด์„œ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ณ€๊ฒฝ*ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?
256
+ > โ€” @malibinYun on `Referee.kt`
257
+
258
+ > *์นด๋“œ๋“ค์„ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ตฌํ˜„*ํ•ด๋ณด์„ธ์š” :)
259
+ > โ€” @malibinYun on `Player.kt`
260
+
261
+ > ์ž„์˜๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ, *6์žฅ์˜ ์นด๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฒŒ์ž„์—์„œ ๋ชจ๋‘๊ฐ€ ๋ธ”๋ž™์žญ์„ ๊ฐ–๊ฒŒ ์‹คํ–‰*ํ•ด๋ณด์•˜๋Š”๋ฐ์š”, *๋”œ๋Ÿฌ์˜ ์ ์ˆ˜๊ฐ€ 16์ดํ•˜์ธ ๊ฒฝ์šฐ*๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. *๋”œ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ, ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ธ”๋ž™์žญ์ด ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ํŒจ๋ฐฐํ•˜๋Š” ๋ฃฐ*์ด ์žˆ๋Š”๋ฐ์š”, *๋ธ”๋ž™์žญ์— ๋Œ€ํ•œ ๋„๋ฉ”์ธ์„ ๋” ํŒŒ์•…*ํ•˜์‹œ๊ณ  ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•ด๋ณด์‹œ๋ฉด ์ข‹๊ฒ ์–ด์š” :)
262
+ > โ€” @malibinYun on `Controller.kt` (์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ๋ฃฐ ๋ˆ„๋ฝ ๋ฐœ๊ฒฌ)
263
+
264
+ > ์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ํ…Œ์ŠคํŠธ์—์„œ, *์‚ฌ์ด์ฆˆ๋งŒ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์€ ํฐ ์˜๋ฏธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์–ด๋ ค์›Œ์š”* :) *๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ*์„ ๋งŒ๋“ค์–ด์„œ, ์นด๋“œ๋ฅผ ๋ฝ‘์•˜์œผ๋‹ˆ, *์‹ค์ œ ๋“ค์–ด์žˆ๋Š” ์นด๋“œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ…Œ์ŠคํŠธ์— ์˜๋ฏธ*๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚
265
+ > โ€” @malibinYun on `CardMachineTest.kt`
266
+
267
+ ## ์–ป์€ ๊ตํ›ˆ
268
+
269
+ - ***`Answer("y"/"n")` ๋„๋ฉ”์ธ์€ UI ์ž…๋ ฅ ํ˜•์‹ ๋ˆ„์ˆ˜*** โ€” 9๊ฐœ+ PR ์—ฐ์† ๋“ฑ์žฅํ•˜๋Š” *UI ํ˜•์‹ ๋„๋ฉ”์ธ ๋ณด์œ * ์•ˆํ‹ฐํŒจํ„ด.
270
+ - ***`Value`/`CardMachine` ๊ฐ™์€ ๋งŒ๋Šฅ ๋ช…์‚ฌ*** โ€” `Rank`/`Deck` ๋„๋ฉ”์ธ ์–ดํœ˜๋กœ. PR #92 `Information`ยท#29 `Rule`ยท#65 `Judge`์™€ ๊ฐ™์€ ๊ฒฐ.
271
+ - ***Card Flyweight ์บ์‹ฑ*** โ€” 52์žฅ + ์ต๋ช… ๊ฐ์ฒด๋กœ ์žฌ์‚ฌ์šฉ. PR #112ยท#128ยท#135์™€ ์ผ๊ด€.
272
+ - ***Generator/Picker/Machine ํŒจํ„ด ํญ์ฆ = ๋„๋ฉ”์ธ ์–ดํœ˜ ํ๋ฆผ*** โ€” `Deck` ๋‹จ์ผ ๋ช…์‚ฌ๊ฐ€ ์ž์—ฐ. PR #29ยท#24ยท#65์™€ ๊ฐ™์€ ๊ฒฐ.
273
+ - ***`Dealer(name, cards: MutableList<Card>)` = ์™ธ๋ถ€ ์ฐธ์กฐ ๋ˆ„์ˆ˜*** โ€” `toMutableList()` ๋˜๋Š” *์ƒ์„ฑ์ž์— List<Card>* + ๋‚ด๋ถ€ ๋ณ€ํ™˜. PR #79ยท#65ยท#24ยท#28 ์žฌ์ถœํ˜„.
274
+ - ***์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ โ‰  ๋ฐฉ์–ด์  ๋ณต์‚ฌ*** โ€” *์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋™์ž‘ ๋ณด์œ *๊ฐ€ ๋ณธ์งˆ. *๋ฐฉ์–ด์  ๋ณต์‚ฌ*๋Š” *์™ธ๋ถ€ ๋ณ€๊ฒฝ ์ฐจ๋‹จ* ๋ณ„๊ฐœ.
275
+ - ***`validPlayerSum` ๊ฐ™์€ *๊ฒ€์ฆ vs ํ•ฉ์‚ฐ ๋ชจํ˜ธ ๋™์‚ฌ*** โ€” *๊ฒฐ๊ณผ ๋™์‚ฌ*๊ฐ€ ์ •ํ™•. `scoreWithAceAdjusted()` / `totalScore()`.
276
+ - ***Ace ํ•œ ๋ฒˆ๋งŒ ๋ณด์ • + ์žˆ๋Š”์ง€(Boolean) ๊ฒ€์‚ฌ*** โ€” *Ace ๋‘ ์žฅ = +20์€ ํ•ญ์ƒ Bust*. PR #79 ๊ถŒ๊ณ ์™€ ์ผ๊ด€.
277
+ - ***`Referee` ์ •์  ๋น„๊ต์ž = ์ž์œจ์„ฑ ๋ถ€์žฌ*** โ€” `player.match(other: Player): GameResult` ๋ฉ”์‹œ์ง€. ํ•™์ƒ์ด *์ƒ๋Œ€ ์ ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์•„๋Š”๊ฐ€* ์ž๊ฐ€ ํ† ๋ก ์œผ๋กœ *ํ•ต์‹ฌ ์˜๋ฌธ ๋„๋‹ฌ*.
278
+ - ***`LoginView` = ๋น„๋„๋ฉ”์ธ ์–ดํœ˜*** โ€” ๊ฒŒ์ž„ ์ปจํ…์ŠคํŠธ์— *Login*์€ ์–ด์ƒ‰. `GameIntroView` ๊ฐ™์€ *๋„๋ฉ”์ธ ์–ดํœ˜ ํ™œ์šฉ*.
279
+ - ***`addCard(List<Card>)`์—์„œ `first()`๋งŒ = ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๊ฑฐ์ง“๋ง*** โ€” ํ•จ์ˆ˜๋ช…/์‹œ๊ทธ๋‹ˆ์ฒ˜/๋™์ž‘ *3์ž ์ผ์น˜* ์›์น™.
280
+ - ***`isNotEmpty()` ํ™œ์šฉ*** โ€” *size != 0*๋ณด๋‹ค *์˜๋„ ์ž์ฒด*๊ฐ€ ํ•จ์ˆ˜์—.
281
+ - ***ํ…Œ์ŠคํŠธ๊ฐ€ size๋งŒ ๊ฒ€์ฆ = ์™ธ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ฏธ๋ถ„๋ฆฌ ์‹ ํ˜ธ*** โ€” ๊ฒฐ์ •์  fake/์ฃผ์ž…์œผ๋กœ *์นด๋“œ ์ž์ฒด ๊ฒ€์ฆ*. ํ•™์ƒ ์ž๊ฐ€ *์™œ ์˜ˆ์ธกํ•ด์•ผ ํ•˜๋Š”์ง€* ์˜๋ฌธ = *์™ธ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ถ„๋ฆฌ ๊ฐœ๋… ๋ฏธ๋ฐœ๊ฒฌ*.
282
+ - ***zip + Pair < ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹*** โ€” *๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋‹จ๊ณ„ ๊ฐ€์‹œํ™”*๊ฐ€ ๊ฐ€๋…์„ฑ.
283
+ - ***๋”œ๋Ÿฌ ๋ธ”๋ž™์žญ ์‹œ 16 ์ดํ•˜๋ผ๋„ ์ถ”๊ฐ€ ๋ฝ‘๊ธฐ X*** โ€” *๋ธ”๋ž™์žญ ๋ฃฐ ํ•ต์‹ฌ*. ๋ฆฌ๋ทฐ์–ด์˜ *์‹œ๋ฎฌ๋ ˆ์ด์…˜*์œผ๋กœ *๋ฃฐ ๋ˆ„๋ฝ ๋ฐœ๊ฒฌ*. PR #128ยท#116ยท#92์™€ ๊ฐ™์€ *๋ธ”๋ž™์žญ ๋ฃฐ ์˜คํ•ด* ํŒจํ„ด.
284
+ - ***๊ณต๊ฐœ API๋Š” ๋ฆฌํ„ด ํƒ€์ž… ๋ช…์‹œ + ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ถ”๋ก *** โ€” Effective Kotlin Item 4/14. PR #135 *๋ชจ๋“  ๋ณ€์ˆ˜ ๋ช…์‹œ ๊ณผ์ž‰*๊ณผ ๊ท ํ˜• ์žกํžŒ ์ž…์žฅ.
@@ -0,0 +1,224 @@
1
+ # PR #75 โ€” [๋ธ”๋ž™์žญ 1๋‹จ๊ณ„] ์‹ฌ์ง€ ๋ฏธ์…˜
2
+
3
+ - **Reviewee:** [@sh1mj1](https://github.com/sh1mj1)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/75
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @vagabond95 โ€” **์ด์ „ racingcar ๋ถ„์„์—์„œ ์ง์ ‘ ์ธ์šฉ๋œ reviewer (CLAUDE.md ์˜ `vagueName` ๋ฃฐ ์ธ์šฉ ์ถœ์ฒ˜). ๋ณธ blackjack ๋ฏธ์…˜์— ์ง์ ‘ ๋“ฑ์žฅ!**
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 28 ์Šค๋ ˆ๋“œ / ํ•™์ƒ ์ž๊ฐ€ ํ† ๋ก  ๋งค์šฐ ํ’๋ถ€ โ€” *State ํŒจํ„ด ์ž๊ฐ€ ํ•™์Šต + ๋””์ž์ธ ํŒจํ„ด = ์š”๋ฆฌ๋ฒ• ๋น„์œ *
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **State ํŒจํ„ด ์ž๊ฐ€ ํ•™์Šต + ์ฝ”๋“œ ์ ์šฉ ์‹œ๋„** โ€” ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต ์ธ์šฉ: *"์ œ๋ฆฌ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ง์”€ํ•ด์ฃผ์…จ์ง€๋งŒ, ์ œ๊ฐ€ ์šฐํ…Œ์ฝ” ์ˆ˜์—…์—์„œ ์ƒํƒœ ํŒจํ„ด์„ ๋ฐฐ์šฐ๊ธฐ ์ „์— ์ง์ ‘ ๊ณต๋ถ€ํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ  ์‹ถ์€ ์š•์‹ฌ์„ ๋А๊ปด์„œ ์—ด์‹ฌํžˆ ์ ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.."*. **์ฒซ ์‹œ๋„ + ์‹œํ–‰์ฐฉ์˜ค + ์ž๊ฐ€ ๋ถ„์„ ๋ชจ๋ฒ”**. `sealed interface CardHandState + Running (Start/Decide/Hit) + Done (Bust/BlackJack/Stay)` ๊ณ„์ธต ์‹œ๋„. PR #136ยท#152ยท#93ยท#147 ์™€ ๊ฐ™์€ ๊ฒฐ.
12
+ - **`Decide` ์ค‘๊ฐ„ ์ƒํƒœ ์ž๊ฐ€ ๋„์ถœ** โ€” *๋ธ”๋ž™์žญ/Bust ๊ฒฐ๊ณผ ์ƒํƒœ + Hit/Stay ์ง„ํ–‰ ์ƒํƒœ + `Decide` (Hit/Stay ๊ฒฐ์ • ์ „) ์ค‘๊ฐ„ ์ƒํƒœ*. *vagabond95 ์ง„๋‹จ "BLACKJACK, BURST ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๊ณ  STAY, HIT ์€ ์ง„ํ–‰๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์ด๊ฒƒ๋“ค์ด ๊ฐ™์€ enum ์œผ๋กœ ๋ฌถ์ด๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค"* ํ›„์† ๋ฐ˜์˜. **์ƒํƒœ ๋ถ„๋ฅ˜ ์ž๊ฐ€ ํ•™์Šต ๋ชจ๋ฒ”**.
13
+ - **๋ธ”๋กœ๊ทธ ๊ธ€ + ์ž๊ฐ€ ํ•™์Šต ์ž๋ฃŒ ์ธ์šฉ** โ€” ํ•™์ƒ ์ž๊ฐ€ ์ธ์šฉ: *"๊ณผ๊ฑฐ์— sealed class ๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๊ณผ ์ดํŽ™ํ‹ฐ๋ธŒ ์ฝ”ํ‹€๋ฆฐ์„ ๋ณด๋ฉด์„œ ์ƒํƒœ ํŒจํ„ด์„ ๊ณต๋ถ€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.(https://sh1mj1-log.tistory.com/199)"* + *"์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋””์ž์ธ ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๊ณ , ์„ค๊ณ„ํ•˜๋ฉด์„œ ๋ฐœ๊ฒฌํ•ด๋‚ด๊ณ  ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. (https://sh1mj1-log.tistory.com/228)"*. **์™ธ๋ถ€ ์ž๋ฃŒ + ์ž๊ฐ€ ์ •๋ฆฌ ๋ธ”๋กœ๊ทธ ๋ชจ๋ฒ”**.
14
+ - **`runPhase(condition: () -> Boolean)` ๋žŒ๋‹ค ์ถ”์ƒํ™” ์‹œ๋„** โ€” Player (์ž…๋ ฅ ์˜์ง€) / Dealer (์ ์ˆ˜ 16 ์ดํ•˜) ๋‘ ์กฐ๊ฑด ํ†ต์ผ์„ ์œ„ํ•œ ๋žŒ๋‹ค ์ธ์ž. vagabond95 ํ‰๊ฐ€: *"์šฐ์„  ํ˜„ ์ฝ”๋“œ์—์„œ ๊ฐ€๋…์„ฑ์€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘ ... ์ด ๋ถ€๋ถ„์€ 2๊ฐ€์ง€ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 1. ์ถ”์ƒํด๋ž˜์Šค์˜ ํ•˜์œ„ ํƒ€์ž…์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์˜ํ•ด ์ƒ์œ„ ํƒ€์ž…์˜ API ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. -> ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์ž˜๋ชป ์ •์˜ํ–ˆ๋‹ค๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2. ๊ตฌํ˜„์˜ ๋ฒ”์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ API ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. -> ํ•˜์œ„ ํƒ€์ž…์˜ ๊ตฌํ˜„์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฒ”์šฉ์„ฑ์„ ์œ„ํ•œ ์„ ํƒ์ด๋ฏ€๋กœ ์ ์ ˆํ•œ ์„ ํƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์˜ ๊ฒฝ์šฐ 1๋ฒˆ์˜ ์ผ€์ด์Šค๋ฅผ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ 2๋ฒˆ์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์•„ ๋ณด์ž…๋‹ˆ๋‹ค."*. **์ถ”์ƒํ™” ์ •๋‹นํ™” ์–‘๋ฐฉํ–ฅ ์ธ์‹ ๋ชจ๋ฒ”**.
15
+ - **`PlayerWinning + DealerWinning` ๋ถ„๋ฆฌ vs ํ†ตํ•ฉ ์ž๊ฐ€ ํ† ๋ก ** โ€” ํ•™์ƒ ์ž๊ฐ€ ๋‹ต๋ณ€ ๊นŠ์Œ: *"ํ•˜์ง€๋งŒ Dealer ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ๋Š” ์˜ค์ง, Player ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ์—ฌ๋ถ€๋งŒ์„ ๊ฐ€์ง€๊ณ  ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ScoreBoard ์—์„œ ๋”œ๋Ÿฌ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋„๊ตฌ์ธ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ, **์–ด๋– ํ•œ ์ฑ…์ž„์„ ์œ„ํ•œ ์ •๋ณด๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๊ฐ€ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ์š”?**"*. vagabond95: *"๋ชจ๋“  ๊ตฌํ˜„์€ trade-off ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ป๋Š”๊ฒŒ ์žˆ์œผ๋ฉด ๊ฑฐ์˜ ๋ฐ˜๋“œ์‹œ ํฌ์ƒํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค."*. **ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์–‘๋ฐฉํ–ฅ ์ธ์‹ ๋ชจ๋ฒ”**.
16
+ - **`Done.draw = throw` vs API ์‚ฌ์šฉ์ž ์ฑ…์ž„** โ€” vagabond95 ๋‹ต๋ณ€: *"API ๋ฅผ ์ž˜ ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด, ์ž˜๋ชป์‚ฌ์šฉํ–ˆ์„ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋Š” API ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ์…”๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋งŽ์€ Android / kotlin ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ ‡๊ฒŒ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ตฌํ˜„์„ ํ†ตํ•ด ์ ‘๊ทผ์„ ๋ง‰๋Š” ๋ฐฉ์‹์„ ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค."* โ€” ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต. PR #152ยท#147 ์˜ *throw vs self return* ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์™€ ๊ฐ™์€ ๊ฒฐ.
17
+
18
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
19
+
20
+ ### 1. `runPhase` ๋ฉ”์„œ๋“œ๋ช… โ€” *๊ณผ๋„ํ•˜๊ฒŒ ๋ชจํ˜ธ (vagabond95 ์ง„๋‹จ ํ•ต์‹ฌ)*
21
+
22
+ ```kotlin
23
+ abstract class Role {
24
+ abstract fun runPhase(condition: () -> Boolean): Boolean
25
+ }
26
+ ```
27
+
28
+ vagabond95: *"ํ•จ์ˆ˜ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์„ run ํ•˜๋Š” ๊ฒƒ์ด๊ณ  phase ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ์–ด๋–ค ๋‚ด์šฉ์ด ํ•ด๋‹น ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€๋„ ํฌ๊ฒŒ ์ด์ƒํ•˜์ง€ ์•Š๊ณ , ๋‹ค์‹œ ๋งํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ˆ˜๋งŽ์€ ์—ญํ• ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ phase ๋ผ๋Š” ๋„ค์ด๋ฐ์ด ๋งŽ์€๋ฐ, ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."*
29
+
30
+ ํ•™์ƒ ์ž๊ฐ€ ๋‹ต๋ณ€: *"์ €๋Š” ์นด๋“œ ๊ฒŒ์ž„์—์„œ phase ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฝค๋‚˜ ์ผ๋ฐ˜์ ์ด๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฝํžŒ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ธฐ์–ต์—๋Š” ์–ด๋ ธ์„ ๋•Œ ๋ดค๋˜ ๋งŒํ™”์—์„œ phase ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค."*
31
+
32
+ vagabond95 ํ›„์† (๋„ค์ด๋ฐ ๊ธฐ์ค€ ์ •๋ฆฌ): *"1. ๋ชจํ˜ธํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์ด๋ฆ„์„ ์ง€์–‘ํ•˜์ž. ์งˆ๋ฌธ ์ฃผ์…จ๋˜ runPhase ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ฉด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠน์„ฑ์ƒ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋Š” run ์ด๋ผ๋Š” ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ”๊ฟ”๋งํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋„ ์–ด์ƒ‰ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 5๋Œ€ ์›๋ฆฌ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” SOLID ์—์„œ SRP ๊ฐ€ ์ œ๋Œ€๋กœ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ . ใ…Žใ…Ž (๋น„์Šทํ•œ ์‚ฌ๋ก€๋กœ executeXXX, doXXX ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.) 2. ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ , ๋„ค์ด๋ฐ์„ ์ง“๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ๋ก€๋ฅผ ์ตํžˆ์ž. ... 3. ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„"*
33
+
34
+ โ†’ **`runXX` / `executeXX` / `doXX` ๋งŒ๋Šฅ ๋™์‚ฌ ์•ˆํ‹ฐํŒจํ„ด**. *SRP ์œ„๋ฐ˜ ์‹ ํ˜ธ*. *vagueName ์•ˆํ‹ฐํŒจํ„ด ๋ณ€ํ˜•*. **MCP ๋ฃฐ ํ›„๋ณด โ€” `vagueVerb`** (vagueName + ๋งŒ๋Šฅ ๋™์‚ฌ). PR #125ยท#114ยท#10ยท#88 ์™€ ๊ฐ™์€ ๊ฒฐ.
35
+
36
+ ### 2. `CardHandState enum` ์˜ *๊ฒฐ๊ณผ + ์ง„ํ–‰ ์ƒํƒœ ํ˜ผ์žฌ*
37
+
38
+ vagabond95: *"BLACKJACK, BURST ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๊ณ  STAY, HIT ์€ ์ง„ํ–‰๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์ด๊ฒƒ๋“ค์ด ๊ฐ™์€ enum ์œผ๋กœ ๋ฌถ์ด๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค"*
39
+
40
+ โ†’ **๊ฒฐ๊ณผ ์ƒํƒœ vs ์ง„ํ–‰ ์ƒํƒœ ๋ถ„๋ฆฌ ๋ถ€์žฌ**. *ํ•™์ƒ ์ž๊ฐ€ ํ›„์† ๋ฐ˜์˜ = sealed interface Running (Hit/Stay/Decide) + Done (Bust/BlackJack/Stay)*. PR #136ยท#147ยท#152 ์™€ ๊ฐ™์€ ๊ฒฐ์˜ *State ๋ถ„๋ฅ˜*.
41
+
42
+ ### 3. `output / shape` enum ๋ฉค๋ฒ„ = View ์˜์กด
43
+
44
+ vagabond95 ๋‹ค์ค‘ ์ง„๋‹จ (CardNumber/CardShape/WinningResultStatus): *"output ์€ view ์—์„œ ํ™œ์šฉ๋˜๋Š” ๊ฐ’์œผ๋กœ model ์—์„œ ์•Œ ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค!"* / *"shape ๋Š” view ์—์„œ ํ™œ์šฉ๋˜๋Š” ๊ฐ’์œผ๋กœ model ์—์„œ ์•Œ ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค!"*
45
+
46
+ โ†’ **enum ์˜ UI value ์•ˆํ‹ฐํŒจํ„ด**. PR #124ยท#28ยท#78ยท#112ยท#125ยท#128ยท#135ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ (๋ฉ”์ด์ € ์•ˆํ‹ฐํŒจํ„ด).
47
+
48
+ ### 4. `BLACK_JACK = 21` ์ƒ์ˆ˜ ๋‹ค์ค‘ ์„ ์–ธ
49
+
50
+ vagabond95: *"๋„ˆ๋ฌด ๋งŽ์€ ๊ณณ์—์„œ BLACK_JACK ์ด๋ผ๋Š” ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํ•˜๋“œ์ฝ”๋”ฉ์„ ๋ง‰๋Š” ๊ฒƒ์™ธ์— ์ „์—ญ์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์— ํฐ ์˜์˜๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์— ์„ ์–ธํ•˜์—ฌ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ ์ผ๊ด€๋˜๊ฒŒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค."*
51
+
52
+ โ†’ **์ƒ์ˆ˜ ๋‹ค์ค‘ ์„ ์–ธ = ์ผ๊ด€์„ฑ invariant ๋ถ€์žฌ**. *ํ•œ ๊ณณ = ๋‹จ์ผ ์ง„์ž…์ *. PR #146ยท#114ยท#125 ์™€ ๊ฐ™์€ ๊ฒฐ.
53
+
54
+ ### 5. `CardDeck object + index ๊ฐ€๋ณ€` + ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ถ€์žฌ
55
+
56
+ vagabond95: *"object ๋กœ ๊ตฌํ˜„๋๋‹ค๋ฉด, index ๋ฅผ reset ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”?"* + *"index ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋„˜์—ˆ์„ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด๋ณด์ž…๋‹ˆ๋‹ค."*
57
+
58
+ โ†’ **Singleton + ๊ฐ€๋ณ€ index = ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ โ†“ + ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€**. PR #108ยท#28ยท#112ยท#125 (Singleton Deck) ์™€ ๊ฐ™์€ ๊ฒฐ. **MCP ๋ฃฐ ํ›„๋ณด โ€” `singleton-deck-testability`** ๋ฉ”์ด์ € ํŒจํ„ด.
59
+
60
+ ### 6. `setFirstTurnCards` ๊ฐ€ public + ํ˜ธ์ถœ ์ˆœ์„œ ๊ฐ•์ œ ๋ถ€์žฌ
61
+
62
+ vagabond95: *"ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ตœ์ดˆ์—๋งŒ ํ˜ธ์ถœ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, public ์œผ๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ N ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ฑฐ๋‚˜ ์ตœ์ดˆ์— ํ˜ธ์ถœ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ฆฌํŽ™ํ† ๋ง์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."*
63
+
64
+ โ†’ **ํ˜ธ์ถœ ์ˆœ์„œ invariant ๋ถ€์žฌ**. *์ƒ์„ฑ์ž ๋˜๋Š” internal*. PR #146ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
65
+
66
+ ### 7. `Referee object` ๊ฐ€๋Šฅ์„ฑ
67
+
68
+ vagabond95: *"object ๋กœ ์„ ์–ธ๋˜์–ด๋„ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ์š”?"*
69
+
70
+ โ†’ **Referee = ์ƒํƒœ ์—†์Œ โ†’ object** = *Kotlin ์–ดํœ˜*. *PR #131ยท#108ยท#146 ์˜ *ResultCalculator object** ์™€ ๊ฐ™์€ ๊ฒฐ.
71
+
72
+ ### 8. `BLACKJACK` ๊ฒฐ๊ณผ ์‹œ *PlayerWinning ๋งŒ PlayerName ๋ณด์œ * โ€” *View ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ˆ„์ˆ˜*
73
+
74
+ vagabond95: *"PlayerWinning ์—๋งŒ PlayerName ์ด ํฌํ•จ๋˜๋Š” ์ด์œ ๋Š” View ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋•Œ๋ฌธ ์•„๋‹๊นŒ์š”?"*
75
+
76
+ โ†’ **View ์˜ ์š”๊ตฌ์‚ฌํ•ญ = ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋ฉค๋ฒ„ ๋ˆ„์ˆ˜**. *PlayerName ์€ Player ์˜ ์ •๋ณด โ†’ PlayerWinning ์ด ๋ณ„๋„ ๋ณด์œ *๋Š” *Player ์™€ ๊ฒฐ๊ณผ์˜ ๊ฒฐํ•ฉ*. PR #49ยท#88ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
77
+
78
+ ### 9. `Participants` ์˜ *player ์Šค์Šค๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ ์™ธ๋ถ€ ์ถ”์ถœ*
79
+
80
+ vagabond95: *"player ๊ฐ€ ์Šค์Šค๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”?"*
81
+
82
+ โ†’ **Player ์ž๊ธฐ ์ฑ…์ž„์„ Participants ๊ฐ€ ํก์ˆ˜**. *Tell-Don't-Ask*.
83
+
84
+ ### 10. `Controller โ†’ model ๋‚ด๋ถ€ ๋””ํ…Œ์ผ ์ง์ ‘ ์ ‘๊ทผ` = Demeter ์œ„๋ฐ˜
85
+
86
+ vagabond95 (BlackJackController.kt:61): *"Controller ๊ฐ€ Model ์˜ ์„ธ๋ถ€์‚ฌํ•ญ๊นŒ์ง€ ๋„ˆ๋ฌด ์ž์„ธํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†์–ด๋ณด์—ฌ์š”. ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ˆจ๊ฒจ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”? hint : `๋””๋ฏธํ„ฐ ๋ฒ•์น™`"*
87
+
88
+ โ†’ **Controller ๊ฐ€ model ๊นŠ์ด ์ ‘๊ทผ = Demeter ์œ„๋ฐ˜**. PR #133ยท#88ยท#137ยท#146ยท#93 ์™€ ๊ฐ™์€ ๊ฒฐ.
89
+
90
+ ### 11. `showCards` ๋„๋ฉ”์ธ์— View ์˜์กด ์–ดํœ˜
91
+
92
+ vagabond95 (Role.kt:22): *"showCards ๋Š” view ์— ์˜์กด์ ์ธ ๋„ค์ด๋ฐ์ด๋ผ๊ณ  ์ƒ๊ฐ๋ผ์š”. ๋ณ€๊ฒฝํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?"*
93
+
94
+ โ†’ **`showXX` / `printXX` ๋„๋ฉ”์ธ ์–ดํœ˜ X**. PR #58ยท#88ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
95
+
96
+ ### 12. `Score.determineWinning(dealerScore: Int)` ํƒ€์ž… ๊ฐ•์ œ ๋ถ€์žฌ
97
+
98
+ vagabond95: *"Score ์—๋Š” dealer ์™€ player ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ์ธ๋ฐ, ๋”œ๋Ÿฌ score ๋งŒ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ ์–ด์ƒ‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜, determineWinning ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋„ค์ด๋ฐ๋งŒ dealerScore ์ผ ๋ฟ ํƒ€์ž…์œผ๋กœ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, dealer score ์—์„œ dealer score ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."*
99
+
100
+ โ†’ **`Int` ์ธ์ž = ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ถ€์žฌ**. *DealerScore value class* ๋˜๋Š” *Participant ์ธ์ž*๋กœ *ํƒ€์ž… ๊ฐ•์ œ*. PR #137ยท#90 ์™€ ๊ฐ™์€ ๊ฒฐ์˜ *์›์‹œ๊ฐ’ ํฌ์žฅ*.
101
+
102
+ ### 13. `BlackJack` ์ปจํŠธ๋กค๋Ÿฌ ๋„ค์ด๋ฐ model ํ˜ผ๋™
103
+
104
+ vagabond95: *"์ปจํŠธ๋กค๋Ÿฌ๋ผ๋ฉด model ๊ณผ ํ˜ผ๋™์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค์ด๋ฐ์— ๋ช…์‹œํ•ด์ฃผ๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?"*
105
+
106
+ โ†’ **BlackJack = model ์ด๋ฆ„ vs Controller**. *BlackJackController* ๋ช…์‹œ. PR #58 ์™€ ๊ฐ™์€ ๊ฒฐ.
107
+
108
+ ### 14. `CardHand.sum()` naming ๋ชจํ˜ธ
109
+
110
+ vagabond95: *"๋ฌด์—‡์„ sum ํ•œ๋‹ค๋Š” ๊ฒƒ์ธ์ง€ ๋‚ด์šฉ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”."*
111
+
112
+ โ†’ **`sum()` = ๋ชจํ˜ธ (์ ์ˆ˜? ์นด๋“œ ์ˆ˜?)**. *`totalScore()` / `cardCount()`* ๋ช…์‹œ. PR #146ยท#136 ์™€ ๊ฐ™์€ ๊ฒฐ.
113
+
114
+ ### 15. `dealer.sum` / `player.result` ๊ฐ™์€ ๊ฒฐ๊ณผ ๋„ค์ด๋ฐ ๋น„์ผ์น˜
115
+
116
+ vagabond95: *"๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, dealer ๋Š” sum / player ๋Š” result ๋กœ ํ‘œํ˜„๋˜๊ณ  ์žˆ๋Š”๋ฐ์š”. ๋„ค์ด๋ฐ์„ ์ผ์น˜์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."*
117
+
118
+ โ†’ **๊ฐ™์€ ์˜๋ฏธ ๋‹ค๋ฅธ ๋„ค์ด๋ฐ = ์ผ๊ด€์„ฑ ๋ถ€์žฌ**. PR #146ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
119
+
120
+ ### 16. `Done.draw / Done.stay` ๊ฐ€ *๋ฌด์˜๋ฏธํ•œ ๋ฉ”์„œ๋“œ* โ€” ํ•™์ƒ ์ž๊ฐ€ ์˜๋ฌธ
121
+
122
+ ํ•™์ƒ ์ž๊ฐ€ ์ธ์šฉ: *"ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ตฌํ˜„์˜ `Done` ์ด๋ผ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ `draw` ์™€ `stay` ๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ ๋ถˆํŽธํ•จ์ด ๋А๊ปด์ง€๋”๋ผ๊ตฌ์š”.. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด `Done` ์˜ ๊ตฌํ˜„์ฒด์ธ `BlackJack`, `Bust`, `Stay` ์—์„œ ์•„๋ฌด ์˜๋ฏธ ์—†๋Š” ๋ฉ”์„œ๋“œ `draw` ๋‚˜ `stay` ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋…ผ๋ฆฌ ์ƒ์œผ๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ผ์ด ์—†๊ฒ ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ `Bust(CardHand()).draw()` ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„์˜ˆ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๊ฒฝ๊ณ ๋ฅผ ๋„์›Œ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”?"*
123
+
124
+ โ†’ **์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ์ผ๊ด€์„ฑ vs ๋„๋ฉ”์ธ invariant ํŠธ๋ ˆ์ด๋“œ์˜คํ”„**. *State interface = draw/stay ๋ชจ๋“  ์ƒํƒœ์— ๊ฐ•์ œ*. *Done ์ƒํƒœ = ์˜๋ฏธ ๋ถ€์žฌ*. PR #152ยท#147 ์™€ ๊ฐ™์€ ๊ฒฐ.
125
+
126
+ ### 17. `enum CardHandState` ์˜ `output: String` ํ•„๋“œ โ€” *View ์˜์กด*
127
+
128
+ (๋ชปํ•œ ์  ยง3 ์˜ ์—ฐ์žฅ).
129
+
130
+ ### 18. CardDeck ์…”ํ”Œ ์ž๋™ โ€” *์™ธ๋ถ€ ์œ„์ž„ ๊ฐ€๋Šฅ*
131
+
132
+ vagabond95: *"์นด๋“œ๋ฅผ ์žฌ์‚ฌ์šฉ ์ฒ˜๋ฆฌ ๐Ÿ‘ ๊ทธ๋Ÿฐ๋ฐ, ์…”ํ”Œ๊นŒ์ง€๋Š” ์•ˆํ•ด๋„ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ์š”? ์นด๋“œ ์„ธํŠธ๋งŒ ์ œ๊ณตํ•˜๊ณ  ๊ทธ ์ดํ›„ ์ฒ˜๋ฆฌ๋Š” ๋‚˜๋จธ์ง€ ํ•จ์ˆ˜์—๊ฒŒ ์œ„์ž„ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„๋ผ๋„ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ๋œ ์›๋ณธ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋„ ์žˆ์„์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ์š” :)"*
133
+
134
+ โ†’ **์…”ํ”Œ = ์™ธ๋ถ€ ์ฑ…์ž„ ์œ„์ž„**. *์ „๋žต ํŒจํ„ด (ShuffleStrategy)* ๋˜๋Š” *Deck ์™ธ๋ถ€์—์„œ shuffle* ๋ถ„๋ฆฌ. PR #108ยท#133ยท#136 ์™€ ๊ฐ™์€ ๊ฒฐ.
135
+
136
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
137
+
138
+ - **`runXX` / `executeXX` / `doXX` ๋งŒ๋Šฅ ๋™์‚ฌ = SRP ์œ„๋ฐ˜ ์‹ ํ˜ธ** โ€” vagabond95 ๋ช…์‹œ.
139
+ - **๊ฒฐ๊ณผ ์ƒํƒœ vs ์ง„ํ–‰ ์ƒํƒœ ๋ถ„๋ฆฌ** โ€” *enum ํ˜ผ์žฌ ํšŒํ”ผ*.
140
+ - **enum UI value = model ๋ˆ„์ˆ˜** โ€” *output/shape ์–ดํœ˜ ๋„๋ฉ”์ธ X*.
141
+ - **์ƒ์ˆ˜ ๋‹ค์ค‘ ์„ ์–ธ = ์ผ๊ด€์„ฑ invariant ๋ถ€์žฌ** โ€” *๋‹จ์ผ ์ง„์ž…์ *.
142
+ - **Singleton + ๊ฐ€๋ณ€ = ํ…Œ์ŠคํŠธ โ†“ + ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€** โ€” *Strategy ์ฃผ์ž… ์ •๊ณต*.
143
+ - **ํ˜ธ์ถœ ์ˆœ์„œ invariant = public ๋…ธ์ถœ ์œ„ํ—˜** โ€” *internal ๋˜๋Š” ์ƒ์„ฑ์ž*.
144
+ - **๊ฐ์ฒด vs object Kotlin ์–ดํœ˜** โ€” *์ƒํƒœ ์—†์Œ โ†’ object*.
145
+ - **View ์–ดํœ˜ (showXX/printXX) ๋„๋ฉ”์ธ X**.
146
+ - **ํƒ€์ž… ๊ฐ•์ œ = `Int` ์ธ์ž ํšŒํ”ผ โ†’ value class** โ€” *PR #90ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ*.
147
+ - **์ถ”์ƒ ํด๋ž˜์Šค = "๊ณ ์žฅ๋‚œ ํด๋ž˜์Šค"** (๋ง๋ฆฌ๋นˆ๋„ ๋™์ผ) โ€” *abstract method ๊ฐ€ ๊ฐ•์ œ*.
148
+ - **๋””์ž์ธ ํŒจํ„ด = ์š”๋ฆฌ๋ฒ• ๋น„์œ  โ€” ์‹œ๊ฐ„ + ๊ฒฝํ—˜ + ์ž๊ฐ€ ํ•™์Šต*** โ€” vagabond95 ์ธ์šฉ.
149
+ - **ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์–‘๋ฐฉํ–ฅ ์ธ์‹ = ๋ชจ๋“  ๊ตฌํ˜„์€ trade-off**.
150
+
151
+ ## ๋Œ€ํ‘œ ์ธ์šฉ
152
+
153
+ **vagabond95 (๋””์ž์ธ ํŒจํ„ด = ์š”๋ฆฌ๋ฒ• ๋น„์œ , CardHandState.kt:1):**
154
+ > ๋””์ž์ธ ํŒจํ„ด์€ ์ผ์ข…์˜ ์š”๋ฆฌ๋ฒ•์„ ์ตํžˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.
155
+ > ์š”๋ฆฌ๋ฒ•์„ ํ•œ๋ฒˆ ๋ณธ๋‹ค๊ณ ํ•ด์„œ, ์š”๋ฆฌ๋ฅผ ์ž˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์†Œํ•œ ์ด ์š”๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜์–ด์•ผํ• ์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋Š” ์–ป์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ . ๋˜ํ•œ, ์š”๋ฆฌ๋ฒ•์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋ชจ๋‘ ํ•œ๋ฒˆ์— ์ดํ•ด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
156
+ >
157
+ > ์—ฌ๋Ÿฌ ์š”๋ฆฌ์— ์š”๋ฆฌ๋ฒ•์„ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ์žฅ/๋‹จ์ ์„ ์ตํžˆ๊ณ  ์‚ฌ๋ก€๋ฅผ ์Œ“์•„๋‚˜๊ฐ€๋ฉด์„œ, ์š”๋ฆฌ๋ฒ•์— ์ ํžŒ ๋‚ด์šฉ์„ ์ง„์ •ํžˆ ์ดํ•ดํ•˜๊ณ  ๋˜ ์ ์ ˆํžˆ ์ทจ์‚ฌ์„ ํƒํ•˜๋Š” ์‹œ๊ธฐ๊ฐ€ ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
158
+ >
159
+ > ๋””์ž์ธํŒจํ„ด๋„ ์ด์™€ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋„ˆ๋ฌด ์™„๋ฒฝํ•˜๊ฒŒ ์ตํžˆ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‹ˆ์™€ ๊ทธ๋ ‡๊ฒŒ ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํฐ ์ŠคํŠธ๋ ˆ์Šค ์•ˆ๋ฐ›์œผ์…”๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ˜„ ์‹œ์ ์—๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
160
+
161
+ **vagabond95 (๋„ค์ด๋ฐ 3 ๊ธฐ์ค€, Role.kt):**
162
+ > 1. ๋ชจํ˜ธํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์ด๋ฆ„์„ ์ง€์–‘ํ•˜์ž.
163
+ > ์งˆ๋ฌธ ์ฃผ์…จ๋˜ `runPhase` ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ฉด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠน์„ฑ์ƒ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋Š” run ์ด๋ผ๋Š” ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ”๊ฟ”๋งํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋„ ์–ด์ƒ‰ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
164
+ > ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 5๋Œ€ ์›๋ฆฌ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” SOLID ์—์„œ SRP ๊ฐ€ ์ œ๋Œ€๋กœ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ . ใ…Žใ…Ž
165
+ > (๋น„์Šทํ•œ ์‚ฌ๋ก€๋กœ executeXXX, doXXX ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)
166
+ >
167
+ > 2. ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ , ๋„ค์ด๋ฐ์„ ์ง“๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ๋ก€๋ฅผ ์ตํžˆ์ž.
168
+ > ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์ ‘ํ•˜๋‹ค๋ณด๋ฉด, ์œ ์‚ฌํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ด๋ฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
169
+ > ๊ฐ€๋ น, ์ด๋ฆ„์˜ ๊ธธ์ด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž์ฃผ ํ™œ์šฉ ๋˜๋Š” verifty ๋ผ๋Š” ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `verifyNameLength()` ๋ผ๊ณ  ์ง€์–ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.
170
+ >
171
+ > 3. ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„
172
+ > ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ ^^; ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋„ ๋ฌด์ฒ™ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
173
+
174
+ **vagabond95 (์ถ”์ƒ ํด๋ž˜์Šค API ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, Role.kt):**
175
+ > ์ด ๋ถ€๋ถ„์€ 2๊ฐ€์ง€ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
176
+ > 1. ์ถ”์ƒํด๋ž˜์Šค์˜ ํ•˜์œ„ ํƒ€์ž…์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์˜ํ•ด ์ƒ์œ„ ํƒ€์ž…์˜ API ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. -> ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์ž˜๋ชป ์ •์˜ํ–ˆ๋‹ค๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
177
+ > 2. ๊ตฌํ˜„์˜ ๋ฒ”์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ API ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. -> ํ•˜์œ„ ํƒ€์ž…์˜ ๊ตฌํ˜„์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฒ”์šฉ์„ฑ์„ ์œ„ํ•œ ์„ ํƒ์ด๋ฏ€๋กœ ์ ์ ˆํ•œ ์„ ํƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
178
+
179
+ **vagabond95 (API ์‚ฌ์šฉ์ž ์ฑ…์ž„, Done.kt:10):**
180
+ > ์ €๋Š” ์ด๋ ‡๊ฒŒ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์ฃผ๋Š”๊ฒŒ ๊ต‰์žฅํžˆ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๋ฉด, ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฝ๊ณ ๋ฅผ ์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ถˆํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
181
+ >
182
+ > API ๋ฅผ ์ž˜ ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด, ์ž˜๋ชป์‚ฌ์šฉํ–ˆ์„ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋Š” API ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ์…”๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
183
+
184
+ **vagabond95 (BLACKJACK/BURST ๊ฒฐ๊ณผ vs HIT/STAY ์ง„ํ–‰ ๋ถ„๋ฆฌ, CardHandState.kt):**
185
+ > BLACKJACK, BURST ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๊ณ 
186
+ > STAY, HIT ์€ ์ง„ํ–‰๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์ด๊ฒƒ๋“ค์ด ๊ฐ™์€ enum ์œผ๋กœ ๋ฌถ์ด๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.
187
+
188
+ **ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต (State ํŒจํ„ด ์š•์‹ฌ, CardHandState.kt:1):**
189
+ > ์ œ๋ฆฌ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ง์”€ํ•ด์ฃผ์…จ์ง€๋งŒ, ์ œ๊ฐ€ ์šฐํ…Œ์ฝ” ์ˆ˜์—…์—์„œ ์ƒํƒœ ํŒจํ„ด์„ ๋ฐฐ์šฐ๊ธฐ ์ „์— ์ง์ ‘ ๊ณต๋ถ€ํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ  ์‹ถ์€ ์š•์‹ฌ์„ ๋А๊ปด์„œ ์—ด์‹ฌํžˆ ์ ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค..
190
+
191
+ **ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต (์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜ ์ธ์šฉ + ์ž๊ธฐ ๋ธ”๋กœ๊ทธ, CardHandState.kt:1):**
192
+ > ์‚ฌ์‹ค 2์ฃผ ์ „์— ์ฝ”์น˜๋‹˜์ด ๋ธ”๋ž™์žญ ๋ฏธ์…˜์„ ํ•˜๋ฉด, ์ƒํƒœ ํŒจํ„ด์ด๋ผ๋Š” ๋””์ž์ธ ํŒจํ„ด์„ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏธ๋ฆฌ ์ด์•ผ๊ธฐ๋„ ํ•ด์ฃผ์…จ๊ณ ,
193
+ > ๋˜ ๊ณผ๊ฑฐ์— sealed class ๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๊ณผ ์ดํŽ™ํ‹ฐ๋ธŒ ์ฝ”ํ‹€๋ฆฐ์„ ๋ณด๋ฉด์„œ ์ƒํƒœ ํŒจํ„ด์„ ๊ณต๋ถ€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.(https://sh1mj1-log.tistory.com/199)
194
+ >
195
+ > ์ €๋Š” ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋””์ž์ธ ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๊ณ , ์„ค๊ณ„ํ•˜๋ฉด์„œ ๋ฐœ๊ฒฌํ•ด๋‚ด๊ณ  ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. (https://sh1mj1-log.tistory.com/228)
196
+
197
+ **ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต (ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์˜๋ฌธ, PlayerWinning.kt:1):**
198
+ > ํ•˜์ง€๋งŒ Dealer ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ๋Š” ์˜ค์ง, Player ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ์—ฌ๋ถ€๋งŒ์„ ๊ฐ€์ง€๊ณ  ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ScoreBoard ์—์„œ ๋”œ๋Ÿฌ์˜ ์Šน/ํŒจ/๋ฌด์Šน๋ถ€ ๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋„๊ตฌ์ธ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ, **์–ด๋– ํ•œ ์ฑ…์ž„์„ ์œ„ํ•œ ์ •๋ณด๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๊ฐ€ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ์š”?**
199
+
200
+ ## ์–ป์€ ๊ตํ›ˆ
201
+
202
+ 1. ***`runXX` / `executeXX` / `doXX` ๋งŒ๋Šฅ ๋™์‚ฌ = SRP ์œ„๋ฐ˜ ์‹ ํ˜ธ***. *ํ•จ์ˆ˜ ์ด๋ฆ„์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋„ ์–ด์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ๋ถ€์žฌ*. **MCP ๋ฃฐ ํ›„๋ณด โ€” `vagueVerb` (vagueName ๋ณ€ํ˜•)**. PR #125ยท#114ยท#10ยท#88ยท#58 ์™€ ๊ฐ™์€ ๊ฒฐ.
203
+
204
+ 2. ***๊ฒฐ๊ณผ ์ƒํƒœ (BLACKJACK/BUST) vs ์ง„ํ–‰ ์ƒํƒœ (HIT/STAY) ๋ถ„๋ฆฌ***. *๊ฐ™์€ enum ํ†ตํ•ฉ X*. *sealed Running / Done ํ˜•์ œ ๋ถ„๋ฆฌ*. PR #136ยท#147ยท#152ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
205
+
206
+ 3. ***๋””์ž์ธ ํŒจํ„ด = ์š”๋ฆฌ๋ฒ• ๋น„์œ  (vagabond95)*** โ€” *ํ•œ ๋ฒˆ ๋ณธ๋‹ค๊ณ  ์ž˜ํ•˜์ง€ X, ์—ฌ๋Ÿฌ ์‚ฌ๋ก€ ์ ์šฉ + ์žฅ๋‹จ์  ์ตํžˆ๊ธฐ*. *ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต ๊ฐ€์น˜ ์ธ์ •*.
207
+
208
+ 4. ***`Done.draw / Done.stay = throw` API ์‚ฌ์šฉ์ž ์ฑ…์ž„ vs ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒฝ๊ณ  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„***. *API ์ž˜ ์„ค๊ณ„ ์‹œ ์ž˜๋ชป ์‚ฌ์šฉ = ์‚ฌ์šฉ์ž ๊ฐ์ˆ˜*. *Android/Kotlin stdlib ๋„ ๋™์ผ ํŒจํ„ด*. PR #152ยท#147ยท#85 ์™€ ๊ฐ™์€ ๊ฒฐ.
209
+
210
+ 5. ***`enum UI value` ๋ฉ”์ด์ € ์•ˆํ‹ฐํŒจํ„ด***. *output/shape/koreanText ๋ฉค๋ฒ„ = model ๋ˆ„์ˆ˜*. PR #124ยท#28ยท#78ยท#112ยท#125ยท#128ยท#135ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
211
+
212
+ 6. ***`BLACK_JACK = 21` ์ƒ์ˆ˜ ๋‹ค์ค‘ ์„ ์–ธ = ์ผ๊ด€์„ฑ invariant ๋ถ€์žฌ***. *๋‹จ์ผ ์ง„์ž…์  + ์ƒ์ˆ˜ ํ•œ ๊ณณ*. PR #146ยท#114ยท#125 ์™€ ๊ฐ™์€ ๊ฒฐ.
213
+
214
+ 7. ***Singleton CardDeck + ๊ฐ€๋ณ€ index = ํ…Œ์ŠคํŠธ โ†“ + ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€***. *Strategy ํŒจํ„ด + ์ƒ์„ฑ์ž ์ฃผ์ž… ์ •๊ณต*. **MCP ๋ฃฐ ํ›„๋ณด โ€” `singleton-deck-testability`** ๋ฉ”์ด์ €. PR #108ยท#28ยท#112ยท#125 ์™€ ๊ฐ™์€ ๊ฒฐ.
215
+
216
+ 8. ***`Int` ์ธ์ž = ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ถ€์žฌ***. *DealerScore value class* / *Participant ์ธ์ž* ๊ฐ€ *ํƒ€์ž… ๊ฐ•์ œ*. PR #137ยท#90ยท#108ยท#133ยท#132ยท#136ยท#49 ์™€ ๊ฐ™์€ ๊ฒฐ.
217
+
218
+ 9. ***`showXX` / `printXX` ๋„๋ฉ”์ธ ์–ดํœ˜ X***. PR #58ยท#88ยท#137 ์™€ ๊ฐ™์€ ๊ฒฐ.
219
+
220
+ 10. ***ํ•™์ƒ ์ž๊ฐ€ ํ•™์Šต = "์ถ”์ƒ ํด๋ž˜์Šค ์‚ฌ์šฉ ์œ„ํ•ด ์ฑ…์ž„์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๊ฐ€ ์ •๋ณด๋ฅผ ๋” ๊ฐ€์ง?"*** = *ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ž๊ฐ€ ์ธ์‹ ๋ชจ๋ฒ”*. *vagabond95 ๋‹ต๋ณ€ = "๋ชจ๋“  ๊ตฌํ˜„์€ trade-off"* ์–‘๋ฐฉํ–ฅ ํ•™์Šต. PR #137ยท#148ยท#151ยท#146 ์™€ ๊ฐ™์€ ๊ฒฐ.
221
+
222
+ 11. ***vagabond95 = racingcar ์ธ์šฉ reviewer ์ง์ ‘ ๋“ฑ์žฅ***. *CLAUDE.md ์˜ vagueName ๋ฃฐ ์ธ์šฉ ์ถœ์ฒ˜๊ฐ€ ๋ณธ blackjack ๋ฏธ์…˜์—๋„ ๋“ฑ์žฅ* โ€” **reviewer ๋ˆ„์  ์ธ์šฉ ๋ณด๊ฐ•**.
223
+
224
+ 12. ***ํ•™์ƒ ์ž๊ฐ€ ๋‹ต๋ณ€์— ์ž๊ธฐ ๋ธ”๋กœ๊ทธ ๊ธ€ + ์™ธ๋ถ€ ์ž๋ฃŒ ์ธ์šฉ (์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜, ์ดํŽ™ํ‹ฐ๋ธŒ ์ฝ”ํ‹€๋ฆฐ) + ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜ ์ธ์šฉ = ํ•™์Šต ๊ฐ€์‹œํ™” ์ตœ๊ณ  ์ˆ˜์ค€***. *์™ธ๋ถ€ ์ž๋ฃŒ + ์ž๊ฐ€ ์ •๋ฆฌ + ๋ณธ์ธ ์ฝ”๋“œ ์ ์šฉ* ํ๋ฆ„. PR #128ยท#135ยท#108ยท#133ยท#136ยท#137ยท#146ยท#41ยท#148ยท#151 ์™€ ๊ฐ™์€ ๊ฒฐ.