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,482 @@
1
+ # PR #152 — [블랙잭 2단계] 모찌 미션
2
+
3
+ - **Reviewee:** [@wondroid-world](https://github.com/wondroid-world)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/152
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @laco-dev (페로로)
7
+ - **라인 코멘트:** 23 스레드 / 45 코멘트 — 학생 자가 답변 + 커밋 SHA 첨부 패턴 유지
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **State 패턴 도입 — `interface State` + `StartGame`/`Hit`/`Finish(Bust/Blackjack/Stay)`** — 1단계의 `Cards.getStatus(): CardsStatus` enum 분기 구조를 *상태 객체로 일급화*. `state.draw(card): State` 가 *다음 상태로 전이* 메시지. `Hit.draw` 가 *블랙잭/Bust/Stay/Hit 분기*를 자기 안에서 결정. *Tell-Don't-Ask* 진척.
12
+ - **`Money value class` + 연산자 오버로딩 (`operator fun times`)** — `Money * Float = Money` / `Money * Int = Money` 표현. *`@JvmInline value class`* 로 *런타임 박싱 없음*. 도메인 어휘를 *값 객체*로.
13
+ - **블랙잭 룰 정확성 — `Hit.draw` 에서 *카드 2장 + 21 = 블랙잭, 21 초과 = Bust, 그 외 21 = Stay***
14
+ ```kotlin
15
+ newHand.size == FIRST_CARD_COUNT && score == BLACKJACK_SCORE -> Blackjack(newHand)
16
+ score > BLACKJACK_SCORE -> Bust(newHand)
17
+ else -> Stay(newHand) // score == 21 but size > 2 → Stay (블랙잭 X)
18
+ ```
19
+ → *1단계 페로로 진단* (`첫 턴 21 ≠ 카드 2장 21`) 완전 반영. *3장 21*은 *Stay*로 분기.
20
+ - **전역 상수 `BlackjackRule.kt` 자가 제거** — 학생이 1단계 종료 후 *공통 상수 객체*에 룰 모았다가, 페로로의 *"특정 비즈니스 로직이 공통 상수에 결합되는건 좋지 않다. 모든 객체가 Rule에 의존하게 되어 하나의 Rule을 쉽게 수정하지 못하게 되지 않나요?"* 진단으로 *각 객체 companion 상수화*로 자가 후퇴. 학생 자가 인용: *"객체는 스스로 자율성을 가져야한다는 생각에서 보면 객체 내에서 상수화를 진행하는 것이 맞다고 바뀌었습니다. 그리고 전역 상수와 객체간에 결합도 올라가서, 유지 보수가 어려워진다고도 생각이 듭니다."*
21
+ - **`Participant.state` 가 `var` + `private set` 후속 반영** — 페로로의 *"private setter를 사용하면 되지 않을까요?"* 한 줄에 *backingField (`var _state` + `val state: get`) → `var state private set`* 으로 자가 반영. *Kotlin property 어휘* 정착.
22
+ - **`Hit.stop()` / `StartGame.stop()` → `Stay`** — *플레이어가 언제든 게임을 끝낼 수 있어야 한다*는 학생 해석. 결과적으로 *카드 한 장 받기 전*에도 `stop` 가능 (StartGame.stop) — 도메인 룰과 정합 여부는 미해결.
23
+ - **`Hit.draw` 의 *다음 상태 결정* 1단계 진단 반영** — *"논리적으로 카드를 뽑는 즉시 버스트가 결정될텐데 stop()이라는 행동이 다시 버스트로 바꿀 일이 있나요?"* 페로로 의문에 *"점수로 파악하는 로직은 draw에서 다 판단을 해주고 넘겨주고 있습니다"* 자가 답변 + 후속 커밋. *상태 전이의 진입점 통일*.
24
+ - **`Dealer.canDraw()` 메시지 도입** — 1단계 `Dealer.isHit()` (페로로 진단: *Hit은 액션이지 상태가 아님*) 에서 `canDraw()`로 자가 변경. *플레이어와 일관된 메시지* 시도 (다만 Player는 canDraw 미구현 — 못한 점 §1).
25
+ - **테스트 픽스처 — `Hand(...)` 직접 생성으로 시작 카드 주입** — `BlackjackGameTest` 의 시드 카드 주입으로 *순서 고정 테스트*. *전략 셔플*과 정합.
26
+
27
+ ## 못한 점 (설계 관점)
28
+
29
+ ### 1. `dealerTurn()` 의 *while 안에 즉시 return* — *논리 오류*
30
+
31
+ ```kotlin
32
+ fun dealerTurn(): Boolean {
33
+ while (dealer.canDraw()) {
34
+ dealer.receiveCard(cardDeck.pickCard())
35
+ return true // ⚠ while 첫 번째 iteration 끝나면 즉시 반환
36
+ }
37
+ dealer.stop()
38
+ return false
39
+ }
40
+ ```
41
+
42
+ → **`while`이 *루프*가 아니라 *if + return* 으로 동작**. *한 번 호출에 카드 1장*만 받고 끝남. *딜러 룰 = "16 이하면 17 이상까지 hit"* 가 *호출자가 반복해서 `dealerTurn()` 부르기*로 외부에 떠넘김. *Tell-Don't-Ask* + *딜러 자율성* 모두 위반.
43
+
44
+ 페로로의 직접 코멘트는 없지만 *`canDraw(participant)` 일관성* 의 결처럼, *딜러 차례 = 자기가 알아서 17까지 hit* 면 함수 내부에서 `while (dealer.canDraw()) { dealer.receiveCard(...) }` 가 자연. `return true/false` 가 *카드 한 장이라도 받았는지* 알리는 시그널이라면 *함수명이 `tryDealerDraw()`* 같은 *시도 메시지*가 자연.
45
+
46
+ ### 2. `Player.canDraw()` 미구현 — *Player/Dealer 메시지 비대칭*
47
+
48
+ ```kotlin
49
+ // Dealer
50
+ fun canDraw(): Boolean = state.hand.score() <= DEALER_HIT_SCORE
51
+
52
+ // Player — canDraw 메서드 없음. Controller가 state.hand.score 직접 검사하거나 외부 입력
53
+ ```
54
+
55
+ 페로로 (BlackjackGame.kt 미해결): *"딜러입장에서 더 뽑을 수 있는지는 게임에서, 플레이어입장에서 더 뽑을 수 있는지 여부를 컨트롤러에서 판단하는데 일관성이 떨어져 보입니다. > 카드를 더 뽑을 수 있는지 확인하고 카드를 뽑는다 라는 기능 아래에서는 딜러인지 플레이어인지 상태가 어떤지는 함수 스스로 판단하면 되지 않을까요?"*
56
+
57
+ 페로로 힌트:
58
+ ```kotlin
59
+ fun canDraw(participant: Participant): Boolean {
60
+ // 플레이어 → ???
61
+ // 딜러 → ???
62
+ }
63
+ fun drawTo(participant: Participant) { ... }
64
+ ```
65
+
66
+ → **`Participant.canDraw()` 메시지로 통일하면 호출자 분기 사라짐**. *Player는 *입력 의지 + 21 이하**, *Dealer는 *17 이하**. *Strategy 차이*는 *Participant 다형성*. 현재는 *Dealer만 canDraw* + *Player는 외부 입력으로만 결정* → *대칭 메시지 부재*.
67
+
68
+ ### 3. `Finish.expectedProfit(money)` + `Finish.profit()` + `Finish.profitRate` — *세 책임 중첩*
69
+
70
+ ```kotlin
71
+ abstract class Finish(override val hand: Hand) : State {
72
+ abstract val profitRate: Float
73
+
74
+ override fun expectedProfit(money: Money): Money = money * profitRate
75
+ override fun profit(): Float = profitRate
76
+ override fun draw(card: Card) = throw IllegalStateException("...")
77
+ override fun stop() = throw IllegalStateException("...")
78
+ }
79
+
80
+ class Blackjack(override val hand: Hand) : Finish(hand) {
81
+ override val profitRate: Float get() = BLACKJACK_PROFIT // 1.5f
82
+ override fun profit(): Float = profitRate // ⚠ Finish의 profit과 중복 override
83
+ companion object { const val BLACKJACK_PROFIT = 1.5f }
84
+ }
85
+ ```
86
+
87
+ 페로로 (Finish.kt — 미해결): *"profit() 함수가 무엇을 하고싶은지 전달이 잘 안되는 것 같아요. 입력받는 돈이 없는데 배율만 반환하면 어떤 뜻인가요?"*
88
+
89
+ 학생 자가 답변: *"아 이 부분은 저의 실수라고 생각합니다. 처음에 profitRate 필드를 private으로 두고 이를 읽는 메서드를 만들어야겠다! 라고 생각했습니다. 하지만, public으로 필드를 만드면서, 결국 필요없는 부분이였는 데, 아직까지 쓰고 있군요...."*
90
+
91
+ 페로로 (PlayerGameResult.kt — 미해결): *"저는 Result가 무엇을 의미하는지 잘 모르겠어요. 다른 개발자가 보더라도 아! 이게 수익금이구나! 라고 바로 이해할 수 있을까요?"*
92
+
93
+ → **`profitRate` (val) + `profit()` (배율 반환) + `expectedProfit(money)` (금액 반환)** 의 *3중 표현*. *수익률 vs 수익금*이 *이름에 안 보임*. *`Money.expectedProfit(state)`* 처럼 *Money가 자기 곱하기 메시지*면 *State는 배율만 노출* + *Money가 곱셈 담당*. PR #133 (시아 2단계) 의 *Money.times 오버로딩* 과 같은 결.
94
+
95
+ 또한 `profitRate` 가 *Blackjack/Stay/Bust 별 const* — *enum* 으로 묶는 게 자연 (1.5/1.0/-1.0). 현재 *클래스 3개에 const 분산*.
96
+
97
+ ### 4. `PlayerGameResult.playerProfitRate()` — *State 분기를 호출자가 다시 함*
98
+
99
+ ```kotlin
100
+ class PlayerGameResult(
101
+ private val dealer: Dealer,
102
+ private val player: Player,
103
+ ) {
104
+ fun playerProfitRate(): Float {
105
+ val dealerState = dealer.state
106
+ val playerState = player.state
107
+
108
+ if (dealerState is Blackjack && playerState is Blackjack) return GameResult.PUSH.profit
109
+ if (dealerState is Blackjack && playerState is Stay) return GameResult.LOSE.profit
110
+ if (dealerState is Bust && playerState is Stay) return GameResult.WIN.profit
111
+ if (dealerState is Stay && playerState is Stay) return getStayResult(dealerState, playerState)
112
+ return playerState.profit()
113
+ }
114
+ ...
115
+ }
116
+ ```
117
+
118
+ 페로로 (Finish.kt 첫 코멘트): *"참가자가 수익률을 계산하는 관점과 State가 수익률을 계산하는 관점은 서로 다릅니다. 상태 입장에서는 단순히 현재 상태에 따른 수익률만 계산하는 반면 플레이어의 수익률은 상대의 패를 같이 확인하게 됩니다. **그렇다면 참가자 -> 상태 -> 형태로 협력하는 관계로 만들 수 있지 않았을까요?** 하나의 예로, 딜러와 플레이어가 모두 블랙잭이면 무승부입니다."*
119
+
120
+ 학생 자가 답변 (커밋 `9c6ed42`): *"페로로, 페로로가 준 힌트를 통해서, gameReult라는 클래스를 만들어서 결과를 처리하게 되었습니다. 하지만, 시간이 너무 부족해져서 좀 더 말끔하게 적지 못했습니다."*
121
+
122
+ → **State 패턴의 이점 = 분기 제거. 그런데 PlayerGameResult가 *`is Blackjack && is Stay`* 같은 *상태 타입 분기 4개*를 다시 함**. *State 패턴 도입 = 분기 제거*가 아니라 *분기 이동*에 그침. *Participant.compete(other: Participant): GameResult* 메시지로 *state 안에서 상대 상태와 비교*면 *외부 if문 사라짐*. 페로로의 *"참가자 → 상태 → 협력"* 이 그 의미.
123
+
124
+ 또한 *Bust 양측 처리 누락* — `is Bust && is Bust` 분기 없음. *마지막 fallback `playerState.profit()`* 으로 *Bust profit = -1f* 가 적용되지만 *Bust dealer & Bust player*는 *명시 안 됨*. 룰 정확성 신호.
125
+
126
+ ### 5. `BlackjackGame.firstTurn()` — *Players + Dealer 카드 1:1 분배 + 첫 카드 공개 규칙 누락*
127
+
128
+ ```kotlin
129
+ fun firstTurn() {
130
+ repeat(FIRST_CARD_COUNT) {
131
+ giveCard(cardDeck)
132
+ }
133
+ }
134
+
135
+ private fun giveCard(cardDeck: CardDeck) {
136
+ dealer.receiveCard(cardDeck.pickCard())
137
+ players.giveCardForPlayer(cardDeck)
138
+ }
139
+ ```
140
+
141
+ → **딜러는 1장 공개 / 플레이어는 2장 공개**라는 *블랙잭 룰* 이 *firstTurn 의 분배 규칙*에 새겨 있지 않음. *`repeat(2) { dealer + players }`* 는 *분배 규칙*. *공개 규칙*은 *View 에서 분기*로 표현되고 있을 가능성.
142
+
143
+ 페로로 (1단계 OutputView.kt:30 미해결 — 본 PR에서 *직접 코멘트는 없으나 1단계의 미해결 사항*): *"최초에 딜러는 1장의 카드를, 플레이어는 2장의 카드를 공개한다 라는 규칙이 있을거에요. 이 규칙은 명확한 비즈니스 로직인데 어떻게 구현할지 추상화 관점에서 접근해보면 도움이 될거에요."*
144
+
145
+ → *Participant.openCards(): Hand* 메시지면 *Dealer는 1장 / Player는 2장*을 자기가 결정. *View는 받은 카드만 출력*. 현재는 미반영.
146
+
147
+ ### 6. `Players.giveCardForPlayer(cardDeck)` — *deck 매개변수 노출*
148
+
149
+ ```kotlin
150
+ // BlackjackGame
151
+ private fun giveCard(cardDeck: CardDeck) {
152
+ dealer.receiveCard(cardDeck.pickCard())
153
+ players.giveCardForPlayer(cardDeck) // ⚠ deck을 Players에 넘김
154
+ }
155
+ ```
156
+
157
+ 페로로 (BlackjackGame.kt 미해결): *"일급 컬렉션으로 묶었으면 Players에게 메시지를 보내도록 해주세요~"*
158
+
159
+ 학생 자가 답변: *"페로로, 일급 컬렉션이 Players에서 일을 시키기위해서, 공통된 카드 덱을 쓰게 해주기 위해서, 매개변수로 cardDeck자체를 넘겨주고 있는 데, 이게 괜찮은 건지 모르겠어요..... 😭"*
160
+
161
+ 페로로 후속: *"왜 괜찮지 않다고 생각하나요?"*
162
+
163
+ → **`deck`을 매개변수로 노출 vs 카드 한 장만 전달**. *Players.giveCardForPlayer(cardDeck)* 는 *Players가 deck.pickCard()를 호출* — *Players가 deck을 안다*는 결합. *Players.receiveCard(cards: List<Card>)* 면 *deck 의존 없음*. PR #133 (시아 2단계) 의 *말리빈 "Deck을 손에 쥐여줘야할지"* 동일 결.
164
+
165
+ 다만 *카드 한 장씩 vs 한 번에 N장* 의 트레이드오프 — *분배 룰이 외부 (Game) 결정*이면 *Players는 받은 카드 그대로 추가*가 자연. *공유 deck = Game이 보유 + 카드만 분배*.
166
+
167
+ ### 7. `BettingTable.getProfit()` + `getProfit(profitRate)` 오버로딩 — *어느 것이 호출되는지*
168
+
169
+ ```kotlin
170
+ class BettingTable(
171
+ val participant: Participant,
172
+ private val bettingAmount: Money,
173
+ ) {
174
+ fun getProfit(): Money {
175
+ val participantState = participant.state
176
+ return participantState.expectedProfit(bettingAmount)
177
+ }
178
+
179
+ fun getProfit(profitRate: Float): Money = bettingAmount * profitRate
180
+ }
181
+ ```
182
+
183
+ 페로로 (BettingTable.kt 미해결): *"그런데 논리적으로 실행할 수 없는 동작이라면 상태 내부에서 스스로 판단하는게 맞지 않을까요? 상태를 분리하는 것 대비 여기저기 if문으로 타입 검사를 하는게 오히려 분리한 이점을 낮추고 있습니다. 아래 두개는 어떤 차이가 있을지? State.profit() / Finished.profit()"*
184
+
185
+ → **`getProfit()` 두 시그니처 — *State 위임 vs 외부 profitRate 주입***. *호출자가 둘 중 어느 것을 부르는지* 가 *상황에 따라 달라짐* — *PlayerGameResult.playerProfitRate()* 로 계산한 profitRate를 다시 *BettingTable.getProfit(profitRate)* 에 넘기는 흐름이라면 *State 책임이 깨짐*. *BettingTable* 이 *Participant + Money* 만 보유 = *Participant 책임의 보조 클래스* — *별도 객체 필요한가* 도 의문.
186
+
187
+ 학생 자가 답변 (커밋 `aa4b8a5`): *"현재 저의 관점에서 보기에 범위 차이로 보입니다. state는 아주 넓은 범위이기 때문에 만약 hit이나 startGame에서 profit을 구할려면 에러가 날것입니다. 하지만, finish에서 구하면, 에러없이 제 값을 구할 수 있는 상태가 될 것입니다. ... state에서 구현을 하고 finish가 아닌 구역에서는 스스로 에러를 뱉어낼 수 있도록 해야할 거 같습니다."*
188
+
189
+ → *State 인터페이스에 expectedProfit 선언 → Hit/StartGame은 throw* 결정. *if문 회피 = 좋은 면* 이지만 *런타임 throw* 가 *호출자가 분기 안에서 안전한가*를 의심하게 함. *진짜 분기 제거*는 *컴파일 타임 sealed 다형성* (못한 점 §8).
190
+
191
+ ### 8. `interface State` 가 *sealed 가 아님* — *외부 구현 가능 + when exhaustive 불가*
192
+
193
+ ```kotlin
194
+ interface State {
195
+ val hand: Hand
196
+ fun expectedProfit(money: Money): Money
197
+ fun profit(): Float
198
+ fun draw(card: Card): State
199
+ fun stop(): State
200
+ }
201
+ ```
202
+
203
+ → **State 상태 종류 = 5개 (StartGame/Hit/Bust/Blackjack/Stay) 라는 *닫힌 집합***. *Kotlin `sealed interface State`* 면 *컴파일러가 when exhaustive 검사* + *외부 패키지 구현 차단*. `is Blackjack && is Stay` 같은 *타입 분기*가 *when (state)* 패턴 매칭으로 표현 가능. *호출자 분기 안전성 ↑*.
204
+
205
+ `PlayerGameResult.playerProfitRate()` 의 *4 단계 if + fallback* 이 *sealed when* 이면 *모든 조합* 처리 강제. *Bust 양측 처리 누락* 도 컴파일러가 잡음. PR #133 (시아 2단계) 의 *sealed 키워드 토론* 과 *부분적으로 같은 결*.
206
+
207
+ ### 9. `Hit.draw` 의 *블랙잭 룰* 이 *상태 전이 분기*에 내장 — *Ace 11 보정 미반영 신호*
208
+
209
+ ```kotlin
210
+ override fun draw(card: Card): State {
211
+ val newHand = hand + card
212
+ val score = newHand.score()
213
+ return when {
214
+ score < BLACKJACK_SCORE -> Hit(newHand)
215
+ newHand.size == FIRST_CARD_COUNT && score == BLACKJACK_SCORE -> Blackjack(newHand)
216
+ score > BLACKJACK_SCORE -> Bust(newHand)
217
+ else -> Stay(newHand)
218
+ }
219
+ }
220
+ ```
221
+
222
+ → **score 계산이 `newHand.score()` 한 줄에 들어 있어 Ace 1↔11 양가성 처리는 Hand 내부**. 1단계의 *Cards.calculateScore* 의 *Ace 단일 +10* 패턴이 *Hand.score* 로 이전되었을 것. 본 PR에서는 Hand 코드를 직접 보기 어려우나 *score == 21* 조건이 *Ace 11 보정 후*인지 *Ace 1 기본*인지가 *블랙잭 판정 정확성* 결정.
223
+
224
+ `size == FIRST_CARD_COUNT && score == BLACKJACK_SCORE`이 *Blackjack(2장 21)* 룰 정확. *Stay(score == 21 but size > 2)* 와 *Bust (score > 21)* 분리 정합. 다만 *score == 21 도달*은 *Ace 11 인식*에 의존 — *Ace 1 기본일 때 score == 11 → +10 → score == 21*. *Hand.score* 가 *최대 21 이하 점수 반환* 룰을 따른다면 OK.
225
+
226
+ ### 10. `Money` 가변/불변 — `value class` 사용은 좋으나 *`Float` 산술 정밀도 손실*
227
+
228
+ ```kotlin
229
+ @JvmInline
230
+ value class Money(val value: Int) {
231
+ operator fun times(floatNumber: Float): Money = Money((this.value * floatNumber).toInt())
232
+ operator fun times(intNumber: Int): Money = Money(this.value * intNumber)
233
+ }
234
+ ```
235
+
236
+ → **`Float` 산술 + `Int` 변환 = 정밀도 손실**. *1000 * 1.5f = 1500.0f → 1500* OK. *1000 * 1.5f = 999.99996f* 같은 케이스 발생 가능 (Float 표현 한계). *수익률 = BigDecimal 권고* 가 *금융 도메인 표준*. PR #133 의 *Money 가변/연산자 오버로딩* 토론과 같은 결.
237
+
238
+ 또한 `times(Float)` 와 `times(Int)` 만 있고 *`plus`/`minus`* 없음 — *베팅 금액 더하기/빼기*는 *호출자가 `Money(a.value + b.value)`* 로 우회. *완전한 산술 추상화 미달*.
239
+
240
+ ### 11. `BlackjackGame.playerTurn(player)` — *한 장만 받음 + 호출자가 루프*
241
+
242
+ ```kotlin
243
+ fun playerTurn(player: Player) {
244
+ player.receiveCard(cardDeck.pickCard())
245
+ }
246
+ ```
247
+
248
+ 페로로 (BlackjackController.kt:61 미해결): *"디테일한 요소지만, 필요하다면 게임이 컨텍스트를 더 가지고 있도록 만들어도 괜찮을 것 같습니다. 어찌되었든 컨트롤러에서 로직을 최소화 하는 과정이 되니까요. `while (blackjackGame.canDraw(player) && askDraw(player)) { ... }`"*
249
+
250
+ → **`playerTurn(player)` 가 *한 장만 받음* + *Controller가 askDraw → canDraw → playerTurn 루프 책임***. *Controller god-object* 진단은 1단계에서 *BlackjackGame 도입*으로 일부 해소. 다만 *플레이어 차례 = 카드 받는 입력 루프*가 *Game 책임*인지 *Controller 책임*인지 *경계 모호*. 페로로의 `while (blackjackGame.canDraw(player) && askDraw(player))` 가 *입력 인터페이스를 콜백 인자*로 받는 *고차함수* 패턴 — *Game 내부 루프 + 콜백으로 UI 분리*. PR #131 (다이스 2단계 콜백) / #132 (환노 2단계 고차함수) 와 같은 결.
251
+
252
+ ### 12. `Hit.stop()` → `Stay(hand)` + `StartGame.stop()` → `Stay(hand)` — *카드 0장 Stay 허용*
253
+
254
+ ```kotlin
255
+ // StartGame.stop
256
+ override fun stop(): State = Stay(hand)
257
+ ```
258
+
259
+ → **StartGame.stop = 카드 받기 전 stop 가능**. *카드 0장으로 게임 종료 → Stay 상태*. *블랙잭 룰* 상 *최소 2장 받고 게임 시작* 이 표준. *Stay(emptyList())* 는 *도메인 invariant 위반*.
260
+
261
+ 학생 자가 답변: *"먼저, stop()했을 때는 카드를 더 이상 받지 않는다는 의미로 finish인 상태로 넘기기 위해서, 메서드를 생성했습니다. 그럼 왜 Hit가 아닌 interface에서 선언을 하였는가? 라고 생각할 수도 있습니다. 이때 생각한 관점은 언제든 플레이어가 게임을 끝낼 수 있어야하지 않을까? 라는 관점이였습니다. 카드를 한장만 받고 게임을 끝낼 수도 있어야 한다고 생각을 해서, interface 함수로 선언했습니다."*
262
+
263
+ → **학생 의도 = "언제든 게임 끝낼 수 있어야"**. *블랙잭 도메인 룰* 과 *Kotlin 인터페이스 메서드 일관성*의 트레이드오프. *진짜 도메인은 첫 2장 분배 후 stop 가능*. *StartGame.stop 자체가 도메인에서 호출 안 됨*이 *현실*이라면 *StartGame은 Finish(stop) 메서드 throw*가 자연.
264
+
265
+ ### 13. `Money` 입장에서 `profit` 관심사 — *Money 책임 누수*
266
+
267
+ ```kotlin
268
+ @JvmInline
269
+ value class Money(val value: Int) {
270
+ operator fun times(floatNumber: Float): Money = Money(...)
271
+ operator fun times(intNumber: Int): Money = Money(...)
272
+ }
273
+ ```
274
+
275
+ 페로로 (Money.kt 첫 코멘트): *"Money 입장에서 단순히 곱하기만 하고 싶은데 profit이라는 관심사가 필요한가요?"*
276
+
277
+ 학생 자가 답변 (커밋 `4351003`): *"페로로 말처럼 money 입장에서는 profit이라는 관심사가 필요없을 것같아요! 다만 파라미터로 float가 들어오거나, int 타입이 들어왔을 때, 모두다 계산할 수 있도록 오버로딩해서, 메서드를 만들었습니다."*
278
+
279
+ 페로로 후속: *"커밋에 또 이상한게 섞였군요.. 😓"*
280
+
281
+ → **`Money.profit()` 같은 메서드가 초기 코드에 있었던 흔적**. 후속 반영으로 *`Money.times` 만 남김* — *Money 가 자기 곱셈 메시지*만. *수익률 결정 = State 책임*, *수익금 계산 = Money 책임*으로 *책임 분리* 시도. 다만 PlayerGameResult 가 *State 분기를 다시 함* (못한 점 §4) 이라 *완전한 분리 미달*.
282
+
283
+ ### 14. `CardDeck` private constructor — *테스트 가능성 의문 + 학생 자가 토론*
284
+
285
+ ```kotlin
286
+ // CardDeck.kt — private constructor
287
+ // 학생: 항상 랜덤 셔플된 상태로 시작
288
+ ```
289
+
290
+ 페로로 (CardDeck.kt:16 미해결): *"private constructor로 만들었는데 항상 랜덤에 의존하면 CardDeck 테스트는 어떻게 해야 하나요?"*
291
+
292
+ 학생: *"페로로 저는 카드덱에 들어가는 카드들은 항상 랜덤인 상태로 있어야한다고 생각을 했습니다. 현실 세계의 카드 덱들은 항상 카드가 섞어진 체로 게임 준비가 되어있기 때문입니다."*
293
+
294
+ 페로로: *"카드들이 랜덤으로 있는 건 현실세계에서 고려한 스펙 아닌가요? 만약 랜덤으로 있는 카드가 아닌 순서대로 있는 카드덱을 준비해야 하면 어떻게 해야하나요?"*
295
+
296
+ 학생: *"만약 순서대로 있는 카드덱이 필요하다고 하면, 생성자를 public으로 열어두겠습니다! 페로로 게임이 시작할려면, 저는 카드가 섞어있어야 한다고 생각을 하는 데, 이 생각이 너무 현실 기반일까요...?! 혹시 페로로가 순서대로 있는 카드덱을 고려하게 된 이유가 궁금합니다!!"*
297
+
298
+ → **현실 룰 vs 테스트 가능성**. *현실 카지노 = 항상 셔플된 덱* 이지만 *테스트 = 결정적 순서 필요*. *전략 패턴 (ShuffleStrategy)* 으로 *RandomShuffle (현실) / IdentityShuffle (테스트)* 주입이 정공 — PR #108 (시아 1단계) 의 *ShuffleStrategy* 후속 결정. 학생이 *"private constructor + 항상 랜덤"* 으로 *현실 룰을 strict로 강제*. *테스트 = 셔플된 덱 안에서 어떤 순서가 나올지 검증* 으로 *간접 테스트* 가능하나 *결정적 시나리오 테스트* 불가능.
299
+
300
+ ### 15. `state.hand.cards` 반복 표현 — *Demeter 위반 표면*
301
+
302
+ 페로로 (BlackjackView.kt 미해결): *"`participant.state.hand.cards` 저는 이 반복되는 코드 자체를 줄일 방법을 고민하기를 의도했습니다."*
303
+
304
+ 학생 자가 답변 (커밋 `7627937`): View 안 `showCards(participant: Participant): List<String>` 헬퍼 추출 — *participant만 받아 안에서 카드 추출*. 학생: *"하지만, 드는 생각은 view만을 위한 메서드를 도메인 안에 만드는 것이 맞나? 라는 생각에 view에서 함수로 구현했습니다."*
305
+
306
+ 페로로 후속: *"너무 어렵게 생각하지 말고 우선은 현재 파일에서 코드중복이 발생하는것을 줄여보자. 라는 관점으로 접근해주시면 좋겠어요"*
307
+
308
+ → **`participant.state.hand.cards` = *Demeter 위반의 표면 신호***. *participant.cards()* 메시지면 *내부 구조 노출 0*. *View가 도메인 메서드 의존하는가* 의 트레이드오프 — *Demeter 준수 + Participant.cards()* 가 자연. *View 헬퍼* 는 *코드 중복 해소 의도*만 충족, *Demeter 위반 해소 X*.
309
+
310
+ ### 16. `Participant.state.update` 의 의미 모호 — *행위 vs 결과 네이밍*
311
+
312
+ ```kotlin
313
+ // 초기 코드 — Participant
314
+ fun updateState(card: Card) { state = state.draw(card) } // → 후속에서 receiveCard 로 변경
315
+ ```
316
+
317
+ 페로로 (Participant.kt 미해결): *"카드 한장을 건네준다는 행위가 상태를 바꾼다는게 어떤 의미인가요? 카드를 더하는건지 빼는건지 복사하는건지 의미가 전달이 되고 있나요?"*
318
+
319
+ 학생 자가 답변 (커밋 `2706164`): *"페로로 메서드명을 지을 때, 행위의 결과로 네이밍을 하는 것이 아니라, 행위 그 자체를 네이밍하는 것이 좋다고 하는 걸까요...?"*
320
+
321
+ 페로로: *"말 그대로입니다. 아무 개발자가 와서 봤을 때 유저.업데이트스테이트 라는 행위가 어떤 동작을 할지 예측할 수 있나요?"*
322
+
323
+ → **`updateState(card)` = 결과 네이밍 / `receiveCard(card)` = 행위 네이밍**. *Tell-Don't-Ask* 의 메시지는 *행위*. *상태 변경*은 *행위의 결과*. *호출자에게 "내가 카드 받았어"* 가 *"내 상태 바꿔"*보다 자연.
324
+
325
+ ### 17. `BettingTable.bettingAmount: Money` — *Bust일 때 0원 테스트 오류*
326
+
327
+ 페로로 (BustTest.kt 미해결): *"버스트인데 왜 배팅금이 0원이되나요?"*
328
+
329
+ 학생 자가 답변 (커밋 `55df417`): *"이 부분은 제가 실수했습니다! 알려주셔서 감사합니다."*
330
+
331
+ → **테스트 시나리오 오류 = 도메인 룰 이해 신호**. *Bust → 베팅금 -1배 (-bettingAmount)*. *0원이 아님*. *학생 단순 실수*로 자가 반영. *Money * (-1f) = -Money* 으로 *베팅금 잃음* 표현. *부호가 잘림*하는지 Money value class 의 *Int 음수 표현* 호환성도 검증 필요.
332
+
333
+ ### 18. 테스트 이름이 *함수명 그대로* — *기능 관점 부재*
334
+
335
+ ```kotlin
336
+ // BlackjackGameTest.kt — 함수명 그대로 테스트 이름
337
+ @Test
338
+ fun `playerTurn() 함수 테스트`() { ... }
339
+ ```
340
+
341
+ 페로로 (BlackjackGameTest.kt 미해결): *"특정 함수 이름을 테스트에 그대로 작성하는 것은 좋지 않습니다. 만약 함수 이름이 변경되더라도 테스트 코드를 같이 수정해야 한다는 것을 실수하기 쉽고 기능 관점이 아닌 함수 이름에 종속됩니다."*
342
+
343
+ 페로로 (DealerTest.kt:46 미해결): *"이 테스트 이름은 적절한가요???"*
344
+
345
+ 페로로 (DealerTest.kt 미해결): *"마찬가지로 특정 상태로 업데이트 한다는게 뭘 테스트 하고 싶은건지 드러나고 있지 않습니다."*
346
+
347
+ → **테스트 이름 = 기능 명세**. *함수명 그대로* = *함수명 바뀌면 테스트 이름 부정합 + 의도 노출 0*. *"플레이어가 카드를 받으면 hand 점수가 증가한다"* 같은 *기능 관점* 이름이 자연. PR #128·#135·#114·#125·#124 와 같은 결.
348
+
349
+ ### 19. `run()` 함수 복잡도 — *Controller 절차적 명령*
350
+
351
+ 페로로 (BlackjackController.kt 미해결): *"어쩌다보니 run() 함수가 너무 복잡해졌는데 수정중이라고 보았습니다. 이런 부분도 마저 다듬어 주시면 좋을 것 같네요"*
352
+
353
+ 학생 자가 답변 (커밋 `123eb71`): *"함수를 추출해서 조금 더 간결하게 만들어 보았습니다!"*
354
+
355
+ → **`run()` 의 절차 호출** = *Controller 가 게임 흐름을 명령형으로 기술*. *함수 추출*은 *세분화* 이지만 *Controller god-object 책임* 자체는 미해결. 페로로의 1단계 *"컨트롤러 없이 게임을 진행할 수 있을까요?"* 진단의 연장.
356
+
357
+ ### 20. `PlayerBehavior` enum 잔존 + 미사용 가능성
358
+
359
+ ```kotlin
360
+ // PlayerBehavior.kt (1단계 그대로)
361
+ enum class PlayerBehavior { HIT, STAY }
362
+ ```
363
+
364
+ → State 패턴 도입 후 *`PlayerBehavior` enum 이 입력 변환 단계에만 살아 있을 가능성*. State 안에 *Hit/Stay* 가 *클래스로* 존재하므로 *PlayerBehavior enum* 은 *입력 의도 표현*만 담당. *State 와의 매핑* 위치가 *Controller인가 InputView인가* 의 토론은 PR #132 (환노 2단계) 와 같은 결.
365
+
366
+ ### 21. *룰 상수의 분산* — `Hit.BLACKJACK_SCORE` / `Hit.FIRST_CARD_COUNT` / `Blackjack.BLACKJACK_PROFIT` / `Stay.STAY_PROFIT` / `Bust.BUST_PROFIT` / `Dealer.DEALER_HIT_SCORE` / `BlackjackGame.FIRST_CARD_COUNT`
367
+
368
+ → **전역 상수 분리는 잘된 면 (자가 답변 §1)** 이지만 *동일 의미 상수가 두 클래스*에 등장:
369
+
370
+ - `Hit.FIRST_CARD_COUNT = 2`
371
+ - `BlackjackGame.FIRST_CARD_COUNT = 2`
372
+
373
+ *같은 상수의 두 곳 정의* = *변경 시 동기화 누락 위험*. *Hit가 자기 룰 알고 / BlackjackGame이 자기 분배 룰 알고* 의 *우연한 같은 값*인지 *공유해야 할 룰*인지 *근거 명시 부재*. *PlayerGameResult* 도 *블랙잭 1.5배 + Stay 1.0배 + Bust -1.0배* 의 *Finish 서브클래스 const* 를 *enum (`GameResult.WIN/LOSE/PUSH`)* 와 *별개 표현*. **두 표현 (`Finish.profitRate` const vs `GameResult.profit` enum) 이 같은 의미를 다른 형태**.
374
+
375
+ ### 22. *블랙잭(Finish) → Stay(Finish) 전이 미구현* — 학생이 알아챈 부분
376
+
377
+ 학생 PR 본문 인용: *"딜러(블랙잭) vs 플레이어(블랙잭) → 플레이어 수익률은 stay의 1.0을 바라봐야함. 이렇게 플레이어의 상태를 블랙잭에서 스테이로 업데이트 해야되더라구요. 이 과정이 개인적으로 느끼기에 매끄럽지 않아 구현이 제대로 되지 않았습니다."*
378
+
379
+ 페로로 답변 (Finish.kt 첫 코멘트): *"참가자가 수익률을 계산하는 관점과 State가 수익률을 계산하는 관점은 서로 다릅니다."*
380
+
381
+ → **블랙잭 vs 블랙잭 → PUSH 처리를 위해 *블랙잭 → Stay 전이* 가 필요하다는 학생 해석은 *State 의미 오해***. *상태 자체* 는 *블랙잭 그대로 유지*. *결과 (PUSH)* 는 *비교 시점*에 결정. *Participant.compete(other)* 메시지가 *블랙잭 vs 블랙잭 = PUSH* 를 *별도 상태 전이 없이* 표현. 페로로의 *"상태 입장에서는 단순히 현재 상태에 따른 수익률만 계산하는 반면 플레이어의 수익률은 상대의 패를 같이 확인"* 진단이 정확.
382
+
383
+ ## 리뷰어 의견 요지
384
+
385
+ - **상태 분리의 이점 = if문 제거** — `if (state is X)` 가 *상태 분리 도입한 의미를 다시 까먹는 신호*. *다형성*으로 *호출자 if 0개*.
386
+ - **참가자 → 상태 → 협력** — *PlayerGameResult가 dealer.state·player.state 분기*는 *상태 정보를 빼서 외부에서 비교*. *Participant 메시지*로 *상태 협력*.
387
+ - **상태 분리 + 논리적 실행 불가 = 상태가 스스로 throw** — `Hit.profit()` throw는 *상태 자체 가드*. *호출자 if 회피*. 다만 *런타임 예외* < *컴파일 타임 sealed*.
388
+ - **메서드명 = 행위 + 결과 → 행위만** — `updateState(card)` 는 *결과 (state 업데이트)*. `receiveCard(card)` 는 *행위*. *호출자 친화 = 행위 메시지*.
389
+ - **공통 상수 객체 = 비즈니스 로직과 결합** — 모든 객체가 *전역 Rule 의존*하면 *Rule 수정의 파급 범위* 가 클래스 전체. *각 객체 자기 상수*가 자율성.
390
+ - **테스트 이름 = 함수명 X / 기능 관점 O** — *함수명 종속 = 함수명 변경 시 테스트 부정합*. *기능 관점 = 도메인 명세*.
391
+ - **`participant.state.hand.cards` = Demeter 위반 표면**. *Participant 메시지*로 *카드 노출*.
392
+ - **현실 룰 (`항상 셔플된 덱`) vs 테스트 가능성 (`결정적 순서`)** — *전략 패턴*으로 둘 다 만족 (1단계 학생이 자가 발견 → 2단계에서 다시 *private constructor + 랜덤* 으로 회귀하는 듯한 신호).
393
+ - **확장성 = 도메인 요구가 부를 때** — `Money.times(Float)` + `Money.times(Int)` 오버로딩이 *현재 사용처가 *Float 만 있는데도 Int 추가*. *YAGNI*.
394
+
395
+ ## 대표 인용
396
+
397
+ **페로로 (참가자 → 상태 협력, Finish.kt):**
398
+ > 참가자가 수익률을 계산하는 관점과 State가 수익률을 계산하는 관점은 서로 다릅니다.
399
+ > 상태 입장에서는 단순히 현재 상태에 따른 수익률만 계산하는 반면 플레이어의 수익률은 상대의 패를 같이 확인하게 됩니다.
400
+ > 그렇다면 참가자 -> 상태 -> 형태로 협력하는 관계로 만들 수 있지 않았을까요?
401
+ > 하나의 예로, 딜러와 플레이어가 모두 블랙잭이면 무승부입니다.
402
+
403
+ **페로로 (메시지 일관성, BlackjackGame.kt):**
404
+ > 딜러입장에서 더 뽑을 수 있는지는 게임에서, 플레이어입장에서 더 뽑을 수 있는지 여부를 컨트롤러에서 판단하는데 일관성이 떨어져 보입니다.
405
+ > > 카드를 더 뽑을 수 있는지 확인하고 카드를 뽑는다
406
+ > 라는 기능 아래에서는 딜러인지 플레이어인지 상태가 어떤지는 함수 스스로 판단하면 되지 않을까요?
407
+
408
+ **페로로 (상태 분리 이점 = if문 제거, BettingTable.kt):**
409
+ > 그런데 논리적으로 실행할 수 없는 동작이라면 상태 내부에서 스스로 판단하는게 맞지 않을까요?
410
+ > 상태를 분리하는 것 대비 여기저기 if문으로 타입 검사를 하는게 오히려 분리한 이점을 낮추고 있습니다.
411
+
412
+ **페로로 (행위 vs 결과 네이밍, Participant.kt):**
413
+ > 카드 한장을 건네준다는 행위가 상태를 바꾼다는게 어떤 의미인가요?
414
+ > 카드를 더하는건지 빼는건지 복사하는건지 의미가 전달이 되고 있나요?
415
+ > ...
416
+ > 아무 개발자가 와서 봤을 때 유저.업데이트스테이트 라는 행위가 어떤 동작을 할지 예측할 수 있나요?
417
+
418
+ **페로로 (전역 상수 결합도, BlackjackRule.kt):**
419
+ > 특정 비즈니스 로직이 공통 상수에 결합되는건 좋지 않다고 생각합니다.
420
+ > 반대로 모든 객체들이 Rule에 의존하게 되어서 하나의 Rule을 쉽게 수정하지 못하게 되지 않나요?
421
+ > Rule이라면 상황에 따라 다른 룰을 적용할수도 있다는 뜻일텐데 게임마다 다른 규칙을 적용하는게 가능할까요?
422
+ > 단 1번만 사용되는데도 불구하고 우선 공통 상수로 빼는 건 좋지 않은 습관입니다.
423
+ > 각 객체가 스스로 판단할 수 있도록 시작하는게 좋습니다.
424
+
425
+ **페로로 (확장성 = 1.5배 신호, BetAmount.kt 결):**
426
+ > 승패여부, 블랙잭 상관 없이 배율(earningRate)이라는 개념을 넘겨주는 방식은 어떨까요?
427
+ > > 블랙잭은 1.5배, 버스트는 -1배
428
+
429
+ **페로로 (Money의 관심사 분리):**
430
+ > Money 입장에서 단순히 곱하기만 하고 싶은데 profit이라는 관심사가 필요한가요?
431
+
432
+ **학생 자가 답변 (블랙잭 → Stay 전이 미해결 신호):**
433
+ > 딜러(블랙잭) vs 플레이어(블랙잭) -> 플레이어 수익률은 stay의 1.0을 바라봐야함.
434
+ > 이렇게 플레이어의 상태를 블랙잭에서 스테이로 업데이트 해야되더라구요. 이 과정이 개인적으로 느끼기에 매끄럽지 않아 구현이 제대로 되지 않았습니다.
435
+
436
+ **학생 자가 답변 (StartGame과 Hit(emptyList()) 차이, StartGame.kt):**
437
+ > 아, 기능 목록에서 작은 기능으로 나누고 시작했습니다.
438
+ > 기능을 나누다보니, 참가자들은 카드를 한장을 받는다부터 시작을 했습니다.
439
+ > 카드를 한장을 받을 때는 카드를 받는 메서드만 필요하지 다른 판단하는 메서들은 필요가 없다고 생각했습니다. 객체를 좀 더 작게 나누고 싶어서, StartGame()으로 인스턴스를 먼저 생성했습니다.
440
+
441
+ **학생 자가 답변 (Hit.stop과 StartGame.stop을 interface에 둔 이유):**
442
+ > 먼저, stop()했을 때는 카드를 더 이상 받지 않는다는 의미로 finish인 상태로 넘기기 위해서, 메서드를 생성했습니다.
443
+ > 그럼 왜 Hit가 아닌 interface에서 선언을 하였는가? 라고 생각할 수도 있습니다. 이때 생각한 관점은 언제든 플레이어가 게임을 끝낼 수 있어야하지 않을까? 라는 관점이였습니다.
444
+
445
+ **학생 자가 답변 (엘레강트 오브젝트 - 빌더 함수 네이밍, PlayerGameResult.kt 결):**
446
+ > 페로로! 엘레강트 오브젝트를 읽으면서, 빌더 함수의 네이밍에 대해서 배우게 되었습니다. 반환값이 있는 함수는 그 함수에게 바라는 것을 물어본다는 것을 배웠습니다. 그래서, 여기서는 수익률을 반환하니 playerProfitRate라고 네이밍을 바꿔보았습니다.
447
+
448
+ ## 얻은 교훈
449
+
450
+ 1. ***State 패턴 도입 = if문 제거를 위함. `is XX` 분기가 다시 나오면 다형성 미활용 신호***. wondroid-world 가 *State interface + StartGame/Hit/Bust/Blackjack/Stay* 로 *상태 일급화* 후에도 *PlayerGameResult.playerProfitRate* 가 *`is Blackjack && is Stay`* 4단 분기. *Participant.compete(other): GameResult* 메시지가 *상대 패와 비교까지 협력*하면 *외부 if 0개*. 페로로의 *"참가자 → 상태 → 협력"* 가 그 핵심.
451
+
452
+ 2. ***`sealed interface State` 가 정공 — 외부 구현 차단 + when exhaustive 검사***. *interface State* 는 *외부 패키지 구현 가능*. *Kotlin sealed*은 *닫힌 계층 = 컴파일러 보장*. *PlayerGameResult* 의 *4단 if + fallback* 이 *sealed when* 이면 *모든 조합 강제*. PR #133 (시아 2단계) 의 *sealed 키워드 토론*과 같은 결.
453
+
454
+ 3. ***메서드명 = 행위 메시지 (`receiveCard`), 결과 (`updateState`) 가 아님***. `updateState(card)` 는 *결과 알림*. `receiveCard(card)` 는 *행위 요청*. *Tell-Don't-Ask* 의 메시지는 *행위 동사*. 학생 자가 답변 *"행위의 결과로 네이밍 하는 것이 아니라, 행위 그 자체를 네이밍"* 이 정확.
455
+
456
+ 4. ***전역 Rule 상수 객체는 결합도 증가 + 자율성 손상***. *모든 객체가 BlackjackRule 의존*하면 *Rule 변경의 파급 범위* 가 *전체 클래스 = 변경 비용 ↑*. *게임마다 다른 룰* 가능성도 차단. *각 객체 companion 상수*가 *자기 책임의 일부*. PR #128·#135·#114·#125 와 같은 결.
457
+
458
+ 5. ***딜러 자율성 = `dealerTurn()` 안에서 17 이상까지 hit***. `while (dealer.canDraw()) { dealer.receiveCard(...) } / return false` 한 줄 안에 *호출 한 번에 끝나는 의미*. 현재 `while ... return true` 가 *while 첫 iteration 후 return* 으로 *루프 미작동* — 논리 오류. *호출자가 다시 반복 부르기*가 *딜러 룰을 외부에 떠넘김*.
459
+
460
+ 6. ***`canDraw()` 메시지를 Player와 Dealer 둘 다에 노출 = Participant 다형성***. *Player.canDraw()* 는 *21 이하 + 입력 의지*, *Dealer.canDraw()* 는 *17 이하*. *전략 차이 = 다형성*. *외부 if (`if (participant is Dealer)`) 0개*. PR #131·#132·#133 와 같은 결.
461
+
462
+ 7. ***`Money * profitRate` 가 정공 — `BettingTable.getProfit(profitRate)` 같은 우회 X***. *Money 가 자기 곱셈 메시지*. *State 가 profitRate 알림*. *Participant 가 결과 결정*. *세 책임 분리* 가 *Tell-Don't-Ask*. *오버로딩으로 두 getProfit* 은 *한 번에 둘 다 만족* 시도 = *책임 분리 미달*.
463
+
464
+ 8. ***`value class` + 연산자 오버로딩 = Kotlin 어휘***. *`@JvmInline value class Money`* 는 *런타임 박싱 없음 + 타입 안전*. *`operator fun times`* 가 *`money * 1.5f`* 자연 표현. 단 *`Float` 산술 정밀도 한계*는 *금융 도메인 시 BigDecimal 권고*.
465
+
466
+ 9. ***`Hit.stop()`이 의미 있는가? - 도메인 invariant 와 인터페이스 메서드의 트레이드오프***. *StartGame.stop = Stay(emptyList())* 는 *블랙잭 룰 위반 (최소 2장)*. *학생 의도 = "언제든 게임 끝낼 수 있어야"* 는 *모든 상태에 stop 메서드 강제*. *진짜 도메인 = 첫 2장 후 stop 가능*. *interface 메서드 일관성* < *도메인 invariant*. *sealed when 으로 `StartGame.stop` 가드*가 자연.
467
+
468
+ 10. ***`getXXX` 명사형 → 행위 동사***. `dealerTurn` (명사) / `playerTurn` (명사) 는 *차례를 가져옴*. *`takeDealerTurn()` / `runDealerTurn()`* 동사가 자연. *Kotlin 어휘 정착*.
469
+
470
+ 11. ***테스트 이름 = 기능 명세, 함수명 종속 X***. *함수명 그대로 테스트 이름*은 *함수명 변경 시 동기화 누락 + 의도 노출 0*. *"플레이어가 카드를 받으면 점수가 증가한다"* 같은 *기능 관점*이 자연. 도메인 변경 시 테스트도 *어휘 갱신*.
471
+
472
+ 12. ***`participant.state.hand.cards` = Demeter 표면 신호***. *Participant.cards()* 메시지가 *내부 구조 노출 0*. *View가 도메인 메서드 의존*은 *View가 Participant 인터페이스만 알면 됨* — *State / Hand 알 필요 없음*. *Demeter 준수의 핵심 = 호출자가 알아야 하는 객체의 수 최소화*.
473
+
474
+ 13. ***`StartGame` 과 `Hit(emptyList())` 차이 — 기능 단위 사고가 클래스 분리로 이어진 사례***. 학생 자가 답변 *"기능 목록에서 작은 기능으로 나누고 시작 → StartGame() 인스턴스 먼저"* 가 *기능 분해 → 클래스 분리* 패턴. *YAGNI vs 의도 명시* 트레이드오프 — *StartGame이 의미 있는 도메인 상태*면 OK, *Hit(emptyList())* 와 똑같은 행동이면 *중복*. *Hit.draw(첫 카드)* 와 *StartGame.draw(첫 카드)* 의 결과가 같다면 *StartGame 책임 정당화 부재*.
475
+
476
+ 14. ***1단계 진단 (`첫 턴 21 ≠ 카드 2장 21`)이 2단계 `Hit.draw`에서 완전 반영 — 학습 가시화 모범***. `newHand.size == FIRST_CARD_COUNT && score == BLACKJACK_SCORE -> Blackjack(newHand)` 로 *2장 21 = 블랙잭, 3장 21 = Stay* 분기 정확. PR #128·#135·#114·#125·#124 와 같은 결의 도메인 룰 정확성.
477
+
478
+ 15. ***Bust 양측 처리 누락 = 블랙잭 룰 정확성 신호***. PlayerGameResult 에 *`is Bust && is Bust`* 분기 없음. *마지막 `playerState.profit()` fallback* 이 *Bust -> -1f* 로 흡수하지만 *명시 부재*. *블랙잭 룰 = 양측 Bust = 양측 패배*. *sealed when* 이면 *컴파일러가 누락 신고*. PR #128·#135·#108·#124 와 같은 결.
479
+
480
+ 16. ***학생 자가 답변에 커밋 SHA 첨부 = 학습 가시화 모범 (지속)***. wondroid-world 가 1단계와 동일하게 *모든 자가 답변에 커밋 SHA* 첨부 (`4351003`, `4a3256f`, `51f6c0a`, `2706164`, `1c41c43`, `7627937`, `9c6ed42`, `2ee93c2`, `aa4b8a5`, `55df417`, `123eb71`, `a5d718d` 등). *학습 가시화 패턴 일관성*.
481
+
482
+ 17. ***엘레강트 오브젝트 자가 학습 — "반환값이 있는 함수는 그 함수에게 바라는 것을 물어본다"***. 학생이 *`PlayerGameResult` 의 `getResult` → `playerProfitRate`* 로 *반환값 의미 노출* 자가 반영. *외부 자료 학습 → 본인 코드 적용* 학습 모범. PR #108 (시아 1단계) 의 *Effective Kotlin Item 4/14* 와 같은 결.