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,465 @@
1
+ # PR #93 — [블랙잭 2단계] 에디 미션
2
+
3
+ - **Reviewee:** [@junjange](https://github.com/junjange)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/93
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @malibinYun (말리빈)
7
+ - **라인 코멘트:** 21 스레드 / 51 코멘트 — *State 패턴 + Demeter + sealed vs enum* 깊은 토론 + 학생 자가 학습 모범
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **State 패턴 정공 — `interface State` + `abstract Started(Hand)` + `Running (Hit) / Finished (Blackjack/Bust/Stay)` 계층** — *Tell-Don't-Ask 정공*. `Hit.draw(card)` 가 *21 초과 → Bust, 2장 21 → Blackjack, 21 도달 → Stay, else → Hit* 분기로 *다음 상태 결정*. **`Blackjack.calculate(opponent: State) = if (opponent is Blackjack) Draw else BlackjackWin` 같은 다형성 메시지**. PR #136 (밀러 2단계) 의 *sealed class BlackJackRule + Stay.compare* 와 같은 결.
12
+ - **`Finished.profit(betAmount, gameResult)` 다형성 + 메시지 응집** — *상태별 earningRate (Blackjack=1.5, Stay=1.0, Bust=-1.0) + 공통 profit 계산*. 호출자가 *isBust 분기* 없이 *state.profit(betAmount, result)* 한 줄.
13
+ - **`Started` 부모 클래스에 `calculateHand()` 응집 — Ace 점진적 보정** — *Ace 11 기본 + repeat(aceCount) { total += 10; if > 21 → -10 + return@repeat }* 패턴:
14
+
15
+ ```kotlin
16
+ override fun calculateHand(): Int {
17
+ var total = hand.cards.sumOf { it.number.value } // Ace=1 기본
18
+ val aceCount = hand.cards.count { it.number == CardNumber.ACE }
19
+ repeat(aceCount) {
20
+ total += Hand.DIFF_ACE_TO_ONE // +10
21
+ if (total > Hand.BLACKJACK_NUMBER) {
22
+ total -= Hand.DIFF_ACE_TO_ONE
23
+ return@repeat // ⚠ break
24
+ }
25
+ }
26
+ return total
27
+ }
28
+ ```
29
+
30
+ *Ace 각각에 11 시도 + Bust면 -10 + 종료* — *Ace 다수 정확*. PR #128·#114·#108·#131 와 같은 결.
31
+ - **`sealed class CardHolder` + `Player` / `Dealer` 다형성** — 1단계 *open class* 자가 학습 후 *sealed* 정공. *외부 구현 차단 + 컴파일러 보장*. PR #136 (밀러 2단계) 의 *sealed class BlackJackRule* 와 같은 결.
32
+ - **`sealed interface GameResult` + `data object BlackjackWin / Win / Lose / Draw`** — *Kotlin `data object` 활용*. *닫힌 결과 계층 + 컴파일러 when exhaustive*. PR #132 (환노) 의 *GameResult enum + earningRate* 와 *반대 트레이드오프* — *enum 부가 속성* vs *sealed object*.
33
+
34
+ ```kotlin
35
+ sealed interface GameResult {
36
+ data object BlackjackWin : GameResult
37
+ data object Win : GameResult
38
+ data object Lose : GameResult
39
+ data object Draw : GameResult
40
+ }
41
+ ```
42
+
43
+ - **`DeckManager` interface + `GameDeck` 구현체 — DIP** — *카드 한 장 가져오는 메서드 추상화*. 말리빈 권고 *"카드 한 장을 가져오는 메서드를 인터페이스로 만들어볼 수 있겠어요"* 후속 반영. *position 인자 추가로 결정적 카드 뽑기 가능* — 테스트 용이성.
44
+ - **`CardHolder.drawCard(card: () -> Card, shouldDrawCard: () -> Boolean, showPlayerCards: (CardHolder) -> Unit)` 고차함수** — *외부 입력 + 출력 콜백을 람다 인자로*. *Player/Dealer 가 자기 진행 자율성*. *Tell-Don't-Ask 정공*. PR #132 (환노 2단계) 의 *고차함수 시도 + 깊이 문제* 와 *비슷한 트레이드오프* — junjange 는 *적정 깊이로 안착*.
45
+ - **`Card.from(cards: List<Card>)` 팩토리 명명 자가 학습** — 말리빈의 *"from과 of는 어떤 의미 차이가 있나요? 어떤 것은 Card를, 다른 하나는 List\<Card>를 반환하는데, 다른 개발자들도 of 와 from 의 경계를 명확히 알아차릴 수 있을까요?"* 진단 후속 반영 (커밋 `b2f1b80`).
46
+ - **양방향 의존 자가 해소** — 말리빈 진단 *"부모가 자식을 알고 있는 형태이네요! 양방향 의존 관계가 생겨나기도 했구요"* + 학생 자가 답변 *"부모와 자식간에 결합도가 증가하여 유지보수가 힘들어질 것 같습니다! 단일 책임 원칙도 위반 될 것으로 보입니다! 의존성을 제거하고 코드를 간소화했습니다!"* (커밋 `efa1571`). **MCP 룰 후보 — `bidirectional-dependency` 변형**.
47
+ - **Demeter 학습 + 리팩토링** — 말리빈 *"디미터의 법칙에 대해 알아보셔도 좋겠어요"* 진단 → 학생 *"네네!! 디미터의 법칙을 준수하면서 리팩터링을 진행했습니다!"* (커밋 `98299dd`). PR #133·#88 와 같은 결.
48
+ - **타입 캐스팅 제거 자가 반영** — 말리빈 *"상태 패턴을 활용해주셨으니, 타입 캐스팅을 사용하지 않고 구현해주세요"* + 학생 자가 반영 (커밋 `15e1e77`). *다형성 활용 정공*.
49
+ - **let/run 함수 활용 함정 자가 학습** — 말리빈의 *"이런 형태를 잘못 사용하게 된다면 let 블럭과 run 블럭 모두가 실행되는 말도 안되는 상황이 발생할 수도 있어요. let 스코프 함수 내부에 잘못된 코드를 작성했을 때 발생하게 되겠는데요, 어떤 경우에 두 스코프가 다 실행 될 수 있을지 고민해보시면 좋겠어요!"* + 학생 자가 실험 (let에서 null 반환 시 두 블록 실행) + 자가 반영. **Kotlin scope function 함정 학습 모범**.
50
+ - **`UserInfo` 도입 — name + betAmount 묶음** — *3 변수 제약* 회피 + *Player/Dealer 공통 정보* 응집. PR #133 (시아 2단계) 의 *Items* 와 같은 결의 *제약 부산물 + 정당한 도메인 객체* 경계.
51
+
52
+ ## 못한 점 (설계 관점)
53
+
54
+ ### 1. `Hit.draw(card)` 에서 `hand.add(card)` 가변 변경 + 새 상태 반환 — *불변 표면 + 깊은 가변*
55
+
56
+ ```kotlin
57
+ class Hit(private val hand: Hand = Hand()) : Running(hand) {
58
+ override fun draw(card: Card): State {
59
+ hand.add(card) // ⚠ 기존 hand 가변 변경
60
+ val sumOfCard = hand.calculate()
61
+ return when {
62
+ sumOfCard > THRESHOLD_BUST -> Bust(hand) // 새 상태 + 같은 hand 참조
63
+ sumOfCard == THRESHOLD_BUST && hand.cards.size == 2 -> Blackjack(hand)
64
+ sumOfCard == THRESHOLD_BUST -> Stay(hand)
65
+ else -> Hit(hand)
66
+ }
67
+ }
68
+ ...
69
+ }
70
+ ```
71
+
72
+ → **`hand.add(card)` = 기존 Hand 가변 변경 + 새 State 객체 반환 + 같은 hand 참조** — PR #85 (하디 2단계) 와 같은 결의 *불변 표면 + 깊은 가변* 함정. *Hit 상태 → Bust 상태 전이* 시 *같은 Hand 참조* 라서 *이전 Hit 객체 조회 시 이미 add 된 hand*.
73
+
74
+ *완전한 불변* = *`Hand(cards + card)`* 새 Hand 생성 + 새 State. *현재 `hand.add(card)`* 가변 호출.
75
+
76
+ ### 2. `Running.calculate(opponent): GameResult = Lose` — *진행 중 상태가 결과 반환?*
77
+
78
+ ```kotlin
79
+ abstract class Running(hand: Hand) : Started(hand) {
80
+ override fun isFinished(): Boolean = false
81
+
82
+ override fun calculate(opponent: State): GameResult {
83
+ return GameResult.Lose // ⚠ 진행 중이면 Lose?
84
+ }
85
+ ...
86
+ }
87
+ ```
88
+
89
+ → **`Running.calculate(opponent) = Lose` = 진행 중 상태에서 결과 메서드 호출 시 무조건 Lose**. *State interface 의 `calculate` 가 모든 상태에 강제* → *Running 상태도 응답 필요*. *논리적으로는 calculate 가 호출 안 되어야 함*. *Lose 반환은 우회*. *PR #152 (모찌 2단계) 의 Hit.expectedProfit throw IllegalStateException* 와 *반대 트레이드오프*.
90
+
91
+ *throw 가 정공* — *진행 중 상태에서 calculate 호출은 도메인 invariant 위반*. *Lose 반환은 silent failure* — *호출자가 결과 잘못 사용 시 디버깅 어려움*.
92
+
93
+ ### 3. `Running.profit(betAmount, gameResult) = 0.0` + `Finished.profit` 분기 — *책임 양분*
94
+
95
+ ```kotlin
96
+ // Running
97
+ override fun profit(betAmount: BetAmount, gameResult: GameResult): Double = 0.0
98
+
99
+ // Finished
100
+ override fun profit(betAmount: BetAmount, gameResult: GameResult): Double {
101
+ val rate = earningRate()
102
+ return when (gameResult) {
103
+ is GameResult.Draw -> 0.0
104
+ is GameResult.Lose -> -betAmount.amount.toDouble()
105
+ else -> betAmount.amount * rate
106
+ }
107
+ }
108
+ ```
109
+
110
+ → **`Running.profit = 0.0` + Finished.profit 가 *gameResult 분기 + earningRate 곱*** — *Running 은 결과 부재 → 0*, *Finished 는 결과 + 배율*. 다만 *Bust.earningRate = -1.0* 인데 *Finished.profit 에서 `is Lose → -betAmount`* 별도 분기 — *Bust 의 earningRate(-1.0) 이 적용 안 됨*. *룰 정합* 인지 *중복* 인지 모호.
111
+
112
+ 실제 사용 흐름:
113
+ - *Bust 상태 → calculate(opponent) = Lose 반환* → *Finished.profit 에 GameResult.Lose 인자 → `is Lose → -betAmount`*. *earningRate(-1.0) 미적용*.
114
+ - *Blackjack 상태 → calculate(opponent) = BlackjackWin 반환* → *Finished.profit 에 BlackjackWin 인자 → `else → betAmount * 1.5`*. *earningRate 적용*.
115
+ - *Stay 상태 → calculate(opponent) = Win/Lose/Draw* → *Finished.profit 분기*.
116
+
117
+ → **Bust 의 earningRate(-1.0) 이 *실제로는 미사용***. *earningRate 추상 메서드*가 *Finished 의 일관 계약*이지만 *Bust는 항상 Lose 분기로 흡수*. *Dead code* 가능성. *earningRate 의 사용처 = `else → betAmount * rate`* — *Bust 의 earningRate 호출 시점 없음*.
118
+
119
+ ### 4. `sealed interface GameResult` vs `enum class GameResult` 토론 — 학생 자가 학습
120
+
121
+ 학생 초기 선택: *sealed interface*. 말리빈 진단: *"enum class와 어떤 점이 차이가 있었나요?"*. 학생 답변: *"profit 함수에서 sealed interface를 통해 패턴 매칭을 할 때, 컴파일러가 타입 안정성을 유지하면서 코드를 검증하여 개발 과정에서 실수를 안 할 수 있는 장점이 있었습니다!"*
122
+
123
+ 말리빈 후속: *"enum은 말씀해주신 위 장점이 존재하지 않았나요?"*
124
+
125
+ 학생: *"맞습니다ㅠㅠ 제가 잘못알고있었습니다 위에 sealed interface는 특별하게 장점을 살리고 있지는 않은 것 같습니다. 그러나 추후에 BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요할 것 같습니다!"*
126
+
127
+ 말리빈: *"특별하게 장점을 살리고 있지 않다면, 저는 필요한 부분만 가져가는 것이 코드를 이해하는 데 불필요한 생각이 들지 않게 해준다 생각해요. 이렇게 할거면 왜 enum을 쓰지 않았지? 라는 의문을 들게하는 것 부터, 코드를 이해하는 데 벌써 한 번의 멈춤이 생겼다고 생각해요. 저는 최대한 필요에 의해 코드를 구성하는 것을 선호해요."*
128
+
129
+ 학생: *"저도 말리빈처럼 왜라고 말했을 때 답하는 것을 중요시하는데 위 부분에서 sealed class의 장점을 살리지 못한다면 enum으로 수정해야할 것 같습니다!"*
130
+
131
+ → **sealed vs enum = 도메인 차이가 있을 때만 sealed**. *현재 GameResult 4 멤버 모두 *데이터 없는 object* → enum 으로 충분*. *sealed = 멤버 별 다른 데이터 보유 가능*이 장점. *현재 도메인이 그 가능성 없음*. **MCP 룰 후보 — `sealed-without-differentiation`** *= sealed 의 멤버 별 데이터 차이 없으면 enum 권고*.
132
+
133
+ 학생 자가 답변에서 *"BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요"* 도 *미래 가능성* 이지만 *YAGNI 위반*. 말리빈의 *"필요에 의해 코드를 구성"* 가르침.
134
+
135
+ ### 5. `Hand.add(card)` 가변 변경 후 `cards.size` 검사
136
+
137
+ ```kotlin
138
+ // Hit.draw
139
+ hand.add(card)
140
+ val sumOfCard = hand.calculate()
141
+ return when {
142
+ sumOfCard > THRESHOLD_BUST -> Bust(hand)
143
+ sumOfCard == THRESHOLD_BUST && hand.cards.size == 2 -> Blackjack(hand)
144
+ ...
145
+ }
146
+ ```
147
+
148
+ → **`hand.cards.size == 2`** — *Hand 의 외부에서 size 직접 접근*. *Hand.isBlackjackEligible() = cards.size == 2 && score == 21* 같은 메서드 위임이 자연. Demeter 표면.
149
+
150
+ ### 6. `Dealer.shouldDrawCard(): Boolean = calculateHand() <= 16` — *Dealer 자기 룰 메시지 (잘함) + Hand 알 필요 없음*
151
+
152
+ ```kotlin
153
+ class Dealer(...) : CardHolder(...) {
154
+ fun shouldDrawCard(): Boolean = calculateHand() <= DEALER_CARD_DRAW_THRESHOLD
155
+ ...
156
+ }
157
+ ```
158
+
159
+ 말리빈 (Dealer.kt — 미해결): *"shouldDrawCard() 이 친구는 CardHolder, Dealer, Player 모두가 갖고있는 듯한 느낌이 드네요! 공통으로 갖고있는 멤버지만, 실행했을 때 동작은 다르게 만드는 방법이 있을까요?"*
160
+
161
+ 학생 자가 답변: *"흠 공통으로 갖고 있어서 interface를 통해 추상화하려고 했지만.. Dealer의 shouldDrawCard는 본인의 카드 점수 합에 따라서 값이 달라지고 Player의 shouldDrawCard는 사용자의 입력에 따라서 달라지기 때문에 추상화가 쉽지 않은 것 같습니다!"*
162
+
163
+ 말리빈 후속: *"입력을 받아오기 위한 람다 등은 최대한 깊이를 깊게 가져가지 않았으면 했어요. 게임을 관제하는 객체를 하나 만들어둔다면 이런 람다를 도메인 깊이 알지 않을 수 있으니까요. ... 그렇다면 플레이어나 딜러나 그저 카드를 받기만 할 수 있는 객체가 되고, 줄 지 말 지는 게임 객체가 판단해줄 수도 있었겠지요!"*
164
+
165
+ → **Player/Dealer shouldDrawCard 다형성 vs Game 객체 판단**. *현재 Dealer 만 shouldDrawCard 메서드 (Player 는 외부 람다)*. *완전 다형성* = *Player.shouldDrawCard(input) / Dealer.shouldDrawCard()* 같은 *인자 통일 + 다형성*. 또는 *Game 객체 = 모든 판단 + Player/Dealer 는 받기만*.
166
+
167
+ *트레이드오프*. PR #132·#136 와 같은 결의 *Participant 다형성* 가 정공.
168
+
169
+ ### 7. `CardHolder.calculateProfit(opponent: State)` — *state 직접 인자*
170
+
171
+ ```kotlin
172
+ fun calculateProfit(opponent: State): Double {
173
+ val gameResult = state.calculate(opponent)
174
+ return state.profit(betAmount = userInfo.betAmount, gameResult = gameResult)
175
+ }
176
+ ```
177
+
178
+ → **`opponent: State` 인자** = *Player가 다른 Player의 State 직접 받음*. *호출자 (BlackjackController)* 가 *`player.calculateProfit(dealer.state)`* 호출. *Tell-Don't-Ask*: *`player.calculateProfit(dealer)`* 가 더 자연 — *Player가 Dealer로부터 State 추출*. *State 인자 직접 노출*은 *내부 표현 의존*.
179
+
180
+ ### 8. `BetAmount` 의 *문자열 파싱이 도메인 책임?* 자가 학습
181
+
182
+ 학생 초기: *문자열 파싱이 도메인 책임*. 말리빈 진단: *"문자열을 파싱해서 BetAmount를 만든다는 것은 도메인의 역할일까요?"*. 학생 자가 답변: *"배팅 금액에 대한 유효성 검증 이후, 문자열을 파싱하는 것은 도메인의 역할이라고 생각했습니다! 그런데, 다시 생각해보니 view의 역할에 더 적합한 것 같습니다!"* (커밋 `7ada402`).
183
+
184
+ → **도메인 vs View 책임 자가 학습**. *문자열 파싱 = View*, *유효성 검증 = 도메인*. *PR #132 (환노 2단계) 의 View가 사용자 의도 표현* 진단과 같은 결.
185
+
186
+ ### 9. `BlackjackState` vs `Blackjack` naming 모호 → State 로 변경 시도 → 말리빈 reminder
187
+
188
+ 학생 초기: `BlackjackState` 와 `Blackjack` 두 객체. 말리빈: *"BlackjackState 와 Blackjack은 처음 보는 개발자들이 서로 어떻게 다른 객체인지 내부 구현을 자세히 보지 않고 파악할 수 있을까요?"*. 학생: *"잘 모를 것 같습니다 BlackjackState를 State로 수정하겠습니다!"* (커밋 `5a66d0a`).
189
+
190
+ 말리빈 후속: *"앗 ㅋㅋㅋ 아래 피드백을 다시 곱씹어볼까요 ?_?"* + 1단계 피드백 링크.
191
+
192
+ → **이름 모호함 자가 해소 + 1단계 피드백 회귀 신호**. *학생이 이름 모호함 진단 받고 다시 변경했지만 이전 피드백 (`State` vs `Blackjack`) 와 같은 결*. *학습 가시화 + 재발견*.
193
+
194
+ ### 10. `Card.create` 와 `companion object card` 중복 — 자가 발견
195
+
196
+ 말리빈: *"create라는 이름으로 무언가 새로운 인스턴스를 생성할 것 처럼 느껴지네요. companion object 의 card를 직접 접근하는 것과 어떤 차이점이 있는지 모르겠어요. 전체적으로 필요하지 않은 코드들을 다듬어 덜어내는 연습을 해보세요"*
197
+
198
+ 학생: *"헉 지금 다시보니 중복되는 내용이네요ㅠㅠ 감사합니다!"* (커밋 `0d2b950`).
199
+
200
+ → **중복 코드 자가 발견 + 삭제**. *create / companion val card 둘 다 *기존 캐시 lookup**. *호출자가 둘 중 어느 것 호출하는지 모호*. *Kotlin 어휘 정공 = factory function 한 가지*.
201
+
202
+ ### 11. `DeckManager.drawCard(position: Int)` — *position 의미*
203
+
204
+ ```kotlin
205
+ interface DeckManager {
206
+ fun resetDeck(cards: List<Card>? = null)
207
+ fun drawCard(position: Int): Card
208
+ }
209
+
210
+ class GameDeck : DeckManager {
211
+ private val deck: MutableList<Card> = Card.cards.shuffled().toMutableList()
212
+
213
+ override fun drawCard(position: Int): Card {
214
+ if (position < deck.size) {
215
+ return deck.removeAt(position)
216
+ }
217
+ resetDeck()
218
+ return deck.removeAt(position)
219
+ }
220
+ ...
221
+ }
222
+ ```
223
+
224
+ 말리빈 (DeckManager.kt:7 — 미해결): *"이전 피드백에 이어서, 기대한 인터페이스는 카드 단 한장만을 가져오는 메서드만 가진 인터페이스였어요. `interface ~ { fun getCard(): Card }`. 랜덤의 요소를 최소화해본다 라는 것에 가장 많이 고민해보세요. reset은 랜덤의 요소였을지, position은 랜덤의 요소였을지 연관지어서요! 1, 2 단계 미션에서 배운 것들을 완전히 자신의 것으로 만들어보세요"*
225
+
226
+ → **`position: Int` 인자 = 랜덤 요소 외부 노출**. *덱이 랜덤이면 *어떤 position 카드든 랜덤** — *position 명시 의의 부재*. *카드 한 장만 받는 메서드*가 *최소 인터페이스*. *학생 의도*는 *테스트 시 결정적 카드* 였으나 *전략 패턴 (ShuffleStrategy)* 이 정공. *position 인자*는 *외부에서 덱 내부 구조 의존*.
227
+
228
+ 학생 자가 답변: *"랜덤의 요소를 최소화하는 것에 대해서 좀 더 고민해보겠습니다!.."*
229
+
230
+ → **인터페이스 추상화의 적정 수준 학습 진행 중**. *DeckManager 의 `resetDeck(cards: List<Card>? = null)` + `drawCard(position: Int)`* 가 *외부 제어 표면*. *진짜 인터페이스 = `fun draw(): Card` 한 메서드*. *resetDeck 도 외부 호출 불필요* — *덱이 비면 자동 셔플 + 새 덱*. PR #108·#133 (시아) 와 같은 결.
231
+
232
+ ### 12. `Card.cards` 같은 *전역 카드 풀* — *Card 객체가 자기 풀 알고 있음*
233
+
234
+ ```kotlin
235
+ private val deck: MutableList<Card> = Card.cards.shuffled().toMutableList()
236
+ ```
237
+
238
+ → **`Card.cards` companion val** = *52장 카드 list 전역*. PR #108·#133 (시아) 의 *`Card.SINGLE_DECK` 위치 모순* 과 같은 결. *Card = 1장* vs *Card.cards = 52장 모음* 의미 충돌. *DeckManager.STANDARD_DECK* 또는 *Deck.companion val* 이 자연.
239
+
240
+ ### 13. `userInfo` naming — 만능 명사
241
+
242
+ ```kotlin
243
+ sealed class CardHolder(val userInfo: UserInfo)
244
+
245
+ data class UserInfo(val nickname: Nickname, val betAmount: BetAmount = BetAmount())
246
+ ```
247
+
248
+ → **`UserInfo` = 만능 명사 (Information)** — PR #88·#114·#125 의 *vagueName 안티패턴* 변형. *블랙잭 도메인에서 `UserInfo` 가 자연한 어휘*인지 *3 변수 제약 부산물*인지 모호. *Player(nickname, betAmount)* 직접 인자 + *CardHolder 는 두 멤버 공통 보유*가 *명시적*.
249
+
250
+ 다만 *Player + Dealer 가 공통 정보 (nickname, betAmount) 보유* + *Dealer 도 nickname/betAmount 필요* 라면 *UserInfo 응집* 정합. *Dealer 의 betAmount = 0 default* — *Dealer 가 베팅 안 하는 도메인 룰 vs UserInfo 일관성* 트레이드오프.
251
+
252
+ ### 14. `Started.calculateHand` 의 *Ace 보정 후 return@repeat*
253
+
254
+ ```kotlin
255
+ override fun calculateHand(): Int {
256
+ var total = hand.cards.sumOf { it.number.value }
257
+ val aceCount = hand.cards.count { it.number == CardNumber.ACE }
258
+ repeat(aceCount) {
259
+ total += Hand.DIFF_ACE_TO_ONE
260
+ if (total > Hand.BLACKJACK_NUMBER) {
261
+ total -= Hand.DIFF_ACE_TO_ONE
262
+ return@repeat // ⚠ break (Kotlin repeat의 continue)
263
+ }
264
+ }
265
+ return total
266
+ }
267
+ ```
268
+
269
+ → **`return@repeat` = 단일 iteration 종료 (continue 의미)**. *Kotlin `repeat` 에 break 없음* — *continue 만 가능*. *while loop 변환*이 *break 의도 명시*. 현재 코드는:
270
+ - *iter 1: total += 10*. *if > 21 → total -= 10 + continue → iter 2*
271
+ - *iter 2: total += 10*. ...
272
+
273
+ *Ace 다수 정확 처리*. 다만 *return@repeat 의미가 *continue* 라 *Kotlin 어휘 미숙자에겐 함정**. *while loop* 이 *break 의도 명시*:
274
+
275
+ ```kotlin
276
+ var aceCount = ...
277
+ while (aceCount > 0 && total > 21) {
278
+ total -= 10
279
+ aceCount--
280
+ }
281
+ ```
282
+
283
+ PR #136·#108·#131 의 *while 패턴* 과 같은 결.
284
+
285
+ ### 15. `Card.cards` 전역 + `GameDeck.drawCard` 가 *resetDeck* 호출 — *position 의미*
286
+
287
+ ```kotlin
288
+ override fun drawCard(position: Int): Card {
289
+ if (position < deck.size) {
290
+ return deck.removeAt(position)
291
+ }
292
+ resetDeck()
293
+ return deck.removeAt(position)
294
+ }
295
+ ```
296
+
297
+ → **`position >= deck.size` 면 resetDeck + removeAt(position)** — *resetDeck 후 새 덱이 적어도 position+1 장*. *Card.cards.shuffled().toMutableList()* = *52장*. *position < 52* 면 정합. *position == 52* 같은 경계 케이스에서 *IndexOutOfBoundsException* 가능성. *position 인자 자체*가 *외부 책임 노출*. PR #108·#133 (시아) 의 *카드 부족 시 자동 셔플* 패턴과 다름.
298
+
299
+ ### 16. `Bust.earningRate(): Double = -1.0` Dead code 가능성 — 못한 점 §3 보강
300
+
301
+ ```kotlin
302
+ class Bust(hand: Hand) : Finished(hand) {
303
+ override fun earningRate(): Double = -1.0
304
+
305
+ override fun calculate(opponent: State): GameResult {
306
+ return Lose
307
+ }
308
+ }
309
+ ```
310
+
311
+ → **`Bust.earningRate(-1.0)` 추상 메서드 구현이지만 *호출 흐름에서 미사용***. *Bust.calculate → Lose → Finished.profit → `is Lose → -betAmount`* 분기 — *earningRate 호출 없음*. *추상 메서드 계약* + *실 사용 0* = *dead code*. *Finished.profit 의 `else -> betAmount * rate`* 가 *earningRate 사용처* 인데 *Bust 는 항상 Lose 분기*.
312
+
313
+ *해결*: *Finished.profit 의 `is Lose → betAmount * rate` (Bust 는 rate=-1 이므로 -betAmount)* 가 *통일*. 현재는 *분기 분리 + earningRate 일부 dead*.
314
+
315
+ ### 17. `let / run` 함수 함정 학생 자가 검증
316
+
317
+ 학생 자가 실험 코드:
318
+ ```kotlin
319
+ fun main() {
320
+ var test: Int? = 1
321
+ test?.let {
322
+ println("let 실행됨")
323
+ test = null
324
+ null
325
+ } ?: run {
326
+ test = 1
327
+ println("run 실행됨")
328
+ }
329
+ println(test)
330
+ }
331
+ ```
332
+
333
+ 말리빈 답변: *"네! 맞아요. 생각보다 null을 반환하는 메서드들이 꽤나 많답니다. 특히 java의 메서드가 non-null 이라고 착각했을 때 자주 발생하게 되지요. 지금은 예시 코드를 작성하시면서 \"무슨 이런 말도안되는 일이 발생할까? 너무 방어적인것 아닐까?\" 하는 생각이 드실 수 있겠지만, 생각보다 자연스러운 코드인데도 이런 현상이 발생해버린다면, 디버깅할때 굉장히 골치아파진답니다. 코드는 자연스러운데, 실행은 비정상적이니, 원인을 찾아내는 데 굉장히 어려워지게돼요."*
334
+
335
+ → **let / run 함수 함정 = null 반환 시 두 블록 실행**. *학생이 자가 검증 코드 작성 → 함정 확인 → 후속 반영*. *Kotlin scope function 학습 모범*. **MCP 룰 후보 — `let-run-elvis-pitfall`**.
336
+
337
+ ## 리뷰어 의견 요지
338
+
339
+ - **State 패턴 정공 (Running/Finished + Blackjack/Bust/Stay)** + **타입 캐스팅 제거 = 다형성 활용**.
340
+ - **sealed vs enum = 필요한 만큼만**. *멤버 별 데이터 차이 없으면 enum*. *코드 이해 시 *왜 sealed 인가* 의문 = 인지 비용*.
341
+ - **bidirectional dependency = 부모-자식 결합도 증가 + SRP 위반** — 학생 자가 학습 + 해소.
342
+ - **Demeter + 위임 메서드** — *a.b.c.d 점 체인 회피*.
343
+ - **scope function 함정 — let의 null 반환 시 run 도 실행** — *디버깅 어려움*.
344
+ - **랜덤 요소 최소화 = 카드 한 장 가져오는 인터페이스** — *position 인자는 외부 책임 노출*. *현재 DeckManager.resetDeck + drawCard(position)* 는 *외부 제어 표면*. *진짜 인터페이스 = `fun draw(): Card`*.
345
+ - **명명 = 의미 표현** — *`newCardHolder` (print용 람다인지 알기 어려움)*, *`from / of` 경계 명료*, *BlackjackState vs Blackjack 모호*.
346
+ - **추상화 = 공통의 요소 뽑기** — *Player/Dealer 의 shouldDrawCard 공통 메서드 다형성 시도* + *Game 객체 분리 권고*.
347
+ - **`라면 끓이기` 비유 = 함수 이름이 *과정 설명* X, *결과/의도* O** — *카드의 합산 가져오기 / 손계산하기 한 단어*.
348
+ - **단일 책임 (`Card.create` vs `companion val card` 중복)** — *불필요한 코드 다듬기*.
349
+
350
+ ## 대표 인용
351
+
352
+ **말리빈 (sealed vs enum, GameResult.kt:10):**
353
+ > enum은 말씀해주신 위 장점이 존재하지 않았나요?
354
+ > ...
355
+ > 특별하게 장점을 살리고 있지 않다면, 저는 필요한 부분만 가져가는 것이 코드를 이해하는 데 불필요한 생각이 들지 않게 해준다 생각해요.
356
+ > 이렇게 할거면 왜 enum을 쓰지 않았지? 라는 의문을 들게하는 것 부터, 코드를 이해하는 데 벌써 한 번의 멈춤이 생겼다고 생각해요.
357
+ > 저는 최대한 필요에 의해 코드를 구성하는 것을 선호해요 :)
358
+
359
+ **말리빈 (랜덤 요소 최소화 + 인터페이스 추상화, DeckManager.kt:7):**
360
+ > 이전 피드백에 이어서,
361
+ > 기대한 인터페이스는 카드 단 한장만을 가져오는 메서드만 가진 인터페이스였어요.
362
+ > ```kotlin
363
+ > interface ~ {
364
+ > fun getCard(): Card
365
+ > }
366
+ > ```
367
+ >
368
+ > 랜덤의 요소를 최소화해본다 라는 것에 가장 많이 고민해보세요.
369
+ > reset은 랜덤의 요소였을지, position은 랜덤의 요소였을지 연관지어서요!
370
+ >
371
+ > 1, 2 단계 미션에서 배운 것들을 완전히 자신의 것으로 만들어보세요 :)
372
+ > 미션을 모두다 다시 한 번 구현해보는 것도 좋은 방법이 될 거예요 🙂
373
+
374
+ **말리빈 (scope function 함정, GameDeck.kt):**
375
+ > if - else 를 활용하는 것이 가독성에 더욱 도움이 되는 경우가 많아요.
376
+ >
377
+ > 또, 이런 형태를 잘못 사용하게 된다면 let 블럭과 run 블럭 모두가 실행되는 말도 안되는 상황이 발생할 수도 있어요.
378
+ > let 스코프 함수 내부에 잘못된 코드를 작성했을 때 발생하게 되겠는데요,
379
+ > 어떤 경우에 두 스코프가 다 실행 될 수 있을지 고민해보시면 좋겠어요!
380
+
381
+ **말리빈 (라면 끓이기 비유, CardHolder.kt):**
382
+ > `카드의 합산 가져오기` `손계산하기` 이 둘에 대한 이름은 한 단어를 가리키기도 하네요.
383
+ >
384
+ > `냄비에물550ml를넣고빨간가루가들어있는손바닥만한봉투를뜯어물에뿌린다음100도씨까지올려서건조된밀가루무언가를넣고3분간기다린다`
385
+ > 라는 이름보다,
386
+ > `라면 끓이기`
387
+ > 라는 이름을 지어보는 연습을 해보세요 :)
388
+
389
+ **말리빈 (Player/Dealer 공통 추상화 + Game 객체 권고, Dealer.kt):**
390
+ > 입력을 받아오기 위한 람다 등은 최대한 깊이를 깊게 가져가지 않았으면 했어요.
391
+ > 게임을 관제하는 객체를 하나 만들어둔다면 이런 람다를 도메인 깊이 알지 않을 수 있으니까요.
392
+ > 그래서 처음에 달아둔, ... 이 피드백을 남겨두기도 했었지요!
393
+ > 그렇다면 플레이어나 딜러나 그저 카드를 받기만 할 수 있는 객체가 되고, 줄 지 말 지는 게임 객체가 판단해줄 수도 있었겠지요!
394
+ > 추상화를 활용한다면 최대한 공통의 요소를 뽑아내려 고민을 많이 해보세요.
395
+
396
+ **말리빈 (bidirectional dependency, CardHolder.kt):**
397
+ > 부모가 자식을 알고 있는 형태이네요!
398
+ > 양방향 의존 관계가 생겨나기도 했구요.
399
+ > 둘은 어떤 문제점이 생길 수 있을까요?
400
+
401
+ **학생 자가 학습 (let / run 함정 자가 실험, GameDeck.kt):**
402
+ > ```kotlin
403
+ > fun main() {
404
+ > var test: Int? = 1
405
+ > test?.let {
406
+ > println("let 실행됨")
407
+ > test = null
408
+ > null
409
+ > } ?: run {
410
+ > test = 1
411
+ > println("run 실행됨")
412
+ > }
413
+ > println(test)
414
+ > }
415
+ > ```
416
+ > let과 run 블럭 모두 실행되는 경우가 위 상황처럼 let에서 null을 반환하는 경우일까요?!
417
+ > 위 같은 오류가 발생할 수 있다고 판단하여 수정했습니다!
418
+
419
+ **학생 자가 답변 (sealed → enum 자가 후퇴, GameResult.kt:10):**
420
+ > 맞습니다ㅠㅠ 제가 잘못알고있었습니다 위에 sealed interface는 특별하게 장점을 살리고 있지는 않은 것 같습니다.
421
+ > 그러나 추후에 BlackjackWin 상태일 때만 특정 데이터를 전달해야하는 경우에는 유요할 것 같습니다!
422
+ > ...
423
+ > 저도 말리빈처럼 왜라고 말했을 때 답하는 것을 중요시하는데 위 부분에서 sealed class의 장점을 살리지 못한다면 enum으로 수정해야할 것 같습니다!
424
+
425
+ **학생 자가 답변 (bidirectional dependency 해소, CardHolder.kt):**
426
+ > 부모와 자식간에 결합도가 증가하여 유지보수가 힘들어질 것 같습니다! 단일 책임 원칙도 위반 될 것으로 보입니다! 의존성을 제거하고 코드를 간소화했습니다!
427
+
428
+ **학생 자가 답변 (Player/Dealer 추상화 한계 + 추가 학습 의지, Dealer.kt):**
429
+ > 흠 공통으로 갖고 있어서 interface를 통해 추상화하려고 했지만.. Dealer의 shouldDrawCard는 본인의 카드 점수 합에 따라서 값이 달라지고 Player의 shouldDrawCard는 사용자의 입력에 따라서 달라지기 때문에 추상화가 쉽지 않은 것 같습니다!
430
+ > ...
431
+ > 저도 그것에 대해서 고민이 많았고 해결하고 싶었지만 해결하지 못했네여ㅠㅠ 좀 더 고민해보겠습니다! 감사합니다!!
432
+
433
+ ## 얻은 교훈
434
+
435
+ 1. ***State 패턴 정공 = sealed + 다형성 + 외부 if 0개***. *Running (Hit) → Finished (Blackjack/Bust/Stay)* 계층 + *calculate/profit 메시지 다형성*. *호출자가 if (state is X) 분기 0개* 가 *State 패턴 핵심*. PR #136·#152·#133·#131 와 같은 결.
436
+
437
+ 2. ***sealed vs enum = 필요한 만큼만***. *멤버 별 데이터 차이 없으면 enum 충분*. *sealed = 멤버 별 다른 데이터/메서드 가능*이 진짜 장점. *"왜 sealed?"* 의문 자체가 *코드 이해 비용*. **MCP 룰 후보 — `sealed-without-differentiation`**. PR #136 (밀러 2단계) 의 *sealed class 선택 근거 명시* 와 *반대 트레이드오프*.
438
+
439
+ 3. ***bidirectional dependency = 부모-자식 결합도 증가 + SRP 위반***. *부모가 자식 알고 있는 형태* = *수정의 파급 범위 ↑*. *DIP* 위반 가능성. 학생 자가 학습 + 해소 모범. **MCP 룰 후보 — `bidirectional-dependency`**.
440
+
441
+ 4. ***Kotlin scope function 함정 — `let의 null 반환 시 elvis run 도 실행`*** — *Java non-null 가정 오류 + 디버깅 어려움*. *학생 자가 실험 + 검증 모범*. **MCP 룰 후보 — `let-run-elvis-pitfall`** (Kotlin 한정).
442
+
443
+ 5. ***랜덤 요소 최소화 = 카드 한 장 받는 인터페이스***. *`fun draw(): Card`* 단일 메서드. *position 인자, reset 메서드* 는 *외부 책임 노출 + 랜덤 요소 X*. *DeckManager 의 진짜 책임 = 카드 한 장 제공*. *진짜 추상화 = 가장 단순한 메시지*. PR #108·#133·#136 와 같은 결.
444
+
445
+ 6. ***도메인 vs View 책임 = 문자열 파싱은 View, 검증은 도메인***. *PR #93 학생 자가 학습 + 후속 반영*. PR #132·#133·#88 와 같은 결의 *View 의도 표현*.
446
+
447
+ 7. ***`라면 끓이기` 비유 = 함수 이름은 결과/의도, 과정 설명 X***. *`카드의 합산 가져오기` vs `손계산하기`* 한 단어 가리키면 *합치기*. *Kotlin 어휘에서 *짧고 의미 있는 이름** 정공. PR #128·#114 의 *vagueName 안티패턴* 과 *반대 방향*.
448
+
449
+ 8. ***명명 모호함 (`BlackjackState` vs `Blackjack`)*** — *개발자가 내부 구현 봐야 차이 알면 명명 실패*. *State 로 변경* 자가 반영 → *1단계 피드백 회귀*. PR #128·#136·#88 와 같은 결의 *naming = 책임 표현*.
450
+
451
+ 9. ***`UserInfo` 만능 명사 = vagueName 변형***. *Information* 어휘는 *책임이 안 잡힌 곳에 등장*. *Player(nickname, betAmount)* 직접 인자가 *명시*. 다만 *Player + Dealer 공통 정보 응집* 시 정당화 가능. PR #88·#125·#114 의 *vagueName 안티패턴 확장*.
452
+
453
+ 10. ***`Running.calculate = Lose` silent failure***. *진행 중 상태에서 결과 메서드 호출 시 무조건 Lose 반환*. *throw IllegalStateException 가 정공*. *PR #152 (모찌 2단계) 의 Hit.profit throw* 와 *반대 트레이드오프*. *silent = 디버깅 어려움*.
454
+
455
+ 11. ***`Bust.earningRate` Dead code 가능성 = State 추상 메서드 통일 부작용***. *Bust.calculate = Lose → Finished.profit 의 `is Lose → -betAmount` 분기 → earningRate 미사용*. *추상 메서드 계약 일관성 vs 실 사용 일치성* 트레이드오프.
456
+
457
+ 12. ***고차함수 + 명시적 인터페이스 = 입력 콜백 추상화***. *`drawCard(card: () -> Card, shouldDrawCard: () -> Boolean, showPlayerCards: (CardHolder) -> Unit)`* 3 콜백 인자. *PR #132 (환노) 의 고차함수 시도 + 깊이 문제* 와 *비슷한 트레이드오프* — junjange 는 *적정 깊이로 안착*.
458
+
459
+ 13. ***`Hit.draw(card)` 가변 변경 + 새 State 반환 = 불변 표면 + 깊은 가변***. PR #85 (하디 2단계) 와 같은 결. *완전 불변 = Hand(cards + card) 새 Hand 생성*. *현재 hand.add(card) 가변 호출 → 같은 hand 참조 새 State* = *호출자 혼란 가능성*.
460
+
461
+ 14. ***`return@repeat` = continue 의미, Kotlin repeat 에는 break 없음***. *Ace 보정 패턴 정확*하지만 *break 의도 모호*. *while loop* 이 *break 의도 명시*. *Kotlin 어휘 미숙자 함정*.
462
+
463
+ 15. ***Card.cards companion val = 전역 카드 풀 위치 모순***. *Card = 1장* 인데 *Card.cards = 52장 풀*. *DeckManager.STANDARD_DECK* 또는 *Deck companion val* 이 자연. PR #108·#133 와 같은 결.
464
+
465
+ 16. ***학생 자가 학습 + 자가 실험 (let/run 검증 코드) + 자가 후퇴 (sealed → enum) = 학습 가시화 최고 수준***. *말리빈 깊은 진단 → 학생 자가 검증/실험 → 자가 결론 + 후속 반영* 흐름이 *모범 학습*. PR #128·#135·#108·#133·#136 와 같은 결의 학생 자가 토론 풍부 패턴.