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,240 @@
1
+ # PR #148 — [블랙잭 2단계] 타마 미션
2
+
3
+ - **Reviewee:** [@etama123](https://github.com/etama123)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/148
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @krrong (크롱) — *신규 reviewer*. 깊은 메타 진단 + 학생 자가 학습 모범.
7
+ - **라인 코멘트:** 27 스레드 / 38 코멘트 — *역할 vs 상태 자가 학습 + 추상화 확장 + 콜백 vs Listener*
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **역할 vs 상태 자가 학습 모범** — 학생 자가 인용: *"[크롱의 저번 피드백](...)을 받고 나서 제가 **역할**과 **상태**를 명확하게 구별하지 못했던 부분을 다시 한 번 깨달았습니다 😓. 1. `Player`는 승패를 판단하는 **역할**을 담당하고 있어야 합니다. 2. `GameResult`는 승패 결과(**상태**)를 나타내는 객체여야 합니다. ... 그렇기 때문에 플레이어가 직접 경기 결과를 가지는 것은 올바르지 않다는 생각이 들었습니다. 게임 결과는 Player가 아니라 GameResult가 책임져야 한다는 점을 다시 한 번 인식하게 되었습니다. 또한, `setPlayerStatus`라는 함수명이 실제로는 승패 결과를 반환하는 함수였기 때문에, 그 함수명이 직관적이지 않다는 점도 깨달았습니다. 따라서 `getPlayerStatus`와 같이 승패를 반환하는 의미가 명확한 함수명으로 변경했습니다"*. **자가 메타 인식 + 후속 반영 + 함수명 정확성 학습 모범**.
12
+ - **`Card.isAce()` 자기 정보 메시지 자가 학습** — 학생 자가 답변: *"`객체에 메시지를 던진다`라는 말의 의미를 잘 이해하지 못했던 것 같아요😥 그래서 이번 피드백에서는 `Card`객체가 직접 Ace 인 지 아닌지 말하도록 만들었는데, 크롱의 의도가 맞는 지 궁금합니다!"*. **Tell-Don't-Ask 자가 학습 명시 모범**.
13
+ - **`HandStatus` enum + `from(hand)` 정적 팩토리** — 학생 자가 인용: *"`Hand` 객체에서 카드의 상태를 관리하는 조건문이 많아지면서 복잡함을 느꼈습니다. 그래서 `HandStatus` 클래스를 추가하여 카드 상태를 관리하기로 했습니다. 상태를 나타내기 위해 Enum class를 사용했고, `from` 메서드를 통해 현재 카드의 상태를 반환할 수 있도록 구현했습니다."*. PR #131·#146 와 같은 결.
14
+ - **`Listener` 패턴 도입 자가 학습** — 학생 자가 답변: *"MVC에서 도메인과 뷰를 분리하는 방법에는 2가지가 있다고 생각합니다. 1. 고차함수로 콜백. 2. Listener 사용. 이중, 콜백은 함수 파라미터로 중복이 많이 되어, **`Listener`** 클래스를 활용해 inputView를 직접 주입받지 않도록 했습니다."*. **MVC 분리 방법 자가 비교 + 결정 모범**. PR #133·#137·#132 와 같은 결의 *EventListener/EventProvider / 고차함수 트레이드오프*.
15
+ - **추상화 확장 의도 (플레이어 vs 플레이어, 플레이어 vs 딜러, 딜러 vs 딜러) 학습 진행** — 크롱 진단: *"플레이어와 플레이어, 딜러와 플레이어, 심지어는 딜러와 딜러 간에도 경기 결과를 계산해볼 수 있죠. 타마가 만든 참가자-딜러-플레이어를 어떻게 해야 위와 같은 상황에 대해 추상화를 잘 적용해볼 수 있을까요?"* + 학생 후속 반영. PR #49·#132·#136 와 같은 결의 *Participant 다형성 = 참가자 vs 참가자 일반화*.
16
+ - **플레이어 + 베팅 동시 입력 자가 반영** — 크롱 진단 *"플레이어 이름을 이용해 베팅금액을 입력받고, 바로 플레이어를 생성하면 베팅금액을 Map에 저장할 필요가 없지 않을까요?"* 후속 반영 (커밋 `2107ce4`). 학생: *"코드가 더 직관적이고 단순화된 것 같습니다 😇"*. PR #103·#85·#88·#137 와 같은 결.
17
+ - **공개 룰 도메인 이전 자가 학습** — 크롱 진단 *"최초 공개 시 딜러는 1장, 플레이어는 2장을 공개한다. 는 게임에서 정한 비즈니스 로직으로 보는 것이 적절하지 않을까요? 비즈니스 로직을 UI에서 결정하는 것이 맞는가를 고민해볼 필요가 있습니다."* + 학생 자가 학습: *"처음에는 \"카드를 보여준다\" 라는 것이 view의 역할이라고 생각했었는데, \"어떻게\" 보여줄 지는 게임의 규칙이고, 몇 장 보여줄 지는 참가자의 역할이되겠다고 생각해 도메인 로직에 적극적으로 반영했습니다"* (커밋 `184f225`). **도메인-뷰 책임 경계 자가 학습 모범**. PR #132·#137·#88 와 같은 결.
18
+ - **베팅금 0원 검증 도메인 이전** — 크롱 진단 *"현재 베팅금액은 0원 이하를 입력받을 수 있는 것처럼 보입니다. 베팅금액이 0원보다 커야한다는 어디서 검증하는 것이 맞을지 고민해보면 좋겠네요."* + 학생 자가 학습: *"해당 예외처리는 도메인의 역할이라 생각해, 도메인 내부 init 블럭에서 예외 처리를 구현했어요"* (커밋 `b7db99d`). PR #137·#103·#136·#90·#49 와 같은 결.
19
+ - **`runCatching` 자가 학습** — 크롱 진단 *"하나라도 입력을 잘못하면 게임이 터져버립니다. 로또에서 배운 오류 처리에 대해 고민해보고 다시 입력을 받을 수 있도록 만들어주세요."* + 학생 자가 반영 (커밋 `b6450bf`): *"`runCatching`을 사용해서 오류 처리가 가능하도록 개선했습니다"*. **Kotlin runCatching 어휘 학습**.
20
+ - **베팅금 vs 수익 자가 인식 + GameResult 응집** — 크롱 진단 *"플레이어의 경기 결과를 가져오는데 베팅금액이 변하고 있습니다. 이는 외부에서 예측할 수 없는 점이죠. 베팅금액은 말 그대로 베팅금액입니다. 곰곰히 생각해보면 플레이어가 베팅한 금액은 변하지 않습니다. 경기 결과에 따라서 얻는 금액이 달라지는 것이고 여기서 얻는 금액이 베팅한 금액에 기반될겁니다."* + 학생 자가 답변: *"Player가 직접 본인의 배팅 결과를 반환하는 것이 어색함은 저도 동의합니다 😥. 딜러의 결과 + 수익이 \"참가자의 승패 상태\"에 따라 결정되기 때문에, 그래서 수익 계산과 딜러의 결과를 정하는 로직을 `GameResult` 내부로 변경하였습니다."* (커밋 `e88a208`). PR #85·#49 와 같은 결의 *베팅금 ≠ 수익*.
21
+ - **테스트 자가 추가** — 크롱 진단 *"게임의 결과를 판단하는 것은 블랙잭 게임에서 가장 중요한 도메인 로직 중 하나인데, 테스트가 존재하지 않습니다."* 후속 반영.
22
+
23
+ ## 못한 점 (설계 관점)
24
+
25
+ ### 1. `Hand(cards: List<Card>)` 외부 가변 참조 — *방어적 복사 자가 인식*
26
+
27
+ ```kotlin
28
+ val cards = mutableListOf(card1, card2, card3)
29
+ val hand = Hand(cards)
30
+ cards.clear()
31
+ ```
32
+
33
+ 크롱 진단 (Hand.kt — 미해결): *"어떤 일이 발생할 수 있을까요?"*
34
+
35
+ 학생 자가 답변: *"cards의 리스트가 비워지게 됩니다. `Hand`가 `cards`를 직접 참조하고 있기 때문에, 외부에서 `cards`에 변경이 일어나면 `hand`가 들고 있는 카드에도 변경이 일어나게 됩니다. 그래서 Hand 내부에서도 `fun getCards(): List<Card> = cards.toList()` `toList()` 연산자를 사용해서 얕은 복사가 가능하도록 구현했었습니다. 혹시 해당 방법이 틀렸던 것일까요? 😰"*
36
+
37
+ → **`toList()` getter = *읽기 방어*** + **생성자 인자 직접 참조 = *쓰기 방어 0***. *비대칭 방어*. *생성자에서 `cards.toMutableList()` 사본*이 *읽기 + 쓰기 양쪽 방어*. PR #108·#132·#133·#85·#58 와 같은 결의 *MutableList 인자 함정*.
38
+
39
+ ### 2. `BetAmount` enum + when else — 크롱 메타 질문
40
+
41
+ 크롱 진단 (BetAmount.kt — 미해결): *"enum과 when을 함께 사용하면 else문을 작성하지 않을 수 있는데요. 이를 통해 어떤 이점을 발휘할 수 있을까요?"*
42
+
43
+ 학생 자가 답변: *"`PlayerResultStatus` Enum class에서 빠진 값이 Draw을 추가해서 명시적으로 코드를 수정했습니다 🫡"*
44
+
45
+ → **enum + when exhaustive = else 불필요 = 컴파일러 보장**. *새 enum 멤버 추가 시 when 안 채우면 컴파일 오류*. *Kotlin 패턴 매칭 정공*. PR #137·#136·#93·#90 와 같은 결.
46
+
47
+ ### 3. `DealerResult` 가 *GameResult 와 중복*
48
+
49
+ 크롱 진단 (DealerResult.kt — 미해결): *"`DealerResult`가 하는 일은 아래와 같은 이유로 `GameResult`로 대체할 수 있는 것처럼 보입니다. 1. 플레이어의 경기 결과를 기반으로 딜러의 경기 결과를 계산할 수 있다. 2. 플레이어의 수익을 기반으로 딜러의 수익을 계산할 수 있다."*
50
+
51
+ → **`DealerResult` 별도 클래스 = 중복 가능성**. *Player 결과 기반 → Dealer 결과 도출* 라면 *GameResult 한 클래스 안*에서 *Dealer/Player 모두 표현*. PR #131·#132·#136·#49 의 *통합 GameResult* 와 같은 결.
52
+
53
+ ### 4. `Hand` 의 *블랙잭 = 21 무조건* 룰 부정확 — 자가 학습
54
+
55
+ 크롱 진단 (Hand.kt — 미해결): *"합계가 21이라고 무조건 블랙잭인것은 아닙니다. 도메인을 다시 한 번 공부해보세요."*
56
+
57
+ 학생 자가 후속 반영 (인용 PR #151 jerry 케이스 유사): *"그 전에는 합계가 21이면 블랙잭 상태로 바꾸는 것이였습니다. 따라서, Blackjack 객체에서 카드를 처음 나누어주는 메소드에서만 판단하기만 하면 되었기 때문에 합계가 21이면 무조건 블랙잭으로 되도록 하였습니다.😅 하지만, Hand객체의 status변수가 없어진 지금은 카드의 size가 두장임을 판단하여 블랙잭이 되도록 수정하였습니다!💪"*
58
+
59
+ → **블랙잭 룰 = 2장 + 21**. *3장 21 ≠ 블랙잭*. *학생 자가 학습 + 후속 반영 모범*. PR #128·#108·#125·#114·#131·#136·#137 와 같은 결.
60
+
61
+ ### 5. `GameController` 가 *Dealer 와 Player 따로 받음* — *Participant 추상 미활용*
62
+
63
+ 크롱 진단 (GameController.kt — 미해결): *"`Dealer`와 `Player`는 모두 `Participant`를 상속받고 있습니다. 즉, 딜러와 플레이어를 따로 받을 필요가 없다는 것이죠. 이와 비슷한 다른 부분들도 어떻게 개선할 수 있을지 고민해보면 좋겠습니다."*
64
+
65
+ → **`Participant` 추상 클래스 활용 부족**. *Dealer, Player 따로 받음 = 다형성 미활용*. *List<Participant>* 또는 *Participant 인자*로 통일. PR #132 (환노) 의 *PlayerGroup(participants).filterIsInstance* 와 *반대 트레이드오프* — *Participant 인자 통일 정공*.
66
+
67
+ ### 6. `addCard repeat` Controller 책임 — 크롱 진단
68
+
69
+ 크롱 (Participant.kt:18 — 미해결): *"컨트롤러를 보면 카드 N장을 추가하는 것을 `repeat`을 통해 진행하고 있는데요. 이 함수를 재활용할 수 있도록 만들어보면 어떨까요?"*
70
+
71
+ 후속 코멘트: *"는 함수 분리를 뜻하는 것이 아닌 addCard 함수 자체를 재활용 할 수 있도록 고민해보는 의도였습니다 😅"*
72
+
73
+ → **`addCard(card: Card)` vs `addCards(cards: List<Card>)` 트레이드오프**. *Controller 가 repeat 호출 = 함수 재사용 부족*. *Participant.addCards(deck.draw(2))* 같은 *vararg 또는 list 인자*가 정공. PR #132·#88 와 같은 결.
74
+
75
+ ### 7. `Player` 점수 비교만 = *확장성 부족*
76
+
77
+ 크롱 진단 (Player.kt — 미해결): *"점수를 비교하는 것은 플레이어만 가능한 것일까요? 저는 블랙잭이 추상화 기법을 공부해볼 수 있는 미션이라고 생각합니다. 참가자는 상대방과의 점수를 비교하여 결과를 내올 수 있는데요, 이는 다음과 같은 경우도 모두 판단이 가능해야 한다는 것입니다. 플레이어 vs 플레이어 / 플레이어 vs 딜러 / 딜러 vs 딜러"*
78
+
79
+ → **점수 비교 = Participant 일반 메서드**. *Player.compareScores(other: Participant)* 가 *플레이어 vs 플레이어 / 플레이어 vs 딜러 모두 표현*. *학생 자가 학습 모범 (Player only → Participant 일반화)*. PR #49·#132·#136 와 같은 결.
80
+
81
+ ### 8. `BetAmount` 린트 깨짐 — *PR 위생*
82
+
83
+ 크롱 (BetAmount.kt — 미해결): *"린트가 깨지고있습니다. 시간이 부족했던거겠죠? 😅"*
84
+
85
+ → **PR 위생 = 린트 통과**. *시간 부족 = 학생 자가 인정*. PR #147 의 *미완성 주석 잔존* 와 같은 결.
86
+
87
+ ### 9. `GameResult` 가 *DealerResult 코드만 이전*
88
+
89
+ 크롱 진단 (GameResult.kt — 미해결): *"단순히 `DealerResult`에 있던 코드를 `GameResult`로 옮겨온 것처럼 보입니다. 딜러의 게임 결과, 수익은 플레이어의 게임 결과, 수익과 관련이 있어보입니다. 그리고 이러한 정보들은 이미 `GameResult`가 가지고 있어요. 이를 적극 활용하는 방법을 고민해보면 좋겠습니다."*
90
+
91
+ → **이전만 + 적극 활용 부재**. *GameResult 가 이미 보유한 정보 (플레이어 결과) → 딜러 결과 도출* 가능. *코드 단순 이전 = 책임 분리 효과 부재*. *Player 결과 합계 → Dealer 수익 도출* 패턴.
92
+
93
+ ### 10. `GameController` 함수 호출 순서 — 가독성
94
+
95
+ 크롱 (GameController.kt:1 — 미해결): *"nit: 함수의 호출 순서대로 코드를 작성하면 가독성이 좋아질 수 있습니다."*
96
+
97
+ → **함수 정의 순서 = 호출 순서**. *호출 흐름대로 위→아래 정의*가 *호출자가 위에서 읽으며 흐름 추적*. *Kotlin 어휘 권고*. PR #131·#88 와 같은 결.
98
+
99
+ ### 11. `setPlayerStatus → getPlayerStatus` 함수명 자가 학습
100
+
101
+ 학생 자가 인용: *"또한, `setPlayerStatus`라는 함수명이 실제로는 승패 결과를 반환하는 함수였기 때문에, 그 함수명이 직관적이지 않다는 점도 깨달았습니다. 따라서 `getPlayerStatus`와 같이 승패를 반환하는 의미가 명확한 함수명으로 변경했습니다"*
102
+
103
+ → **`setXX` = 값 설정 어휘 vs `getXX` = 값 반환 어휘**. *반환 함수 = get/check/calculate 등*. *set = void/mutation*. *학생 자가 인식 + 후속 반영 모범*. PR #58·#85·#88 와 같은 결.
104
+
105
+ ### 12. `OutputView` 수익 출력 오류 — 자가 수정
106
+
107
+ 크롱 (OutputView.kt — 미해결): *"수익이 잘못출력되고 있는 것처럼 보입니다. ```##최종 승패 / 딜러: 1승 2패 0무| 수익: -3000 / a: 블랙잭 ! | 수익: 1500 / b: 승 | 수익: 2000 / c: 패 | 수익: -3000``` "*
108
+
109
+ 학생: *수정했습니다😰*
110
+
111
+ → **수익 계산 + 출력 형식 오류**. *플레이어 수익 합 (1500+2000-3000=500) vs 딜러 -3000* 불일치. *총합 0 게임 룰 위반*. *블랙잭 = 1.5배 vs 1배 룰 적용 오류 가능성*. *학생 자가 후속 반영*.
112
+
113
+ ### 13. `BetAmount` 1배~1000배 메서드 폭증
114
+
115
+ 크롱 (BettingMoney.kt — 미해결, PR #151 케이스 유사): *"1배 ~ 1000배까지 모든 배수가 생긴다면 1000개의 메서드가 필요한 것처럼 보입니다."*
116
+
117
+ → **배수별 메서드 폭증 안티패턴**. *PR #151 jerry 케이스 유사*. *파라미터로 배수 받기*가 정공. *PlayerBetAmount.calculate(multiplier: Double)* 한 메서드.
118
+
119
+ ## 리뷰어 의견 요지
120
+
121
+ - **역할 vs 상태 명확 구별** — *역할 = 행위 주체*, *상태 = 변하는 값*. *Player = 역할*, *GameResult = 상태*.
122
+ - **플레이어 vs 플레이어 / 플레이어 vs 딜러 / 딜러 vs 딜러 추상화** — *Participant 다형성 정공*.
123
+ - **공개 룰 = 도메인 = 참가자 자기 책임** — *몇 장 공개할지 = 도메인 + 어떻게 = 게임 규칙*.
124
+ - **베팅금 vs 수익 분리** — *베팅금 = 불변*, *수익 = 결과 + 베팅금*.
125
+ - **enum + when exhaustive = else 불필요 = 컴파일러 보장**.
126
+ - **MutableList 인자 직접 참조 = 외부 변경 함정** — *cards.toMutableList() 사본*.
127
+ - **`Dealer`/`Player` 따로 받음 = Participant 다형성 미활용** — *List<Participant>*.
128
+ - **`addCard` 재활용 = vararg/list 인자**.
129
+ - **`Listener` vs 고차함수 콜백 트레이드오프** — *학생 자가 결정 = Listener*.
130
+ - **`setXX` vs `getXX` 어휘** — *반환 = get, 설정 = set*.
131
+ - **함수 호출 순서 = 정의 순서** — 가독성.
132
+ - **린트 = PR 위생** — *시간 부족 ≠ 무시*.
133
+
134
+ ## 대표 인용
135
+
136
+ **크롱 (Participant 다형성 = 참가자 vs 참가자, Player.kt):**
137
+ > 점수를 비교하는 것은 플레이어만 가능한 것일까요?
138
+ > 저는 블랙잭이 추상화 기법을 공부해볼 수 있는 미션이라고 생각합니다.
139
+ >
140
+ > 참가자는 상대방과의 점수를 비교하여 결과를 내올 수 있는데요,
141
+ > 이는 다음과 같은 경우도 모두 판단이 가능해야 한다는 것입니다.
142
+ > ```
143
+ > 플레이어 vs 플레이어
144
+ > 플레이어 vs 딜러
145
+ > 딜러 vs 딜러
146
+ > ```
147
+
148
+ **크롱 (베팅금 ≠ 수익, Player.kt:15):**
149
+ > 한발 더 나아가보면, 게임의 결과에 따라서 **플레이어의 베팅금액을 변경하는 것이 괜찮을까?** 에 대해서도 고민해볼 수 있겠어요.
150
+ > 이전에 드린 리뷰와 비슷하게 플레이어의 경기 결과를 가져오는데 베팅금액이 변하고 있습니다. 이는 외부에서 예측할 수 없는 점이죠.
151
+ >
152
+ > 베팅금액은 말 그대로 베팅금액입니다. 곰곰히 생각해보면 플레이어가 베팅한 금액은 변하지 않습니다.
153
+ > 경기 결과에 따라서 얻는 금액이 달라지는 것이고 여기서 얻는 금액이 베팅한 금액에 기반될겁니다.
154
+ >
155
+ > 이 역시 객체간의 협력으로 이끌어낼 수 있는 것처럼 보이네요 🤔
156
+
157
+ **크롱 (공개 룰 = 도메인, OutputView.kt:1):**
158
+ > 사실 블랙잭은 추상화 전략을 이해하고 공부해볼 수 있도록 구성되어 있는데요.
159
+ >
160
+ > 최초 공개 시 딜러는 1장, 플레이어는 2장을 공개한다. 는 게임에서 정한 비즈니스 로직으로 보는 것이 적절하지 않을까요?
161
+ > 비즈니스 로직을 UI에서 결정하는 것이 맞는가를 고민해볼 필요가 있습니다.
162
+
163
+ **크롱 (방어적 복사 함정, Hand.kt):**
164
+ > ```kotlin
165
+ > val cards = mutableListOf(card1, card2, card3)
166
+ > val hand = Hand(cards)
167
+ > cards.clear()
168
+ > ```
169
+ > 어떤 일이 발생할 수 있을까요?
170
+
171
+ **크롱 (Participant 다형성 미활용, GameController.kt):**
172
+ > `Dealer`와 `Player`는 모두 `Participant`를 상속받고 있습니다. 즉, 딜러와 플레이어를 따로 받을 필요가 없다는 것이죠.
173
+ > 이와 비슷한 다른 부분들도 어떻게 개선할 수 있을지 고민해보면 좋겠습니다.
174
+
175
+ **학생 자가 학습 (역할 vs 상태, Player.kt:15):**
176
+ > [크롱의 저번 피드백](...)을 받고 나서 제가 **역할**과 **상태**를 명확하게 구별하지 못했던 부분을 다시 한 번 깨달았습니다 😓
177
+ > 1. `Player`는 승패를 판단하는 **역할**을 담당하고 있어야 합니다.
178
+ > 2. `GameResult`는 승패 결과(**상태**)를 나타내는 객체여야 합니다.
179
+ >
180
+ > 그렇기 때문에 플레이어가 직접 경기 결과를 가지는 것은 올바르지 않다는 생각이 들었습니다. 게임 결과는 Player가 아니라 GameResult가 책임져야 한다는 점을 다시 한 번 인식하게 되었습니다.
181
+ > 또한, `setPlayerStatus`라는 함수명이 실제로는 승패 결과를 반환하는 함수였기 때문에, 그 함수명이 직관적이지 않다는 점도 깨달았습니다. 따라서`getPlayerStatus`와 같이 승패를 반환하는 의미가 명확한 함수명으로 변경했습니다
182
+ >
183
+ > 이번 리뷰는 **"객체에게 메시지를 던져라"** 는 저번 리뷰와도 이어지는 내용이라 느꼈습니다.
184
+
185
+ **학생 자가 학습 (Listener vs 콜백 트레이드오프, InputView.kt:1):**
186
+ > MVC에서 도메인과 뷰를 분리하는 방법에는 2가지가 있다고 생각합니다.
187
+ > 1. 고차함수로 콜백
188
+ > 2. Listener 사용
189
+ >
190
+ > 이중, 콜백은 함수 파라미터로 중복이 많이 되어, **`Listener`** 클래스를 활용해 inputView를 직접 주입받지 않도록 했습니다.
191
+
192
+ **학생 자가 학습 (Tell-Don't-Ask 자가 인식, Card.kt:11):**
193
+ > `객체에 메시지를 던진다`라는 말의 의미를 잘 이해하지 못했던 것 같아요 😥
194
+ > 그래서 이번 피드백에서는 `Card`객체가 직접 Ace 인 지 아닌지 말하도록 만들었는데, 크롱의 의도가 맞는 지 궁금합니다!
195
+
196
+ **학생 자가 학습 (공개 룰 도메인 이전, OutputView.kt):**
197
+ > Dealer와 Player의 추상 클래스 `Participant`에서 추상 메서드를 추가했어요!
198
+ >
199
+ > 처음에는 "카드를 보여준다" 라는 것이 view의 역할이라고 생각했었는데, "어떻게" 보여줄 지는 게임의 규칙이고, 몇 장 보여줄 지는 참가자의 역할이되겠다고 생각해 도메인 로직에 적극적으로 반영했습니다 ☺️
200
+
201
+ **학생 자가 학습 (Racing Car 피드백 인용, Deck.kt):**
202
+ > 코드를 작성한 입장에서, 내가 아는 정보를 바탕으로 한 변수명을 작성했던 것 같습니다 ㅜ.ㅜ
203
+ > **Racing Car 미션**에서부터 이야기가 되던, _객체 안에서는 외부의 상황을 알 필요가 없다_ 피드백이 지켜지고 있지 않았었네요.
204
+ > 이번 피드백을 초석으로, 앞으로는 이런 실수가 없도록 해보겠습니다 💪
205
+
206
+ ## 얻은 교훈
207
+
208
+ 1. ***역할 vs 상태 명확 구별 = OOP 핵심 개념***. *Player = 승패 판단 역할 (행위 주체)*, *GameResult = 승패 결과 상태 (변하는 값)*. *학생 자가 인식 + 메타 학습 모범*. **MCP 룰 후보 — `role-state-conflation`**.
209
+
210
+ 2. ***참가자 vs 참가자 = Participant 다형성 = 추상화 정공***. *플레이어 vs 플레이어 / 플레이어 vs 딜러 / 딜러 vs 딜러 모두 표현 가능*. *Participant.compareScores(other: Participant)* 메시지. PR #49·#132·#136 와 같은 결.
211
+
212
+ 3. ***공개 룰 = 도메인 + 몇 장 = 참가자 자기 책임 + 어떻게 = 게임 규칙***. *학생 자가 학습 모범*. *UI 책임 vs 도메인 책임 경계 명료성*. PR #132·#137·#88 와 같은 결.
213
+
214
+ 4. ***베팅금 vs 수익 분리 = 베팅금 불변 + 수익 = 결과 + 베팅금 도출***. *Player.bettingAmount val 불변*. *GameResult 가 수익 계산*. PR #85·#49·#137·#88 와 같은 결.
215
+
216
+ 5. ***Listener vs 고차함수 콜백 트레이드오프***. *Listener = 명시적 인터페이스 + 다양한 구현*. *콜백 = 함수 파라미터 중복 가능성*. *학생 결정 = Listener (콜백 중복 회피)*. PR #133·#137·#132 와 같은 결의 *EventListener/EventProvider*.
217
+
218
+ 6. ***`MutableList` 인자 직접 참조 = 외부 변경 함정***. *getter `toList()` 만 = 읽기 방어 + 쓰기 방어 0*. *생성자에서 `cards.toMutableList()` 사본*이 *양쪽 방어*. PR #108·#132·#133·#85·#58·#146 와 같은 결.
219
+
220
+ 7. ***`Participant` 다형성 미활용 = Dealer/Player 따로 받기 = 코드 중복***. *List<Participant>* 또는 *Participant 인자*로 통일. PR #132·#88 와 같은 결.
221
+
222
+ 8. ***enum + when exhaustive = else 불필요 = 컴파일러 보장***. *새 enum 멤버 추가 시 when 안 채우면 컴파일 오류*. *Kotlin 패턴 매칭 정공*. PR #137·#136·#93·#90·#137 와 같은 결.
223
+
224
+ 9. ***`setXX` vs `getXX` 함수명 = 반환 vs 설정 어휘***. *setPlayerStatus 가 반환 함수 = 이름 misleading*. *학생 자가 인식 + 후속 반영 모범*. PR #58·#85·#88 와 같은 결.
225
+
226
+ 10. ***Tell-Don't-Ask 자가 학습 = "객체에 메시지를 던진다" 의미 자가 학습***. *Card.isAce() = 자기 정보 자기 메시지*. *학생 자가 인용 + reviewer 인정 ("정확히 이해하신 것 같습니다 👍")*.
227
+
228
+ 11. ***블랙잭 = 21 무조건 X = 2장 + 21 정확***. *학생 자가 학습 + 후속 반영*. PR #128·#108·#125·#114·#131·#136·#137 와 같은 결.
229
+
230
+ 12. ***`addCard` 재활용 = vararg/list 인자***. *Controller repeat 호출 회피*. *Participant.addCards(cards: List<Card>)* 단일 메서드. PR #132·#88 와 같은 결.
231
+
232
+ 13. ***`runCatching` Kotlin 어휘 = 에러 처리***. *try-catch 대신 함수형 어휘*. PR #136 (밀러) 의 *NullableRetry/ThrowableRetry* 와 같은 결의 *에러 처리 추상화*.
233
+
234
+ 14. ***Racing Car 피드백 인용 (이전 미션 학습 누적) = 학습 가시화 모범***. *_객체 안에서는 외부의 상황을 알 필요가 없다_ 피드백 인용 + 후속 반영*. PR #103 (해나) 의 *1단계 피드백 인용* 와 같은 결.
235
+
236
+ 15. ***`DealerResult` + `GameResult` 중복 = 통합 정공***. *Player 결과 기반 → Dealer 결과 도출*. *GameResult 한 클래스 안에서 표현*. PR #131·#132·#136·#49 와 같은 결.
237
+
238
+ 16. ***학생 자가 학습 + 자가 답변 + 커밋 SHA 첨부 풍부 = 학습 가시화 최고 수준***. *역할 vs 상태 / Tell-Don't-Ask / Listener vs 콜백 / 공개 룰 도메인 이전 / 방어적 복사 모두 자가 학습 메타 인식 + 후속 반영*. PR #128·#135·#108·#133·#137·#146·#41·#88·#136 와 같은 결.
239
+
240
+ 17. ***신규 reviewer 크롱 (krrong) = 깊은 메타 진단 + 추상화 확장 (플레이어 vs 플레이어 vs 딜러)***. *PR #131·#136·#88 (두루) / PR #41·#53 (잭슨) / PR #93·#108·#133 (말리빈) / PR #124·#85·#103·#58·#49·#152 (페로로) / PR #137 (지훈) / PR #146 (두루)* 외 *신규 reviewer 스타일 추가*. **프로젝트 reviewer 다양성 명시**.
@@ -0,0 +1,146 @@
1
+ # PR #102 — [블랙잭 2단계] 벼리 미션
2
+
3
+ - **Reviewee:** [@gaeun5744](https://github.com/gaeun5744)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/102
5
+ - **단계:** 2단계
6
+ - **리뷰어:** [@vagabond95](https://github.com/vagabond95) — 1단계 #69 동일 reviewer
7
+ - **라인 코멘트:** 13 스레드 — *PR 본문 자가 의문 (공통 로직 묶는 방법 + Dealer/Player playTurn 시그니처 차이) + 학생 자가 의문 (factory deck 의존성, abstract vs interface) + reviewer *추상함수 기준보다 추상 클래스와 인터페이스 사용 기준* 메타 어휘 + 람다 named parameter 권유 + API 일관성 어휘 + 람다 네이밍 = 외부 상황 X 어휘*
8
+ - **양 단계 완성 reviewee** (1단계 #69 batch 23 완료 + 2단계 #102 = batch 24).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 + 시그니처 차이 학습
13
+
14
+ PR 본문:
15
+
16
+ > *"`Dealer`와 `Player`를 보면 공통적으로 `playTurn` 로직이 있습니다. 둘의 로직은 비슷하지만, 반환값과 파라미터가 약간 다릅니다. (...) 그래서 부득이하게 `Finish`를 반환하기 어려워서 둘의 로직을 공통으로 묶지 못했는데, 이러한 상황에서는 어떻게 대처해야할지 몰라 질문 드립니다."*
17
+
18
+ → **시그니처 차이 추상화 한계 학생 자가 의문** = PR #126·#140·#69 결 합류 누적 4+ PR.
19
+
20
+ ### 2. 학생 자가 abstract vs interface 의문 (Thread 2)
21
+
22
+ 학생:
23
+
24
+ > *"혹시 해당 구현을 `abstract`가 아닌 `interface`로도 바꿔도 무방한 코드일까요? 저는 추상함수를 사용하는 기준이 다음과 같이 두가지 라고 생각합니다.*
25
+ > *- 클래스간 공통된 로직을 묶을 때*
26
+ > *- 클래스 간 연간관계가 강할 때 (...) 현재의 로직은 구현부가 없고 시그니처만 존재하고 있기 때문에, 인터페이스를 사용하는 것과 큰 차이점을 못 느끼고 있습니다."*
27
+
28
+ reviewer:
29
+
30
+ > *"인터페이스를 사용하는 것과 큰 차이가 없다면, 반대로 다중 상속이 가능하여 비교적 제약이 적은 인터페이스를 사용하지 않을 이유가 있을까요? :)*
31
+ >
32
+ > *추상함수는 말씀하신 것처럼 인터페이스의 함수 시그니쳐와 동일하므로, 추상함수를 사용하는 기준보다는 추상 클래스와 인터페이스를 사용하는 기준을 잡아보는게 좋을 것 같은데요."*
33
+
34
+ → **학생 자가 Kotlin 어휘 깊은 학습 + reviewer 메타 어휘 (기준 재정의)** = PR #129·#126·#138·#142·#143·#113·#19·#69 결 합류 누적 9+ PR.
35
+
36
+ ### 3. 학생 자가 *deck 의존성 vs card 전달* 의문 (Thread 1)
37
+
38
+ 학생:
39
+
40
+ > *"`Players`와 `Dealer`가 `Deck`을 가지고 있는 상황이 어색하여, 팩토리 함수를 이용해 `gamePlayers`를 초기화 하였습니다. 다만, 이렇게 하는 방식이 과연 옳은지에 관해 의문이 들었습니다."*
41
+
42
+ reviewer:
43
+
44
+ > *"deck 을 꼭 주입받아야하는지 고민해보면 좋겠어요. card 만 전달받아도 충분하지 않을까요?"*
45
+
46
+ 학생 자가 적용: *고차함수로 받기*.
47
+
48
+ → **deck 의존성 제거 학생 자가 학습** = PR #69 1단계 결의 *2단계 학생 자가 정공*. **MCP 룰 `object-ownership-vs-parameter-passing` 강화** 누적 4+ PR.
49
+
50
+ ### 4. 추가 칭찬
51
+
52
+ - Thread 8: *"enum 활용 👍"*.
53
+
54
+ ## 못한 점 (설계 관점)
55
+
56
+ ### 1. 람다 named parameter 권유 (Thread 6)
57
+
58
+ reviewer:
59
+
60
+ > *"람다를 넘길 때는 named parameter 를 습관해주시면 좋습니다~! 현재와 같은 코드는 어떤 람다인지 구분이 불가능해서 가독성이 많이 떨어질 것 같아요."*
61
+
62
+ → **Kotlin named parameter 가독성** = **MCP 룰 `kotlin-named-parameter-readability` 후보**.
63
+
64
+ ### 2. API 일관성 어휘 (Thread 7)
65
+
66
+ reviewer:
67
+
68
+ > *"times 함수는 하나만 제공해도 되지 않을까요? 혹은 Float 형도 지원해야하지 않을까요? API 는 일관된 규칙을 가지고 있어, 코드를 쉽게 예측할 수 있으면 좋다고 생각합니다 ㅎㅎ"*
69
+
70
+ → **API 일관성 어휘** = **MCP 룰 `api-consistency-criteria` 후보** — *함수 1 개 vs 모든 타입 지원 양쪽 일관성*.
71
+
72
+ ### 3. 람다 네이밍 = 외부 상황 X (Thread 13)
73
+
74
+ reviewer:
75
+
76
+ > *"앞으로도 람다의 네이밍을 지을 때 항상 명심하면 좋을 부분입니다. 람다는 외부의 상황을 알지 못하고, 철저히 람다를 사용하는 입장에서 네이밍이 지어져야합니다!"*
77
+
78
+ → **람다 네이밍 = 사용 입장 어휘** = *PR #36 (Domain/View 비용 메타포) 결 합류*. **MCP 룰 `lambda-naming-from-user-perspective` 후보**.
79
+
80
+ ### 4. show 알기 model = view 책임 (Thread 9)
81
+
82
+ reviewer: *"\"show\" 할 것이라는 것을 model 이 알고 있는 것이 어색하지 않을까요?"*
83
+
84
+ → **Model→View 분리** = 누적 15+ PR ⭐⭐⭐.
85
+
86
+ ### 5. setResult vs getResult 명명 (Thread 10)
87
+
88
+ reviewer: *"해당 함수는 gameResult 를 반환하는 것인지 Result 를 Set 하는 것인지 코드를 직접 보기 전까지는 알기가 어려울 것 같아요."*
89
+
90
+ → **이름 의미 정확성** = 누적 13+ PR.
91
+
92
+ ### 6. Result 일급 컬렉션 (Thread 11)
93
+
94
+ reviewer: *"Result 도 별도 클래스로 묶어봐도 좋겠습니다~!"*
95
+
96
+ → **일급 컬렉션** = 누적 다수.
97
+
98
+ ### 7. require init 검증 중복 (Thread 12)
99
+
100
+ reviewer: *"require 문이 중복되는데, 클래스의 init 블록에서 한번에 검증해도 좋겠습니다~!"*
101
+
102
+ → **검증 중복 자가 정리** = PR #69·#109 결 합류.
103
+
104
+ ### 8. players turn + dealer turn 함수 명명 (Thread 4)
105
+
106
+ reviewer: *"players trun 인데 dealer turn 도 진행되는게 어색한 것 같아요. 함수를 분리하거나 네이밍을 수정해야하지 않을까요~?"*
107
+
108
+ → **함수 명명 의미 정확성**.
109
+
110
+ ### 9. 매직넘버 BLACKJACK_NUMBER 재활용 (Thread 3)
111
+
112
+ 학생 자가 *매직넘버 제거 까먹음* 인정.
113
+
114
+ → **매직넘버 상수화** = 누적 다수.
115
+
116
+ ### 10. 상태 = 파라미터 받지 말고 멤버 (Thread 5)
117
+
118
+ reviewer: *"상태로 가지고 있으므로, 파라미터로 받을 필요가 없지 않을까요?"*
119
+
120
+ → **parameter vs self state access** = PR #140·#143 결 합류.
121
+
122
+ ## 대표 인용
123
+
124
+ > [vagabond95 Thread 2]
125
+ > *"추상함수를 사용하는 기준보다는 추상 클래스와 인터페이스를 사용하는 기준을 잡아보는게 좋을 것 같은데요."*
126
+
127
+ → **reviewer 메타 어휘 (기준 재정의)**.
128
+
129
+ > [vagabond95 Thread 13]
130
+ > *"람다는 외부의 상황을 알지 못하고, 철저히 람다를 사용하는 입장에서 네이밍이 지어져야합니다!"*
131
+
132
+ → **람다 네이밍 사용 입장 어휘**.
133
+
134
+ > [vagabond95 Thread 7]
135
+ > *"API 는 일관된 규칙을 가지고 있어, 코드를 쉽게 예측할 수 있으면 좋다고 생각합니다"*
136
+
137
+ → **API 일관성 어휘**.
138
+
139
+ ## 얻은 교훈 (보편)
140
+
141
+ 1. **시그니처 차이 추상화 한계** = 누적 4+ PR.
142
+ 2. **추상 클래스 vs 인터페이스 기준** = 누적 9+ PR.
143
+ 3. **람다 named parameter 가독성** — **MCP 룰 `kotlin-named-parameter-readability` 후보**.
144
+ 4. **API 일관성 어휘** — **MCP 룰 `api-consistency-criteria` 후보**.
145
+ 5. **람다 네이밍 = 사용 입장** — **MCP 룰 `lambda-naming-from-user-perspective` 후보**.
146
+ 6. **deck 의존성 제거 학생 자가 학습 시간성 (PR #69 → #102)** = *학습 시간성 정공*.
@@ -0,0 +1,224 @@
1
+ # PR #69 — [블랙잭 1단계] 벼리 미션
2
+
3
+ - **Reviewee:** [@gaeun5744](https://github.com/gaeun5744)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/69
5
+ - **단계:** 1단계
6
+ - **리뷰어:** [@vagabond95](https://github.com/vagabond95) — 2023 코호트 (racingcar 인용 reviewer) + 2024 reviewer
7
+ - **라인 코멘트:** 20 스레드 — *Domain ↔ View 분리 5+ 자리 + 학생 자가 *type-safe enum class* 의문 + CardMachineManager 인터페이스 학생 자가 *확장성* 명시 + handle 이름 정확성 + Judge 객체 vs Dealer 책임 4 라운드 깊은 양방향 토론 + reviewer *현실 세계 투영 = 필수 X, 필요할 때 사용 도구* 메타 어휘 + 상태 패턴 자가 적용*
8
+ - **신규 reviewee** (2024 코호트, 새 1단계 분석).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. 학생 자가 *type-safe enum class* 의문 (Thread 1)
13
+
14
+ 학생:
15
+
16
+ > *"그렇다면 문자열이 포함된 `enum class`들은 따로 util 패키지에 두는게 맞을까요...? 문자열을 없앨까 라는 생각도 들었지만, 이는 상수를 `type-safe`하게 다루는 enum class의 장점을 활용하지 못한다는 생각이 들어서 패키지를 옮기는 쪽으로 생각했습니다!!"*
17
+
18
+ → **학생 자가 *type-safe* + *enum class 장점 활용* 어휘** = *Kotlin 어휘 깊은 자가 학습*. **MCP 룰 `student-self-type-safe-vocabulary` 후보**.
19
+
20
+ reviewer 자가 정정:
21
+
22
+ > *"CompetitionResult 를 enum 으로 구현하고, 이것이 model 패키지에 있는 것은 자연스럽다고 생각해요. 제가 코멘트를 남겼던 것은 enum 자체가 문제가 된다기보다 model 에서 view 에서 사용될 값을 알고 있는 것이 어색해보였어요."*
23
+
24
+ → **reviewer 자가 의도 명료화** = PR #142 결 합류.
25
+
26
+ ### 2. CardMachineManager 인터페이스 + 학생 자가 *확장성* 명시 (Thread 2)
27
+
28
+ 학생 자가 답변:
29
+
30
+ > *"`ShuffleCardMachine` 및 `BlackjackCardMachine` 등의 상태를 싱글톤으로 만드는게 문맥상 옳다고 생각해서 해당 `CardMachineManager object`를 만들었습니다. 만약 예시의 클래스들을 그냥 object로 만들 경우, 해당 클래스에 직접 접근해서 다른 Deck 클래스를 만든 후, 수정해야 하기 때문에 Deck 객체의 확장성이 저해된다고 생각했습니다."*
31
+
32
+ 학생 자가 후속: `shuffle` → `handle` 이름 자가 변경.
33
+
34
+ reviewer 칭찬: *"handle 로 수정되니, 구현의도가 명확해진 것 같아요. 카드를 분배하는 방식을 인터페이스로 유연하게 다루는 것은 좋은 시도 같습니다 👍"*
35
+
36
+ → **학생 자가 *유연성* 의식 + 자가 명명 정정** + **인터페이스 = 카드 분배 방식 유연** = PR #138·#142·#143 결 합류.
37
+
38
+ ### 3. Judge 객체 vs Dealer 책임 — 4 라운드 깊은 양방향 토론 (Thread 12)
39
+
40
+ 학생 자가 답변:
41
+
42
+ > *"따로 `Judge`라는 객체를 둘까라는 생각도 했지만, 현실 세계에 빗대어 봤을때 문맥이 어색해 보여서 `Dealer` 객체에 두었습니다! 왜냐하면 실제로 승패를 판단하는건 딜러이며, 딜러가 승패 결과에 따라 칩을 직접 놔눠주기 때문에 추후 리팩토링을 위해서 `Dealer` 객체에 두었습니다.*
43
+ >
44
+ > *또한, 원래부터 딜러라는 역할 자체가 책임이 많은 역할이라는 생각에 무의식중에 괜찮지 않을까? 라는 생각이 들었습니다.*
45
+ >
46
+ > *제리는 책임이 많은 역할에 대해 어떻게 생각하시나요? 현실 세계에서는 책임이 많은 역할이더라도, 프로그래밍 세계에서는 역할을 책임을 쪼개서 새로운 객체를 탄생시키는게 옳다고 생각하시나요?"*
47
+
48
+ reviewer (메타 어휘):
49
+
50
+ > *"벼리의 말도 일리가 있다고 생각해요. 도메인을 어떻게 해석하느냐에 따라 관점을 다르게 볼 수 있겠네요!*
51
+ >
52
+ > *좋은 질문이고, 굉장히 어려운 내용이라고 생각해요. 저도 잘 지키고 있는지 모르겠네요 ㅎㅎ;*
53
+ > *저 같은 경우 현실세계의 도메인을 잘 투영하려고 노력하지만, 읽고 유지보수하기 쉬운 코드인가? 를 더 중요하게 생각하고 구현하는 것 같아요.*
54
+ >
55
+ > *읽고 유지보수하기 쉬운 코드는 기본적으로 수행하는 역할이 명확하고, 잘 분리되어야 한다고 생각해서 위와 같은 코멘트를 남기게 되었네요 ㅎㅎ*
56
+ >
57
+ > *벼리의 명확한 기준이 있다면, 우선 그 방향으로 진행해보고 추후에 구현이 막힐"*
58
+
59
+ 학생 자가 후속 의문:
60
+
61
+ > *"그렇다면 제리는 역할과 책임이 명확하고 읽기 쉬운 코드를 작성하는데 있어서, 현실 세계의 도메인을 투영하는 것은 필수가 아니라 필요할때 사용하는 도구라 생각하시나요?*
62
+ >
63
+ > *사실 현실 세계를 투영한다고 해도, 다양한 정렬 방식을 제공하는 `CardMachine`이 실제로는 존재 하지 않지만 유지보수성을 위해 추가한 것처럼, 어디까지 현실 세계를 의인화할지 아직도 고민입니다."*
64
+
65
+ → **현실 메타포 vs 유지보수성 트레이드오프 깊은 메타 어휘** = *PR #117·#129·#130·#143·#109·#113·#118·#71·#96 (현실 메타포 정합) 결의 *반대 시점 (학생 자가 메타 의문)***. **MCP 룰 `metaphor-fidelity-vs-maintenance-tradeoff` 후보** — *현실 메타포 = 도구 vs 필수* 학생 자가 메타 의식.
66
+
67
+ PR #118 (현실 메타포 vs SRP 트레이드오프) 결의 *학생 자가 깊은 의문* 어휘 합류.
68
+
69
+ ### 4. 상태 패턴 자가 적용 (Thread 17)
70
+
71
+ reviewer: *"결과를 판단하는 조건식이 복잡한데요, 조건식의 순서도 중요하고 조금만 요구사항이 추가되어도 이해하기가 쉽지 않을 것 같아요 😢 객체지향의 다형성을 이용하여 코드를 좀 더 간결하게 만들어보는 방법은 없을까요?"*
72
+
73
+ 학생: *"상태 패턴을 이용해서 코드를 좀 더 간결하게 해봤습니다...!!"*
74
+
75
+ → **State 패턴 자가 적용** = PR #93·#136·#152·#98·#36·#87·#142·#143·#138·#153 결 합류 누적 11+ PR.
76
+
77
+ ### 5. 추가 칭찬
78
+
79
+ - Thread 18: *"확장함수 활용 👍 패키지도 view 에 잘 선언해주셨네요!"*.
80
+ - Thread 19: *"이전보다 훨씬 코드가 간결해졌네요 👍"*.
81
+
82
+ ## 못한 점 (설계 관점)
83
+
84
+ ### 1. Domain ↔ View 분리 5+ 자리 (Thread 1·3·6·7·8)
85
+
86
+ reviewer 가 5+ 자리에서 *view 값 (result/value/shape/이름 출력 함수)* 도메인 외부 권유.
87
+
88
+ → **MVC 원칙 정공** = PR #126·#143·#149·#19·#35·#68 결 합류 누적 15+ PR ⭐⭐⭐.
89
+
90
+ ### 2. Pattern 명명 = 정규식 충돌 (Thread 6)
91
+
92
+ reviewer: *"Pattern 은 정규식에 사용되는 클래스의 이름이기도 해서 좀 더 구체적인 네이밍이 들어가면 좋겠습니다 :)"*
93
+
94
+ → **Kotlin/Java 표준 라이브러리 명명 충돌** = PR #130 (Number vs kotlin.Number), PR #142 (Result vs kotlin.Result) 결 강화 누적 3+ PR.
95
+
96
+ ### 3. HandCards 가 Deck 가짐 자연성 X (Thread 5·16)
97
+
98
+ reviewer: *"HandCards 는 플레이어가 소지하고있는 카드를 표현하는 도메인으로 보이는데요, 전체 카드 덱을 같이 소지하고 있는 부분이 어색한 것 같아요. 필요할 때만 카드를 전달받는것이 도메인의 흐름상 좀 더 자연스럽지 않을까요?"*
99
+
100
+ → **카드 전달 vs Deck 소유** = PR #96·#138 결의 *손이 덱과 카드를 동시에 아는가* 어휘 합류.
101
+
102
+ ### 4. Player.deck 멤버 → 카드 전달 (Thread 13)
103
+
104
+ reviewer:
105
+
106
+ > *"Player, Dealer 가 deck 을 가지고 있는 이유는 card 를 추가해주기 위함인데요. deck 을 멤버로 가지고 있기보다, 필요시 card 만 전달받는 것은 어떨까요?*
107
+ >
108
+ > *현 구조에서는 테스트시에도 deck 을 매번 주입해줘야하는데, deck 에 대한 의존성을 줄여봐도 좋을 것 같습니다."*
109
+
110
+ 학생 자가 적용: *팩토리 함수 통해 deck 전달*.
111
+
112
+ → **객체 소유 vs 매개변수 전달** = PR #138 (rosemin928 *deck 매개변수 전달 = 소유 X*) 결 합류.
113
+
114
+ ### 5. isWantAddCard 외부 의존 (Thread 14)
115
+
116
+ reviewer:
117
+
118
+ > *"isWantAddCard 여부를 Player 가 꼭 알 필요가 있을까요? 해당 구현은 외부에 의한 조건인데, `카드가 주어지면 더한다.` 의 역할이 더 간결하고 명확할 것 같아요."*
119
+
120
+ 학생 자가 답변:
121
+
122
+ > *"메시지는 최대한 추상적이고 명료해야 하는데, 그 법칙을 제대로 지키지 못한것 같네요ㅠㅠ 지적해주셔서 감사합니다!!"*
123
+
124
+ → **메시지 추상화 어휘 + Tell-Don't-Ask** = PR #129·#142·#143 결 합류.
125
+
126
+ ### 6. GameParticipant.addCard 추상화 미적용 (Thread 15)
127
+
128
+ reviewer: *"addCard 도 필수적인 함수로 보이는데 상위 클래스에서는 선언되지 않은 이유가 무엇일까요?"*
129
+
130
+ 학생: *"`Dealer` 객체와 `Player` 객체의 시그니처가 달라서 넣지 않았습니다ㅠ"*
131
+
132
+ → **시그니처 차이 추상화 한계** = PR #126·#140 결 합류. 학생 자가 수정.
133
+
134
+ ### 7. Players init 검증 중복 (Thread 10)
135
+
136
+ reviewer: *"해당 검증은 내부의 init 블록이 아니라 별도함수로 분리해서 검증하는 이유가 있을까요?"*
137
+
138
+ 학생: *"`validateDuplicateNames`을 제거하면, `names.toSet()`에서 저절로 중복이 제거된 채 객체가 생성되기 때문에 추가했습니다! 지금 다시 보니 init 블록 내 검증과 겹치는거 같아서 이쪽 검증을 제거하겠습니다!"*
139
+
140
+ → **검증 중복 자가 인지** = PR #109 (validation-function-vs-require-inline) 결 합류.
141
+
142
+ ### 8. Deck.draw 리턴 List<Card> 확장성 (Thread 4)
143
+
144
+ reviewer: `removeFirst()` 활용 권유.
145
+
146
+ 학생 자가 답변:
147
+
148
+ > *"해당 `draw`메서드의 반환 타입이 `List<Card>`라서 어쩔 수 없이 여러 줄로 작성했습니다ㅠ 처음 블랙잭 게임을 시작할 때 카드를 두장 뽑는데, 이때 같은 메서드를 두번 사용하기 보다는 파라미터로 뽑고자 하는 카드의 개수를 전달하는 것이 확장성에 좋을것 같아서 이렇게 구현했습니다!!"*
149
+
150
+ → **학생 자가 *확장성* 의식** = *PR #138·#142 결의 *유연성 vs 현재 룰* 어휘 합류*.
151
+
152
+ ### 9. InputView 분리 기준 (Thread 11)
153
+
154
+ 학생 자가 답변:
155
+
156
+ > *"다음과 같이 두가지 기준으로 뷰를 분리했습니다.*
157
+ > *1. 객체를 생성해서 던질 수 있는가 (도메인 객체를 단위로 해서 뷰를 분리했습니다.)*
158
+ > *2. 비슷한 함수끼리 엮을 수 있는가"*
159
+
160
+ → **학생 자가 분리 기준 명시** = *PR #126·#130·#117 결의 *학생 자가 분류* 합류*.
161
+
162
+ ### 10. `playerInput` 모호 명명 (Thread 9)
163
+
164
+ reviewer: *"playerInput 은 너무 이름이 모호한 것 같아요. 좀 더 구체적인 네이밍으로 지어볼 수 있을까요?"*
165
+
166
+ → **이름 의미 정확성** = 누적 13+ PR.
167
+
168
+ ### 11. Player 의 상태 자가 결정 (Thread 20)
169
+
170
+ reviewer: *"상태가 스스로 다음 상태를 결정하도록 리펙토링 해봐도 좋을 것 같습니다!"*
171
+
172
+ → **State 패턴 자식 자가 결정** = PR #93·#136·#152·#98 결 합류.
173
+
174
+ ## 대표 인용
175
+
176
+ > [vagabond95 Thread 12]
177
+ > *"저 같은 경우 현실세계의 도메인을 잘 투영하려고 노력하지만, 읽고 유지보수하기 쉬운 코드인가? 를 더 중요하게 생각하고 구현하는 것 같아요."*
178
+
179
+ → **현실 메타포 vs 유지보수성 메타 어휘**.
180
+
181
+ > [gaeun5744 Thread 12]
182
+ > *"그렇다면 제리는 역할과 책임이 명확하고 읽기 쉬운 코드를 작성하는데 있어서, 현실 세계의 도메인을 투영하는 것은 필수가 아니라 필요할때 사용하는 도구라 생각하시나요?"*
183
+
184
+ → **학생 자가 *현실 메타포 = 도구* 메타 의문**.
185
+
186
+ > [gaeun5744 Thread 1]
187
+ > *"이는 상수를 `type-safe`하게 다루는 enum class의 장점을 활용하지 못한다는 생각이 들어서"*
188
+
189
+ → **학생 자가 *type-safe* Kotlin 어휘**.
190
+
191
+ > [gaeun5744 Thread 14]
192
+ > *"메시지는 최대한 추상적이고 명료해야 하는데, 그 법칙을 제대로 지키지 못한것 같네요ㅠㅠ"*
193
+
194
+ → **학생 자가 *메시지 추상화* 메타 학습**.
195
+
196
+ ## 얻은 교훈 (보편)
197
+
198
+ 1. **현실 메타포 vs 유지보수성 트레이드오프** — **MCP 룰 `metaphor-fidelity-vs-maintenance-tradeoff` 후보**.
199
+
200
+ 2. **학생 자가 *type-safe* / *확장성* / *메시지 추상화* Kotlin/OOP 어휘** — **MCP 룰 `student-self-type-safe-vocabulary` 후보**.
201
+
202
+ 3. **Kotlin/Java 표준 라이브러리 명명 충돌 (Pattern)** — 누적 3+ PR.
203
+
204
+ 4. **카드 전달 vs Deck 소유** — PR #96·#138 결 누적 3+ PR.
205
+
206
+ 5. **시그니처 차이 추상화 한계 → 학생 자가 수정** = 누적.
207
+
208
+ 6. **검증 중복 자가 인지** = PR #109 결.
209
+
210
+ 7. **상태 패턴 자가 적용 (조건식 복잡 → 다형성)** = 누적 11+ PR.
211
+
212
+ 8. **InputView 분리 기준 학생 자가 명시** = 누적.
213
+
214
+ ## MCP 룰 후보 신규 + 강화 (PR #69)
215
+
216
+ | 룰 | 신규 / 강화 | 누적 PR |
217
+ |---|---|---|
218
+ | `metaphor-fidelity-vs-maintenance-tradeoff` | 신규 | 1 (#69) |
219
+ | `student-self-type-safe-vocabulary` | 신규 | 1 (#69) |
220
+ | `class-name-vs-stdlib-collision` | 강화 | 3+ (#130·#142·#69) |
221
+ | `model-view-dependency-direction` | 강화 | 15+ ⭐⭐⭐ |
222
+ | `state-children-method-vs-external-when` | 강화 | 11+ |
223
+ | `object-ownership-vs-parameter-passing` | 강화 | 3+ |
224
+ | `function-name-vs-return-semantic-mismatch` | 강화 | 13+ |