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,318 @@
1
+ # PR #85 — [블랙잭 2단계] 하디 미션
2
+
3
+ - **Reviewee:** [@ii2001](https://github.com/ii2001)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/85
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @laco-dev (페로로)
7
+ - **라인 코멘트:** 17 스레드 / 31 코멘트 — *Hand 불변/가변 토론* + *사이드 이펙트 vs 명시적 반환 토론*
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Hand` 가 *불변 객체로 진화* — `draw(card): Hand` / `decideStay(): Hand` 메시지 반환** — 페로로의 *"Hand가 Hand를 반환하도록 해서, 객체가 더 안전하도록 잘 만들어 주셨습니다. 👍🏻 짧은 시간내에 이정도로 적용해보시는게 쉽지 않았을텐데요."* 자가 칭찬. *불변 객체 + 메서드 체인* 패턴. *Tell-Don't-Ask* + *Functional style*.
12
+
13
+ ```kotlin
14
+ fun draw(card: Card): Hand {
15
+ if (stay) return this // ⚠ stay 시 same instance
16
+ return Hand(_cards.apply { add(card) }, stay)
17
+ }
18
+
19
+ fun decideStay(): Hand {
20
+ return Hand(_cards, true)
21
+ }
22
+ ```
23
+
24
+ - **`Hand.stay: Boolean` 상태 반영 — 스테이/버스트 시 추가 카드 차단** — 페로로의 *"블랙잭 게임에서 스테이 상태, 버스트 상태는 더이상 카드를 뽑을 수 없는 상태죠? 그렇다면, Hand에서도 이 상태라면 카드를 더 뽑을 수 없도록 기능을 만들어 보면 어떨까요?"* 진단 반영. *학생 자가 답변: "불변객체로 만듦과 동시에 해결이 되었습니다!"*. *Hand 가 자기 invariant 알리는 책임*.
25
+ - **`Player.state` enum (`State.Running.Hit` / `State.Finished.Blackjack/Bust/Stay`) 도출** — *Hand 의 isBlackjack/isBust/isStay 메시지로 derived 상태*. 1단계 *Cards.getStatus enum* 진단의 후속 반영.
26
+
27
+ ```kotlin
28
+ val state: State
29
+ get() = when {
30
+ hand.isBlackjack() -> State.Finished.BlackJack
31
+ hand.isBust() -> State.Finished.Bust
32
+ hand.isStay() -> State.Finished.Stay
33
+ else -> State.Running.Hit
34
+ }
35
+ ```
36
+
37
+ - **`Deck` 의 `generateStandardDeck` + 자동 셔플 + 카드 부족시 새 덱 채움** — *카지노 무한 게임 룰 정합*. *companion object* 에 *기본 덱 생성 함수*. PR #108·#133·#136 와 같은 결.
38
+
39
+ ```kotlin
40
+ fun dealCard(): Card {
41
+ if (_cards.isEmpty()) {
42
+ _cards.addAll(generateStandardDeck())
43
+ _cards.shuffle()
44
+ }
45
+ return _cards.removeAt(0)
46
+ }
47
+ ```
48
+
49
+ - **`PlayerResult.profit: Int by lazy { calculateProfits() }` Kotlin 지연 초기화** — 페로로의 *"코틀린의 지연 초기화를 이용하면, 프로퍼티를 호출할 때 마다 매번 계산하지 않고 한번만 초기화 하도록 할 수 있습니다."* 권고 후속 반영. *Kotlin `by lazy`* 어휘 활용. *순수 계산 + 캐싱* 자연.
50
+ - **`GameResult.dealerProfit = -playerResults.sumOf { it.profit }` — 총합 0 게임 룰 정합** — *딜러 수익 = 플레이어 수익 합 × -1*. PR #131·#132·#133 와 같은 결.
51
+ - **`Player(name, hand, bettingMoney = BettingMoney())` 생성자 인자 통일** — 페로로의 *"플레이어 이름에 맞춰 배팅금액을 입력 받고, 바로 플레이어를 생성하도록 만들면, 배팅 금액을 Map 형태로 넣어줄 필요가 없지 않을까요?"* 진단 후속 반영. *Map<Player, BettingMoney>* 우회 제거.
52
+ - **테스트 추가 자가 반영** — *기능 추가 시 테스트도 같이*. 페로로 다중 권고 후속.
53
+ - **사이드 이펙트 → 별도 반환 자가 학습 (논쟁 후 후퇴)** — 학생이 처음에 *"calculateFinalProfits() 가 player 속 bettingMoney 변경 → 따로 반환 불필요"* 주장 → 페로로의 *"불변 상태로 만든다면 → 수익률을 별도 함수로 계산하는게 아닌 게임의 결과로 같이 포함하도록 한다면"* 진단 → 학생 자가 후퇴: *"따로 빼는게 더 안전성은 있을 것 같아서 그렇게 수정해보았습니다"*. **자가 학습 + 후속 반영 모범**.
54
+
55
+ ## 못한 점 (설계 관점)
56
+
57
+ ### 1. `Hand.draw` 가 *_cards 재사용* — *불변 흉내 + 깊은 가변*
58
+
59
+ ```kotlin
60
+ class Hand(
61
+ private val _cards: MutableList<Card>,
62
+ val stay: Boolean = false,
63
+ ) {
64
+ val cards: List<Card> get() = _cards.toList()
65
+ ...
66
+ fun draw(card: Card): Hand {
67
+ if (stay) return this
68
+ return Hand(_cards.apply { add(card) }, stay) // ⚠ _cards 변경 + 새 Hand 반환
69
+ }
70
+ ...
71
+ }
72
+ ```
73
+
74
+ 페로로 (Hand.kt:6 — 미해결): *"불변을 목표로 하였지만, 실제로는 가변 객체처럼 동작을 하고 있어요. 완전히 불변을 지향하는 것이라면, List 타입 하나로만 동작하도록 만들어 보시면 됩니다. `fun draw(card: Card): Hand { val nextHand = Hand(cards + card) }`"*
75
+
76
+ 학생 자가 답변 (미반영): *"완전한 불변보단 가변객체가 좋지 않을까 싶습니다 ㅜㅜ. 아직 굳이 불변으로 바꿔야 하는 큰 이유를 못찾겠습니다. 방어적 복사가 과연 정말 옳은것인가에 대해서 더 심도있는 고민이 필요한 것 같습니다."*
77
+
78
+ → **`Hand.draw(card): Hand` 반환 = *불변 스타일*** + **`_cards.apply { add(card) }` 으로 *기존 list 변경 + 같은 list 참조 새 Hand 반환***. *두 Hand 객체가 같은 _cards 참조*. *이전 Hand 조회 시 *이미 변경된 list***. **불변 표면 + 깊은 가변 함정**. *진짜 불변* = *`Hand(cards + card)` 새 list 생성*.
79
+
80
+ 페로로 진단의 의미 = *Hand 반환 = 불변 의도* / *_cards 재사용 = 가변 함정*. 학생이 *불변 vs 가변 트레이드오프*를 *방어적 복사 비용*으로 의식. 다만 *불변 표면 + 깊은 가변* 은 *최악의 표현* — *호출자가 불변 가정으로 코드 작성 시 버그 가능성*.
81
+
82
+ ### 2. `Deck(cards: List<Card>)` 생성자 = *기존 코드 회귀 신호*
83
+
84
+ ```kotlin
85
+ class Deck(cards: List<Card> = generateStandardDeck()) {
86
+ private val _cards = cards.toMutableList()
87
+ val cards: List<Card> get() = _cards.toList()
88
+ ...
89
+ }
90
+ ```
91
+
92
+ 페로로 (Deck.kt — 미해결): *"생성자로 받던 방식이 다시 없어졌어요. 왜일까요?? 테스트코드도 모두 깨졌을 것 같네요. 생성자와 방어적 복사를 활용한 방법은 아래를 참고 해주세요. `class Dedk(cards: List<Card>) { private val _cards = mutableListOf(cards); val cards: List<Card> get() = _cards.toList() }`"*
93
+
94
+ → **방어적 복사 + 불변 외부 노출 패턴이 정공**. *현재 코드 `cards.toMutableList()` + `_cards.toList()` 가 그 패턴*. 페로로 코멘트는 *이전 리뷰 자가 후퇴 경고*. 학생이 *Mutable 인자 → List 인자 → Mutable 인자 → List 인자* 흐름에서 *왔다갔다* 한 흔적. *최종 코드 정합*.
95
+
96
+ 페로로 추가 (Deck.kt:8 — 미해결): *"비어있을 때 셔플하는 규칙도 generateStandardDeck() 에 넣으면, 고민하던 비어있으면 셔플한다 라는 논리적인 문제도 해결되지 않을까요?"*
97
+
98
+ → **`dealCard` 에 *if (_cards.isEmpty()) addAll + shuffle*** 분기 vs *`generateStandardDeck()` 자체가 셔플된 덱 반환*. *책임 분리* 트레이드오프. *현재 dealCard 분기*는 *카지노 룰 분기*. *generateStandardDeck 셔플 포함*은 *생성자에서 init { _cards.shuffle() } 와 일관*.
99
+
100
+ ### 3. `Hand` 추상 클래스 + `DrawableHand` / `ReadOnlyHand` 인터페이스 패턴 미적용 (참고만 제시)
101
+
102
+ 페로로 (Hand.kt:12 — 미해결 참고): *"Hand가 Hand를 반환하도록 해서, 객체가 더 안전하도록 잘 만들어 주셨습니다. 👍🏻 ... 아래는 적용하지 않으셔도 됩니다. 참고만 해주세요. 사실 블랙잭 미션에서는 여러가지 추상화 전략을 이용한 기법을 경험하도록 되어 있는데요. 인터페이스 개념을 이용한다면 if, else 를 사용하지 않고 Hand의 상태를 수월하게 관리할 수도 있습니다."*
103
+
104
+ ```kotlin
105
+ abstract class Hand {
106
+ abstract fun draw(card): Hand
107
+ abstract fun decideStay(): Hand
108
+ }
109
+
110
+ class DrawableHand: Hand {
111
+ override fun draw(card: Card): Hand { ... }
112
+ override fun decideStay(): Hand { return ReadOnlyHand(...) }
113
+ }
114
+
115
+ class ReadOnlyHand: Hand {
116
+ override fun draw(card: Card): Hand { return this }
117
+ }
118
+ ```
119
+
120
+ → **상태 패턴 = if-else 제거**. *PR #152 (모찌 2단계) 의 State interface / PR #136 (밀러 2단계) 의 sealed class BlackJackRule* 와 같은 결. *현재 `Hand.stay: Boolean` + if-return* 은 *상태 분기 if 잔존*. *추상화로 다형성 활용* 미반영. 페로로 참고만 제시.
121
+
122
+ ### 4. `PlayerResult.calculateProfits` — *Result enum 분기 + 블랙잭 추가 분기*
123
+
124
+ ```kotlin
125
+ private fun calculateProfits(): Int {
126
+ val playerBlackjack = player.hand.isBlackjack()
127
+ val bettingAmount = player.bettingMoney.bettingMoney
128
+
129
+ return when {
130
+ result == Result.PLAYER_WIN && playerBlackjack -> (bettingAmount * 1.5).toInt()
131
+ result == Result.PLAYER_WIN -> bettingAmount
132
+ result == Result.DEALER_WIN -> -bettingAmount
133
+ result == Result.DRAW -> 0
134
+ else -> 0 // ⚠ 도달 불가 (Result enum 3개)
135
+ }
136
+ }
137
+ ```
138
+
139
+ 페로로 (GameResult.kt — 미해결): *"플레이어의 수익률이니까 PlayerResult에 가지고 있어야 하지 않을까요? 추가로 플레이어 자신의 결과를 가지고 있을테니 그 결과만으로 수익률을 계산할 수 있어 보이는데요. 수익률을 위해 딜러와 다시 승부를 벌이는 이유가 있을까요?"*
140
+
141
+ → **수익률 = PlayerResult 책임 (좋은 면)** + **블랙잭 분기 (`isBlackjack && PLAYER_WIN`) = Player.hand 직접 의존**. *PR #131·#132 의 GameResult enum + BlackjackWin 별도 멤버 패턴* 과 비교: *Result enum 3개 (WIN/DEALER_WIN/DRAW) + BLACKJACK 별도 분기*. *블랙잭은 결과의 한 종류*인지 *수익률의 한 변형*인지 *모호*. *Result.BLACKJACK_WIN* 멤버 추가가 *명시*.
142
+
143
+ 또한 `else -> 0` = *도달 불가 분기* — *Result enum 3개 + `result == PLAYER_WIN && !blackjack` else* 까지면 모든 경우 처리. *enum exhaustive when 활용 미달*.
144
+
145
+ ### 5. `Player(name, hand, bettingMoney)` 가 *Hand + BettingMoney + name = 3 변수*
146
+
147
+ → **3 변수 제약**. *Player = 이름 + 손패 + 베팅금*. *블랙잭 도메인에서 자연한 묶음*. *3 변수 제약 = 연습 도구* (PR #133 말리빈 진단) 의 *정당한 도메인 객체* 케이스.
148
+
149
+ 다만 `BettingMoney = BettingMoney()` default = *베팅 안 한 Player* 표현. *Player 가 반드시 베팅* 인지 *default 베팅 0* 인지 *도메인 의미 명시 부재*. PR #131 (다이스 2단계) 의 *기본 생성자 지양* 권고와 같은 결.
150
+
151
+ ### 6. `Hand.draw` 의 `if (stay) return this` — *예외 vs silent ignore*
152
+
153
+ ```kotlin
154
+ fun draw(card: Card): Hand {
155
+ if (stay) return this // ⚠ stay 시 silent return
156
+ return Hand(_cards.apply { add(card) }, stay)
157
+ }
158
+ ```
159
+
160
+ → **stay 상태에서 `draw(card)` 호출 시 *카드 무시 + 자기 반환***. *예외 throw* 대안: *stay 시 IllegalStateException*. *silent ignore vs explicit failure* 트레이드오프. *호출자가 stay 상태 모르고 draw 호출 시 *카드 분실 신호 없음**. *PR #152 (모찌 2단계) 의 Finish.draw throw IllegalStateException* 와 *반대 트레이드오프*.
161
+
162
+ *안전한 표현* = *Hand.draw 가 *stay 검증 후 호출자가 보장**. *현재 silent return* = *Hand 가 자기 invariant 강제 + 호출자 부담 없음*. *둘 다 합리* — 트레이드오프.
163
+
164
+ ### 7. `Hand(_cards.apply { add(card) }, stay)` — *같은 _cards 참조 새 Hand*
165
+
166
+ ```kotlin
167
+ return Hand(_cards.apply { add(card) }, stay)
168
+ ```
169
+
170
+ → **두 Hand 객체가 *같은 _cards MutableList 참조***. *호출 흐름*:
171
+ - *Hand1 = 초기 손패*
172
+ - *Hand2 = Hand1.draw(card)* → Hand1._cards 에 카드 추가 + Hand2 새 객체이지만 same _cards
173
+
174
+ *Hand1._cards.size == Hand2._cards.size* (둘이 같은 list).
175
+
176
+ 이건 *불변 객체의 본질 위반* — *Hand1 의 상태가 Hand1.draw 호출로 변경*. *함수형 스타일 정공* = *cards + card* (새 list 생성). 페로로 권고:
177
+
178
+ ```kotlin
179
+ fun draw(card: Card): Hand {
180
+ val nextHand = Hand(cards + card) // 새 List
181
+ }
182
+ ```
183
+
184
+ 학생 자가 답변 = *가변 유지 결정*. *Kotlin 의 cards + card immutable expression* 활용 미달.
185
+
186
+ ### 8. `Hand.stay: Boolean` 부생성자 default = `false` — 모호한 시작 상태
187
+
188
+ ```kotlin
189
+ class Hand(
190
+ private val _cards: MutableList<Card>,
191
+ val stay: Boolean = false,
192
+ )
193
+ ```
194
+
195
+ → **`stay = false` default** = *모든 Hand 가 초기 *진행 중**. *블랙잭 도메인 = Hand 생성 시점 = 초기 2장 분배 후* 라면 *진행 중 default* 정합. 다만 *Hand 자체*가 *카드 0장 또는 카드 1장* 상태도 가능 — *블랙잭 룰 invariant 부재*. PR #136 (밀러 2단계) 의 *Hand.size 검증 부재* 와 같은 결.
196
+
197
+ ### 9. `calculateFinalProfits()` *반환 없음 + 사이드 이펙트* (자가 후퇴) — `calculate` naming 패턴 위반
198
+
199
+ 학생 초기 코드 (후속 수정 전): `calculateFinalProfits()` 가 *Unit 반환 + Player.bettingMoney 변경*.
200
+
201
+ 페로로: *"`calculateFinalProfits()` 무언가를 계산하라 라는 메시지가 아무것도 반환을 하지 않는게 맞을까요? ... calculateXXX는 일반적인 프로그래밍 패턴으로 무언가를 반환하도록 사용됩니다."*
202
+
203
+ 학생: *"제 생각엔 calculateFinalProfits()함수내에서 계산을 한 후에 player속에 bettingMoney가 변경되게 만들어서 따로 반환이 필요하지 않다고 생각하는데 어떻게 생각하시나요???"*
204
+
205
+ 페로로: *"calculateXXX는 일반적인 프로그래밍 패턴으로 무언가를 반환하도록 사용됩니다. 대다수의 개발자들이 이렇게 사용될거라고 생각을 하는데 실제로는 다르다면 불필요한 비용이 들 수 있습니다. 클래스와 함수 모두, 가급적 사이드 이펙트를 최소화 하라는 의미는 무엇인지 알고 계실거라 생각합니다. 그런 차원에서 본다면 calculateFinalProfits()을 호출할 때 마다 값이 달라질 수 있다는 것은 좋은 방법일까요? > 게임 결과를 만들었는데, 수익률이 매번 바뀔 수 있다 > 게임 결과에 있는 딜러의 배팅 금액을 임의로 바꾸면 수익률이 바뀌어야 한다. 위 문제를 근본적으로 접근해서, 불변 상태로 만든다면 -> 수익률을 별도 함수로 계산하는게 아닌 게임의 결과로 같이 포함하도록 한다면 어떨까요?"*
206
+
207
+ → **`calculateXXX = 반환 패턴 표준 + 사이드 이펙트 최소화 + 불변 게임 결과 권고**. 학생 자가 후퇴 + 후속 반영. *호출 시점마다 값 달라질 위험 + 게임 결과 invariant 깨짐* 진단.
208
+
209
+ ### 10. *불변에 대한 학생 자가 회의 — "방어적 복사가 정말 옳은가"*
210
+
211
+ 학생 인용: *"완전한 불변보단 가변객체가 좋지 않을까 싶습니다 ㅜㅜ. 아직 굳이 불변으로 바꿔야 하는 큰 이유를 못찾겠습니다. 방어적 복사가 과연 정말 옳은것인가에 대해서 더 심도있는 고민이 필요한 것 같습니다."*
212
+
213
+ → **불변 vs 가변 트레이드오프 자가 의문 — 학습 가시화 모범**. *PR #133 (시아 2단계) 의 "val 가변 vs var 불변"* 자가 의문과 같은 결. *불변 = multi-thread 안전 + 부수효과 0 + 추론 쉬움*. *가변 = 성능 + 코드 짧음 + 익숙*. *결정은 도메인 + 컨텍스트 의존*.
214
+
215
+ 페로로 답변 (calculateFinalProfits 토론): *"기존 사이드 이펙트를 사용한 코드가 안정성이 떨어진다는 것을 충분히 알고 계셧다면 왜 사용했을까요.."* — *학생의 자가 판단이 옳은 지 토론 유도*.
216
+
217
+ ## 리뷰어 의견 요지
218
+
219
+ - **`calculateXXX` 가 사이드 이펙트 + Unit = naming 패턴 위반** — *반환 표준*. *호출 시점마다 값 변경 가능성 = 게임 결과 invariant 부재*.
220
+ - **불변 게임 결과 = 수익률을 결과 객체에 포함** — *계산 시점 ≠ 결과 시점* 분리. *PlayerResult.profit by lazy* 가 그 표현.
221
+ - **`Hand.draw(card): Hand` 메시지 반환 = 불변 표면, 다만 _cards 재사용은 깊은 가변** — *완전한 불변* = *List 타입 하나 + cards + card*.
222
+ - **상태 패턴 (`DrawableHand` / `ReadOnlyHand`) = if-else 제거** — *블랙잭 미션의 추상화 전략 경험*. 페로로 참고만 제시.
223
+ - **`Deck` 빈 상태 셔플 = generateStandardDeck 책임** — *논리적 문제 (비어 있으면 셔플) 해결*.
224
+ - **방어적 복사 = 캡슐화 + 의도치 않은 버그 방지** — *외부에서 cards.add(...) 같은 변경* 차단. PR #108 (시아 1단계) 의 *MutableList 외부 인자* 진단의 연장.
225
+ - **수익률 = PlayerResult 책임** — *플레이어 자신의 결과만으로 계산 가능*. *딜러와 다시 승부 X*.
226
+ - **Kotlin `by lazy` 활용** — *프로퍼티 호출마다 매번 계산 X*. *한 번 초기화 + 캐싱*.
227
+ - **사이드 이펙트 = 가급적 최소화 + 의도 명시 필요** — *사용 시 명시 안 하면 호출자 추측*. *학생이 의도 = 명시*.
228
+ - **`MutableList` vs `List` = 기본은 불변** — *생성자 인자 Mutable 이면 외부 변경 가능성*.
229
+ - **테스트도 기능과 함께 추가** — *기능 추가 시 테스트 필수 (TDD 일관성)*.
230
+
231
+ ## 대표 인용
232
+
233
+ **페로로 (calculate 패턴 + 사이드 이펙트, BlackJackController.kt):**
234
+ > calculateXXX는 일반적인 프로그래밍 패턴으로 무언가를 반환하도록 사용됩니다.
235
+ > 대다수의 개발자들이 이렇게 사용될거라고 생각을 하는데 실제로는 다르다면 불필요한 비용이 들 수 있습니다.
236
+ >
237
+ > 클래스와 함수 모두, 가급적 사이드 이펙트를 최소화 하라는 의미는 무엇인지 알고 계실거라 생각합니다.
238
+ > 그런 차원에서 본다면 calculateFinalProfits()을 호출할 때 마다 값이 달라질 수 있다는 것은 좋은 방법일까요?
239
+ >
240
+ > > 게임 결과를 만들었는데, 수익률이 매번 바뀔 수 있다
241
+ > > 게임 결과에 있는 딜러의 배팅 금액을 임의로 바꾸면 수익률이 바뀌어야 한다.
242
+ >
243
+ > 위 문제를 근본적으로 접근해서, 불변 상태로 만든다면 --> 수익률을 별도 함수로 계산하는게 아닌 게임의 결과로 같이 포함하도록 한다면 어떨까요?
244
+
245
+ **페로로 (불변 vs 가변 + Hand, Hand.kt:6):**
246
+ > 불변을 목표로 하였지만, 실제로는 가변 객체처럼 동작을 하고 있어요.
247
+ > ```kotlin
248
+ > val cards = mutableListOf<Card>()
249
+ > val hand = Hand()
250
+ > cards.add(Card())
251
+ > cards.add(Card())
252
+ > val result = hand.cards // [?, ?]
253
+ > ```
254
+ >
255
+ > 완전히 불변을 지향하는 것이라면, List 타입 하나로만 동작하도록 만들어 보시면 됩니다.
256
+ > ```kotlin
257
+ > fun draw(card: Card): Hand {
258
+ > val nextHand = Hand(cards + card)
259
+ > }
260
+ > ```
261
+
262
+ **페로로 (상태 패턴 추상화 참고, Hand.kt:12):**
263
+ > Hand가 Hand를 반환하도록 해서, 객체가 더 안전하도록 잘 만들어 주셨습니다. 👍🏻
264
+ > ...
265
+ > 아래는 적용하지 않으셔도 됩니다. 참고만 해주세요*
266
+ > 사실 블랙잭 미션에서는 여러가지 추상화 전략을 이용한 기법을 경험하도록 되어 있는데요.
267
+ > 인터페이스 개념을 이용한다면 if, else 를 사용하지 않고 Hand의 상태를 수월하게 관리할 수도 있습니다.
268
+
269
+ **페로로 (캡슐화 = 의도치 않은 버그 방지, Deck.kt):**
270
+ > 작성하신 구조에서는 논리적으로 카드가 비어있다면 셔플을 하거나, "Deck is empty" 출력합니다.
271
+ > 지우는 것 외에도 외부에서 상태를 임의로 바꾸지 못하게 하는 것은 객체지향 캡슐화와, 은닉성을 지키면서 의도치 않은 버그를 만들지 않기 위함입니다.
272
+ >
273
+ > 지우는 것 말고 반대로 넣는 예시로 볼게요.
274
+ > 아래와 같은 코드 호출이, 내가 의도한 프로그램으로서 동작하는데 문제가 없을까요?
275
+ > 사용하는 측이 건들였으니 아무런 책임이 없는 걸까요?
276
+
277
+ **페로로 (사이드 이펙트 의도 명시 + 학생 자가 의도, BlackJackController.kt):**
278
+ > 사이드 이펙트를 이용해서 풀려 했다는 사실을, 왜 먼저 명시해주지 않으셨을까 궁금하네요.
279
+ > 정답은 없기 때문에 가변 상태를 이용한 방법도 하나의 해결법이 될 수 있습니다.
280
+ >
281
+ > 상태를 불변으로 만들면서, 점차 개선하는 과정을 연습하는 과정으로 생각해주시면 될 것 같습니다.
282
+ > 다만 기존 사이드 이펙트를 사용한 코드가 안정성이 떨어진다는 것을 충분히 알고 계셧다면 왜 사용했을까요..
283
+
284
+ **학생 자가 답변 (불변 vs 가변 자가 의문, Hand.kt:6):**
285
+ > 완전한 불변보단 가변객체가 좋지 않을까 싶습니다 ㅜㅜ
286
+ > 아직 굳이 불변으로 바꿔야 하는 큰 이유를 못찾겠습니다.
287
+ > 방어적 복사가 과연 정말 옳은것인가에 대해서 더 심도있는 고민이 필요한 것 같습니다.
288
+
289
+ **학생 자가 답변 (사이드 이펙트 시도 의도, BlackJackController.kt):**
290
+ > 사이드 이펙트를 사용해서 풀면 좋은 경우가 있다고 들어서 저는 이경우가 굳이 불변으로 바꾸지 않고 사이드 이펙트를 사용하는게 더 좋다고 판단했었습니다.
291
+
292
+ ## 얻은 교훈
293
+
294
+ 1. ***`calculateXXX` 가 사이드 이펙트 + Unit = naming 패턴 위반***. *Kotlin 의 calculate 메서드 표준 = 반환*. *대다수 개발자 추측과 다른 동작 = 불필요한 인지 비용*. 사이드 이펙트 의도면 *명시적 이름 (`updateProfits()`, `applyResultsToPlayers()`)* 이 자연.
295
+
296
+ 2. ***불변 게임 결과 = 수익률을 결과 객체에 포함***. *계산 시점마다 값 달라지면 *게임 결과 invariant* 깨짐*. *결과 객체의 수익률 = 계산 시점에 고정 (`by lazy`)* 가 정공. PR #131·#132·#133 의 *GameResult/BlackjackResult* 와 같은 결.
297
+
298
+ 3. ***Hand.draw(card): Hand 반환 = 불변 표면, _cards 재사용 = 깊은 가변***. *불변 표현 + 가변 함정* 최악. *Kotlin `cards + card` immutable expression* 활용 가능. 학생 자가 회의 + 후속 반영 미달 = *trade-off 의식이 의도적 선택*.
299
+
300
+ 4. ***방어적 복사 = 캡슐화 + 의도치 않은 버그 방지***. *Mutable 인자 노출 → 외부 변경 가능 → 의도 안 했는데 상태 변경*. *생성자에서 toMutableList() 사본 + getter toList()* 가 정공. PR #108·#132·#133 와 같은 결.
301
+
302
+ 5. ***상태 패턴 (`DrawableHand` / `ReadOnlyHand`) = if-else 제거***. *블랙잭 미션의 추상화 전략 경험 = 인터페이스 다형성*. *Hand.stay: Boolean + if (stay) return this* 는 *상태 분기 잔존*. PR #152·#136·#133·#131 와 같은 결의 sealed/abstract 상태 객체.
303
+
304
+ 6. ***Kotlin `by lazy` = 프로퍼티 호출마다 매번 계산 X***. *순수 계산 + 캐싱* 자연. *`val profit: Int by lazy { calculateProfits() }`* 한 줄. *Kotlin 어휘 활용 모범*.
305
+
306
+ 7. ***딜러 수익 = 플레이어 수익 합 × -1*** = *총합 0 게임 룰 정합*. PR #131·#132·#133·#136 와 같은 결. 학생의 *`GameResult.dealerProfit = -playerResults.sumOf { it.profit }`* 한 줄 표현.
307
+
308
+ 8. ***`else -> 0` 도달 불가 분기 = enum exhaustive when 미활용***. *Result enum 3개 (PLAYER_WIN/DEALER_WIN/DRAW)* 면 *모든 경우 처리*. *else 도달 불가*. *Kotlin enum + when exhaustive* 컴파일러 보장 활용 미달.
309
+
310
+ 9. ***`Hand.stay` Boolean 시작값 = false default = 모호한 시작 상태***. *Hand 생성 시점*이 *초기 2장 분배 후* 라면 *default false 정합*. *Hand 0장/1장* 상태도 가능 — *블랙잭 invariant 부재*. PR #136·#133·#132 와 같은 결.
311
+
312
+ 10. ***학생 자가 학습 + 자가 후퇴 + 자가 회의 = 학습 가시화 모범***. *사이드 이펙트 → 별도 반환 후퇴*, *불변 vs 가변 자가 회의*, *방어적 복사 의문*. *trade-off 의식 = 의도적 선택* 흐름. 페로로의 *"사이드 이펙트를 사용해서 풀려 했다는 사실을, 왜 먼저 명시해주지 않으셨을까 궁금하네요"* 가 *자가 의도 명시의 중요성*. PR #131·#132·#133·#136 와 같은 결.
313
+
314
+ 11. ***`Hand.draw(card)` silent return vs throw IllegalStateException 트레이드오프***. *PR #152 (모찌 2단계) 의 Finish.draw throw* 와 *반대 선택*. *silent ignore = Hand 자기 invariant 강제 + 호출자 부담 없음*. *throw = 명시적 실패 + 호출자가 stay 검증 강제*. *둘 다 합리* — 도메인 의존.
315
+
316
+ 12. ***`generateStandardDeck()` 자체가 셔플 포함 vs `dealCard` 분기*** = *책임 분리 트레이드오프*. *셔플 = 덱 생성 시 한 번* vs *카지노 룰 = 빈 시 셔플 + 새 카드* 양쪽 표현. PR #108·#133·#136·#136 와 같은 결.
317
+
318
+ 13. ***`MutableList<Card>` 생성자 인자 회귀 → List<Card> 자가 후퇴 → 다시 MutableList → ...*** = *자가 학습 흐름의 왔다갔다*. 페로로 진단 = *학생이 왜 회귀했는지 자가 인식 + 명시* 권고. *학습 가시화 = 자가 결정의 근거 노출*.
@@ -0,0 +1,250 @@
1
+ # PR #128 — [블랙잭 1단계] 화이팅 미션
2
+
3
+ - **Reviewee:** [@ijh1298](https://github.com/ijh1298)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/128
5
+ - **단계:** 1단계 (페어, TDD 진행)
6
+ - **리뷰어:** @krrong (크롱)
7
+ - **라인 코멘트:** 30 (리뷰어 13 / 리뷰이 17)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`@JvmInline value class` 적극 사용 (`CardNumber`, `Suit`) + 범위 invariant** — 원시값 포장.
12
+ - **TDD 진행 — 테스트 / 구현 / README 체크 분리 커밋** — 리뷰어가 *한 번에 진행 권고*했지만 *TDD 사이클 가시화* 의도 명시.
13
+ - **`Card.constructor(cardIndex: Int)` 인덱스 → CardNumber/Suit 분해 — 카드 ID 변환 유틸** (후속에 제거됨).
14
+ - **후속 반영 폭 큼:**
15
+ - `value class Suit/CardNumber` → `enum class` 전환 (학생 자가 이점 설명: *유효성 검증 불필요* + *else 구문 회피*).
16
+ - `outputView` 확장 함수로 *UI 문자열 이관*.
17
+ - `Rule` 클래스 제거 + `HandCards` 일급 컬렉션 도입 (점수 계산 + Bust + 비교 책임 이전).
18
+ - `Player`/`Dealer` 추상화 → `Participant`로 재정의 + `compareTo` 메서드.
19
+ - `Deck`에 `CardsGenerator` 인터페이스 주입 (테스터빌리티).
20
+
21
+ ## 못한 점 (설계 관점)
22
+
23
+ ### 1. enum 대신 `@JvmInline value class`로 *13개 / 4개 닫힌 집합* 표현
24
+
25
+ ```kotlin
26
+ @JvmInline
27
+ value class Suit(private val index: Int) {
28
+ init { require(index in SUIT_INDEX_RANGE) { ... } }
29
+ companion object { const val MAX_SUIT_NUMBER = 4 }
30
+ }
31
+
32
+ @JvmInline
33
+ value class CardNumber(val cardNumber: Int) {
34
+ init { require(cardNumber in CARD_NUMBER_RANGE) { ERROR_OUT_OF_CARD_NUMBER_RANGE } }
35
+ fun getValue(): Int = if (cardNumber > 10) 10 else cardNumber
36
+ fun getCardNumberName(): String = when (cardNumber) {
37
+ 1 -> "A"; 11 -> "J"; 12 -> "Q"; 13 -> "K"; else -> cardNumber.toString()
38
+ }
39
+ }
40
+ ```
41
+
42
+ 리뷰어: "enum class로 변경해볼까요? *value 클래스로 설계한 이유와 변경하면서 어떤 이점이 있었는지 설명해주세요* 🤠"
43
+
44
+ 학생 자가 인정: "단지 1~13의 정수만을 담으니 *원시값의 최적화에 도움이 되는 value class*로 결정하고 빠르게 넘어갔었는데, enum class로 수정하니 *애초에 13가지의 수만 선언해놓아서 이외 지정될 수 없는 정수의 유효성 검증을 하지 않아도 된다는 점*, *열거형의 장점인 한눈에 보기 쉽다는 점*의 이점을 챙길 수 있었습니다!"
45
+
46
+ → **`value class` vs `enum class` 선택 휴리스틱**: *연속 정수 + invariant*는 `value class`, *닫힌 유한 집합*은 `enum class`. 학생은 *원시값 최적화* 한 가지만 보고 선택. *유한 집합 → enum*이 더 큰 이점(컴파일러 검증 + when else 회피).
47
+
48
+ ### 2. `CardNumber.getCardNumberName()` UI 표현 ("A", "J", "Q", "K")
49
+
50
+ 리뷰어: "*어떻게 출력이 될지는 UI의 관심사이지 않을까요?* 🤔" — 일관 패턴. 후속 `outputView` 확장함수로 이동.
51
+
52
+ ### 3. `WinLoss.koreanText` — 도메인 enum이 한국어 문자열 보유
53
+
54
+ ```kotlin
55
+ enum class WinLoss(val koreanText: String) {
56
+ WIN("승"), DRAW("무"), LOSE("패"),
57
+ }
58
+ ```
59
+
60
+ 리뷰어: "`koreanText` 역시 *UI 영역처럼 보이네요*!" — 일관 패턴 (PR #28·#112·#125와 동일). 후속 반영.
61
+
62
+ ### 4. `Card(cardIndex: Int)` 보조 생성자 — 0~51 인덱스로 분해
63
+
64
+ ```kotlin
65
+ data class Card(val cardNumber: CardNumber, private val suit: Suit) {
66
+ constructor(cardIndex: Int) : this(
67
+ cardNumber = CardNumber((cardIndex) % MAX_CARD_NUMBER + 1),
68
+ suit = Suit((cardIndex) / MAX_CARD_NUMBER),
69
+ ) { require(cardIndex in CARD_INDEX_RANGE) { ERROR_OUT_OF_CARD_INDEX } }
70
+ }
71
+ ```
72
+
73
+ 리뷰어: "*딱 봐도 복잡하게 생겼군요...*😅 `CardNumber`와 `Suit`를 리팩터링하면서 함께 리팩터링해보면 좋겠어요." — *인덱스 ↔ (Number, Suit) 변환*은 *Card의 책임이 아님*. enum 전환 시 자연히 제거됨 (학생 인정).
74
+
75
+ ### 5. `Deck`이 *Singleton + 모든 카드 자동 생성 + ArrayDeque*
76
+
77
+ ```kotlin
78
+ class Deck {
79
+ companion object {
80
+ private val cards = ArrayDeque(Card.CARD_INDEX_RANGE.shuffled().map { Card(it) })
81
+ fun giveCard() = cards.removeFirst()
82
+ }
83
+ }
84
+ ```
85
+
86
+ 리뷰어: "덱을 생성할 때 *모든 카드가 들어있을 것이라고 예상할 수 있을까요?* 🤔 카드를 명시적으로 넣어주는 것은 어떤가요? --- *특별히 `ArrayDeque`를 사용한 이유가 있나요?*"
87
+
88
+ 학생: "*Deck의 네이밍에서 카드를 가지고 있을 거라 충분히 추측이 가능하다고 생각*하여 프로퍼티나 인자로 받을 필요가 없다고 생각했습니다! [...] 시작부터 셔플된 카드로 덱이 생성되면 테스트하기 어려울 듯하여 [...] *셔플된 카드를 넣는 Generator, 원하는 카드를 넣을 수 있는 Generator를 주입할 수 있도록 CardsGenerator 인터페이스*를 만들어 리팩터링을 진행했습니다!" — *이름 추론*과 *명시적 invariant 표현*은 다름. *생성자 인자*가 *invariant 가시화*. 자료구조 선택(`ArrayDeque`): "*시간복잡도 면에서 나은 ArrayDeque을 무의식적으로 사용*" — *무의식*이라는 정직한 인정.
89
+
90
+ 또: `companion object`로 *static cards*. *전역 변경 가능 상태* (PR #78/#65와 같은 결).
91
+
92
+ ### 6. `GameParticipant` abstract class의 `play()` / `isDrawFinish()` 미구현 + 미사용
93
+
94
+ ```kotlin
95
+ abstract class GameParticipant(val name: String) {
96
+ private val cards = mutableListOf<Card>()
97
+ init { repeat(2) { drawCard() } } // ⚠ init에서 추상 메서드 호출 위험 없는지?
98
+ fun showCards(): List<Card> = cards.toList()
99
+ fun drawCard() { cards += Deck.giveCard() }
100
+ abstract fun play()
101
+ abstract fun isDrawFinish(): Boolean
102
+ }
103
+ ```
104
+
105
+ 리뷰어: "*`Player`, `Dealer` 모두 구현하고 있지 않은데 무엇을 위한 것인가요?* 🤔" / "*`play` 함수와 비슷하게 어떤 곳에서도 사용하고 있지 않네요* 😅" — *추상 메서드 정의*해놓고 *구현체에서 빈 함수*. *설계 의도만 적어놓고 실제 흐름이 호출 안 함*. 학생 자가 인정: "급하게 미션을 진행해서 *제가 보기에도 이상한 부분을 많이 작성*한 것 같습니다 😭" — 후속 `Participant` + `compareTo` 재정의.
106
+
107
+ 또: `init`에서 `drawCard()`가 *static Deck*에 의존 → *전역 상태에 의존하는 생성자*. *Participant 생성 시점에 Deck이 준비*되어야 한다는 *암묵 invariant*.
108
+
109
+ ### 7. `Rule` 클래스가 *모든 룰을 companion object에* — *상태 없는 정적 유틸*
110
+
111
+ ```kotlin
112
+ class Rule {
113
+ companion object {
114
+ fun calculateResultByCards(cards: Collection<Card>): Int { ... }
115
+ fun isBurst(cards: Collection<Card>): Boolean { ... }
116
+ fun isDealerMustDraw(cards: Collection<Card>): Boolean { ... }
117
+ ...
118
+ }
119
+ }
120
+ ```
121
+
122
+ 리뷰어: "*모든 함수가 `Collection<Card>` 를 받고 있는데 이렇게 구현한 이유는 무엇인가요?* 🤔" / "*모든 로직을 companion object에 작성*해주었는데 이러한 이유가 있을까요? 🤔"
123
+
124
+ 학생 자가 인정: "*상태가 필요없지만 규칙에 물어보는 용도로 Rule을 처음에 정의*했습니다. 따라서 *object처럼 사용*하게 되었습니다. 다만 [...] *명확한 역할이 정의되지 않고, 규칙이라는 광범위한 역할*을 맡다보니 *무슨 상태를 지녀야 할지, 무슨 책임을 지녀야 할지가 명확해지지 않아졌습니다*."
125
+
126
+ 리뷰어: "*`Rule`이 가지고 있는 모든 기능들은 알맞는 객체로 이동할 수 있는 것처럼 보여요*. 열심히 분리해보면 *`Rule` 자체를 떠나보내줄 수도* 있어보입니다. 🤠" — `Rule`이라는 *광범위 명사*가 *책임 흡인기*. 정적 유틸 + Collection 인자는 *데이터를 빼앗긴 객체*(feature-envy). 학생 후속: `Rule` 제거 + `HandCards`에 *점수 계산 + Bust 판정 + 비교* 이전. **`Rule` 같은 *범용 명사*는 책임을 흩뜨림** — 이름이 의미를 만들지 않는다 (PR #63 `BlackJack`과 같은 결).
127
+
128
+ ### 8. `Rule.calculateResultByCards(cards: Collection<Card>)` — Collection 추상화의 부작용
129
+
130
+ 학생 자가 인정: "*페어의 의견에 List, Set 등 타입을 전부 받을 수 있다는 장점*을 수긍해 그렇게 적용하였습니다! 다만 생각해보니 *저번 미션과 다르게 Set을 사용할 필요가 없다*고 생각이 듭니다. 또한 *명확한 자료형을 명시하지 않는 셈이니 혹시 모를 어떤 문제점이 발생할 수도 있을 듯합니다.*" — *유연성*은 *명확성을 비용으로*. *호출자가 어떤 타입을 줄지 모름* + *함수 내부에서 가정*. 가장 *구체적인 타입*이 보통 정답.
131
+
132
+ ### 9. 매직넘버 곳곳 — `21`, `16`, `10`
133
+
134
+ ```kotlin
135
+ fun calculatePlayerWinLoss(...): WinLoss {
136
+ ...
137
+ if (playerScore > 21) { ... } // ⚠ 매직 21
138
+ }
139
+
140
+ class Rule { companion object {
141
+ fun calculateResultByCards(cards: Collection<Card>): Int {
142
+ ...
143
+ if (1 in cardValues && (minimumSum + 10) <= BLACK_JACK_NUMBER) { // ⚠ 매직 10
144
+ return minimumSum + 10
145
+ }
146
+ }
147
+ }}
148
+ ```
149
+
150
+ 리뷰어: "*곳곳에 매직넘버가 자주 출몰하고 있네요. 다른 파일들도 모두 확인해주세요* 🤠" — `BUST_THRESHOLD = 21`, `ACE_BONUS = 10`, `DEALER_MUST_HIT_THRESHOLD = 16` 같은 *도메인 룰 상수* 명명.
151
+
152
+ ### 10. `HandCards.compareTo(opponentHandCards): GameResult` — *점수 동률 = 무승부* 오판
153
+
154
+ ```kotlin
155
+ fun compareTo(opponentHandCards: HandCards): GameResult {
156
+ if (isBurst()) return GameResult.LOSE
157
+ if (getScore() > opponentHandCards.getScore()) return GameResult.WIN
158
+ if (getScore() == opponentHandCards.getScore()) return GameResult.DRAW
159
+ return GameResult.LOSE
160
+ }
161
+ ```
162
+
163
+ 리뷰어: "*점수가 똑같다고 항상 비기는 것은 아니에요!* 블랙잭 룰을 다시 한 번 확인해보면 좋겠어요 🤠" — 블랙잭에서 *21 = BlackJack(2장)*과 *21 = 일반 합산*은 다름. 또 *Bust 동률*은 *무승부 아님*. *점수 동률 != 무승부*. 단순 *점수 비교*는 블랙잭 룰을 환원시킴.
164
+
165
+ ### 11. `HandCards.compareTo` — `if` 3개 분기
166
+
167
+ 리뷰어: "*조건이 3가지 이상인 경우에는 if문 보다도 when 절을 사용하는 것을 권장*합니다 🤠 ref. https://kotlinlang.org/docs/coding-conventions.html#if-versus-when" — Kotlin 코딩 컨벤션. *3개 이상 분기는 when*.
168
+
169
+ ### 12. `HandCards`가 *사용 안 됨* (후속에 도입했으나 다른 곳 미수정)
170
+
171
+ 리뷰어: "*사용하지 않는 것처럼 보이네요* 😅" — *새 객체 도입만 하고 기존 코드 갱신 누락*. 리팩토링 *반쪽*.
172
+
173
+ ### 13. TDD *분리 커밋* — 컴파일 안 되는 중간 커밋
174
+
175
+ 학생 PR 본문: "테스트 코드 작성, 구현, README 체크가 *따로 커밋*을 진행"
176
+
177
+ 리뷰어: "*TDD를 진행하는 것처럼 보이는데요*. [...] *한 번에 이루어지면 좋을 것 같아요* 🤠"
178
+
179
+ 학생 자가 토론: "이번 페어가 저번 미션에서 *TDD로 진행했음에도 불구하고 TDD로 진행한 티가 안났다*고 피드백을 받아서 이번에 *티가 나도록(?) 진행해보자*고 판단해서 이런 방식으로 커밋을 했었습니다. 다만 *컴파일 되지 않는 코드를 커밋*하면서 *이 방식으로 진행해도 되는가에 대한 찜찜함*과 의문이 남긴 했었습니다.." — *TDD 가시화*가 *컴파일 깨진 중간 커밋*을 낳음. *Red-Green-Refactor*의 *Red 상태도 함께 커밋*해야 *TDD 흔적*이 보인다는 *의도*는 이해되나, *git history는 bisect 가능*해야 의미. 학생도 *찜찜함*을 자가 인정.
180
+
181
+ ### 14. `HandCards.show()` + `HandCards.cards` 둘 다 노출
182
+
183
+ ```kotlin
184
+ class HandCards {
185
+ private val _cards = mutableListOf<Card>()
186
+ private val cards get() = _cards.toList() // private getter
187
+ fun add(card: Card) { _cards += card }
188
+ fun show(): List<Card> = cards // public show()
189
+ }
190
+ ```
191
+
192
+ `show()`가 *방어적 복사된 cards*를 *그대로 반환*. *공개 API*에 `show()`/`cards` 둘 다 존재할 필요 없음. *외부에 노출할 거면 `cards: List<Card>`*가 직관, *컬렉션 전체 노출이 싫으면 `forEach`/`map` 위임만*.
193
+
194
+ ### 15. `CardsGenerator: interface`에 `fun interface` 폐기 토론
195
+
196
+ ```kotlin
197
+ interface CardsGenerator {
198
+ fun createCards(): List<Card>
199
+ }
200
+ ```
201
+
202
+ 리뷰어: "*fun interface로 선언했던 이유와 변경한 이유가 무엇인가요?* 🤔" — Kotlin `fun interface`는 *단일 추상 메서드*에 *람다 변환*을 허용. 학생이 *왜 `fun interface`에서 일반 `interface`로* 바꿨는지 설명 요구. *기능 선택의 근거*가 *글로 남아야* 학습 가시화.
203
+
204
+ ## 리뷰어 의견 요지
205
+
206
+ - ***`value class` vs `enum class` 선택*** — *연속 정수 + invariant*는 value, *닫힌 유한 집합*은 enum.
207
+ - ***UI 표현(`koreanText`, `getCardNumberName`)은 도메인 X***.
208
+ - ***`Card.constructor(cardIndex)` 인덱스 분해는 Card의 책임 X***.
209
+ - ***Deck Singleton + 자동 생성 = 명시 invariant 부재 + 테스터빌리티 ↓***.
210
+ - ***abstract class의 미구현/미사용 추상 메서드 = 설계 의도만 적어놓은 잔해***.
211
+ - ***`Rule` 광범위 명사 = 책임 흡인기*** — 책임을 적절 객체로 이전 후 `Rule` 제거 가능.
212
+ - ***`Collection<Card>` 인자 = 명확성과 맞바꾼 유연성***.
213
+ - ***매직넘버(21/16/10) 상수화***.
214
+ - ***`compareTo`가 점수 동률 = 무승부 = 블랙잭 룰 환원***.
215
+ - ***`if` 3개 이상 = `when`*** (Kotlin convention).
216
+ - ***새 객체 도입만 + 기존 갱신 누락 = 리팩토링 반쪽***.
217
+ - ***TDD 가시화가 컴파일 깨진 중간 커밋을 낳음 = bisect 불가***.
218
+
219
+ ## 대표 인용
220
+
221
+ > 어떻게 출력이 될지는 *UI의 관심사*이지 않을까요? / `koreanText` 역시 *UI 영역처럼 보이네요!*
222
+ > — @krrong on `CardNumber.kt` / `WinLoss.kt`
223
+
224
+ > enum class로 변경해볼까요? *value 클래스로 설계한 이유와 변경하면서 어떤 이점이 있었는지 설명*해주세요 🤠
225
+ > — @krrong on `Suit.kt`
226
+
227
+ > `Player`, `Dealer` 모두 구현하고 있지 않은데 *무엇을 위한 것인가요?* 🤔
228
+ > — @krrong on `GameParticipant.kt`
229
+
230
+ > `Rule`이 가지고 있는 모든 기능들은 *알맞는 객체로 이동할 수 있는 것처럼* 보여요. 열심히 분리해보면 *`Rule` 자체를 떠나보내줄 수도 있어보입니다.* 🤠
231
+ > — @krrong on `Rule.kt`
232
+
233
+ > *점수가 똑같다고 항상 비기는 것은 아니에요!* 블랙잭 룰을 다시 한 번 확인해보면 좋겠어요 🤠
234
+ > — @krrong on `HandCards.kt`
235
+
236
+ ## 얻은 교훈
237
+
238
+ - ***`value class` vs `enum class`*** — *연속 정수 + 범위 invariant*는 `value class`, *닫힌 유한 집합*은 `enum class`. *원시값 최적화*만 보면 잘못된 선택 (학생 자가 인정).
239
+ - ***Card 인덱스 → (Number, Suit) 분해는 Card 책임 X*** — *enum 전환 = 변환 코드 자동 제거* (학생 자가 깨달음).
240
+ - ***Deck Singleton + 자동 생성은 invariant 명시 부재*** — 생성자에 카드 인자 + Generator 인터페이스 주입이 *invariant 가시화 + 테스터빌리티*.
241
+ - ***abstract 메서드 정의 + 미구현 = 설계 잔해*** — *의도만 적어놓고 흐름이 호출 안 함*. 사용처가 생긴 후 정의.
242
+ - ***`Rule` 같은 광범위 명사는 책임 흡인기*** — `HandCards`, `Participant.isDrawable`, `WinLossStatistics` 등 *적절 객체로 이전 후 `Rule` 제거*. PR #63의 `BlackJack` 객체 의미 모호와 같은 결.
243
+ - ***`Collection<Card>` 인자 = 명확성을 비용으로 한 유연성*** — *호출 가정이 함수 내부*에 박힘. 가장 구체적 타입이 보통 정답.
244
+ - ***매직넘버(21/16/10/2)는 도메인 룰 상수***. `BUST_THRESHOLD`, `DEALER_MUST_HIT_THRESHOLD`, `ACE_BONUS`, `INITIAL_HAND_SIZE`.
245
+ - ***점수 동률 = 무승부는 블랙잭 룰 환원*** — *Bust 동률*은 *무승부 아님*. *21(BlackJack 2장) vs 21(일반 합산)*도 다름. *블랙잭 룰* 충실히 읽기.
246
+ - ***`if` 3개 이상 = `when`*** (Kotlin convention).
247
+ - ***새 객체(`HandCards`) 도입만 + 호출처 갱신 누락 = 리팩토링 반쪽*** — 전체 흐름 검증 필요.
248
+ - ***TDD 가시화 ≠ 컴파일 깨진 중간 커밋*** — *Red 상태 커밋*은 *git history bisect 불가*. *TDD 흔적*은 *작은 단위 + 빠른 사이클*로 가시화하되 *컴파일은 항상 통과*.
249
+ - ***`fun interface` vs 일반 `interface`*** — 단일 추상 메서드 + 람다 변환 가치가 있을 때만 `fun interface`. 선택 근거를 *글로 남기는 습관*.
250
+ - ***`HandCards.show()` + 방어적 복사 + cards 둘 다 노출은 과잉*** — 외부 API 단순화.