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,265 @@
1
+ # PR #47 — [하티] 2단계 블랙잭
2
+
3
+ - **Reviewee:** [@sujin9](https://github.com/sujin9) (하티)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/47
5
+ - **단계:** 2단계
6
+ - **리뷰어:** [@BeokBeok](https://github.com/BeokBeok) (커트/벅벅) — 2023 코호트 reviewer
7
+ - **라인 코멘트:** 13 스레드 — *학생 자가 답변 풍부 (5 thread) / 메서드 참조 = 함수형 프로그래밍 어휘 정점 + 테스트 커버리지 100 강박 vs 의미 메타 + 컨트롤러 *브릿지* 메타포 PR 본문 + 테스트 명명 부정형 → 긍정형 변환 + 람다 `it` 명시 + argument name 가독성 + 1.5/1.0 매직넘버 + 방어적 복사*
8
+ - **sujin9 양 단계 완성** (1단계 #15). sujin9 양 단계 완성.
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 — 컨트롤러 *브릿지* 메타포
13
+
14
+ PR 본문:
15
+
16
+ > *"컨트롤러가 그저 `view`와 `domain`을 연결하는, 마치 `브릿지`와 같은 역할만 할 수 있도록 리팩토링을 해보았습니다."*
17
+
18
+ → **MCP 룰 `controller-as-bridge-metaphor`** ⭐⭐ 신규 — *컨트롤러 = view↔domain 브릿지 메타포*. PR #154 (laco-dev *"컨트롤러 없이 진행 가능?"*)·PR #72 (`controller-classification-criteria`)·PR #100 (`pseudo-domain-controller-layer`) 결의 *컨트롤러 책임 분리* 다른 축 — *학생 자가 브릿지 어휘*.
19
+
20
+ ### 2. 학생 자가 답변 + 깊은 의문 (5 thread)
21
+
22
+ - Thread 1 (메서드 참조): 학생 자가 깊은 답변 + reviewer 확인 요청 *"제가 말한 부분이 맞는지, 혹은 놓친 부분이 있을지 궁금해요!"*.
23
+ - Thread 7 (덱 모두 뽑기): 학생 자가 *카드 다시 채움* 의도 설명.
24
+ - Thread 8 (게임 흐름 테스트): 학생 자가 깊은 토론 + reviewer 의견 요청 *"커트라면 어떻게 테스트를 작성하실지 궁금해요"*.
25
+
26
+ ### 3. `operator fun` 활용 칭찬 (Thread 2)
27
+
28
+ reviewer: *"operator fun 활용 👍"*. BettingMoney 연산자 오버로딩.
29
+
30
+ ## 못한 점 (설계 관점)
31
+
32
+ ### 1. 메서드 참조 = 함수형 프로그래밍 어휘 (Thread 1) — 정점
33
+
34
+ reviewer:
35
+
36
+ > *"메서드 참조를 잘 활용해주셨네요. 👍 일반 함수에 비해 메서드 참조가 갖는 장점은 무엇인지 학습해보시면 어떨까요?"*
37
+
38
+ 학생 자가 답변 정점:
39
+
40
+ > *"공부해보면서 아직 확실하게 아는 건 아니지만 제 생각을 적어보면요..!*
41
+ >
42
+ > *- 코드가 간결해지고 가독성이 좋아집니다.*
43
+ > *- 만약 `game.startGame(participant) { ResultView.printSetUp() }` 과 같은 형태로 쓰게 된다고 했을 때, 만약 함수에 매개변수가 있는 경우라면 매개변수를 함께 담아서 함수를 전달해야 합니다. 하지만 메소드 참조를 사용하면 이를 나중에 지정해줄 수 있다는 장점이 있는 것 같아요!*
44
+ >
45
+ > ***제가 말한 부분이 맞는지, 혹은 놓친 부분이 있을지 궁금해요!*** 😄"*
46
+
47
+ reviewer 첨언 정점:
48
+
49
+ > *"잘 정리해주셨습니다. 👍 첨언드리자면, **메서드 참조는 input을 가공없이 그대로 함수 파라미터로 전달하기 때문에, 데이터가 전달되는 과정에서 훼손되지 않았음을 확신할 수 있습니다.** 즉, 동일한 input이면 동일한 output이 나올 것이라 기대할 수 있습니다.*
50
+ >
51
+ > ***\"동일한 input이면 동일한 output이 나온다\"라는 매커니즘은 \"함수형 프로그래밍\"의 매커니즘입니다.*** 😅"*
52
+
53
+ → **MCP 룰 `method-reference-as-functional-vocabulary`** ⭐⭐⭐ **신규 정점** — *메서드 참조 = 데이터 훼손 X + 함수형 프로그래밍 동일 input → 동일 output 매커니즘*.
54
+
55
+ → **`student-self-correction-request-vocabulary`** ⭐⭐ — *"제가 말한 부분이 맞는지, 놓친 부분이 있을지 궁금해요"* 학생 자가 확인 요청 어휘. PR #82·#149 등 학생 자가 질문 결.
56
+
57
+ ### 2. 테스트 커버리지 100 강박 vs 의미 (Thread 8) — 정점
58
+
59
+ ```kotlin
60
+ // BlackjackGameTest
61
+ @Test
62
+ fun `게임을 오류없이 실행한다`() {
63
+ BlackjackGame().apply {
64
+ startGame(participant, ::output)
65
+ runPlayer(participant.players, ::isHit, ::output)
66
+ runDealer(participant.dealer, ::output)
67
+ }
68
+ }
69
+ ```
70
+
71
+ reviewer: *"게임을 오류없이 실행한다는 것은 어떤 의미일까요? 여기서 말하는 \"오류가 없다\" 라는 것은 어떤 오류를 말하는 걸까요?"*
72
+
73
+ 학생 자가 답변:
74
+
75
+ > *"게임이 전체적으로 중간에 종료되거나 다른 오류 없이 잘 끝나는, 전체적인 로직의 `흐름`에 대한 테스트를 하고 싶어서 이렇게 작성하였었습니다. 다른 구체적인, 디테일한 오류들에 대해서는 다른 단위 테스트들이 있기 때문에 모든 경우의 수를 테스트하는 것은 굳이 필요하진 않다고 생각했어요!*
76
+ >
77
+ > ***혹시 이런 상황에서는 테스트가 굳이 필요한지, 필요하다면 어떻게 테스트를 하면 좋을까요?*** 다른 더 나은 테스트 방법이 있는지, 혹은 커트라면 어떻게 테스트를 작성하실지 궁금해요 😊"*
78
+
79
+ reviewer 정점:
80
+
81
+ > *"적어도 테스트는 명확한 요구사항이 기재되어야 합니다. 그렇지 않은 테스트는 의미가 없으며, **반드시 성공하는 테스트 코드를 작성하기 쉽게 됩니다.** 또한, 테스트 코드에는 가급적이면 로직을 넣지 않는 것이 좋습니다.*
82
+ >
83
+ > *모든 로직에 단위 테스트를 작성하는 것은 좋으나, **그렇다고 반드시 성공하는 테스트를 작성하는 것은 의미가 없습니다. 저라면, 이런 경우라면 차라리 테스트 코드를 작성하지 않습니다.** 그럼에도 불구하고 테스트 코드를 작성해야한다면, \"BlackJackGame 객체를 생성합니다.\" 와 같은 테스트 코드를 작성할 수 있을 것 같아요."*
84
+
85
+ 학생 자가 답변:
86
+
87
+ > *"모든 로직에 테스트를 작성해야 한다는 생각과, 굳이 이게 작성할 필요가 있는 테스트인가에 대한 고민이 계속 있었는데 의견 감사해요! :)*
88
+ >
89
+ > ***앞으로 다음 미션에서는 테스트 커버리지를 100 만드는 것만 생각하기 보다는, 테스트의 의미에 더 집중해야겠어요*** 😄"*
90
+
91
+ → **MCP 룰 `coverage-100-vs-test-meaning`** ⭐⭐⭐ **신규 정점** — *테스트 커버리지 100 강박 vs 테스트 의미 — 학생 자가 자각*.
92
+
93
+ → **MCP 룰 `always-passing-test-anti-pattern`** ⭐⭐⭐ **신규** — *"반드시 성공하는 테스트 = 의미 없음 + 차라리 안 쓰는 게 낫다"* reviewer 명시 어휘.
94
+
95
+ → **MCP 룰 `test-with-logic-anti-pattern`** ⭐⭐ — *테스트 코드에 로직 포함 X*. PR #14·#48·#86 (테스트 어휘) 결 합류.
96
+
97
+ → **MCP `oh-my-oop` 핵심 가치 학생 측 메타 어휘** — *커버리지 100 강박 자가 자각*. PR #18 (`student-honest-no-deep-thought`) 결의 학생 솔직 인정 다른 축.
98
+
99
+ ### 3. 테스트 명명 부정형 → 긍정형 변환 (Thread 7)
100
+
101
+ ```kotlin
102
+ // 변경 전
103
+ @Test
104
+ fun `덱에 있는 카드를 모두 뽑아도 오류가 나지 않는다`() { ... }
105
+ ```
106
+
107
+ reviewer: *"덱에 있는 카드를 모두 뽑게 되면 오류가 발생해야 하지 않을까요?"*
108
+
109
+ 학생 자가 답변:
110
+
111
+ > *"덱에 있는 카드를 모두 뽑으면 카드를 다시 채워줌으로써 게임이 끝나지 않고 계속 진행되도록 구현하고 싶어서 이렇게 작성하였습니다!"*
112
+
113
+ reviewer: *"그렇다면, 말씀하신대로 \"오류가 나지 않는다\" 라는 문구 대신, \"다시 채워진다\" 의 내용이 들어가면 어떨까요?"*
114
+
115
+ 학생: *"오,,! 그게 더 의미에 맞는 이름인 것 같아요!"*
116
+
117
+ → **MCP 룰 `test-name-positive-vs-negative-vocabulary`** ⭐⭐ 신규 — *부정형 (오류 X) → 긍정형 (다시 채워진다) — 도메인 의도 명시*. PR #38 (테스트 명명 도메인 어휘) 결 합류.
118
+
119
+ ### 4. argument name 가독성 (Thread 0)
120
+
121
+ reviewer:
122
+
123
+ > *"코틀린에는 argument name이라는 것이 있습니다. argument name을 활용하면, 파라미터에 무엇을 넣어야할지 알 수 있어서 가독성이 좋아집니다. **파라미터가 3개 이상이거나, 함수명만 보고서 파라미터를 무엇을 넣어야할지 짐작하기 어려울 경우에는 argument name을 활용하는 것을 권장**합니다."*
124
+
125
+ ```kotlin
126
+ // 권장
127
+ val participant = BlackjackParticipant.of(
128
+ dealer = Dealer(),
129
+ names = names,
130
+ input = InputView::getBettingMoney
131
+ )
132
+ ```
133
+
134
+ → **MCP 룰 `kotlin-named-parameter-readability`** ⭐⭐ — PR #144 (m6z1) `kotlin-named-parameter-readability` 결 합류 누적 2 PR → ***Kotlin named parameter 어휘*** ⭐⭐⭐ 강화.
135
+
136
+ ### 5. `1.5`와 `1.0` 매직넘버 (Thread 4)
137
+
138
+ reviewer: *"1.5와 1.0은 각각 어떤 것을 의미할까요?"*
139
+
140
+ → **매직넘버 = 도메인 어휘 분리** = 누적 다수.
141
+
142
+ ### 6. 팩토리 + private constructor (Thread 3)
143
+
144
+ reviewer:
145
+
146
+ > *"팩토리 메서드를 활용한다면 생성자를 통한 객체 생성을 막도록 개선해보면 어떨까요?"*
147
+
148
+ → **팩토리 + private constructor** = 누적 다수.
149
+
150
+ ### 7. 언더바 `_` backing property 컨벤션 (Thread 5)
151
+
152
+ reviewer:
153
+
154
+ > *"대체로 backing property 패턴을 사용할 때 언더바(_)를 붙입니다. backing property 패턴을 사용하는 것이 아니라면, 언더바(_)는 제거해주시는 것이 좋습니다.*
155
+ > *ref. https://kotlinlang.org/docs/coding-conventions.html#names-for-backing-properties"*
156
+
157
+ → **MCP 룰 `underscore-prefix-backing-property-only`** ⭐⭐⭐ — PR #12 (EmilyCh0 1단계) 결 합류 누적 2 PR + Kotlin 공식 컨벤션 ref 첨부 강화.
158
+
159
+ ### 8. 방어적 복사 (Thread 6)
160
+
161
+ reviewer:
162
+
163
+ > *"players를 BlackJackParticipant의 파라미터로 전달하게 되고, 이 값을 BlackJackParticipant 내부에서 데이터를 조작(추가 및 삭제)를 하게 되면, 원본(players)을 훼손하게 됩니다. 지금 구조에서는 문제가 없지만, 원본이 훼손되면 원본을 사용하게 되는 모든 곳에서 문제가 발생하게 됩니다."*
164
+
165
+ → **방어적 복사** = PR #137·#148 결 합류 누적 3 PR.
166
+
167
+ ### 9. 클래스 + 생성자 같은 줄 컨벤션 (Thread 9)
168
+
169
+ ```kotlin
170
+ // 변경 전
171
+ class BettingResult
172
+ private constructor(...) { ... }
173
+
174
+ // 권장
175
+ class BettingResult private constructor(...) { ... }
176
+ ```
177
+
178
+ reviewer: *"클래스와 생성자는 한 줄에 같이 작성하는 것이 컨벤션이에요. 지금처럼 작성하시면, **private 함수로 오해하기 쉬워요.** 😅"*
179
+
180
+ → **MCP 룰 `class-constructor-same-line-convention`** ⭐ — 가독성 컨벤션 + 오해 시그널.
181
+
182
+ ### 10. 람다 `it` → 명시적 변수 (Thread 10)
183
+
184
+ reviewer:
185
+
186
+ > *"람다에서 기본적으로 제공하는 `it`을 활용해도 좋지만, **가급적이면 변수가 어떤 역할을 하는지 정의하여 사용하는 것을 권장**해요."*
187
+
188
+ ```kotlin
189
+ // 변경 전
190
+ players.forEach { it.draw(...) }
191
+
192
+ // 권장
193
+ players.forEach { player -> player.draw(...) }
194
+ ```
195
+
196
+ → **MCP 룰 `lambda-it-vs-named-param`** ⭐⭐ 신규 — *`it` 활용 가능 / 명시적 변수 = 역할 정의 권장*. PR #144 (`kotlin-named-parameter-readability`)·Thread 0 (`argument-name-readability`) 결 합류 — *명명 명시 어휘*.
197
+
198
+ ### 11. 파라미터 긴 경우 개행 (Thread 11)
199
+
200
+ ```kotlin
201
+ fun of(
202
+ dealer: Dealer,
203
+ names: List<String>,
204
+ money: (String) -> (BettingMoney)
205
+ ): BlackjackParticipant { ... }
206
+ ```
207
+
208
+ → 가독성 컨벤션.
209
+
210
+ ### 12. main 함수도 한 가지 일만 (Thread 9 main)
211
+
212
+ reviewer: *"main함수도 일종의 함수이므로, 함수가 한 가지 일만 잘 하도록 함수를 분리해보면 좋을 것 같아요."*
213
+
214
+ → **함수 한 가지 일** = 누적 다수.
215
+
216
+ ## 대표 인용
217
+
218
+ > [sujin9 PR 본문]
219
+ > *"컨트롤러가 그저 `view`와 `domain`을 연결하는, 마치 `브릿지`와 같은 역할만 할 수 있도록 리팩토링"*
220
+
221
+ → **컨트롤러 = 브릿지 메타포 학생 자가 어휘**.
222
+
223
+ > [BeokBeok Thread 1]
224
+ > *"메서드 참조는 input을 가공없이 그대로 함수 파라미터로 전달하기 때문에, 데이터가 전달되는 과정에서 훼손되지 않았음을 확신할 수 있습니다. 즉, 동일한 input이면 동일한 output이 나올 것이라 기대할 수 있습니다."*
225
+
226
+ → **메서드 참조 = 함수형 매커니즘 어휘 정점**.
227
+
228
+ > [sujin9 Thread 1]
229
+ > *"제가 말한 부분이 맞는지, 혹은 놓친 부분이 있을지 궁금해요!"*
230
+
231
+ → **학생 자가 확인 요청 어휘**.
232
+
233
+ > [BeokBeok Thread 8]
234
+ > *"반드시 성공하는 테스트를 작성하는 것은 의미가 없습니다. 저라면, 이런 경우라면 차라리 테스트 코드를 작성하지 않습니다."*
235
+
236
+ → **항상 성공 테스트 거부 어휘 정점**.
237
+
238
+ > [sujin9 Thread 8]
239
+ > *"앞으로 다음 미션에서는 테스트 커버리지를 100 만드는 것만 생각하기 보다는, 테스트의 의미에 더 집중해야겠어요"*
240
+
241
+ → **학생 자가 커버리지 100 강박 자각 어휘**.
242
+
243
+ > [BeokBeok Thread 9 (생성자 줄바꿈)]
244
+ > *"클래스와 생성자는 한 줄에 같이 작성하는 것이 컨벤션이에요. 지금처럼 작성하시면, private 함수로 오해하기 쉬워요."*
245
+
246
+ → **생성자 줄바꿈 = private 함수 오해 시그널 어휘**.
247
+
248
+ ## 얻은 교훈 (보편)
249
+
250
+ 1. **메서드 참조 = 함수형 프로그래밍 매커니즘 (input → output 훼손 X)** — **MCP 룰 `method-reference-as-functional-vocabulary` 후보** ⭐⭐⭐ 정점.
251
+ 2. **테스트 커버리지 100 강박 vs 의미** — **MCP 룰 `coverage-100-vs-test-meaning` 후보** ⭐⭐⭐ 정점.
252
+ 3. **항상 성공 테스트 안티패턴** — **MCP 룰 `always-passing-test-anti-pattern` 후보** ⭐⭐⭐.
253
+ 4. **컨트롤러 = 브릿지 메타포** — **MCP 룰 `controller-as-bridge-metaphor` 후보** ⭐⭐.
254
+ 5. **테스트 명명 부정형 → 긍정형 변환** — **MCP 룰 `test-name-positive-vs-negative-vocabulary` 후보** ⭐⭐.
255
+ 6. **Kotlin argument name + 람다 `it` vs 명시적 변수** — **MCP 룰 `kotlin-named-parameter-readability` + `lambda-it-vs-named-param` 후보** ⭐⭐⭐.
256
+ 7. **언더바 `_` backing property 컨벤션 누적 2 PR** — **MCP 룰 `underscore-prefix-backing-property-only` 후보** ⭐⭐⭐.
257
+ 8. **클래스 + 생성자 같은 줄 컨벤션 (private 함수 오해)** — **MCP 룰 `class-constructor-same-line-convention` 후보** ⭐.
258
+ 9. **방어적 복사 누적 3 PR** = 누적.
259
+
260
+ ## 메타 노트
261
+
262
+ - **sujin9 양 단계 완성 (1단계 #15 → 2단계 #47)** — 1단계 단방향 가이드 → 2단계 학생 자가 답변 5 thread + 학생 자가 *확인 요청 + 의견 요청* 어휘 진화. **BeokBeok 양 단계 reviewer**.
263
+ - **BeokBeok 양 PR 어휘 진화** (#15 가이드 → #47 함수형 매커니즘 + 테스트 의미 어휘 정점) — *2025-05 시점 누적 reviewer 다년 활동*.
264
+ - **메타 케이스 8번째 = 학생 자가 *커버리지 100 강박 자각* + *컨트롤러 브릿지 메타포* + reviewer 함수형 매커니즘 어휘** — *학습 정체감 자각 + 어휘 진화 메타*.
265
+ - **MCP `oh-my-oop` 핵심 가치 어휘** (학생 측 자가 자각 + reviewer 단일 답 거부 *"차라리 안 쓰는 게 낫다"*) 정점.
@@ -0,0 +1,305 @@
1
+ # PR #29 — [블랙잭 1단계] 부나 미션
2
+
3
+ - **Reviewee:** [@tmdgh1592](https://github.com/tmdgh1592)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/29
5
+ - **단계:** 1단계 (Builder + DSL 시도)
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 30 (리뷰어 20 / 리뷰이 10)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`@JvmInline value class CardNumber(private val number: Int)`** — 끗수 원시값 포장 (후속에 enum 전환 검토).
12
+ - **`Card private constructor + Card.of(id: Int)` Flyweight (`CARDS = flatten`)** — 52장 캐싱.
13
+ - **`open class Player` + `Dealer : Player` 상속 구조** — 후속에 `abstract class Participant`로 개선 권고.
14
+ - **`PlayerHand` 일급 컬렉션 + 방어적 복사** — 점수 계산 + Ace 보정.
15
+ - **`DTO 패턴` 도입 시도 + 학생 자가 토론** (못한 점 §6).
16
+ - **후속 반영 — `Cards.isBlackjack()` 캡슐화 + DTO 분리 위치 토론 + DSL+Builder 폐기 결정**.
17
+
18
+ ## 못한 점 (설계 관점)
19
+
20
+ ### 1. `Shape` enum *한글 식별자*
21
+
22
+ ```kotlin
23
+ enum class Shape {
24
+ 스페이드, 다이아몬드, 하트, 클로버;
25
+ }
26
+ ```
27
+
28
+ 리뷰어: "*한글로 코드를 작성하지 않도록 해주세요. 왜 한글로 작성하면 안되는지, 답변을 남겨주세요.*"
29
+
30
+ 학생 답변: "*Encoding 설정에 따라서 한글이 깨지는 경우가 발생할 수 있기 때문에, 영어로 작성*하는 것이 일반적일 것 같습니다."
31
+
32
+ → 한글 식별자는 *인코딩 호환* + *국제화* + *키보드 입력 비용* + *오픈소스 협업* 측면 모두 비표준. *enum 값 = 도메인 어휘*가 영어로. *출력만 한글*은 `OutputView`가 매핑.
33
+
34
+ ### 2. `BlackJackBuilder` *잘못된 빌더 패턴* (object + lateinit)
35
+
36
+ ```kotlin
37
+ object BlackJackBuilder {
38
+ private lateinit var participants: Participants
39
+ private lateinit var cardDeck: CardDeck
40
+
41
+ fun cardDeck(generator: CardGenerator) { cardDeck = CardDeck(generator) }
42
+ fun participants(block: ParticipantsBuilder.() -> Unit) { participants = ParticipantsBuilder(block) }
43
+
44
+ operator fun invoke(block: BlackJackBuilder.() -> Unit): BlackJack = BlackJackBuilder.apply(block).build()
45
+ private fun build(): BlackJack = BlackJack(cardDeck, participants)
46
+ }
47
+ ```
48
+
49
+ 리뷰어: "*빌더 패턴에 대한 잘못된 사용 방법*입니다. 1. *빌더는 어떠한 공유 자원을 사용하지 않습니다.* 2. *빌더가 생성하는 인스턴스를 만들기 위해 반드시 필요한 값*이라면, *선택적으로 받지 않습니다*. 즉, 이 경우 *생성자를 이용해서 받는것이 맞습니다*. 3. 지금 구조에서 *빌더 + DSL을 사용하는 것에 특별한 장점이 드러나지 않는 것 같습니다*."
50
+
51
+ 학생 자가 인정: "다시 살펴보니, *말씀해주신 것처럼 단순히 `val blackJack = BlackJackBuilder { }` 라는 코드를 작성했을 때 문제가 발생하게 됩니다*..😅 *Builder 패턴을 사용할 때에는 반드시 필요한 값이 아닌, 선택적으로 초기화가 필요한 경우에 사용하는 것이 올바른 사용법*이라는 생각이 들었습니다. [...] *이번에 우테코 강의에서 DSL을 배워서 적용해보고 싶은 마음에 해봤는데*, 3번 피드백을 받고 찾아보니, *빌더와 DSL을 함께 사용하는 경우는 어떠한 인스턴스를 생성하는 것이 복잡한 구조일 때 적합*하다고 합니다."
52
+
53
+ → **세 가지 빌더 위반 동시 발생:**
54
+ 1. `object` Builder = 전역 변경 가능 상태 (공유 자원).
55
+ 2. `cardDeck`/`participants` 둘 다 필수인데 *선택적 람다*로 받음 → 생성자가 자연.
56
+ 3. *Builder + DSL*은 *복잡한 인스턴스* 시나리오에 적합 — 블랙잭 2 필드는 *과잉*.
57
+
58
+ 수업에서 배운 기능을 *적용하고 싶은 마음*이 잘못된 적용을 만든 신호. PR #65 (kmkim2689) DSL과 같은 결.
59
+
60
+ ### 3. `Card.toString()` UI 결합
61
+
62
+ ```kotlin
63
+ class Card private constructor(private val shape: Shape, val number: CardNumber) {
64
+ override fun toString(): String = "${number.toLetter()}${shape.name}"
65
+ }
66
+ ```
67
+
68
+ 리뷰어: "*Card를 어떻게 그릴지는 UI의 관심사*입니다."
69
+
70
+ 학생 자가 인정: "*도메인은 비즈니스 로직만을 수행*하고, 로직에 의해서 *반환된 값을 어떻게 화면에 보여주는지는 View에 따라 다를 수* 있다고 다시금 생각이 들었습니다. *어떤 View에서는 Shape.Heart를 "하트" 라고 그리고 싶어하고, 또 다른 View에서는 하트를 "❤️"로 그리고 싶어한다면, 그 때마다 domain을 수정해주는건 재사용성이 매우 떨어지기 때문*입니다." — 일관 패턴 자가 인정.
71
+
72
+ ### 4. `Card.of(id: Int): Card = CARDS[id - 1]` — id 의미 모호
73
+
74
+ ```kotlin
75
+ class Card private constructor(private val shape: Shape, val number: CardNumber) {
76
+ companion object {
77
+ private val CARDS = Shape.values().map { shape ->
78
+ (CardNumber.min()..CardNumber.max()).map { Card(shape, CardNumber(it)) }
79
+ }.flatten()
80
+ fun of(id: Int): Card = CARDS[id - 1]
81
+ }
82
+ }
83
+ ```
84
+
85
+ 리뷰어: "*of 함수가 무엇을 의미하는지, 왜 필요한지 모르겠습니다.* 🙏🏻" — `id`는 *0~51 인덱스*. *외부에서 1~52 정수로 카드 참조*하는 호출자는 누구? PR #128 (ijh1298) `Card(cardIndex: Int)` 보조 생성자와 같은 결. *인덱스 ↔ Card 분해*는 *Card의 책임 X*. `Card.of(shape, number)` 같은 *식별자 기반*이 자연.
86
+
87
+ 또: `(CardNumber.min()..CardNumber.max()).map { Card(shape, CardNumber(it)) }` — `CardNumber.min()`/`max()` companion 메서드. 학생 후속에 `flatMap` 사용 권고: "*컬렉션 함수의 flatMap { } 을 사용해보세요*".
88
+
89
+ ### 5. `Command(value: String)` UI 형식이 도메인에
90
+
91
+ ```kotlin
92
+ class Command(val value: String) {
93
+ private val validCommands = listOf("y", "n", "Y", "N")
94
+ init { require(value in validCommands) { ... } }
95
+ }
96
+ ```
97
+
98
+ 리뷰어: "*"y", "n" 과같은 문자는 UI에서 결정하는 관심사*입니다. [...] 도메인에서 필요한 개념은, *받는다 or 받지 않는다 라는 두가지 개념*으로 볼 수 있지 않을까요?"
99
+
100
+ 학생 자가 인정: "*입력 값이 달라지는 상황에서도 domain을 재사용할 수 있게끔 만드는 것이 중요*하다는 생각이 들었습니다. 일례로, *한국을 타겟으로 하다가 앱을 글로벌화 했을 때, 각국 다른 언어로 이루어진 입력값에 따라 domain을 수정하거나 새롭게 만드는 것은 유지보수에 좋지 않을 수도 있기 때문*입니다." — PR #63/#125/#128와 같은 결 — UI 형식 도메인 보유.
101
+
102
+ ### 6. `HandDTO` Domain에서 생성 — 학생 자가 의문
103
+
104
+ ```kotlin
105
+ data class HandDTO(val name: String, val hand: List<String>)
106
+ ```
107
+
108
+ 학생 PR 본문 자가 의문: "*DTO로 감싸는 것이 Controller의 역할인가 vs Domain의 역할인가* 우선, 이번 프로젝트를 진행하면서 *Domain에서 DTO로 감싸서 전달*하도록 하였습니다. 하지만 *테스트 코드를 작성하는 것이 너무 힘들어진다는 문제*가 발생하였는데, 이런 구조여도 괜찮은지 궁금합니다!"
109
+
110
+ 리뷰어: "*작성하는 방법을 묻기 전에, DTO가 왜 필요한가요?* DTO가 어떤 목적으로 사용되는지, 왜 필요한지, 그렇다면 누가 생성을 해야 하는 것인지 답변을 남겨주세요."
111
+
112
+ 학생 자가 답변: "*DTO는 각 계층간 데이터를 전달하기 위한 목적*을 가지고 있습니다. 따라서 *어떠한 로직을 포함하고 있어서도 안됩니다*. [...] *MVC패턴에서 Controller는 View와 Domain의 중개 역할*을 수행하며, View와 Domain을 의존합니다. 따라서 *Controller에서 DTO를 사용하여 Domain 로직을 통해 얻은 결과를 View에게 전달*해주는 것이 좋지 않을까 라는 생각을 하였습니다. 또한, *이번 미션을 하면서 Domain에서 DTO를 반환하게 되면 테스트 코드 작성이 매우 복잡해진다는 것을 깨달았습니다*."
113
+
114
+ → **테스트 어려움 = 책임 잘못 배치 신호** (PR #92 결). *DTO 변환*은 *Controller 책임*. Domain은 *비즈니스 로직만*. 학생이 *자가 진단 + 정답 도달*. (다만 콘솔 게임에 DTO는 *과잉*일 수도 있음.)
115
+
116
+ ### 7. `CardDeck`이 `CardGenerator` 의존 — 카드를 새로 만들기?
117
+
118
+ ```kotlin
119
+ class CardDeck(private val generator: CardGenerator) {
120
+ private val deck = Card.all().toMutableList()
121
+ fun draw(): Card {
122
+ val card = generator.generate()
123
+ if (deck.contains(card)) { deck.remove(card); return card }
124
+ return draw()
125
+ }
126
+ }
127
+ ```
128
+
129
+ 리뷰어: "*카드덱이 카드 제너레이터와 어떤 협력관계를 가지는 것일까요?* 가지고있는 *카드뭉치에서 카드를 뽑는데 카드를 새로 만든다는 의미가 맞을까요?* 카드 뭉치가 생성될때 *필요한 카드들을 생성자로 받아서 준비*할 수도 있지 않을까요?"
130
+
131
+ 학생 자가 인정: "*단순히 카드를 하나 뽑는데 그 때마다 계속 generate() 해주는 것이 자연스러운 구현은 아닌 것 같습니다.* CardDeck의 생성자 파라미터로 *generator 대신에 이미 생성된 카드들을 넘겨주는 방식으로 변경*해보겠습니다!" — *generate() + 중복 시 재귀*는 PR #65 (kmkim2689) 패턴 재출현. *덱이 미리 셔플 + pop*이 자연.
132
+
133
+ ### 8. `PlayerHand`에 점수 계산 + `JQK_SCORE` 상수
134
+
135
+ ```kotlin
136
+ class PlayerHand {
137
+ fun calculateTotalScore(): Int = cards.map { it.number.toInt() }.fold(0) { total, number -> total + calculateEachScore(total, number) }
138
+ private fun calculateEachScore(score: Int, number: Int): Int = when (number) {
139
+ CardNumber.ace() -> calculateAceScore(score)
140
+ CardNumber.jack(), CardNumber.queen(), CardNumber.king() -> JQK_SCORE
141
+ else -> number
142
+ }
143
+ companion object { private const val ACE_MIN_SCORE = 1; private const val ACE_MAX_SCORE = 11; private const val JQK_SCORE = 10 }
144
+ }
145
+ ```
146
+
147
+ 리뷰어: "*플레이어 핸드나 게임 결과 객체가 카드의 점수를 가지고 있는것이 맞을까요?* *기본 점수는 어떤 객체가 결정할 책임을 가지고 있을까요?*" — *Card.score()* 또는 *Rank.score*가 *카드 한 장의 책임*. `PlayerHand`는 *합산 + Ace 보정*만. `J`/`Q`/`K`가 *모두 10점*인 룰을 `PlayerHand`에 박으면 *카드의 점수 룰이 Hand 안*에 있어 *Card 도메인 어휘*가 누수.
148
+
149
+ ### 9. `GameResult.judgePlayer(dealerScore, playerScore)` — 정적 + Int 비교
150
+
151
+ ```kotlin
152
+ enum class GameResult {
153
+ 승, 무, 패;
154
+ companion object {
155
+ fun judgePlayer(dealerScore: Int, playerScore: Int): GameResult = when {
156
+ playerScore > BLACKJACK_SCORE -> 패
157
+ dealerScore > BLACKJACK_SCORE || playerScore > dealerScore -> 승
158
+ dealerScore == playerScore -> 무
159
+ else -> 패
160
+ }
161
+ }
162
+ }
163
+ ```
164
+
165
+ 리뷰어: "*승부를 결정짓는 것은 딜러와 상관없이 참가자가 다른 참가자가 판단할 요소이지 않을까요?* [...] `class Player { fun judge(otherPlayer: Player): GameResult { ... } }`"
166
+
167
+ 학생 변호: "*블랙잭 게임은 Dealer와 Player가 싸우는 상황이기 때문에 승부를 결정짓는 것이 딜러와 상관있지 않을까요..?*"
168
+
169
+ 리뷰어: "*현실 게임 입장에서 본다면, 딜러와 플레이어간의 점수를 비교하는 것으로 볼 수 있겠네요. 하지만, 객체지향 관점에서 볼 때 점수를 비교하는 구현체가 딜러인지 플레이어인지 관심을 가질 필요가 있을까요?* *만약 딜러 vs 플레이어가 아닌 플레이어 vs 플레이어면 동일한 코드를 중복해서 만들어야 할까요?* 또한 지금 구조에서 본다면, *플레이어는 승패를 스스로 판단하는 것이 아닌, 딜러에 의해 수동적으로 계산이 되고 있습니다.* (플레이어 객체가 *자율적으로 역할을 수행하지 않다*고 볼 수 있습니다)"
170
+
171
+ → PR #63·#125·#128과 동일한 *상대 무관 비교 = 참가자 자율성* 토론.
172
+
173
+ 또: `enum 한글 값 (승/무/패)` — Shape의 한글 식별자와 같은 결.
174
+
175
+ ### 10. `Player`가 `open class` + `Dealer : Player` 상속
176
+
177
+ ```kotlin
178
+ open class Player(val name: String) {
179
+ val hand = PlayerHand()
180
+ fun addCard(card: Card) { hand.add(card) }
181
+ fun isBust(): Boolean = hand.calculateTotalScore() > GameResult.blackjackScore()
182
+ }
183
+ class Dealer : Player(DEALER_NAME) { ... }
184
+ ```
185
+
186
+ 리뷰어: "*open class를 이용한 상속 구조가 아닌, 다형성을 이용한 추상 클래스를 고려*해보면 어떨까요? `abstract class Player { abstract fun canDraw(): Boolean }` [...] `dealer.isStay() // (X)` / `player.isBust() // (X)` / `player.canDraw() // (O) 딜러인지 참가자인지 관심없음, 더 뽑을 수 있니?`" — *Dealer is-a Player*는 *현실 비유*에 맞지만 *Liskov 위반*(Dealer는 입력 없이 자동 진행). *공통 추상 = `Participant`* + *서로 다른 역할*. PR #114와 같은 결.
187
+
188
+ ### 11. `BlackJackController.blackJack: BlackJack lateinit` — 매번 새로 생성
189
+
190
+ ```kotlin
191
+ class BlackJackController {
192
+ private lateinit var blackJack: BlackJack
193
+ fun start() {
194
+ blackJack = BlackJackBuilder { ... }
195
+ ...
196
+ }
197
+ }
198
+ ```
199
+
200
+ 리뷰어: "*start() 함수에서 매번 블랙잭을 새로 만든다면, blackjack 을 프로퍼티로 작성할 필요가 있을까요?*"
201
+
202
+ 학생 자가 인정: "*BlackJackController의 start() 메서드를 호출할 때마다 새로운 인스턴스로 초기화되므로 따로 뺴놓을 필요가 없을 것 같습니다!*" — PR #92·#114와 같은 *lateinit var의 호출 순서 invariant 위반*. *local val*이 자연.
203
+
204
+ ### 12. `Cards.getFirstCard(): List<Card>` — 첫 *카드 한 장*인데 *List 반환*
205
+
206
+ ```kotlin
207
+ class Cards {
208
+ fun getFirstCard(): List<Card> = listOf(_items.first())
209
+ }
210
+ ```
211
+
212
+ 리뷰어: "*getFirstCard() 라면 Card를 반환해야 하지 않을까요?*" — *이름과 반환 타입 불일치*. `getFirstCards()` 또는 `Card` 반환. *Dealer가 1장만 공개*하는 *룰을 위해 List로 감쌌으나* `Card` 자체 반환 + *호출자가 List 만들기*가 자연.
213
+
214
+ ### 13. `Cards`가 *외부 `BlackJack.blackjackScore()` 의존*
215
+
216
+ ```kotlin
217
+ class Cards {
218
+ fun calculateTotalScore(): Int { ... }
219
+ private fun calculateAceScore(score: Int): Int =
220
+ if (hasAce() && (score + BONUS_SCORE) <= blackjackScore()) score + BONUS_SCORE else score
221
+ }
222
+ ```
223
+
224
+ 리뷰어: "*블랙잭 스코어(21점)은 Cards에서 스스로 판단을 해야 좋지 않을까요?* 21점이라는 값은 *Cards의 점수 합계에서 도출되는 하나의 상태*이기 때문에, *`Blackjack.blackjackScore()` 형태로 사용하는 것이 아닌 `cards.isBlackjack()` 처럼 사용해야 맞을 것 같습니다.*" — *상수 위치*가 *Cards 외부 의존*을 만듦. `Cards.isBlackjack()`이 Tell-Don't-Ask.
225
+
226
+ ### 14. `Participants(dealer: Dealer, players: Players)` — *Participant 추상화 미활용*
227
+
228
+ ```kotlin
229
+ class Participants(private val dealer: Dealer, private val players: Players)
230
+ ```
231
+
232
+ 리뷰어: "*Participants라는 객체 이름과 역할로 본다면, 딜러와 플레이어들을 알고있는 것이 아닌*, 아래와 같은 시그니처를 가지고 있을 것이라고 기대했습니다. `class Participants(participants: List<Participant>) { ... }` 딜러와 플레이어들을 이용해서 *`List<Participant>`를 만드는 것이 우선*되어야 하지는 않을까요? 또한, *모든 코드가 딜러 플레이어들을 직접적으로 호출해서 하고 있는데 Participant 타입을 활용하지 못하고 있는 것처럼 느껴집니다.*" — `Participants(dealer, players)`는 *프로퍼티 묶음*. PR #63과 같은 *Participants 첫 0번 = Dealer invariant* 변형. *공통 행위*는 `List<Participant>` 처리로.
233
+
234
+ ### 15. `BlackJack.drawAll()` — 두 단계 흐름이 한 메서드에
235
+
236
+ ```kotlin
237
+ class BlackJack(private val deck: CardDeck, private val participants: Participants) {
238
+ fun drawAll() { participants.drawAll(deck) }
239
+ }
240
+ ```
241
+
242
+ 리뷰어: "*처음 카드를 받는 동작과 게임을 시작하는 과정으로 크게 두가지로 나눠서 생각해볼 수 있지 않을까요?* `class BlackJack(...) { fun readyToStart() { participants.drawFirst(deck) } fun start(onDrawn: (Participant) -> Unit): BlackJackResult { while (isRunning()) { participants.draw(deck); ... } }`" — *초기 분배 vs 진행*이 *시점 분리*. `readyToStart()` + `start()`로 *호출자가 단계 명시*. PR #135와 같은 결.
243
+
244
+ ### 16. `Participant.cards` 공개 + `getCards()`도 공개
245
+
246
+ ```kotlin
247
+ abstract class Participant(val name: String) {
248
+ val cards = Cards()
249
+ fun getCards(): List<Card> = cards.items
250
+ }
251
+ ```
252
+
253
+ 리뷰어: "*getCards() 함수가 이미 공개되어 있는데 위 프로퍼티도 같이 공개할 필요가 있을까요?*" — *두 가지 접근 경로*가 *동일 정보*를 노출. *한 가지 공개*만 (Kotlin에서 `val cards: Cards`로 충분).
254
+
255
+ ## 리뷰어 의견 요지
256
+
257
+ - ***한글 식별자 금지*** — 인코딩 + 국제화 + 협업.
258
+ - ***Builder 패턴 잘못 사용*** — 공유 자원 X, 필수값은 생성자, DSL은 복잡 인스턴스에만.
259
+ - ***`Card.of(id: Int)` 인덱스 분해 = Card 책임 X*** (PR #128와 같은 결).
260
+ - ***`Command "y"/"n"`은 UI 형식*** — 도메인은 *받는다/받지 않는다*.
261
+ - ***DTO 변환 = Controller 책임, Domain은 비즈니스 로직만*** — 학생 자가 도달.
262
+ - ***`CardDeck + CardGenerator`는 부자연*** — 덱이 카드를 미리 보유.
263
+ - ***카드 한 장 점수 = Card 책임*** — Hand는 합산 + 보정.
264
+ - ***승부 = 참가자 자율성 (상대 무관 비교)*** — *Dealer.judge(player)* X.
265
+ - ***open class 상속 < abstract Participant 다형성***.
266
+ - ***lateinit var은 호출 순서 invariant 위반*** — local val.
267
+ - ***`getFirstCard(): List<Card>` 반환 타입 ≠ 이름***.
268
+ - ***`blackjackScore()` 상수 위치 = Cards 내부*** — `cards.isBlackjack()`.
269
+ - ***Participants = `List<Participant>` 단일 추상*** — dealer/players 분리는 invariant 누수.
270
+ - ***`drawAll()` = 초기 + 진행 두 단계 압축*** — `readyToStart()` + `start()` 분리.
271
+
272
+ ## 대표 인용
273
+
274
+ > "y", "n" 과같은 문자는 *UI에서 결정하는 관심사*입니다. [...] 도메인에서 필요한 개념은, *받는다 or 받지 않는다 라는 두가지 개념*으로 볼 수 있지 않을까요?
275
+ > — @laco-dev on `Command.kt`
276
+
277
+ > 빌더 패턴에 대한 *잘못된 사용 방법*입니다. 1. *빌더는 어떠한 공유 자원을 사용하지 않습니다.* 2. *빌더가 생성하는 인스턴스를 만들기 위해 반드시 필요한 값*이라면, *선택적으로 받지 않습니다*.
278
+ > — @laco-dev on `BlackJackBuilder.kt`
279
+
280
+ > 카드덱이 카드 제너레이터와 어떤 협력관계를 가지는 것일까요? 가지고있는 *카드뭉치에서 카드를 뽑는데 카드를 새로 만든다는 의미가 맞을까요?*
281
+ > — @laco-dev on `CardDeck.kt`
282
+
283
+ > 현실 게임 입장에서 본다면, 딜러와 플레이어간의 점수를 비교하는 것으로 볼 수 있겠네요. 하지만, *객체지향 관점에서 볼 때 점수를 비교하는 구현체가 딜러인지 플레이어인지 관심을 가질 필요가 있을까요?* *만약 딜러 vs 플레이어가 아닌 플레이어 vs 플레이어면 동일한 코드를 중복해서 만들어야 할까요?*
284
+ > — @laco-dev on `Dealer.kt`
285
+
286
+ > 처음 카드를 받는 동작과 게임을 시작하는 과정으로 크게 *두가지로 나눠서 생각해볼 수 있지 않을까요?*
287
+ > — @laco-dev on `BlackJack.kt`
288
+
289
+ ## 얻은 교훈
290
+
291
+ - ***한글 식별자 = 인코딩/국제화/협업 비용*** — *도메인 어휘는 영어*, *출력만 한글*은 OutputView 매핑.
292
+ - ***Builder + DSL = 복잡한 선택적 필드 인스턴스 시나리오*** — *2 필드 필수*면 생성자가 자연. *수업에서 배운 기능 적용 욕구*가 *과잉 적용* 만듦 (PR #65·#135와 같은 결).
293
+ - ***`Card.of(id: Int)` 인덱스 분해 = Card 책임 X*** — *인덱스 ↔ Card 매핑*은 *호출자 책임*.
294
+ - ***UI 입력 형식(`"y"`/`"n"`)은 도메인 X*** — *받는다 / 받지 않는다*가 도메인 어휘. PR #63·#125·#128와 같은 결.
295
+ - ***DTO 변환 = Controller 책임*** — Domain에서 DTO 반환하면 *테스트 어려움*이 신호. 학생이 *자가 진단 + 정답 도달*.
296
+ - ***`CardDeck + CardGenerator` 결합 = 덱이 카드를 새로 만듦*** — *덱이 미리 셔플 + pop*이 자연. PR #65 재출현 패턴.
297
+ - ***카드 한 장 점수 = Card 또는 Rank/CardNumber 책임*** — Hand는 합산 + 보정. `JQK_SCORE = 10` 같은 룰이 Hand에 있으면 *Card 도메인 어휘 누수*.
298
+ - ***승부 = 참가자 자율성 (`participant.judge(other)`)*** — *Dealer.judge(player)*는 *Dealer가 비교자 역할*. 상대 무관 비교가 자연.
299
+ - ***open class < abstract Participant*** — *Dealer is-a Player*는 현실 비유에 맞지만 *Liskov 위반*. 공통 추상 + 서로 다른 역할.
300
+ - ***`lateinit var blackJack` = 호출 순서 invariant 위반*** — *매번 새로 생성*이면 *local val*. PR #114·#92와 일관.
301
+ - ***`getFirstCard(): List<Card>` = 이름 ≠ 반환 타입*** — `Card` 반환 + 호출자가 List.
302
+ - ***`blackjackScore()` 상수 위치 = Cards 내부*** — `cards.isBlackjack()` 메시지. 외부 상수 참조는 *도메인 응집 깨짐*.
303
+ - ***Participants = `List<Participant>` 단일 추상이 자연*** — `(dealer, players)` 분리는 *공통 행위*를 *직접 호출*로 분해.
304
+ - ***`drawAll()` 한 메서드 = 초기 + 진행 압축*** — `readyToStart()` + `start()`로 *단계 분리*. PR #135와 같은 결.
305
+ - ***학생이 자가 진단으로 정답 도달하는 PR 패턴*** — *PR 본문에 자가 의문 + 리뷰어 메타 질문 + 학생 자가 답변*. PR #135와 같은 결.