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,540 @@
1
+ # PR #136 — [블랙잭 2단계] 밀러 미션
2
+
3
+ - **Reviewee:** [@oungsi2000](https://github.com/oungsi2000)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/136
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @Gyuil-Hwnag (두루)
7
+ - **라인 코멘트:** 20 스레드 / 48 코멘트 — 학생 자가 학습 (엘레강트 오브젝트) 풍부 + 두루의 메타 질문 다수
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`sealed class BlackJackRule<T : Participant>` + `Bust` / `BlackJack` / `Stay` subtypes — State 패턴 정공 (sealed)** — *닫힌 계층 = 컴파일러 보장 + 외부 구현 차단*. 1단계 *함수형 분기*에서 *상태 객체 다형성*으로 자가 학습 후속. *제네릭 (`<T : Participant>`)* 으로 *Player/Dealer 타입 구분* — 진보된 Kotlin 어휘 활용. PR #152 (모찌 2단계) 의 *interface State* 와 비교: *sealed* 가 정공.
12
+ - **`BlackJackRule(participant)` 팩토리 함수 (`@Suppress("FunctionName")`)** — *클래스와 동일 이름의 함수 = Kotlin pseudo-constructor 패턴*. `BlackJackRule(participant)` 호출 시 *isBust / isBlackJack / else (Stay)* 분기로 *적절한 subtype 반환*. *Caller 가 마치 생성자처럼 사용*. **`@Suppress("FunctionName")`** 으로 *PascalCase 함수* 의도 명시. PR #108 (시아 1단계) 의 *Card.invoke* 함정 회피 — *별도 함수명 + 명시적 자유함수* 가 *생성자 모호함 회피*.
13
+ - **상태 메시지 다형성 — `compare(other: BlackJackRule<out Participant>): GameResult` 가 sub-type 별로 다른 구현**:
14
+ ```kotlin
15
+ // BlackJack
16
+ override fun compare(other) = if (other is BlackJack) DRAW else WIN
17
+ // Bust
18
+ override fun compare(other) = LOSE
19
+ // Stay
20
+ override fun compare(other) = when {
21
+ other is BlackJack -> LOSE
22
+ other is Bust -> WIN
23
+ else -> Score(participant).compare(Score(other.participant))
24
+ }
25
+ ```
26
+ *Tell-Don't-Ask 정공* — *상태 객체가 자기 입장 비교 결과* 직접 반환. *Bust 는 무조건 LOSE* (블랙잭 룰 정확). PR #152·#133·#131·#132 와 같은 결.
27
+ - **`GameResult` enum + `sign: Int`** — WIN(1) / LOSE(-1) / DRAW(0) 부호 일급화. *수익률 = sign × multiplier* (BlackJack은 1.5, Stay는 1.0). *룰 표 = enum 부가 속성*. PR #132 (환노 2단계) 의 `earningRate: Double` 와 비슷한 결.
28
+ - **`Score` data class + `operator fun compareTo(Score)` + `operator fun compareTo(Int)`** — *Score 비교 = Score 와 Int 둘 다 지원*. `score > 21` / `score < otherScore` 자연 표현. *value class 안 쓰고 data class* — *constructor 오버로딩 (`Score(List<Card>)` + `Score(Participant)`)*. *Kotlin 연산자 어휘 활용*.
29
+ - **`Score.calculateTotalSum` Ace 처리 패턴 — `while (sum > 21 && aceCount > 0) sum -= (11 - 1)`** — *Ace 11 기본 + while 차감* 패턴. *Ace 다수 정확* (각 Ace 11 → 1 점진적). PR #128·#135·#114·#125·#108·#131 와 같은 결. *내부적으로 Ace 1↔11 양가성*.
30
+ - **`Score(Participant)` 보조 생성자 — Score 가 Participant 의존 가능** — *Score 객체에 Participant 인자* = *`Score(participant.getCards())` 의 syntactic sugar*. *호출 편의 + 코드 길이 ↓*. 다만 *Participant 가 Score 알아야 호출 → Score 가 Participant 알아야 생성* = *순환 의존 신호* (못한 점 §3).
31
+ - **`NullableRetry` / `ThrowableRetry` interface — 입력 재시도 추상화** — 1단계 lotto 의 *sealed class 예외 처리* 경험 반영 + *AOP-like retry 인터페이스* 도입. 학생 자가 인용: *"엘레강트 오브젝트의 4.2에서 재시도 로직은 aop로 처리하면 깔끔하다는 내용이 있어 비슷하게 구현하려고 시도해봤어요."* 두루 자가 답변: *"구현해주신 내용 아주 좋습니다👍"*.
32
+ - **`BlackJackPair` data class (Player + Dealer)** — *카지노 매치 단위* 일급화. *Controller 가 입력받은 플레이어 + 딜러 묶음*. PR #131·#132 와 같은 결의 *PlayerGroup*.
33
+ - **`Participant.isBlackJack` 룰 정확 — `countAce() == 1 && countScoredTen() == 1`** — *Ace 1장 + 10점 카드 1장 = 블랙잭 2장 21점*. *조합 정확* (Ace+10 / Ace+J / Ace+Q / Ace+K). 다만 *2장 size 검증 부재* (못한 점 §1).
34
+ - **엘레강트 오브젝트 자가 학습 + 본인 코드 적용** — *4.2 체크 예외만 던지세요 → ThrowableRetry 적용*. *2.2 상태 없는 행동 클래스 지양 → BlackJackResult 객체 책임 재배치*. *책 → 코드 적용 + 두루와 토론* 학습 모범.
35
+ - **`Cards → Hand` naming 자가 반영** — 두루 코멘트: *"`Cards 객체는 플레이어가 가지고 있는 카드`라는 담당하는 기능에 맞게 네이밍을 수정해보는 것도 좋을 것 같습니다!"*. 학생 자가 반영: *"Cards -> Hand로 이름을 변경하였습니다..!"* *도메인 어휘 정확성*.
36
+ - **`State → BlackJackRule` naming 자가 반영** — 두루: *"State가 담당하고 있는 것은 블랙잭의 규칙이군요. 해당 객체가 담당하고 있는 기능에 맞게 네이밍을 수정해볼 수 있을 것 같군요💪"*. 학생 자가 반영: *"BlackJackRule 로 이름을 변경하였습니다"*. *naming = 책임 표현*.
37
+
38
+ ## 못한 점 (설계 관점)
39
+
40
+ ### 1. `Participant.isBlackJack` — *2장 size 검증 부재 = 룰 invariant 누수*
41
+
42
+ ```kotlin
43
+ fun isBlackJack(): Boolean {
44
+ return innerHand.countAce() == 1 && innerHand.countScoredTen() == 1
45
+ }
46
+ ```
47
+
48
+ → **`countAce + countScoredTen == 2` 의 *카드 2장 강제 부재***. *Ace 1장 + 10점 카드 1장 + 다른 카드* 도 *조건 통과*. 예: *A♠ K♥ 2♣* — *countAce=1, countScoredTen=1, sum=13(A=11)→13(<=21 OK)*. *isBlackJack=true* 인데 *블랙잭 룰 = 2장 21*. *실제로 게임에서 *블랙잭은 초기 2장 후만 판정*이므로 *3장 도달 전에 분기*하면 누락 없음. 다만 *Hand 자체*가 *블랙잭 invariant 강제 안 함*.
49
+
50
+ *명시적 검증*:
51
+
52
+ ```kotlin
53
+ fun isBlackJack(): Boolean {
54
+ return innerHand.size() == 2 && countAce() == 1 && countScoredTen() == 1
55
+ }
56
+ ```
57
+
58
+ 이 *컴파일 타임 + 런타임 invariant 보장*. 두루 코멘트는 없으나 *룰 정확성 신호*.
59
+
60
+ ### 2. `BlackJackRule.compare` 가 *`is BlackJack`/`is Bust` 타입 검사* — *sealed when exhaustive 미활용*
61
+
62
+ ```kotlin
63
+ // Stay
64
+ override fun compare(other: BlackJackRule<out Participant>): GameResult {
65
+ if (other is BlackJack) return GameResult.LOSE
66
+ if (other is Bust) return GameResult.WIN
67
+ return Score(participant).compare(Score(other.participant))
68
+ }
69
+
70
+ // BlackJack
71
+ override fun compare(other) = if (other is BlackJack) DRAW else WIN
72
+
73
+ // Bust
74
+ override fun compare(other) = LOSE
75
+ ```
76
+
77
+ → **`if (other is BlackJack)` / `if (other is Bust)` 타입 검사 = *sealed when exhaustive 미활용***. *`sealed class BlackJackRule`* 인데 *when (other)* 패턴 매칭이면 *컴파일러가 모든 분기 강제*. 현재 *if-return* 은 *Stay 와의 비교* (else fallback) 누락 시 *런타임 발견*.
78
+
79
+ ```kotlin
80
+ override fun compare(other) = when (other) {
81
+ is BlackJack -> GameResult.LOSE
82
+ is Bust -> GameResult.WIN
83
+ is Stay -> Score(participant).compare(Score(other.participant))
84
+ }
85
+ ```
86
+
87
+ 이 *sealed 의 장점 = 새 상태 추가 시 모든 compare 함수 컴파일 오류*. *현재 if-return* 은 *새 subtype 추가 시 누락 가능*.
88
+
89
+ ### 3. `Score(Participant)` 보조 생성자 — *순환 의존 신호*
90
+
91
+ ```kotlin
92
+ // Score
93
+ data class Score(private val cards: List<Card>) {
94
+ constructor(participant: Participant) : this(participant.getCards())
95
+ ...
96
+ }
97
+
98
+ // Participant
99
+ fun canHit(): Boolean = Score(this) < hitThreshold
100
+
101
+ fun isBust(): Boolean = Score(innerHand.toList()) > BLACKJACK_BUST_LIMIT
102
+ ```
103
+
104
+ → **Score → Participant 의존 + Participant → Score 의존 = 순환**. *Score 는 카드 점수 계산* + *Participant 는 자기 점수 (Score) 알림*. *Participant.score(): Score* 메시지가 *Tell-Don't-Ask* 정공. *현재 Score 가 Participant 인자 받음 + Participant 도 Score 생성* 양방향.
105
+
106
+ *해결*:
107
+ - *Score 가 Participant 모름* (`Score(List<Card>)` 만) + *Participant.score() = Score(cards)* 위임
108
+ - *Score 가 도메인 의식 X + 단순 점수 객체*. *Participant 가 자기 카드로 Score 생성*만.
109
+
110
+ PR #131 (다이스 2단계) 의 *Score private constructor + Score.create(cards)* 와 같은 결 — *순환 회피*. 현재는 *순환 의존* — *학습 가시화 의도*인지 *우연*인지 모호.
111
+
112
+ ### 4. `Score.compare(other): GameResult` 의 `else throw IllegalStateException` — *도달 불가 명시*
113
+
114
+ ```kotlin
115
+ fun compare(other: Score): GameResult {
116
+ return when {
117
+ this > other -> GameResult.WIN
118
+ this < other -> GameResult.LOSE
119
+ this.isEqualTo(other) -> GameResult.DRAW
120
+ else -> throw IllegalStateException("")
121
+ }
122
+ }
123
+ ```
124
+
125
+ → **`>` / `<` / `==` 3 분기 + else throw** — *논리적으로 3 분기 모든 경우 처리*. *else 도달 불가*. *`when { ... }` exhaustive 보장이 Kotlin 컴파일러*에선 *Int 비교의 경우 자동 보장 X* — *명시적 else 또는 if/else if* 필요. 현재 *throw* 는 *도달 불가 명시* 패턴. 다만 *throw 의미가 모호 (`""` 빈 메시지)*. *`UnreachableException` / `error("...")`* 가 *의도 명시*.
126
+
127
+ 또한 *`this.isEqualTo(other) -> DRAW`* 가 *value 비교* — *`this > other == false && this < other == false`* 이면 *값 동등* 이므로 *isEqualTo 도 true*. *3 분기 자체가 중복*. *`compareTo(other).sign` 로 -1/0/1 → enum 매핑* 이 1줄.
128
+
129
+ ### 5. `Score(this)` Participant 인자 매 호출 — *불필요한 객체 생성*
130
+
131
+ ```kotlin
132
+ // Participant
133
+ fun canHit(): Boolean = Score(this) < hitThreshold // 매 호출 새 Score 객체
134
+
135
+ fun isBust(): Boolean = Score(innerHand.toList()) > BLACKJACK_BUST_LIMIT // 매 호출 새 Score
136
+ ```
137
+
138
+ → **`Score(this)` / `Score(innerHand.toList())` 매 호출 새 객체** — *Score data class* 라 *equals/hashCode* 정합이지만 *불변 객체로서 매번 새 인스턴스*. *Hand 변경 안 되면 같은 Score* — *캐싱 가능*. 다만 *Score 가 cards.list 보유 + Hand 가 가변* 이므로 *Score(this) 가 매번 다른 카드 리스트*. *현재 Hand.add 시 Score 다음 생성 = 다른 점수*.
139
+
140
+ *성능보다 의미 명료성* 측면 — *Participant.score(): Score* 가 *자기 점수 메시지* 가 더 자연. *Score(this)* 가 *Participant 외부에서 Score 생성*도 가능하지만 *호출자가 Score 직접 다룸* 패턴.
141
+
142
+ ### 6. `BlackJackRule.getEarnRate(gameResult: GameResult)` — *Bust 입장 비대칭*
143
+
144
+ ```kotlin
145
+ // BlackJack
146
+ override fun getEarnRate(gameResult: GameResult): Double = 1.5 * gameResult.sign
147
+
148
+ // Stay
149
+ override fun getEarnRate(gameResult: GameResult): Double = gameResult.sign * 1.0
150
+
151
+ // Bust
152
+ override fun getEarnRate(gameResult: GameResult): Double = -1.0 // ⚠ gameResult 무시
153
+ ```
154
+
155
+ → **Bust 는 `getEarnRate(gameResult)` 인자 무시 + 항상 -1.0**. *Bust 는 항상 LOSE* 룰 정합. 다만 *`getEarnRate(GameResult.WIN)`* 같은 *불가능 호출*도 *-1.0* 반환 — *함수 시그니처가 호출자에게 misleading*. *Bust.compare(other) = LOSE* 만 호출되므로 *getEarnRate(LOSE) 만 정합* — *런타임 보장*은 *현재 사용 흐름* 의존.
156
+
157
+ *해결*: *Bust.getEarnRate() (인자 없음)* 시그니처. 다만 *오버라이드 호환성 깨짐*. *세 subtype 시그니처 통일 vs Bust 안전성* 트레이드오프. *현재 통일* 선택.
158
+
159
+ 또한 *`gameResult.sign * 1.0`* (Stay) = *`gameResult.sign.toDouble()`*. *× 1.0* 곱셈은 *명시적 Double 변환 의도* 인지 *불필요한 곱셈*인지 모호.
160
+
161
+ ### 7. `Player.bettingAmount: Int = 0` default + `require(bettingAmount > 0)` 모순
162
+
163
+ ```kotlin
164
+ class Player(val name: String, val bettingAmount: Int = 0) : Participant() {
165
+ init {
166
+ require(name.isNotEmpty()) { INVALID_NAME }
167
+ require(bettingAmount > 0) { INVALID_BETTING_AMOUNT }
168
+ }
169
+ ...
170
+ }
171
+ ```
172
+
173
+ → **default = 0 + require > 0 모순** — *`Player(name)` 호출 시 *bettingAmount = 0 → require 실패***. *default 값 자체가 invalid*. *Kotlin default value 는 유효한 값* 이어야 함. *default 제거* (`val bettingAmount: Int`) 가 *호출자 강제 명시*. *PR #131 (다이스) 의 기본 생성자 지양* 권고와 같은 결.
174
+
175
+ ### 8. `BlackJackGame.run()` 의 *if + outputView 분기* — *Tell-Don't-Ask 부분 위반*
176
+
177
+ ```kotlin
178
+ fun run() {
179
+ eachPlayerHitOrNot()
180
+ if (pair.dealer.needsAdditionalCard()) {
181
+ outputView.printDealerHaveAdditionalCard()
182
+ }
183
+ addDealerCard()
184
+ }
185
+ ```
186
+
187
+ → **`if (pair.dealer.needsAdditionalCard())` 가 *외부 분기 + 출력* + `addDealerCard()` 가 *내부 루프***. *Dealer 의 추가 카드 받는 흐름*이 *외부 if 분기 + 내부 while*로 *책임 분산*. *`Dealer.takeAdditionalCards(deck, onAdditionalNeeded: () -> Unit)`* 같은 *콜백 메시지*면 *if 분기 사라짐*. PR #131·#132·#152 와 같은 결.
188
+
189
+ 또한 `needsAdditionalCard()` 와 `canHit()` 의 차이 모호:
190
+
191
+ ```kotlin
192
+ // Dealer
193
+ fun needsAdditionalCard(): Boolean = Score(this) < DEALER_HIT_THRESHOLD // < 17
194
+
195
+ // Participant
196
+ fun canHit(): Boolean = Score(this) < hitThreshold // < 17 (Dealer)
197
+ ```
198
+
199
+ → *완전 동일 의미 + 다른 이름* = *naming 중복*. *둘 다 *Dealer 가 17 미만일 때 true**. *`canHit` 한 가지로 통일* 또는 *`needsAdditionalCard`* 만 노출이 자연.
200
+
201
+ ### 9. `handlePlayerHit` 의 *while + boolean 분기 + break*
202
+
203
+ ```kotlin
204
+ private fun handlePlayerHit(player: Player) {
205
+ while (player.canHit()) {
206
+ val result = inputView.askPlayerHit(player.name)
207
+ if (result) {
208
+ player.addCard(deck.draw())
209
+ outputView.printPlayerCards(player)
210
+ } else {
211
+ break
212
+ }
213
+ }
214
+ }
215
+ ```
216
+
217
+ → **`Boolean` 반환 input → if + break + while** — Kotlin 어휘 `do-while` + *`break` 위치 모호* (else 안). *Player.takeTurns(askHit: () -> Boolean, ...)* 같은 *콜백 패턴*이 더 응집. PR #132 (환노) 의 *고차함수 시도 + 인터페이스* 토론과 같은 결.
218
+
219
+ 또한 `inputView.askPlayerHit(player.name)` 가 *Boolean 반환* — *플레이어 행동 = "예/아니오"* 만 가정. PR #132 의 *ActionType enum + InputView 다형성* 권고 (페로로 진단) 와 같은 결.
220
+
221
+ ### 10. `Score.value: Int get() = calculateTotalSum()` — *매 호출 재계산*
222
+
223
+ ```kotlin
224
+ data class Score(private val cards: List<Card>) {
225
+ val value: Int
226
+ get() = calculateTotalSum()
227
+ ...
228
+ }
229
+ ```
230
+
231
+ → **`value` getter 가 *매 호출 calculateTotalSum 재계산***. *Score 가 불변 (data class + val cards)* 인데 *getter 계산*. *`val value: Int = calculateTotalSum()`* 초기화로 *한 번만 계산* 가능. *현재 `get() = ...`* 는 *function* 의미 — *순수 함수면 캐싱 안전*.
232
+
233
+ *성능 미세* 비용. 다만 *`value` 사용처가 `compareTo` 등 다수*면 *반복 계산*. PR #131 (다이스) 의 *Score private constructor + factory* 와 *비교*: 다이스는 *생성 시 계산 + value 불변*, 밀러는 *getter 매 계산*. 둘 다 동작은 정확.
234
+
235
+ ### 11. `Score.isEqualTo` 노출 + *equals override 회피*
236
+
237
+ ```kotlin
238
+ data class Score(private val cards: List<Card>) {
239
+ ...
240
+ fun isEqualTo(other: Score): Boolean = value == other.value
241
+ ...
242
+ }
243
+ ```
244
+
245
+ 두루 (Score.kt:50 — 미해결): *"해당 함수에 대해서 외부에 드러나도록 작성을 하신 이유가 있을까요?"*
246
+
247
+ 학생 자가 답변: *"현재는 외부에서 오버로딩한 compareTo 연산자를 사용하고 있어요. 이 말은 즉 모양만 다를 뿐 사실 equals 연산자를 사용하는 isEqualTo 가 외부에서 사용될 여지가 있다고 생각했어요. 사실 equals를 재정의하려고도 생각했어요. 하지만 hashcode도 재정의 해야하며, 예제 코드로 대략 보았을 때 코드가 지저분하다고 생각하여 그냥 이름만 다른 isEqualTo 라는 메소드를 제작하는 것이 더 낫겠다고 생각이 들었네요. 두루의 생각은 어떤가요?"*
248
+
249
+ 두루 후속: *"그런 이유였군요~ 그렇다면 좋습니다!👍"*
250
+
251
+ → **`equals` 재정의 vs `isEqualTo` 별도 메서드** — *Kotlin data class 는 equals 자동* (val cards 기반). *Score.value 동등성 ≠ cards 동등성*. 예: *cards = [A♠, K♥]* 와 *cards = [K♠, A♥]* 가 *value 같지만 cards 리스트 다름* → *equals false, isEqualTo true*. *학생의 의도 명료* — *value 기반 비교를 별도 메서드로*.
252
+
253
+ 다만 *Score.value 가 Score 의 본질*이면 *equals 도 value 기반* 이 자연. *data class 의 equals 가 cards 기반* 은 *Score 가 카드 리스트 ID로 동등성 갖는다* 의미 — *블랙잭에서 카드 순서/조합과 무관한 점수 동등성*과 맞지 않음. *학생의 isEqualTo 분리 결정*은 *data class 의 equals 의도와 도메인 의미의 불일치*를 회피한 합리적 선택. 다만 *non-standard Kotlin 어휘*.
254
+
255
+ ### 12. `Score.compare(other)` 의 `else throw` + *3 분기 중복*
256
+
257
+ ```kotlin
258
+ fun compare(other: Score): GameResult {
259
+ return when {
260
+ this > other -> GameResult.WIN
261
+ this < other -> GameResult.LOSE
262
+ this.isEqualTo(other) -> GameResult.DRAW
263
+ else -> throw IllegalStateException("")
264
+ }
265
+ }
266
+ ```
267
+
268
+ → **분기 중복 + 도달 불가 throw**. *`this > other == false && this < other == false`* 이면 *값 동등* (Int compareTo 의 *trichotomy*). *isEqualTo 분기 자체 중복*. *throw 도 도달 불가* — *컴파일러 보장 부재*.
269
+
270
+ *간결화*:
271
+
272
+ ```kotlin
273
+ fun compare(other: Score): GameResult = when {
274
+ this > other -> GameResult.WIN
275
+ this < other -> GameResult.LOSE
276
+ else -> GameResult.DRAW
277
+ }
278
+ ```
279
+
280
+ 이 정공. *학생 자가 의도*는 *isEqualTo 메서드의 사용 의도 노출* 일 가능성 — *코드 가독성에 isEqualTo 등장*. 다만 *논리 중복*.
281
+
282
+ ### 13. `BlackJackPair` 인스턴스 변수 3개 회피 시도 — 학생 자가 회의
283
+
284
+ ```kotlin
285
+ data class BlackJackPair(val players: List<Player>, val dealer: Dealer = Dealer())
286
+ ```
287
+
288
+ 학생 PR 코멘트 (BlackJackPair.kt:3): *"컨트롤러에서 입력받은 플레이어와 딜러를 묶는 일급 컬렉션을 생성했어요! 여기에 사실 deck 도 넣고싶었지만 인스턴스 변수는 3개 미만이어야 해서.... 그런데 의문이 가는 점이 있어요. 다른 모든 부분은 인스턴스 변수를 3개 미만으로 줄였지만, 컨트롤러와 블랙잭 게임 객체는 view를 주입받아 어떻게 하더라도 3개 미만으로 못 줄이겠더라고요.. 굳이 3개 미만으로 줄인다면 view를 주입하는 것이 아닌 직접 blackjackView에 접근하도록 해야 할 것 같아요. 엘레강트 오브젝트의 해당 내용을 본다면 이는 잘못된 방법 같아요."*
289
+
290
+ 두루 답변: *"맞아요...😅 실제로 구현을 하면서 변수가 3개 미만으로만 규정을 하기는 정말 힘든 부분이 많습니다. 특히나, Controller 와 BlackJackGame 에서는 무지하게 힘듭니다. 맞추려다보면 어거지로 객체를 끼워넣는 방식이 될 수 있어요. 그래서 저도 왠만하면, Controller 와 BlackjackGame 부분에 대해서는 변수에 대한 제한에 대해서 별말을 하지 않았긴 합니다!"*
291
+
292
+ 두루 후속: *"해당 객체를 없앨 수 있는 방법은 한가지가 있긴 합니다. ... `BlackjackGame.run()`으로 블랙잭 게임을 실행시켜보도록 하는 것은 어떨까요? ㄴ 이말은 BlackJackGame 이라는 Controller 역활을 하는 객체를 만들어보길 원했어요. GameController 라는 것이 존재하고 해당 GameController 에서는 여러 게임들을 실행 시킬 수 있으며, 해당 Controller 에서는 `게임객체.run()`으로 실행이 가능하도록 한다!"*
293
+
294
+ → **3 변수 제약 자가 회의 + 두루 답변 = 제약 vs 현실의 트레이드오프 학습**. PR #133 (시아 2단계) 의 *말리빈 "연습 도구"* 진단과 같은 결. *Controller/Game 객체에서 변수 줄이기 어려움* 이 *제약의 한계*. *해결 = GameController + Game 분리* 패턴.
295
+
296
+ ### 14. `BlackJackGame` 4 인스턴스 변수 (`pair`, `deck`, `outputView`, `inputView`) — *Controller god-object*
297
+
298
+ ```kotlin
299
+ class BlackJackGame(
300
+ private val pair: BlackJackPair,
301
+ private val deck: Deck,
302
+ private val outputView: BlackJackOutputView,
303
+ private val inputView: BlackJackInputView,
304
+ ) {
305
+ fun setUp() { ... }
306
+ fun run() { ... }
307
+ fun eachPlayerHitOrNot() { ... }
308
+ private fun addDealerCard() { ... }
309
+ private fun setInitialPlayerCards(players) { ... }
310
+ private fun handlePlayerHit(player) { ... }
311
+ }
312
+ ```
313
+
314
+ → **4 변수 + 6 메서드** — *BlackJackGame 가 *게임 진행 + 입출력 인터페이스 직접 의존**. PR #131·#132·#133 와 같은 결의 *Engine/Game god-object*. *Controller 가 입출력 + Game 이 도메인* 의 *명시적 분리*는 *Game(inputCallback, outputCallback)* 같은 *콜백 주입* 패턴.
315
+
316
+ 두루의 *GameController + Game 분리* 권고가 그 정공 — *Controller = 진입점 + Game 객체 호출, Game = 도메인 자기 진행*. *현재 BlackJackGame = Controller + Game 합쳐짐* — *책임 흡수*.
317
+
318
+ ### 15. `Hand.size(): Int` 메서드 + *isBlackJack 에 size 검증 부재 (못한 점 §1과 정합)*
319
+
320
+ ```kotlin
321
+ class Hand {
322
+ private val cards = mutableListOf<Card>()
323
+ ...
324
+ fun size(): Int { return cards.size }
325
+ }
326
+ ```
327
+
328
+ → **`Hand.size()` 메서드 존재 + Participant.isBlackJack 에서 사용 안 함**. *2장 검증* 가능했음. *`innerHand.size() == 2 && countAce() == 1 && countScoredTen() == 1`* 한 줄 추가가 *룰 invariant 강제*.
329
+
330
+ ### 16. `Dealer.getOpenedCard(): Card` — *공개 룰을 Dealer 메서드로 명시*
331
+
332
+ ```kotlin
333
+ class Dealer : Participant() {
334
+ ...
335
+ fun getOpenedCard(): Card {
336
+ return innerHand.toList().first() // ⚠ 첫 카드만 공개
337
+ }
338
+ }
339
+ ```
340
+
341
+ → **`getOpenedCard()` = *첫 카드만 공개* 룰 메서드 노출**. *블랙잭 공개 룰 정확*. *Dealer.openedCards: List<Card>* 메서드면 *Player.openedCards: List<Card> = cards* 일관성 가능 (PR #132 환노 의 `getInitCard()` 다형성과 같은 결). *현재 Dealer만 getOpenedCard* — *Player 측 동일 메시지 부재 비대칭*.
342
+
343
+ ### 17. `BlackJackRule(participant)` factory function — *@Suppress("FunctionName") + 클래스와 동일 이름*
344
+
345
+ ```kotlin
346
+ @Suppress("FunctionName")
347
+ fun <T : Participant> BlackJackRule(participant: T): BlackJackRule<T> {
348
+ return when {
349
+ participant.isBust() -> Bust(participant)
350
+ participant.isBlackJack() -> BlackJack(participant)
351
+ else -> Stay(participant)
352
+ }
353
+ }
354
+
355
+ sealed class BlackJackRule<T : Participant> { ... }
356
+ ```
357
+
358
+ → **함수 이름 = 클래스 이름 (PascalCase) + @Suppress("FunctionName") 으로 lint 우회**. *Kotlin pseudo-constructor pattern* — *호출자는 `BlackJackRule(player)` 가 마치 생성자처럼 보임*. *invoke operator 의 대안* — *invoke 와 달리 confusion 명시 회피* (@Suppress 가 *고의 패턴* 명시).
359
+
360
+ 다만 *팩토리 함수 표준 어휘 (`BlackJackRule.from(participant)`, `BlackJackRule.of(participant)`)* 와 *다른 표현*. *Kotlin pseudo-constructor* 는 *드물지만 인정된 패턴* — Kotlin stdlib 의 *`buildList`, `MutableList<T>(...)`* 등이 비슷한 패턴. *블랙잭 도메인에서 정당화 가능*. PR #108·#133 의 *Card.invoke* 함정 회피 의도.
361
+
362
+ ### 18. `Stay` subtype 의 `else -> Score(...).compare(...)` — *순환 호출 가능성*
363
+
364
+ ```kotlin
365
+ // Stay
366
+ override fun compare(other: BlackJackRule<out Participant>): GameResult {
367
+ if (other is BlackJack) return GameResult.LOSE
368
+ if (other is Bust) return GameResult.WIN
369
+ return Score(participant).compare(Score(other.participant))
370
+ }
371
+ ```
372
+
373
+ → **`other is Stay` 일 때 `Score(participant).compare(Score(other.participant))`** — *Stay vs Stay 비교 = 점수 비교*. *Score.compare = WIN/LOSE/DRAW 반환*. *BlackJackRule.compare → Score.compare* 호출 순서 명료. 순환 없음.
374
+
375
+ 다만 *Score.compare 가 GameResult 반환*이라 *BlackJackRule.compare 가 Score 의존*. *책임 분리 명확* — *상태 비교 분기 (BlackJackRule)* + *점수 비교 (Score)*. PR #131 (다이스 2단계) 의 *Score 객체 분리* 와 같은 결.
376
+
377
+ ### 19. `Player.canHit() = Score(this) < hitThreshold` — *Bust 도달 시 자동 false*
378
+
379
+ ```kotlin
380
+ // Participant
381
+ fun canHit(): Boolean = Score(this) < hitThreshold
382
+ ```
383
+
384
+ → **Score 가 21 이상이면 canHit = false** — *21 == hitThreshold 이면 canHit = false* — *Player threshold = 21, Dealer threshold = 17*. *Player 가 정확히 21 도달*하면 canHit = false (자동 STAY). *Bust (>21) 도 canHit = false*. *블랙잭 룰 정합*.
385
+
386
+ 다만 *블랙잭 (2장 21)* 은 *카드 받은 후 자동 STAY* 가 자연. *handlePlayerHit while (player.canHit())* 가 *블랙잭 도달 시 자동 종료* — 정확. *블랙잭 vs Stay 의 BlackJackRule 분리*는 *결과 계산 시* 만 의미.
387
+
388
+ ### 20. `BlackJackInputView` / `BlackJackOutputView` interface 미공개 — *추정 인터페이스*
389
+
390
+ 본 PR 내용은 `BlackJackGame` 이 interface 의존하나 *구체 코드 미공개*. 1단계 lotto 학습 + 두루 권고 반영 추정.
391
+
392
+ ### 21. `setInitialPlayerCards(players: List<Player>)` 가 *Player 만* — *Dealer 별도 분배*
393
+
394
+ ```kotlin
395
+ fun setUp() {
396
+ pair.dealer.setInitialCard(deck)
397
+ setInitialPlayerCards(pair.players)
398
+ outputView.showInitialCards(pair)
399
+ }
400
+ ```
401
+
402
+ → **Dealer 와 Players 분리 분배**. *PR #132 (환노) 의 *모든 참여자 forEach + 다형성** 과 *다른 트레이드오프* — *Dealer 와 Player 의 분배 차이 명시*. *현재 둘 다 setInitialCard 같은 메시지* → *분리 의의 모호*. *통일 가능*.
403
+
404
+ 또한 `setInitialCard(deck)` 가 *Participant.setInitialCard(deck)* 라 *Dealer / Player 동일 메서드*. *분리 호출* 의의 = *명시적 순서 표현 (Dealer 먼저)*. *논리적으론 동시 분배 가능*. *카지노 룰 = 딜러 먼저 1장, 플레이어 각 1장, 딜러 1장, 플레이어 각 1장* 도 있음 — *현재 코드는 모두 2장씩 한꺼번에*.
405
+
406
+ ## 리뷰어 의견 요지
407
+
408
+ - **3 변수 제약 = 연습 도구, Controller/Game 에서는 절대 룰 X** — 두루 자가 답변: *"Controller 와 BlackJackGame 에서는 무지하게 힘듭니다. 맞추려다보면 어거지로 객체를 끼워넣는 방식이 될 수 있어요. 그래서 저도 왠만하면, Controller 와 BlackjackGame 부분에 대해서는 변수에 대한 제한에 대해서 별말을 하지 않았긴 합니다!"*. PR #133 (시아) 와 같은 결.
409
+ - **GameController + Game 분리 = god-object 해결** — *Controller = 게임 객체.run() 호출자, Game = 게임 진행*. *여러 Game 을 실행시킬 수 있는 GameController* 의 *확장 안전성*.
410
+ - **State (BlackJackRule) sealed class = 닫힌 계층 보장** — *외부 구현 차단 + 컴파일러 when exhaustive*. *sealed class vs sealed interface 차이* 학생 자가 학습.
411
+ - **점수 계산 = Score 객체 분리** — *Participant 의 점수 계산 책임 누수 해소*. *Hand = 카드 관리, Score = 점수 계산*. PR #131 와 같은 결.
412
+ - **`getEarnRate` 가 Bust 입장 `gameResult.sign`을 무시 = 시그니처 misleading** — *Bust 는 항상 -1.0*. *호출 흐름 보장*이 *런타임 의존*.
413
+ - **논리적 오류 vs 비논리적 오류 자가 정의** — 학생 인용: *"논리적 오류는 사실 예외가 아닌데 오류 라는 워딩 때문에 예외라는 인식이 있는 것 같아요. 저는 개인적으로 논리적 오류라는 단어 대신 논리적 모순 이란 단어를 사용하고 싶어요."* *예외 처리 자가 학습 모범*.
414
+ - **엘레강트 오브젝트 4.2 (체크 예외) + 2.2 (상태 없는 행동)** — 학생 자가 학습 + 본인 코드 적용.
415
+ - **`isEqualTo` 별도 메서드 vs equals 재정의** — *data class 의 equals 자동 vs 도메인 의미 동등성* 트레이드오프. 학생 결정 합리.
416
+ - **`Cards` / `State` 네이밍 자가 반영 (`Hand` / `BlackJackRule`)** — *책임을 이름으로 표현*.
417
+ - **긴 변수명 > 모호한 짧은 이름** — 두루 자가 표현 (PR #131 다이스 와 같은 결).
418
+
419
+ ## 대표 인용
420
+
421
+ **두루 (3 변수 제약 의 한계, BlackJackPair.kt):**
422
+ > 맞아요...😅
423
+ > 실제로 구현을 하면서 변수가 3개 미만으로만 규정을 하기는 정말 힘든 부분이 많습니다
424
+ > 특히나, Controller 와 BlackJackGame 에서는 무지하게 힘듭니다.
425
+ > 맞추려다보면 어거지로 객체를 끼워넣는 방식이 될 수 있어요
426
+ > 그래서 저도 왠만하면, Controller 와 BlackjackGame 부분에 대해서는 변수에 대한 제한에 대해서 별말을 하지 않았긴 합니다!
427
+
428
+ **두루 (GameController + Game 분리, BlackJackPair.kt):**
429
+ > 해당 객체를 없앨 수 있는 방법은 한가지가 있긴 합니다
430
+ > 이건 제가 이전에 남겼던 코멘트에서 살짝의 힌트를 얻어볼 수 있을 것 같아요
431
+ > > `BlackjackGame.run()`으로 블랙잭 게임을 실행시켜보도록 하는 것은 어떨까요?
432
+ >
433
+ > ㄴ 이말은 BlackJackGame 이라는 Controller 역활을 하는 객체를 만들어보길 원했어요.
434
+ > GameController 라는 것이 존재하고 해당 GameController 에서는 여러 게임들을 실행 시킬 수 있으며, 해당 Controller 에서는 `게임객체.run()`으로 실행이 가능하도록 한다!
435
+ >
436
+ > 현재처럼 한가지 Controller가 있는 경우라면 그 효과는 미비하지만, 여러 Controller들이 있고 여러 Controller에서 BlackJackGame을 한다고 할때, 위와 같이 작성을 해보면 입출력이 조금씩 다르지만 언제나 동일한 블랙잭 게임을 제공할 수 있다는 장점이 있어요.
437
+
438
+ **두루 (점수 계산 분리 + 상태 인터페이스 진단, Participant.kt):**
439
+ > 저도 같은 의견이네요. 이렇게 된 이유가 무엇일까요?
440
+ > 저는 밀러의 구현을 보면, 점수 계산을 플레이어가 하는 부분에서 걸리는군요.
441
+ > 점수 계산기 or 규칙을 판별 (즉, 게임 매너저 <- 플레이어의 점수 or 결과를 계산해주는 역활)이 있다면 해결이 될 수도 있을 것 같군요💪
442
+
443
+ **학생 자가 학습 (엘레강트 오브젝트 4.2 + 예외 처리 자가 정의, Application.kt:16):**
444
+ > 엘레강트 오브젝트의 4.2 체크 예외만 던지세요 (https://jessyt.tistory.com/163)
445
+ > 부분에서 딱 한 번만 복구하세요 라는 내용이 있습니다. 이 내용을 토대로 저도 이번 코드에 적용해 보았어요!
446
+ >
447
+ > 엘레강트 오브젝트의 내용 자체는 완전 동의하지만 막상 코드로 구현하게 되니 모양이 예쁘지 않게 나오고, 던져진 예외에 맞춰서 다른 동작을 수행하려 하게 된다면 더욱 코드가 길어질 것 같다는 생각이 들었어요.
448
+
449
+ **학생 자가 학습 (논리적 오류 vs 비논리적 오류 자가 정의, GameController.kt:26):**
450
+ > 논리적 오류의 정확한 정의는 **프로그램이 강제 종료되지도 않고 의도대로 동작하지도 않는 상황** 이라고 알고 있어요
451
+ > 이를 토대로 간단하게 세울 수 있는 저만의 기준을 공유드릴게요.
452
+ >
453
+ > 논리적 오류 : 잘못된 사용자 입력 값, http요청 시 예상과 다른 페이지 반환 등 프로그래머의 의도대로 동작하지 않지만 예외는 던져지지 않는 상황
454
+ > 비논리적 오류 : 이외의 모든 프로그래머의 잘못된 사용으로 인한 예외
455
+ >
456
+ > 즉 논리적 오류는 원래 예외가 던져졌어야 할 상황에 예외가 던져지지는 않은 것이라고 할 수 있겠네요.
457
+ > 논리적 오류는 사실 예외가 아닌데 오류 라는 워딩 때문에 예외라는 인식이 있는 것 같아요.
458
+ > 저는 개인적으로 논리적 오류라는 단어 대신 논리적 모순 이란 단어를 사용하고 싶어요.
459
+
460
+ **학생 자가 답변 (sealed class vs sealed interface 자가 학습, Stay.kt):**
461
+ > sealed class 또는 sealed interface를 사용하게 된다면 상속, 또는 구현을 막을 수 있다는 장점이 있습니다! (한 패키지에서만 구현 가능)
462
+ > 두루가 말씀하신 *한 곳에서 규칙에 대해서 볼 수 있을 것 같다* 라는 부분은 저는 패키지가 그 역할을 충분히 다하고 있다고 생각해요.
463
+ > 저는 오히려 한 파일에서 몰아 보면 더 헷갈리더라고요.
464
+ >
465
+ > 현재의 BlackJackRule (이전 State 인터페이스) 은 여러 클래스에 범용적으로 사용하게끔 만든 인터페이스가 아니에요. (반대의 예시로는 이전에 설명드린 NullableRetry, ThrowableRetry 등이 있겠네요). 그렇다면 클라이언트의 악의적 구현을 막기 위해 예방 차원에서 sealed 키워드를 붙이는게 맞다고 생각했어요.
466
+ >
467
+ > 그렇다면 여기서 고민인 것이 sealed class vs sealed interface 에요.
468
+ > ...
469
+ > 제가 곰곰이 생각해보았을 때, BlackJackRule은 인터페이스보다는 추상 클래스가 더 어울리다고 생각했어요.
470
+ > 이유는 sealed 키워드로 상속을 관리한다는 것은 곧 *클래스 계층 구조를 명확히 한다* 와 동일하다고 생각했기 때문이에요
471
+ >
472
+ > 또한 sealed로 한 패키지 내에서 관리한다는 것은 인터페이스처럼 높은 자유도를 설정할 필요도 없기 때문에,
473
+ > 디폴트 프로퍼티를 설정할 수 있는 추상 클래스를 선택하는 것이 적절하다고 생각했어요
474
+
475
+ **학생 자가 답변 (isEqualTo 별도 메서드 이유, Score.kt:50):**
476
+ > 현재는 외부에서 오버로딩한 compareTo 연산자를 사용하고 있어요.
477
+ > 이 말은 즉 모양만 다를 뿐 사실 equals 연산자를 사용하는 isEqualTo 가 외부에서 사용될 여지가 있다고 생각했어요
478
+ >
479
+ > 사실 equals를 재정의하려고도 생각했어요.
480
+ > 하지만 hashcode도 재정의 해야하며,
481
+ > 예제 코드로 대략 보았을 때 코드가 지저분하다고 생각하여 그냥 이름만 다른 isEqualTo 라는 메소드를 제작하는 것이 더 낫겠다고 생각이 들었네요.
482
+
483
+ **학생 자가 답변 (3 변수 제약 자가 회의, BlackJackPair.kt:3):**
484
+ > 컨트롤러에서 입력받은 플레이어와 딜러를 묶는 일급 컬렉션을 생성했어요!
485
+ > 여기에 사실 deck 도 넣고싶었지만 인스턴스 변수는 3개 미만이어야 해서....
486
+ >
487
+ > 그런데 의문이 가는 점이 있어요.
488
+ > 다른 모든 부분은 인스턴스 변수를 3개 미만으로 줄였지만, 컨트롤러와 블랙잭 게임 객체는 view를 주입받아 어떻게 하더라도 3개 미만으로 못 줄이겠더라고요..
489
+ >
490
+ > 굳이 3개 미만으로 줄인다면 view를 주입하는 것이 아닌 직접 blackjackView에 접근하도록 해야 할 것 같아요.
491
+ >
492
+ > https://jessyt.tistory.com/159
493
+ > 엘레강트 오브젝트의 해당 내용을 본다면 이는 잘못된 방법 같아요.
494
+
495
+ **학생 자가 학습 (Score 객체 분리, Participant.kt):**
496
+ > 이 부분에 대해 한참을 고민했어요.
497
+ > 결국 Score 객체를 따로 만들어 점수 계산을 따로 처리하도록 만들었어요.
498
+ > 이렇게 구현하니 State에서 점수계산을 하는 부분 또한 Score로 옮길 수 있게 되어 일석이조가 되었네요!
499
+
500
+ ## 얻은 교훈
501
+
502
+ 1. ***`sealed class BlackJackRule<T : Participant>` = State 패턴 정공***. *sealed 키워드 = 닫힌 계층 + 외부 구현 차단 + 컴파일러 when exhaustive 검사*. *제네릭 `<T : Participant>` 로 Player/Dealer 타입 구분*. PR #152 (모찌 2단계) 의 *interface State* 보다 *sealed* 가 정공. **MCP 룰 후보 — `state-machine-without-sealed`** 가 *interface 인 경우 sealed 권고*.
503
+
504
+ 2. ***`BlackJackRule(participant)` factory function (`@Suppress("FunctionName")`)*** — *Kotlin pseudo-constructor pattern*. *클래스와 동일 이름 함수* + *@Suppress 로 lint 의도 명시*. *호출자는 생성자처럼 사용*. PR #108·#133 의 *invoke 함정* 회피 + *팩토리 함수 표준 어휘 (`.of()`, `.from()`) 의 대안*.
505
+
506
+ 3. ***`if (other is X)` 분기 = sealed 의 when exhaustive 미활용***. *if-return* 은 *새 subtype 추가 시 누락 가능*. *`when (other) { is BlackJack → ..., is Bust → ..., is Stay → ... }` exhaustive 가 컴파일러 보장*. *sealed 의 진짜 장점 활용*.
507
+
508
+ 4. ***Score 객체 분리 = 점수 계산 응집***. *Participant.score() = Score(cards)* 메시지가 *Tell-Don't-Ask*. *Hand = 카드 관리, Score = 점수 계산* 책임 분리. *학생 자가 학습 + 두루 권고 반영 모범*. PR #131 (다이스) 와 같은 결.
509
+
510
+ 5. ***Ace 처리 = `while (sum > 21 && aceCount > 0) sum -= 10`*** — *Ace 11 기본 + 차감 패턴*. *Ace 다수 정확 (각 Ace 11→1 점진적)*. PR #128·#135·#108·#131·#132 와 같은 결의 Ace 정공.
511
+
512
+ 6. ***Bust 입장 `getEarnRate(gameResult)` = 인자 무시 = 시그니처 misleading***. *Bust 는 항상 -1.0* 정합이지만 *함수 시그니처가 호출자에게 misleading*. *세 subtype 시그니처 통일 vs Bust 안전성* 트레이드오프. *오버라이드 호환성*과 *호출 의미 명료성* 의 균형.
513
+
514
+ 7. ***`Player(name, bettingAmount: Int = 0)` default = 0 + require > 0 모순***. *default 값이 invalid* = *명시적 호출 강제 안 됨*. *default 제거*가 *컴파일 타임 강제*. PR #131 (다이스) 의 기본 생성자 지양 권고와 같은 결.
515
+
516
+ 8. ***3 변수 제약 = 연습 도구, Controller/Game 에서는 너무 얽매이지 말 것***. 두루 자가 답변: *"맞추려다보면 어거지로 객체를 끼워넣는 방식이 될 수 있어요"*. 학생 자가 회의: *"3개 미만으로 줄인다면 view를 주입하는 것이 아닌 직접 blackjackView에 접근하도록 해야 할 것 같아요. 엘레강트 오브젝트의 해당 내용을 본다면 이는 잘못된 방법 같아요."* PR #133·#132 와 같은 결.
517
+
518
+ 9. ***GameController + Game 분리 = god-object 해결 정공***. *Controller = 진입점 + Game.run() 호출, Game = 도메인 자기 진행*. *현재 BlackJackGame = Controller + Game 합쳐짐*. *분리 시 GameController 가 여러 Game 실행 가능 + 입출력 분리*.
519
+
520
+ 10. ***엘레강트 오브젝트 자가 학습 + 본인 코드 적용 = 학습 모범***. *4.2 체크 예외 → ThrowableRetry 적용*, *2.2 상태 없는 행동 → BlackJackResult 책임 재배치*. *외부 자료 → 본인 사고 변동 → 코드 후속 반영* 흐름. 학생이 *"엘레강트 오브젝트의 내용 자체는 완전 동의하지만 막상 코드로 구현하게 되니 모양이 예쁘지 않게 나오고"* 의 *책 원칙 vs 현실 코드 트레이드오프 인식*.
521
+
522
+ 11. ***논리적 오류 vs 비논리적 오류 자가 정의 = 예외 처리 사고 모범***. *학생이 "논리적 오류 = 예외 던져지지 않음 + 의도대로 동작 X" vs "비논리적 오류 = 예외 발생"* 자가 정의. *"논리적 오류" 워딩 자체에 의문 → "논리적 모순" 대체어 제시*. *예외 처리의 본질에 대한 자가 사고 모범*.
523
+
524
+ 12. ***sealed class vs sealed interface 학생 자가 학습***. *abstract class = "고장난 부분 채우라"* (말리빈 1단계 진단) + *sealed = "패키지 내에서만 상속 가능"*. *BlackJackRule = 범용 인터페이스 아니라 닫힌 계층 → sealed*. *abstract class 선택 이유 = 디폴트 프로퍼티*. **학생 자가 결정 + 두루 인정**.
525
+
526
+ 13. ***`isEqualTo` 별도 메서드 vs equals 재정의 = data class 의 자동 equals 와 도메인 의미 불일치 회피***. *Score data class 의 equals = cards 리스트 동등성* vs *블랙잭 도메인 의미 = value 동등성*. *학생의 별도 메서드 결정 = 합리적 회피*. *Kotlin 어휘 non-standard 비용 vs 도메인 의미 명료성* 트레이드오프.
527
+
528
+ 14. ***네이밍 = 책임 표현***. *`Cards → Hand` (플레이어 손패)*, *`State → BlackJackRule` (블랙잭 규칙)*. *이름이 책임을 표현* — *호출자가 의미 추측 X*. 두루 자가 표현: *"State가 담당하고 있는 것은 블랙잭의 규칙이군요. 해당 객체가 담당하고 있는 기능에 맞게 네이밍을 수정해볼 수 있을 것 같군요"*. PR #128·#135·#125 와 같은 결.
529
+
530
+ 15. ***`Score.compare(other)` 의 *3 분기 중복 + else throw* = 도달 불가 명시 = Kotlin 어휘 부재***. *`Score.compareTo`* 가 *trichotomy 보장* (Int 비교 본질) 이므로 *>, <, == 3 분기 후 else 도달 불가*. *throw 도 도달 불가 명시* 패턴이지만 *컴파일러 보장 부재*. *간결화 = `when { > → WIN, < → LOSE, else → DRAW }`*.
531
+
532
+ 16. ***`Hand.isBlackJack` 의 *size == 2 검증 부재* = 룰 invariant 누수***. *countAce + countScoredTen == 2* 가정 + *추가 카드 검증 X*. *실제 게임 흐름에선 정합* (블랙잭 판정은 첫 2장 후만). *Hand 자체 invariant 강제 X* — *호출 흐름 의존*. *명시적 size 검증* 이 *invariant 보장*.
533
+
534
+ 17. ***`Score(Participant)` 보조 생성자 = 순환 의존 신호***. *Score → Participant + Participant → Score* 양방향. *Score 단순 점수 객체 + Participant 가 자기 카드로 Score 생성* 단방향이 정공. *학생 의도 = 호출 편의*. *순환 비용 vs 호출 편의* 트레이드오프.
535
+
536
+ 18. ***`NullableRetry` / `ThrowableRetry` interface = AOP-like 추상화 정공***. *예외 발생 시 재시도 로직* 의 *공통 추상화*. *Kotlin interface + 람다 인자* 로 *재사용 가능 retry 패턴*. *학생 자가 학습 + 본인 도메인 적용 모범*. PR #133 (시아) 의 *EventListener/EventProvider* 와 같은 결의 인터페이스 추상화.
537
+
538
+ 19. ***칭찬 위주 리뷰 + 깊은 메타 질문 + 학생 자가 학습 풍부 = PR #131 다이스와 같은 결***. 두루의 *🥳/👍/💪* 다수 + *"여기서 질문"* 메타 질문 위주. *깊은 안티패턴 진단 < 자가 학습 기회 제공*. *학생 자가 답변 + 외부 자료 학습 + 코드 적용* 흐름이 그 보상.
539
+
540
+ 20. ***`@Suppress("FunctionName")` 의 명시적 lint 우회 = 의도 패턴 명시***. *PascalCase 함수* 는 *Kotlin lint warning*. *@Suppress 로 *고의 패턴* 명시* = *호출자에게 *이건 의도된 pseudo-constructor* 신호*. *lint 무시 vs 의도 명시* 의 정공.