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,460 @@
1
+ # PR #90 — [블랙잭 2단계] 케이엠 미션
2
+
3
+ - **Reviewee:** [@kmkim2689](https://github.com/kmkim2689)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/90
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @Gyuil-Hwnag (두루)
7
+ - **라인 코멘트:** 22 스레드 / 30 코멘트 — *학생 자가 답변 매우 풍부* (특히 *value class vs data class vs class* 1000자 답변)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Money @JvmInline value class` + 4가지 연산자 오버로딩 (`plus`/`minus`/`times`/`unaryMinus`)** — *Kotlin value class 의 완전 활용*. *원시 박싱 없음 + 타입 안전 + 모든 산술*. PR #131·#132·#136 의 *value class* 와 *기능 풍부도 최고 수준*.
12
+
13
+ ```kotlin
14
+ @JvmInline
15
+ value class Money(val amount: Int = 0) {
16
+ operator fun plus(other: Money): Money = Money(this.amount + other.amount)
17
+ operator fun minus(other: Money): Money = Money(this.amount - other.amount)
18
+ operator fun times(times: Double): Money = Money((this.amount * times).toInt())
19
+ operator fun unaryMinus(): Money = Money(-amount)
20
+
21
+ companion object {
22
+ fun from(bettingAmount: Int): Money {
23
+ require(bettingAmount >= MINIMUM_MONEY_AMOUNT) { ... }
24
+ return Money(bettingAmount)
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ *베팅 금액 (factory `from` + invariant 검증) + 수익 금액 (default 0 + 자유 산술)* 두 용도 자가 분리. *학생의 1000+자 자가 답변 = value class vs data class vs class 자가 학습 모범*.
31
+ - **`EarningRate` enum + `BLACKJACK(1.5) / WIN(1.0) / LOSE(-1.0) / BURST(-1.0) / DRAW(0.0)`** — *수익률 룰 enum 응집*. *BLACKJACK / BURST 별도 멤버* — *현재 LOSE = BURST = -1.0 같지만 의미 분리*. PR #132 (환노 2단계) 의 *GameResult enum + earningRate* 와 같은 결.
32
+ - **`Players.of(...)` 정적 팩토리 + `zip` 함수 활용** — 두루 자가 칭찬: *"`zip`함수의 활용 좋습니다~👍"*. *Kotlin stdlib 함수 활용 모범*. *팩토리 메서드 + 람다 인자*로 *Players 생성 시점에 의존성 주입*:
33
+
34
+ ```kotlin
35
+ fun of(
36
+ playerNames: List<String>,
37
+ playerMoneyAmount: List<Int>,
38
+ onInputDecision: (String) -> String,
39
+ generateCard: () -> Card?,
40
+ ): Players {
41
+ return playerNames.zip(playerMoneyAmount) { name, amount ->
42
+ Player.of(
43
+ gameInfo = GameInfo(name, Money.from(amount)),
44
+ onInputDecision = { onInputDecision(name) },
45
+ generateCard = generateCard,
46
+ )
47
+ }.run { Players(this) }
48
+ }
49
+ ```
50
+
51
+ - **`Card.toString` override = View 책임 분리 자가 학습** — 두루 권고 *"Cards의 toString()을 오버라이딩을 한다면 Output에 좀 더 유연하게 대응을 할 수 있을것 같다"* 후속 반영. 학생 자가 인용: *"toString() 메소드를 오버라이드 해본 경험이 없어서 적용할 생각을 하지 못하였던 것 같습니다! 말씀하신 대로 수정을 진행해보니 뷰 측에서 형식을 일일이 지정해주지 않고 toString() 메소드 호출만으로 원하는 형식으로 정보를 출력할 수 있게 되었습니다!"*
52
+ - **테스트 픽스처 + Fixtures.kt 활용** — 두루 권고 + 학생 자가 반영. *공통 테스트 데이터 추출*. *fixture = 테스트 가독성 + 재사용*.
53
+ - **`@CsvSource` 활용** — 두루 자가 칭찬: *"CsvSource기능의 활용 정말 좋습니다~👍"*. *Parameterized 테스트 + 데이터 주도 테스트* 어휘.
54
+ - **빈 입력 재시도 자가 구현** — 두루 자가 칭찬: *"빈칸 입력시 재 입력을 받도록 해주셨군요~👍"*. *입력 retry 패턴*.
55
+ - **`Money.from(bettingAmount)` 정적 팩토리 + invariant 검증** — *베팅 금액 ≥ 1* 검증. *Player.of / Players.of* 와 함께 *팩토리 패턴 일관성*.
56
+ - **`Money(0)` default = 수익 시작값** — 두루 권고 후속 *"0으로 하드코딩 하는 방법도 있지만, Money 객체에 Default Value를 넣어주는 방식"* 반영. *베팅 금액 (1 이상)* vs *수익 금액 (0 default + 음수 허용)* 두 의미 *생성 방식 분리* (factory vs primary constructor + default).
57
+ - **함수 단일 책임 분리 자가 반영** — 두루 권고 후속. *Judge 의 winning 판정 함수* `isPlayerBurst` / `isPlayerBlackjack` / `isPlayerWin` / `isPlayerLose` 각각 분리.
58
+ - **`Player.of(...)` 정적 팩토리 + 초기 카드 분배 응집** — *생성 시점에 2장 분배*:
59
+
60
+ ```kotlin
61
+ fun of(gameInfo, onInputDecision, generateCard): Player {
62
+ repeat(INITIAL_DRAW_COUNT) {
63
+ gameInfo.addCard(generateCard() ?: throw ...)
64
+ }
65
+ return Player(gameInfo, onInputDecision)
66
+ }
67
+ ```
68
+
69
+ *초기 카드 분배 + Player 생성 응집*. PR #132 (환노) 의 *Player(name, Hand)* 어색함 회피 + *팩토리 함수 표준 어휘*.
70
+
71
+ ## 못한 점 (설계 관점)
72
+
73
+ ### 1. `Judge.isPlayerWin` / `isPlayerLose` — *복잡한 분기 + 룰 부정확 신호*
74
+
75
+ ```kotlin
76
+ private fun isPlayerWin(
77
+ playerDifference: Int,
78
+ dealerDifference: Int,
79
+ ): Boolean =
80
+ dealerDifference != BLACKJACK_DIFFERENCE && playerDifference == BLACKJACK_DIFFERENCE ||
81
+ dealerDifference < BLACKJACK_DIFFERENCE && playerDifference >= BLACKJACK_DIFFERENCE ||
82
+ playerDifference < dealerDifference
83
+
84
+ private fun isPlayerLose(
85
+ playerDifference: Int,
86
+ dealerDifference: Int,
87
+ ): Boolean =
88
+ playerDifference < BLACKJACK_DIFFERENCE && dealerDifference >= BLACKJACK_DIFFERENCE ||
89
+ dealerDifference < playerDifference
90
+ ```
91
+
92
+ 두루 (Judge.kt — 미해결, 두 번 코멘트): *"해당 내용의 조건들은 새로운 요구사항이 생길때마다 로직이 복잡하게 꼬일 수도 있을것 같은데, 결과를 좀더 복잡하지 않도록 해보는 방법을 고민해봐도 좋을 것 같다는 생각이 듭니다!🤔"*
93
+
94
+ → **승패 판정 로직이 *21 - sumOfCards = difference* 변환 후 *부호 + 크기 비교* 다중 분기**. *`difference < 0`* = Bust, *`difference == 0`* = 21 도달, *`difference > 0`* = 21 미만. *직관적이지 않음* — *호출자가 difference 의 *의미* 추측 필요*.
95
+
96
+ 직접 점수 비교 표현:
97
+ - *`isBust(score)` = score > 21*
98
+ - *`isPlayerBlackjack(player)` = score == 21 && cards.size == 2*
99
+ - *`compareScores(player, dealer)`* = *Bust → Lose, Dealer Bust → Win, 점수 비교*
100
+
101
+ *PR #132·#136·#108·#133·#152 의 *상태별 메시지 + Tell-Don't-Ask** 와 비교: PR #90 은 *Judge 정적 분기 + difference 변환* — *Tell-Don't-Ask 미달*. *Judge = 정적 헬퍼* — *Participant.compare(other) 메시지가 정공*.
102
+
103
+ ### 2. `Judge.getEarningRate` — *4 단계 if-when 분기 + Judge가 도메인 룰 전부 알고 있음*
104
+
105
+ ```kotlin
106
+ class Judge(val dealer: GameInfo, val players: List<GameInfo>) {
107
+ fun getDealerIncome(): Money { ... }
108
+ fun getPlayersIncome(): List<Money> { ... }
109
+ private fun getSinglePlayerIncome(playerGameInfo: GameInfo): Money { ... }
110
+ private fun getEarningRate(dealerDifference: Int, playerDifference: Int, playerGameInfo: GameInfo): EarningRate {
111
+ return when {
112
+ isPlayerBurst(playerDifference, dealerDifference) -> EarningRate.BURST
113
+ isPlayerBlackjack(playerGameInfo, dealerDifference) -> EarningRate.BLACKJACK
114
+ isPlayerWin(playerDifference, dealerDifference) -> EarningRate.WIN
115
+ isPlayerLose(playerDifference, dealerDifference) -> EarningRate.LOSE
116
+ else -> EarningRate.DRAW
117
+ }
118
+ }
119
+ ...
120
+ }
121
+ ```
122
+
123
+ → **Judge = 정적 헬퍼 + 모든 블랙잭 룰 판정 책임**. *Tell-Don't-Ask 위반*:
124
+ - *Judge 가 player.gameInfo.cards.take(2).sumOf* 같은 *플레이어 카드 직접 접근*
125
+ - *Judge 가 difference 계산 + 모든 분기 판정*
126
+ - *Player/Dealer/GameInfo 는 자기 결과 알리는 메시지 부재*
127
+
128
+ *PR #132 (환노) 의 *Participants.compareScores(other)** / *PR #136 (밀러) 의 *BlackJackRule.compare(other)** 와 *반대 트레이드오프*. PR #90 은 *Judge god-object* 변형.
129
+
130
+ 다만 *Judge 자체*가 *블랙잭 룰의 응집 객체*면 *Judge.judge(player, dealer): EarningRate* 메시지가 *내부 분기 응집*. *Participant.compare(other)* 다형성보다 *Judge = 룰 전담*이 *책임 분리 다른 표현*. 트레이드오프.
131
+
132
+ ### 3. `isPlayerBlackjack(playerGameInfo, dealerDifference)` — *블랙잭 + 딜러 비블랙잭 결합*
133
+
134
+ ```kotlin
135
+ private fun isPlayerBlackjack(playerGameInfo: GameInfo, dealerDifference: Int): Boolean =
136
+ playerGameInfo.cards.take(INITIAL_CARD_SIZE).sumOf { it.value } == CRITERIA_NUMBER &&
137
+ dealerDifference != BLACKJACK_DIFFERENCE
138
+ ```
139
+
140
+ → **`isPlayerBlackjack` 조건 = *플레이어 첫 2장 21 + 딜러 비블랙잭***. *플레이어 블랙잭 자체* 가 아니라 *블랙잭 + 딜러 비블랙잭 시 EarningRate.BLACKJACK 적용*. *이름 = 의미 모순* — *isBlackjack* 아니라 *`shouldApplyBlackjackBonus`*.
141
+
142
+ 또한 *`playerGameInfo.cards.take(INITIAL_CARD_SIZE).sumOf { it.value }`* — *첫 2장 점수*. 현재 *Set<Card>* 라 *first 2가 *입력 순서대로 보장 안 됨* (Set 의 iteration order = LinkedHashSet 이면 보장). *2단계 게임에서 카드 추가 순서 = 초기 2장 → Hit 추가* 라면 *take(2) = 초기 2장*. 다만 *Set의 의미상 순서 보장 X* — *함정*. PR #136 (밀러) 의 *Hand.size 검증 부재* 와 같은 결.
143
+
144
+ ### 4. `Player.checkBurst` — *MAXIMUM_CARD_TOTAL = 21 == Bust 기준 vs 도달 기준 혼동*
145
+
146
+ ```kotlin
147
+ private fun checkBurst(): PickingState {
148
+ if (gameInfo.sumOfCards >= MAXIMUM_CARD_TOTAL) {
149
+ return PickingState.STAND
150
+ }
151
+ return PickingState.HIT
152
+ }
153
+
154
+ companion object {
155
+ private const val MAXIMUM_CARD_TOTAL = 21
156
+ ...
157
+ }
158
+ ```
159
+
160
+ → **`>= 21` 이면 STAND** — *21 == 도달 + 21 초과 = Bust* 둘 다 STAND 로 동작. *MAXIMUM_CARD_TOTAL = 21* 이름이 *Bust 기준 (> 21)* 인지 *도달 기준 (== 21)* 인지 모호. *이름 = `BLACKJACK_SCORE` / `MAX_VIABLE_SCORE`*가 *의미 명료*.
161
+
162
+ 또한 *checkBurst 가 STAND 반환* = *Burst 도 STAND 로 같은 상태로 흡수*. *블랙잭 도메인에서 Bust 와 Stand 는 다른 상태*. *PickingState* enum 에 *BURST 별도 멤버* 필요 (못한 점 §5).
163
+
164
+ ### 5. `PickingState` enum 의 *HIT / STAND* 2 멤버 — *BURST 상태 부재*
165
+
166
+ ```kotlin
167
+ // PickingState.kt (추정, 코드 미공개)
168
+ enum class PickingState { HIT, STAND }
169
+ ```
170
+
171
+ → **`PickingState` 가 *입력 의도* (HIT/STAND) + *Player 자기 상태* (Bust 도달) 의 두 의미 혼재**. *`Player.checkBurst()` 가 STAND 반환* = *Bust 도 STAND 으로 흡수*. *Bust 와 Stand 의 의미 차이 (Bust = 무조건 패배, Stand = 점수 비교)* 가 *enum 에서 표현 안 됨*. *추가 BURST 멤버* 또는 *별도 State enum*.
172
+
173
+ PR #132·#136·#152 의 *상태 객체 분리 (Bust / Stay / Blackjack)* 와 *반대 트레이드오프*. PR #90 은 *액션 + 상태 enum 통합 시도 + 룰 표현 부족*.
174
+
175
+ ### 6. `GameInfo.cards: Set<Card>` — *순서 보장 부재 + 중복 차단*
176
+
177
+ ```kotlin
178
+ class GameInfo(
179
+ val name: String,
180
+ val moneyAmount: Money = Money(),
181
+ cards: Set<Card> = emptySet(),
182
+ ) {
183
+ private val _cards: MutableSet<Card> = cards.toMutableSet()
184
+ ...
185
+ }
186
+ ```
187
+
188
+ → **`Set<Card>` 사용 의의 = *카드 중복 방지***. *블랙잭 도메인 = 한 덱에서 같은 카드 2장 안 나옴* — *Set 정합*. 다만:
189
+
190
+ 1. **`Set.iteration order` = LinkedHashSet 보장만 (default), HashSet 은 보장 X** — `toMutableSet()` 가 *LinkedHashSet* 반환 (Kotlin 표준). 정합.
191
+ 2. **`cards.take(2)` = 초기 2장** — Set 도 iteration order 보장 (LinkedHashSet)이면 *추가 순서대로*. PR 의 *isBlackjack* 분기 의존.
192
+ 3. **`Set` 이 *Card 중복 안 됨* 보장** — *카드 동등성 = data class equals (rank + suit)*. *같은 카드 두 번 들어가면 Set 차단* — 도메인 invariant.
193
+
194
+ 다만 *손패 = 카드 순서가 의미 있을 수 있음* (블랙잭 룰 자체는 무관). *List vs Set* 트레이드오프 — *Set 선택 합리*. 다만 *take(2)* 같은 *순서 의존 코드*가 *함정*.
195
+
196
+ ### 7. `Player(gameInfo, onInputDecision: () -> String)` — *람다 인자가 Player 멤버*
197
+
198
+ ```kotlin
199
+ class Player(
200
+ val gameInfo: GameInfo,
201
+ val onInputDecision: () -> String,
202
+ ) : Participant() { ... }
203
+ ```
204
+
205
+ → **Player 가 *입력 콜백을 멤버로 보유***. *Tell-Don't-Ask*: *Player 가 자기 의사 결정 = 콜백 호출*. *Player 가 자기 손패를 보고 더 뽑을지 결정* 의도 표현. PR #132 (환노 2단계) 의 *고차함수 시도* 와 같은 결.
206
+
207
+ 다만 *콜백 = View 의존*. *Player 가 View 콜백 보유 = 도메인 → View 결합*. *Player 가 자기 상태 + 외부 입력 분리* 는 *EventProvider interface* (PR #133) 처럼 *interface 의존성 주입*. *람다 인자 vs 인터페이스* 트레이드오프.
208
+
209
+ 또한 *`onInputDecision: () -> String`* 이 *String 반환* — *PR #132 의 *raw String vs ActionType 토론** 과 같은 결. *View가 사용자 의도 표현* (ActionType) 이면 *`onInputDecision: () -> PickingState`* 가 *도메인 어휘*. *현재 String 반환*은 *Player 가 String → PickingState 변환* 책임 보유.
210
+
211
+ ### 8. `Players` 의 *MIN = 2 / MAX = 8* — *최소 2명 강제 의문*
212
+
213
+ ```kotlin
214
+ companion object {
215
+ private const val MINIMUM_NUMBER_OF_PLAYERS = 2
216
+ private const val MAXIMUM_NUMBER_OF_PLAYERS = 8
217
+ private val PLAYER_NUM_RANGE = MINIMUM_NUMBER_OF_PLAYERS..MAXIMUM_NUMBER_OF_PLAYERS
218
+ ...
219
+ }
220
+ ```
221
+
222
+ → **`MIN = 2` = 최소 2명 강제** — *블랙잭 = 1 인 게임 가능 (혼자 vs 딜러)*. *카지노 도메인 = 1 인 이상*. *학생 결정 근거 부재*. PR #131·#132·#133 의 *MIN = 1* 와 다른 트레이드오프.
223
+
224
+ 또한 *MAX = 8* — *카지노 표준 = 6~7명*. *프로그래밍 요구사항* 의 *최대 인원* 가정. *도메인 룰 vs 학생 가정* 모호.
225
+
226
+ ### 9. `Player.drawCardsUntilStand` — *재귀 vs 반복* 미명시
227
+
228
+ ```kotlin
229
+ override fun drawCardsUntilStand(
230
+ generateCard: () -> Card?,
231
+ printCards: (GameInfo) -> Unit,
232
+ ) {
233
+ val pickingState = drawSingleCard(generateCard)
234
+ printCards(gameInfo)
235
+ determineContinuation(pickingState, generateCard, printCards)
236
+ }
237
+ ```
238
+
239
+ → **`determineContinuation` 가 재귀 호출 추정**. *PR #133 (시아) 의 tailrec* 같은 *명시적 재귀*인지 *while loop* 인지 *코드 미공개*. *재귀 시 stack overflow 가능성* 또는 *tailrec 보장*.
240
+
241
+ ### 10. `Judge` 내부 `BLACKJACK_DIFFERENCE = 0` — *추상화 우회 신호*
242
+
243
+ ```kotlin
244
+ companion object {
245
+ private const val BLACKJACK_DIFFERENCE = 0
246
+ private const val INITIAL_CARD_SIZE = 2
247
+ private const val CRITERIA_NUMBER = 21
248
+ }
249
+ ```
250
+
251
+ → **`difference = 21 - score`** 변환 + *`difference == 0` = 21 도달, difference < 0 = Bust, difference > 0 = 21 미만*. *직관적 점수 비교 (>=, ==, > 21)* 대신 *difference 변환*. *추가 변환 단계* = *코드 가독성 ↓*. *score 직접 비교*가 자연.
252
+
253
+ 학생의 *difference* 변환 의도 = *동일 비교 표현 (`difference == 0` 둘 다)* 일 가능성. 다만 *Bust 분기*가 *difference < 0* — *0 미만 == Bust* 가 *직관 위반*.
254
+
255
+ ### 11. `Players` 부 생성자 vs 팩토리 메서드 혼재 — 학생 자가 답변
256
+
257
+ ```kotlin
258
+ class Players(val value: List<Player>) {
259
+ init { ... }
260
+ companion object {
261
+ fun of(...): Players { ... }
262
+ }
263
+ }
264
+ ```
265
+
266
+ 두루 (Players.kt:29 — 미해결): *"추가적으로 Players 함수로 팩토리 함수로 인스턴스를 생성하도록 설정해두셨는데, 일부 테스트코드에서 부 생성자로 인스턴스를 생성하도록 하는 코드들이 있어서 그렇게 작성하신 이유가 있을까요??🤔"*
267
+
268
+ 학생 답변: *"객체에 대한 동작의 테스트를 진행하고자 할 때, 복잡한 로직들을 집어넣어야 하는 정적 팩토리 메소드보다는 이미 데이터가 만들어진 상태에서 테스트를 진행하는 것이 더욱 손쉬운 테스트 진행에 도움이 될 것이라고 생각하였습니다!"*
269
+
270
+ → **테스트 vs 프로덕션 호출 방식 분리**. *프로덕션 = factory* / *테스트 = primary constructor 직접*. *Player.of 같은 복잡한 분배 로직 우회 + 사전 상태 주입*. *테스트 가독성 + Player 동작 격리* 의도. *접근성 트레이드오프*.
271
+
272
+ ### 12. `Money.from` factory vs primary constructor `Money(0)` — 학생 자가 답변 풍부
273
+
274
+ 학생 1000+자 자가 답변 (요약): *"베팅 금액 (검증 필요) = factory `from`, 수익 금액 (음수 허용 + 검증 불필요) = primary constructor + default"*. 두루 권고 *"Default Value"* 반영. *value class 한계 = abstract class 상속 불가* 자가 인식 + *Bet/Profit 분리 시도 후 통합 결정*. **학생 자가 학습 + 결정 근거 명시 모범**.
275
+
276
+ 다만 **`Money(0)` primary constructor 노출** = *호출자가 검증 우회 가능* (`Money(-1000)` 같은 호출). *value class 의 invariant 강제 부재*. *factory only 정공* — `Money.from(bettingAmount: Int)` + `Money.zero()` 두 factory.
277
+
278
+ ### 13. `EarningRate.BURST(-1.0)` vs `LOSE(-1.0)` — *같은 값 두 멤버*
279
+
280
+ ```kotlin
281
+ enum class EarningRate(val rate: Double) {
282
+ BLACKJACK(1.5),
283
+ WIN(1.0),
284
+ LOSE(-1.0),
285
+ BURST(-1.0),
286
+ DRAW(0.0),
287
+ }
288
+ ```
289
+
290
+ → **`LOSE` 와 `BURST` 가 *같은 rate (-1.0)***. *의미 분리 (Bust = 무조건 패배, Lose = 점수 비교 패배)*는 합리. *현재 코드 = 둘 다 -1.0* 이므로 *수익률 계산 차이 0*. *향후 BURST 차별 (예: 2단 패널티)* 가능성 대비.
291
+
292
+ 다만 *`Judge.getEarningRate` 분기에서 BURST 우선 → LOSE fallthrough*: *플레이어 Bust → BURST 반환*, *Bust 아닌 패배 → LOSE 반환*. *분기 명시* 정공. *EarningRate.BURST 노출 자체는 도메인 의미 분리* — *수익률 계산은 동일*.
293
+
294
+ ### 14. `Judge(dealer: GameInfo, players: List<GameInfo>)` — *Player 대신 GameInfo 인자*
295
+
296
+ ```kotlin
297
+ class Judge(
298
+ val dealer: GameInfo,
299
+ val players: List<GameInfo>,
300
+ ) { ... }
301
+ ```
302
+
303
+ → **Judge 가 *Player/Dealer 인스턴스가 아닌 GameInfo 인자***. *GameInfo = 공통 인터페이스*. *Player.gameInfo* 와 *Dealer.gameInfo* 분리 후 *Judge 가 GameInfo 만 받음* — *Player/Dealer 의 행동 메서드 미접근*. *Tell-Don't-Ask 의 *행동 메시지* 호출 불가*.
304
+
305
+ *Judge.dealer.sumOfCards* 같은 *데이터 추출* 만 가능 — *Player vs Dealer 다형성 활용 X*. *Participant 추상화 후 Player/Dealer 인자*가 정공.
306
+
307
+ ### 15. `Player.onInputDecision()` 호출 — *PickingState.entries.find* 의 String 매핑
308
+
309
+ ```kotlin
310
+ override fun drawSingleCard(generateCard: () -> Card?): PickingState {
311
+ val inputDecision = onInputDecision()
312
+ val pickingState =
313
+ PickingState.entries.find { it.value == inputDecision }
314
+ ?: throw IllegalStateException(EXCEPTION_PLAYER_INPUT)
315
+ ...
316
+ }
317
+ ```
318
+
319
+ → **String → PickingState 매핑 = Player 책임**. *PR #132 (환노) 의 View가 사용자 의도 표현 (ActionType 반환)* 진단과 같은 결의 *반대 트레이드오프* — *현재 Player가 raw String 받아 변환*. *PickingState.entries.find { it.value == inputDecision }* 는 *Y/N 같은 String → enum 변환*. *PR #132 의 페로로 진단* (*컨트롤러에 중복 만들어지면 한쪽 변경 시 한쪽 고장*) 와 같은 함정 가능성.
320
+
321
+ 또한 *`it.value` = enum 멤버의 String 부가 속성*. PR #124·#28·#78·#112 의 *enum 의 UI value* 안티패턴 변형. *PickingState 가 도메인 인지 입력 인지* 경계 모호.
322
+
323
+ ### 16. `GameInfo.toString()` override — 도메인 객체가 View 형식 보유
324
+
325
+ ```kotlin
326
+ override fun toString(): String {
327
+ return MESSAGE_PARTICIPANT_CARD_RESULT.format(
328
+ name,
329
+ cards.joinToString { MESSAGE_CARD_INFO.format(it.title, it.shape.title) },
330
+ sumOfCards,
331
+ )
332
+ }
333
+
334
+ companion object {
335
+ private const val MESSAGE_PARTICIPANT_CARD_RESULT = "%s카드: %s - 결과: %d"
336
+ private const val MESSAGE_CARD_INFO = "%s%s"
337
+ }
338
+ ```
339
+
340
+ → **`GameInfo.toString` 이 *한글 메시지 형식 보유***. *View 책임 흡수*. *toString = 디버깅용*이 *Kotlin 표준 어휘*. *프로덕션 출력에 toString 사용* = *형식 변경 시 도메인 객체 수정*. PR #131·#88 의 *toString 도메인 객체 자가 표현* 와 같은 결.
341
+
342
+ *형식 일관성* vs *도메인-뷰 분리* 트레이드오프. *현재 GameInfo.toString 한글 메시지*는 *완전 도메인 어휘 부재*. *OutputView 에서 매핑*이 정공.
343
+
344
+ ### 17. `Players` 의 `init` *2 검증 (중복 + 인원수)*
345
+
346
+ ```kotlin
347
+ init {
348
+ require(value.map { it.gameInfo.name }.distinct().size == value.size) { EXCEPTION_DUPLICATED_PLAYERS }
349
+ require(value.size in PLAYER_NUM_RANGE) { EXCEPTION_NUMBER_OF_PLAYERS.format(value.size) }
350
+ }
351
+ ```
352
+
353
+ → **이름 중복 검증 + 인원수 검증** 정합. *value.map { it.gameInfo.name }* = *Player → name 추출*. *Player.gameInfo.name* 점 체인 — *Demeter 위반 표면*. *`value.map { it.name }`* (Player.name getter) 가 *위임 메서드 추가*면 *Demeter 안전*. *Player 가 name 직접 노출*하면 *gameInfo 노출 회피 가능*.
354
+
355
+ ### 18. `Player.checkBurst` 가 *`sumOfCards >= 21`* — *21 도달도 STAND*
356
+
357
+ ```kotlin
358
+ private fun checkBurst(): PickingState {
359
+ if (gameInfo.sumOfCards >= MAXIMUM_CARD_TOTAL) {
360
+ return PickingState.STAND
361
+ }
362
+ return PickingState.HIT
363
+ }
364
+ ```
365
+
366
+ → **21 도달 + 21 초과 모두 STAND** — *블랙잭 도달 (2장 21 = 블랙잭)* + *21 도달 후 더 안 받음* 표현. *블랙잭 자체 = STAND 흡수* — *EarningRate.BLACKJACK 분기*가 *Judge.isPlayerBlackjack* 에서 *별도 판정*. *상태 분리 부재*.
367
+
368
+ *PR #132·#136·#152 의 *State 객체 분리 (Blackjack/Bust/Stay)* * 와 *반대 트레이드오프*. PR #90 은 *enum 통합 + Judge 분기 분담*.
369
+
370
+ ## 리뷰어 의견 요지
371
+
372
+ - **`value class` 정공 활용 — `@JvmInline` + 연산자 오버로딩** — 두루의 *"value class를 너무 잘 작성해주셨네요~💯"* 칭찬. *학생 자가 답변 1000+자 = value class vs data class vs class 자가 학습 모범*.
373
+ - **승패 판정 로직 = 복잡 분기 + 새 요구 시 꼬임 위험** — *difference 변환 + 다중 if-or 분기*. *직접 점수 비교 + Tell-Don't-Ask 메시지* 권고.
374
+ - **`toString` override = View 형식 분리** — *학생 자가 학습 모범 (오버라이드 첫 경험)*.
375
+ - **`@CsvSource` + 테스트 픽스처 + 함수명 명확성** — *테스트 어휘 정공 활용*.
376
+ - **단일 책임 함수 분리** — *Judge winning 판정* 분리.
377
+ - **`Money` Default Value (0)** — *수익 시작값 표현*. *primary constructor + default* 활용.
378
+ - **`zip` 함수 활용 = Kotlin stdlib 어휘** — *Players.of 의 List 결합* 패턴.
379
+ - **테스트 동작 격리 = primary constructor 활용** — *팩토리 우회 + 사전 상태 주입*. *접근성 트레이드오프 학생 자가 결정*.
380
+ - **`data class` vs `value class` vs `class` 차이 학습** — 두루 메타 질문 + 학생 1000+자 자가 답변.
381
+ - **`InputView` 단계별 분리 (`initializeView`)** — *기능별 네이밍* 권고. *PR #88·#131 와 같은 결*.
382
+ - **패키지 분리 (`card` / `gameInfo` / `participants`)** — *도메인 그룹별 패키지*.
383
+
384
+ ## 대표 인용
385
+
386
+ **두루 (Judge 복잡 분기 + 요구사항 변화 시 꼬임, Judge.kt):**
387
+ > 해당 내용의 조건들은 새로운 요구사항이 생길때마다 로직이 복잡하게 꼬일 수도 있을것 같은데, 결과를 좀더 복잡하지 않도록 해보는 방법을 고민해봐도 좋을 것 같다는 생각이 듭니다!🤔
388
+
389
+ **두루 (value class 학습 메타 질문, Money.kt):**
390
+ > 고민해보면 좋을 내용인 것 같아서 코멘트 남겨두었습니다!
391
+ > `data class`, `value class`, `class`는 각각의 어떤 차이점을 가지고 있을까요??
392
+ > 추가적으로 `@JvmInline` 해당 어노테이션을 추가하면 어떠한 기능을 하는걸까요??
393
+
394
+ **학생 자가 답변 (value class vs data class vs class 자가 학습, Money.kt — 발췌):**
395
+ > data class는 toString(), hashCode(), equals(), copy(), componentN()메소드를 자동으로 만들어주는 클래스입니다.
396
+ > class와는 달리 이름부터 데이터를 담는 클래스라는 뉘앙스를 강하게 풍기는 만큼, 사용 시 클래스와 비교하였을 때 아래와 같은 이점을 얻을 수 있습니다.
397
+ > ...
398
+ > 우선 하나의 원시값만을 담아야 한다는 것이 value class의 특성임은 공식 문서에서도 잘 나와있음을 확인할 수 있었습니다.
399
+ > ...
400
+ > 또한, 수많은 멤버 변수 및 메소드를 필요하지 않을 때 value class를 사용하면 좋을 것 같다는 생각이 들었습니다. value class 자체가 과거에는 inline class라는 이름을 가졌다고 하는데, inline의 정의인 "함수나 코드 블록을 호출하는 위치에 해당 함수 또는 코드 블록의 본문이 복사되어 실행되는 것"이라는 특성을 생각해 보았습니다.
401
+ > ...
402
+ > 결론적으로 아래 상황들이 모두 맞아떨어지게 된다면 성능 상 이점을 볼 수 있도록 value class를 활용하게 될 것 같습니다.
403
+ > * '하나'의 원시값만을 생성자에 담아야 하는 상황.
404
+ > * data class나 class에서만 제공해주는 기능들을 필요로 하지 않는 상황
405
+ > * typealias를 활용하기에는 아쉬운, 내부 로직이 필요할 것 같은 상황
406
+ > * 수많은 멤버 변수/메소드를 필요로 하지 않으면서 value class로 만든 Wrapper 클래스가 광범위하게 사용되지는 않는 상황
407
+
408
+ **학생 자가 답변 (Money factory vs primary constructor 자가 결정, GameInfo.kt — 발췌):**
409
+ > 제가 설계를 진행할 때, Money 클래스가 두 가지 용도로 사용이 되도록 하였다는 것이 근본적 이유였습니다. 저는 베팅 금액과 수익 금액 두 가지를 동시에 Money 클래스를 활용하여 표현을 하고자 하였습니다.
410
+ >
411
+ > 문제는 베팅 금액의 경우 0 이하가 될 수 없는 반면에 수익 금액은 0 이하의 정수가 될 수 있다는 차이가 존재했다는 것이었습니다.
412
+ >
413
+ > 그 이유로, Money 클래스를 제약이 존재하는 베팅 금액 용도로 생성할 때는 정적 팩토리 메소드를 활용하여 메소드 내부에서 음수인지의 여부를 검증하고자 하였고, 수익으로서 Money는 주생성자로 바로 생성하고자 하는 목적으로 위와 같은 방식을 적용하게 되었습니다.
414
+
415
+ **학생 자가 답변 (Bet/Profit 추상화 시도 후 통합, GameInfo.kt — 발췌):**
416
+ > 사실 다른 후보로, Money라는 개념을 value class 대신 abstract class 혹은 interface로 추상화하고 Bet(베팅 금액)과 Profit(수익 금액)을 각각 value class로 구현하고자 생각하기도 하였습니다. 하지만 value class는 abstract class를 상속받을 수 없었기에 abstract class로 추상화 후 value class로 상속하는 조합으로는 목적을 달성할 수 없었습니다. 또한 Bet과 Profit이 공통으로 수행하는 책임이 거의 없었기에, 추상화 자체의 실익이 적다는 생각을 하게 되었습니다.
417
+
418
+ **학생 자가 답변 (테스트 primary constructor 활용 이유, Players.kt:29):**
419
+ > 객체에 대한 동작의 테스트를 진행하고자 할 때, 복잡한 로직들을 집어넣어야 하는 정적 팩토리 메소드보다는 이미 데이터가 만들어진 상태에서 테스트를 진행하는 것이 더욱 손쉬운 테스트 진행에 도움이 될 것이라고 생각하였습니다!
420
+
421
+ **학생 자가 답변 (toString 오버라이드 첫 경험, GameRoundView.kt):**
422
+ > toString() 메소드를 오버라이드 해본 경험이 없어서 적용할 생각을 하지 못하였던 것 같습니다!
423
+ > 말씀하신 대로 수정을 진행해보니 뷰 측에서 형식을 일일이 지정해주지 않고 toString() 메소드 호출만으로 원하는 형식으로 정보를 출력할 수 있게 되었습니다!
424
+
425
+ **두루 (학생 자가 답변 평가):**
426
+ > 해당 내용에 대해서 정말 많은 객체의 책임과 추상화에 대해서 고민을 하셨을 것 같군요~👍
427
+ > 타당한 근거 정말 좋습니다.
428
+ > 사실 구현에 대해서 정답은 없어서 케이엠이 해당 내용을 구현하실 때 타당한 이유가 있었고, 그에 대한 설명을 해주시는 모습 정말 좋습니다ㅎㅎ😆
429
+
430
+ ## 얻은 교훈
431
+
432
+ 1. ***`@JvmInline value class` + 4가지 연산자 오버로딩 = Kotlin value class 완전 활용***. *원시 박싱 없음 + 타입 안전 + 모든 산술*. PR #131·#132·#136 와 같은 결의 *value class* 트레이드오프 — *기능 풍부도 최고 수준*.
433
+
434
+ 2. ***`Money` 두 용도 (베팅 + 수익) 자가 분리 = factory + primary constructor***. *베팅 (검증 필요) = factory*. *수익 (음수 허용) = primary constructor + default*. *학생 자가 학습 + 결정 근거 명시 모범*. *abstract class + value class 조합 시도 후 통합 후퇴 = 추상화 트레이드오프 학습*.
435
+
436
+ 3. ***Judge 정적 헬퍼 + difference 변환 = Tell-Don't-Ask 절반***. *Judge 가 모든 룰 판정 + Participant/GameInfo 는 데이터 추출만*. *PR #132·#136 의 Participant.compare(other) 메시지 다형성* 과 *반대 트레이드오프*. *Judge god-object 변형* 가능성. 두루 *"새 요구사항 시 꼬임 위험"* 진단.
437
+
438
+ 4. ***`difference = 21 - score` 변환 = 추상화 우회 신호***. *직접 점수 비교 (`score > 21`, `score == 21`)* 가 *직관*. *difference 변환 + 다중 분기*는 *코드 가독성 ↓*. *추가 변환 단계 = 인지 비용*.
439
+
440
+ 5. ***`PickingState` enum 의 HIT/STAND 통합 = 입력 의도 + 상태 표현 혼재***. *Bust 도 STAND 로 흡수* = *상태 차이 (Bust 무조건 패배 vs Stand 점수 비교) 표현 부족*. *PR #132·#136·#152 의 State 객체 분리* 와 *반대 트레이드오프* — *enum 통합 + Judge 분기*. **MCP 룰 후보 — `action-and-state-enum-conflation`**.
441
+
442
+ 6. ***`Card.toString` override = 도메인 객체가 자기 표현 알림***. 학생 자가 첫 경험 + *View 측 형식 지정 X*. *toString = 디버깅 vs 프로덕션 출력* 트레이드오프 의식 필요. *프로덕션 사용 시 형식 변경 = 도메인 객체 수정* 함정.
443
+
444
+ 7. ***`Set<Card>` 사용 = 카드 중복 차단 + iteration order LinkedHashSet 보장***. *블랙잭 도메인 = 같은 카드 2장 안 나옴* 정합. *Set.take(2) = 추가 순서대로 (LinkedHashSet)*. *List vs Set* 트레이드오프 — *Set 선택 합리*. 다만 *순서 의존 코드*는 *함정 가능성*.
445
+
446
+ 8. ***`Player(gameInfo, onInputDecision: () -> String)` 람다 인자 = 입력 콜백 멤버***. *Player 가 자기 의사 결정 = 콜백 호출*. *PR #132 (환노) 의 고차함수 시도* 와 같은 결. *Player → View 결합 vs interface 의존성 주입* 트레이드오프.
447
+
448
+ 9. ***`onInputDecision: () -> String` raw String 반환 = View가 raw vs 의도 표현 트레이드오프***. PR #132 (환노) 의 *페로로 진단 "View가 사용자 의도 표현 (ActionType)"* 과 같은 결. *Player 가 String → PickingState 변환 책임* = *변환 로직 중복 가능성*.
449
+
450
+ 10. ***`Judge(dealer: GameInfo, players: List<GameInfo>)` = Player/Dealer 인자 아닌 GameInfo***. *Participant 다형성 활용 X*. *Judge.dealer.sumOfCards* 같은 *데이터 추출* 만. *Player vs Dealer 행동 메서드 미접근*.
451
+
452
+ 11. ***`Money(0)` primary constructor 노출 = invariant 강제 부재***. *value class 의 factory only 정공* 위반 — *호출자가 `Money(-1000)` 같은 호출 가능*. *Money.zero() / Money.from()* 두 factory 가 *invariant 강제*.
453
+
454
+ 12. ***리뷰어 메타 질문 + 학생 1000+자 자가 답변 = 학습 가시화 최고 수준***. *두루의 "data class vs value class vs class 차이?"* 메타 질문 → *학생 자가 학습 1000+자 답변*. *외부 자료 + 본인 사고 + 코드 적용* 흐름이 *모범 학습 패턴*. PR #128·#135·#108·#133·#136 와 같은 결.
455
+
456
+ 13. ***패키지 분리 (`card` / `gameInfo` / `participants`) = 도메인 그룹별*** — *프로젝트 구조 명료성*. PR #88 의 *card/game/user* 와 같은 결. *각 패키지가 자기 책임 영역* 명시.
457
+
458
+ 14. ***`zip` 함수 + `run { Players(this) }` = Kotlin stdlib 어휘 활용***. *List 결합 + scope function*. *factory 함수 안에서 변환 + wrap* 패턴. *Kotlin 어휘 정공*.
459
+
460
+ 15. ***학생 자가 답변에 추상화 시도 후 통합 후퇴 명시 = 학습 가시화 모범***. *Bet / Profit value class 추상화 시도 → 공통 책임 거의 없음 → 통합 결정* 흐름이 *추상화의 정당화 기준*. *추상화 = 도메인 차이 있을 때만*. PR #88·#131 와 같은 결.