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,278 @@
1
+ # PR #51 — [블랙잭 2단계] 부나 미션
2
+
3
+ - **Reviewee:** [@tmdgh1592](https://github.com/tmdgh1592)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/51
5
+ - **단계:** 2단계 (베팅 + State 패턴 + Composition)
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 30 (리뷰어 19 / 리뷰이 11)
8
+ - **참고:** 같은 학생의 1단계 = [PR #29](./29-1단계-블랙잭.md)
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ - **State 패턴 도입** — `CardState` 추상 + `StartState`/`HitState`/`StayState`/`BustState`/`BlackjackState`.
13
+ - **`Money` + `BetMoney` 도메인** — *연산자 오버로딩* (`+`, `*`, `unaryMinus`) — 리뷰어 칭찬.
14
+ - **`Participants.takePlayerTurns / takeDealerTurns`** — 진행자 메서드.
15
+ - **`BlackjackEventListener`로 콜백 통합 (후속 반영)** — Controller god-object 회피.
16
+ - **Fixtures.kt 테스트 fixture** — 리뷰어 칭찬.
17
+ - **후속 반영 — Blackjack 생성자에 deck + players 동시 주입 + 불변 RunningState (add 시 새 List) + canDraw 내부 호출 + while → do-while 변경**.
18
+
19
+ ## 못한 점 (설계 관점)
20
+
21
+ ### 1. `Int.isGreaterThan(value: Int): Boolean` 확장 함수 — 친숙성 ↓
22
+
23
+ ```kotlin
24
+ // blackjack/Extensions.kt
25
+ fun Int.isGreaterThan(value: Int): Boolean = this > value
26
+ ```
27
+
28
+ 리뷰어: "*이 함수를 사용하는 것과 Int > Int 를 비교하는 것중 무엇이 더 개발자에게 친숙할까요?* `val isBust = 5 > 10` vs `val isBust = 5.isGratherthan(10)`"
29
+
30
+ 학생 자가 인정: "*한글자로 끝낼 수 있는걸 늘려놓은 느낌인 것 같아 전자가 더 친숙해보입니다! 수정하겠습니다 : )*" — **확장 함수 *과잉*. *기본 연산자가 명확*하면 *DSL 효과 없음***. PR #34·#92와 같은 결.
31
+
32
+ ### 2. `BlackjackController.start()`가 *5개 callback 인자*
33
+
34
+ ```kotlin
35
+ fun start() {
36
+ Blackjack(CardDeck()).start(
37
+ players = InputView.inputPlayers(),
38
+ onStartFirstDrawn = OutputView::printFirstDrawnMessage,
39
+ onFirstDrawn = OutputView::printFirstOpenCards,
40
+ onDrawnMore = OutputView::printAllCards,
41
+ onEndGame = OutputView::printBlackjackResult
42
+ )
43
+ }
44
+ ```
45
+
46
+ 리뷰어: "*출력에 대해서 요구사항이 변경될 때 마다 start() 함수의 파라미터로 많은 값을 넘겨야 할 수 있습니다.* *이와 관련된 리스너 인터페이스를 만들어서 전달 해 보는건 어떨까요?*"
47
+
48
+ 학생: "*BlackjackEventListener를 통해서 하나의 객체만 전달하도록 해보겠습니다!*" — **5개 callback = 인터페이스 신호**. `interface BlackjackEventListener { fun onStartFirstDrawn(); fun onFirstDrawn(); ... }`. *EventListener 패턴*.
49
+
50
+ ### 3. `Blackjack(deck)` — 덱 보유, 플레이어는 start() 인자
51
+
52
+ ```kotlin
53
+ class Blackjack(private val deck: CardDeck) {
54
+ fun start(players: List<Player>, ...) { ... }
55
+ }
56
+ ```
57
+
58
+ 리뷰어: "*하나의 블랙잭 게임에서 덱은 재사용되고있고 플레이어는 매번 새로가 준비되는 것이 어색하다고 느껴집니다.* *(게임을 두번 이상할 때 덱은 그대로 사용하고 플레이어만 변경되는가?)* *하나의 블랙잭 게임에서는 하나의 덱과 플레이어들로 이루어진 게임으로 만들어 보면 어떨까요?*"
59
+
60
+ 학생 자가 인정: "*블랙잭 객체를 하나 생성하고 start() 메서드를 호출할 때마다, 카드덱은 소모된 상태이고 플레이어만 새롭게 변경되는 문제가 발생하는군요..!* 블랙잭 객체 생성시 *카드덱과 플레이어를 동시에 전달받고, 해당 인자에 대해 게*..."
61
+
62
+ → **객체 생명주기 일관성**. *한 게임 = 한 인스턴스 + 덱 + 플레이어 모두 생성자*. PR #92·#114와 같은 결.
63
+
64
+ ### 4. `ParticipantsTest`에 *주석 처리된 테스트*
65
+
66
+ ```kotlin
67
+ class ParticipantsTest {
68
+ // @Test
69
+ // fun `참여자들은 최대 8명까지 가능하다`() { ... 주석 ... }
70
+ }
71
+ ```
72
+
73
+ 리뷰어: "*테스트 코드 곳곳에 이유를 알 수 없는 주석이 쳐져 있습니다. 왜일까요?*" — PR #17 (rhkrwngud445)과 같은 *주석 처리 코드 = 의도 불명*. *TODO 코멘트* 또는 *삭제*.
74
+
75
+ ### 5. `BetMoney : Money` 상속 — Liskov 위반 위험
76
+
77
+ ```kotlin
78
+ open class Money(private val amount: Int) {
79
+ operator fun times(operand: Double): Money = Money((amount * operand).toInt())
80
+ operator fun plus(money: Money): Money = Money(amount + money.amount)
81
+ }
82
+ class BetMoney(amount: Int) : Money(amount) {
83
+ init { require(amount > 0); require(amount % 1000 == 0) }
84
+ }
85
+ ```
86
+
87
+ 리뷰어: "*배팅 금액이 돈의 성격을 띄고 있어서 단순히 Money를 상속한 것으로 보입니다.* 하지만 *Money에서 제공하는 함수가 다시 Money 타입을 반환하기 때문에* 아래와 같은 상황이 발생할 수 있습니다. ```kotlin val baseBetMoney: BetMoney = BetMoney(10000); val myBetMoney: Money = baseMetMoney * (-2) // -2만원``` 즉 *Money 함수를 사용하고 나면 더이상 BetMoney 타입이 아닌 Money 타입이 되어 기존의 로직이 손상되는 결과로 이어질 수* 있습니다. *상속 대신 Composition을 이용*해 보면 어떨까요?"
88
+
89
+ → **상속 + 반환 타입 불일치 = Liskov 위반**. `BetMoney * (-2)`가 *유효한 BetMoney가 아닌 Money*. *Composition* (BetMoney가 Money를 *멤버*로 보유)이 *invariant 보호*. **상속의 깊은 함정**.
90
+
91
+ ### 6. `Dealer.stay()` — *상태 변경 없음*
92
+
93
+ ```kotlin
94
+ class Dealer(cardState: CardState = StartState()) : Participant(...) {
95
+ override fun stay(): Participant = Dealer(cardState) // ⚠ 같은 상태로 반환
96
+ }
97
+ ```
98
+
99
+ 리뷰어: "*스테이 요청에 카드의 상태가 아무런 변경이 되지 않는 것 같습니다.*" — `stay()`가 *동작 동사*인데 *실제로는 상태 변경 X*. `StayState`로 *명시 전이*가 자연.
100
+
101
+ ### 7. `Participant.draw(card: Card): Participant` 추상 — *Dealer/Player 자율성 차이*
102
+
103
+ ```kotlin
104
+ abstract class Participant(...) {
105
+ abstract fun draw(card: Card): Participant
106
+ abstract fun stay(): Participant
107
+ abstract fun getProfit(other: Participant): Money
108
+ }
109
+ ```
110
+
111
+ 리뷰어: "*더 뽑을지 말지를 선택하는 것은 딜러와 플레이어가 각각 다른데, 이 규칙을 상태에게 전파시킬 필요는 없는 것 같습니다.* 어떤 기능을 추상화 하는가에따라 구현이 달라진다는 의미로 볼 수 있는데요. *결국 트레이드 오프의 영역*이라고 하는 부분이죠. 저는 이렇게 작성 해볼 것 같아요 ```class Dealer { override fun draw(card: Card): Participant { if (canDraw()) return copy(state = state.draw(card)) else return stay() }; fun canDraw(): Boolean { ... } }```"
112
+
113
+ → **State 패턴의 *전이 책임* 위치**: *Participant.draw가 canDraw() 확인 + draw/stay 분기*가 자연. *State에 직접 전파*하면 *State가 Dealer/Player 룰 알아야*.
114
+
115
+ ### 8. `Participants.onStartFirstDrawn()` callback — 외부 책임
116
+
117
+ 리뷰어: "*onStartFirstDrawn()은 사용하는 곳에서 처리하는 곳의 책임으로 볼 수 있지 않을까요?* ```val participants: Participants; onStartDrawn(participants); participants.drawFirst(...)```"
118
+
119
+ 학생: "*onStartFirstDrawn()은 인자로 참여자 객체를 넘겨주기 때문에 내부에서 직접 실행하는 것보다 외부에서 호출하도록 변경*했습니다!" — **callback 내부 호출 vs 외부 호출**. *외부 호출이 도메인 → View 의존* 회피.
120
+
121
+ ### 9. `Participants.getDealer()` / `getPlayers()` 함수 vs 프로퍼티
122
+
123
+ ```kotlin
124
+ class Participants(private val participants: List<Participant>) {
125
+ fun getDealer(): Dealer = participants.first() as Dealer
126
+ fun getPlayers(): List<Player> = participants.subList(1, ...).map { it as Player }
127
+ }
128
+ ```
129
+
130
+ 리뷰어: "*Participants 객체가 딜러 1명, 그리고 플레이어들을 가지고 있는 개념이 명확하다면 위 값들을 매번 함수로 호출하는 것이 아닌, 프로퍼티로 만들어서 가지고 있어도 좋을 듯 합니다.* 또한 *지금 생성자에서 딜러를 포함해 2 명 ~*..." — *getXxx() 매번 캐스팅*보다 *생성자에서 분리 + 프로퍼티*. PR #63·#28과 같은 결.
131
+
132
+ ### 10. `Participants.takePlayerTurn`의 *do-while* 구조
133
+
134
+ ```kotlin
135
+ do {
136
+ val choice = participant.needToDraw()
137
+ if (choice) result = result.draw(...)
138
+ } while (...)
139
+ ```
140
+
141
+ 리뷰어: "*do, while 문을 이용하는 것 보다는 while 문 하나로 해결할 수 없을지? 생각해보고 적용하는게 좋습니다.* *while이 조건을 먼저 확인하기 때문에 코드 이해에도 도움이 되고 가독성도 좋습니다* ```var result: Participant = participant ...```"
142
+
143
+ 학생: "*canDraw()를 내부에서 호출하도록 하고, do-while 대신 while문으로 변경*하였습니다! 대신 *canDraw() 마다 플레이어는 람다를 호출하기 때문에 while 조건에 `result.isRunning`를 추가하여 플레이어가 아직 카드 뽑기를 실행중인지 체크하도*..." — **`do-while < while`** — *조건 먼저 확인*이 가독성. 학생 후속 반영 + *람다 호출 비용*까지 고려.
144
+
145
+ ### 11. `Participants.needToDraw()` 호출 위치 — Player 내부?
146
+
147
+ 리뷰어: "*needToDraw()를 참가자들에서 호출하는 것이 아닌 플레이어 객체에서 직접 호출해야 하지 않을까요?* 앞서 남겨드린 *canDraw()와 draw() 함수의 개선 피드백과 같이 생각*해보세요"
148
+
149
+ 학생: "*다시 생각해보니 Player가 가지고 있는 함수인만큼 내부에서 호출하는 것이 좋을 것 같습니다!*" — **Tell-Don't-Ask**. *플레이어가 자기 의지를 묻는 callback*은 *Player 내부*. PR #20과 같은 결.
150
+
151
+ ### 12. `Participants.calculateProfit(participants)` — Participant 메서드로
152
+
153
+ ```kotlin
154
+ class Participants { fun calculateProfit(): Map<Participant, Money> { ... } }
155
+ ```
156
+
157
+ 리뷰어: "*이 기능도 잘 돌려보면 Participant에서 구현할 수 있을 것 같네요!?* `abstract class Participant { abstract fun getProfit(others: List<Participant>: Money }`" — *수익 계산*도 *참가자 자율 = Tell-Don't-Ask*. 1대다 확장.
158
+
159
+ ### 13. `BustState.earningRate = 1.0`
160
+
161
+ ```kotlin
162
+ class BustState : FinishedState() { override val earningRate: Double = 1.0 }
163
+ ```
164
+
165
+ 리뷰어: "*earningRate를 음수로 생각해볼 수 도 있지 않을까요?*" — **Bust = 패배 = 음수 earningRate**. *호출자가 *-1 곱셈*하는 트릭*보다 *enum/state에 음수*가 자연. PR #135·#119와 같은 결.
166
+
167
+ ### 14. `FinishedState`에서 *draw/stay 시 IllegalStateException*
168
+
169
+ ```kotlin
170
+ abstract class FinishedState : CardState {
171
+ override fun draw(card: Card): CardState = throw IllegalStateException(...)
172
+ override fun stay(): CardState = throw IllegalStateException(...)
173
+ }
174
+ ```
175
+
176
+ 리뷰어: "*종료 상태에서 카드를 더 뽑거나 스테이를 하는 것이 충분히 논리적으로 가능할 수 있지 않을까요?* *비즈니스 상태를 가급적 오류를 발생시키기 보다는, 논리적으로 계산을 하는 것도 방법*입니다. `override fun draw(card: Card): CardState = this // 변화 없음`"
177
+
178
+ 학생: "*확실히 오류를 발생시키지 않는 것이 더 안전할 것 같습니다!*" — **State 패턴 + 종료 상태에서의 *no-op*** = *invariant 깨짐 회피 + 호출자 코드 단순*. PR #34와 같은 결.
179
+
180
+ ### 15. `HitState.draw`가 *무조건 BustState로*
181
+
182
+ ```kotlin
183
+ class HitState : RunningState() {
184
+ override fun draw(card: Card): CardState = BustState(cards + card) // ⚠ 항상 Bust?
185
+ }
186
+ ```
187
+
188
+ 리뷰어: "*히트 상태에서는 스테이 혹은 버스트로 넘어갈 수 있지 않을까요?* *다음 상태가 무조건 버스트가 되는 것이 맞을까요?* *다음 상태라는 추상 함수로 정의*하는 것이 맞을까? 를 생각 해보세요"
189
+
190
+ 학생 자가 답변: "*제가 잘 이해한지 모르겠습니다만..*🥲 > *히트 상태에서는 스테이 혹은 버스트로 넘어갈 수 있지 않을까요?* 우선 *히트 상태에서는 스테이와 버스트가 될 수 있습니다*. 플레이어라면 n을 입력했을 때, *딜러라면 17점 이상일*..." — **State 전이의 의미 토론**. *HitState.draw* 이후 *점수에 따라 다음 상태 결정* (RunningState 유지 또는 BustState로). 무조건 BustState는 *조기 종료*.
191
+
192
+ ### 16. `RunningState.draw(card)` mutable cards 위험
193
+
194
+ ```kotlin
195
+ abstract class RunningState : CardState {
196
+ protected val cards: MutableList<Card> // ⚠ mutable
197
+ override fun draw(card: Card): CardState {
198
+ cards.add(card)
199
+ return ...
200
+ }
201
+ }
202
+ ```
203
+
204
+ 리뷰어: "*cards 객체가 내부적으로 가변 컬렉션으로 이루어져 있기 때문에, 아래와 같은 시나리오가 생길 수 있어요.* ```val currentState: RunningState // 2장; val nextState: CardState = currentState.draw(card) // 3장; // 이 시점에, currentState 는 카드를*..."
205
+
206
+ 학생: "*아.. 불변을 구현하고 싶었지만 이런 문제가 있었군요..! 카드 목록에 add() 하면 새로운 카드 목록을 반환하도록 변경해보겠습니다!*" — **State 패턴 + immutable cards = 정확한 패턴**. *draw → 새 RunningState 반환*. `currentState`는 *불변 상태*.
207
+
208
+ ### 17. `HitState`와 `StayState`의 *2장 invariant*
209
+
210
+ 리뷰어: "*스테이 상태에도 동일하게 최소 2장의 카드를 가져야 하지 않을까요?*"
211
+
212
+ 학생: "*Stay 상태에서는 FinishedState를 상속하고 있어서 `최소 2장의 카드를 갖는다` 라는 조건을 검증하고 있습니다!*" — **상속을 통한 invariant 검증 공유** — *Hit/Stay 둘 다 적용*은 다른 메커니즘.
213
+
214
+ ### 18. `StayState.matchWith`의 *if/else if*
215
+
216
+ ```kotlin
217
+ if (other is BustState) return WIN
218
+ else if (other is StayState) { ... }
219
+ else { ... }
220
+ ```
221
+
222
+ 리뷰어: "*if, else if 구문 대신 when 조건을 사용 해보세요*" — Kotlin 컨벤션. PR #33·#34와 같은 결.
223
+
224
+ ## 리뷰어 의견 요지
225
+
226
+ - ***확장 함수 과잉 (`isGreaterThan`) = 기본 연산자가 친숙***.
227
+ - ***5개 callback = Listener 인터페이스 신호***.
228
+ - ***Blackjack 객체 생명주기 = 덱 + 플레이어 모두 생성자***.
229
+ - ***주석 처리 테스트 = 의도 불명***.
230
+ - ***`BetMoney : Money` 상속 = Liskov 위반*** — Composition.
231
+ - ***`Dealer.stay()` 상태 변경 없음 = StayState 명시 전이***.
232
+ - ***`draw(card): Participant` 추상은 Dealer/Player 자율성 다름*** — Participant 분기 + canDraw().
233
+ - ***callback 내부 호출 < 외부 호출 (도메인 → View 의존 회피)***.
234
+ - ***`getDealer()` 함수 매번 캐스팅 < 생성자 분리 + 프로퍼티***.
235
+ - ***do-while < while*** (조건 먼저 확인).
236
+ - ***needToDraw 호출 위치 = Player 내부 (Tell-Don't-Ask)***.
237
+ - ***calculateProfit = Participant 메서드 (1대다 확장)***.
238
+ - ***Bust earningRate = -1.0 (음수)***.
239
+ - ***FinishedState에서 IllegalStateException < no-op***.
240
+ - ***HitState.draw = 무조건 Bust X = 점수에 따라 분기***.
241
+ - ***RunningState mutable cards = stale 위험 = immutable 새 인스턴스***.
242
+ - ***`if/else if` < `when`***.
243
+
244
+ ## 대표 인용
245
+
246
+ > 이 함수를 사용하는 것과 *Int > Int 를 비교하는 것중 무엇이 더 개발자에게 친숙*할까요?
247
+ > — @laco-dev on `Extensions.kt`
248
+
249
+ > 출력에 대해서 요구사항이 변경될 때 마다 start() 함수의 *파라미터로 많은 값을 넘겨야 할 수 있습니다.* 이와 관련된 *리스너 인터페이스를 만들어서 전달*해 보는건 어떨까요?
250
+ > — @laco-dev on `BlackjackController.kt`
251
+
252
+ > 배팅 금액이 돈의 성격을 띄고 있어서 단순히 Money를 상속한 것으로 보입니다. 하지만 *Money에서 제공하는 함수가 다시 Money 타입을 반환하기 때문에* [...] *즉 Money 함수를 사용하고 나면 더이상 BetMoney 타입이 아닌 Money 타입이 되어 기존의 로직이 손상*되는 결과로 이어질 수 있습니다. *상속 대신 Composition을 이용*해 보면 어떨까요?
253
+ > — @laco-dev on `BetMoney.kt`
254
+
255
+ > cards 객체가 내부적으로 *가변 컬렉션으로 이루어져 있기 때문에*, 아래와 같은 시나리오가 생길 수 있어요. `val nextState: CardState = currentState.draw(card) // 3장; // 이 시점에, currentState 는 카드를`...
256
+ > — @laco-dev on `RunningState.kt`
257
+
258
+ > 종료 상태에서 카드를 더 뽑거나 스테이를 하는 것이 *충분히 논리적으로 가능할 수 있지 않을까요?* *비즈니스 상태를 가급적 오류를 발생시키기 보다는, 논리적으로 계산을 하는 것도 방법*입니다.
259
+ > — @laco-dev on `FinishedState.kt`
260
+
261
+ ## 얻은 교훈
262
+
263
+ - ***확장 함수 과잉 (`Int.isGreaterThan`) = 기본 연산자가 친숙*** — *DSL 효과 없으면 과잉*.
264
+ - ***5개 callback = Listener 인터페이스 신호*** — *EventListener 패턴*.
265
+ - ***Blackjack 객체 생명주기 = 덱 + 플레이어 모두 생성자*** — *한 게임 = 한 인스턴스*.
266
+ - ***주석 처리 테스트 = 의도 불명*** — *TODO 코멘트* 또는 *삭제*. PR #17·#8과 같은 결.
267
+ - ***`BetMoney : Money` 상속 = 반환 타입 불일치로 Liskov 위반*** — *상속의 깊은 함정*. **Composition으로 invariant 보호**.
268
+ - ***`Dealer.stay()` 상태 변경 없음 = State 패턴의 명시 전이*** — *StayState로 명시*.
269
+ - ***State 패턴 + immutable cards = 정확한 패턴*** — *draw → 새 인스턴스 반환*. *currentState 불변* 보장.
270
+ - ***FinishedState에서 IllegalStateException < no-op*** — *비즈니스 상태 = 호출 가능한 모든 메서드는 논리적 결과 반환*. *예외는 invariant 깨짐* 시에만.
271
+ - ***HitState.draw = 점수에 따라 RunningState/BustState 분기*** — *조기 종료 X*.
272
+ - ***Bust earningRate = -1.0 음수*** — *호출자가 곱셈 트릭* X. 의미 명시.
273
+ - ***do-while < while*** — *조건 먼저 확인*이 가독성.
274
+ - ***`needToDraw` callback = Player 내부 호출 (Tell-Don't-Ask)***.
275
+ - ***calculateProfit = Participant.getProfit(others) 메서드 (1대다 확장)*** — PR #24와 같은 결.
276
+ - ***`getDealer()` 매번 캐스팅 = 생성자 분리 + 프로퍼티***.
277
+ - ***callback 내부 호출 vs 외부 호출 = 도메인 → View 의존 회피***.
278
+ - ***`if/else if` < `when` Kotlin 컨벤션***.
@@ -0,0 +1,305 @@
1
+ # PR #115 — [블랙잭 1단계] 토바에 미션
2
+
3
+ - **Reviewee:** [@tobae-time](https://github.com/tobae-time) (토바에) — 2025 모바일 안드로이드 7기 코호트
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/115
5
+ - **단계:** 1단계
6
+ - **리뷰어:** [@laco-dev](https://github.com/laco-dev) (페로로) — 누적 14명 reviewer
7
+ - **라인 코멘트:** 15 스레드 — *학생 자가 `Rule` god-object 시도 + reviewer 강한 반대 메타 정점 (4 thread 동일 패턴 반복) + 현실 세계 vs 객체지향 세계 메타포 충돌 어휘 + 패키지로 enum/data class 종류 구분 비판 + 출력 표현 UI 책임 + 참가자 vs 딜러 vs 플레이어 일반화 + 빌더 필수 속성 vs 미초기화 위험 + Deck mutable 직접 접근 시나리오 + 점진적 테스트 묘사*
8
+ - **신규 reviewee** (2025 모바일 안드로이드 7기). PR 본문에 *셀프 체크리스트 + 집중 리뷰 요청* (네이밍).
9
+ - **메타 케이스 정점**: 학생 자가 *`Rule` 객체 시도* → reviewer *"모든 메서드 Rule.canX() 변환 가능 = god-object"* 4 thread 반복 비판 + *"쎄게 피드백 양해부탁드립니다"* 메타 어휘.
10
+
11
+ ## 잘한 점 (설계 관점)
12
+
13
+ ### 1. PR 본문 셀프 체크리스트 + 집중 리뷰 요청
14
+
15
+ PR 본문에 7개 체크리스트 (기능/테스트/이전 피드백/스타일/요구사항/README) 모두 체크 + *"네이밍 읽기 어떠신지 궁금합니다"* 집중 리뷰 요청.
16
+
17
+ → **`pr-self-checklist-vocabulary`** + **`pr-focused-review-request`** = PR #144 (m6z1 셀프 코드 리뷰) 결 합류.
18
+
19
+ ### 2. 학생 자가 답변 매우 적극적 + 커밋 SHA 첨부
20
+
21
+ 15 thread 중 **10 thread 학생 자가 답변** + 모두 *커밋 SHA + 변경 사항 인용* 첨부. *학습 가시화 정점*.
22
+
23
+ ### 3. HandTest 점진적 묘사 칭찬 (Thread 6)
24
+
25
+ reviewer:
26
+
27
+ > *"카드뭉치에 대한 기능과 테스트를 역할에 맞게 잘 구현해주셨습니다. 👍🏻"*
28
+
29
+ ## 못한 점 (설계 관점) — 핵심: `Rule` god-object 메타
30
+
31
+ ### 1. `Rule` 객체 도입 — god-object 신규 모범 사례 (Thread 11·12·13·14, 4 thread 반복)
32
+
33
+ #### 학생 자가 시도 + 의문
34
+
35
+ PR 첫 답변에서 학생 자가 답변:
36
+
37
+ > *"안녕하세요, 페로로! 결과를 만드는 것이 참가자 객체의 역할 보다는 블랙잭 규칙의 역할이라는 생각을 하게 되어 Rule이라는 객체를 만들었습니다. **블랙잭 규칙에 관련된 행위를 모으다 보니, Rule이 너무 커진 것 같습니다.** 이전에는 컨트롤러에 있던 비즈니스 로직(딜러 결과 함수)을 옮겨 왔지만 딜러와 플레이어가 각각 들고 있는 편이 더 좋았을지 고민됩니다."*
38
+
39
+ #### Thread 11 (Rule.kt) — reviewer 강한 반대
40
+
41
+ ```kotlin
42
+ object Rule {
43
+ fun ...(...) { ... } // 결과 계산
44
+ }
45
+ ```
46
+
47
+ reviewer:
48
+
49
+ > *"왜 참가자의 규칙이 아니라고 생각하는지 궁금합니다. **현실세계라면 블랙잭 게임에서의 규칙이지만, 객체지향 세계에서 객체는 모두 스스로 일을 합니다.** 또한 객체들은 서로 긴밀하게 협력을 통해 필요한 정보를 요청하는데 Rule은 그 역할을 다 하고 있다고 보시나요?"*
50
+
51
+ #### Thread 12·13 (Players.kt + Participant.kt) — 반복 비판
52
+
53
+ reviewer Thread 12: *"토바에가 제시한 방향에 따르면 **이런것도 전부 Rule 아닌가요?**"*
54
+
55
+ reviewer Thread 13:
56
+
57
+ > *"Rule 논리대로면 이것도 다 Rule입니다.*
58
+ > *`Rule.canDealerDraw()`*
59
+ > *`Rule.canPlayerDraw()`*"*
60
+
61
+ → **MCP 룰 `rule-as-god-object-anti-pattern`** ⭐⭐⭐ **신규 정점**:
62
+ - 학생이 *모든 도메인 행위*를 `Rule` 클래스로 모음 = *god-object 변형*.
63
+ - reviewer 강한 어휘 — *"모든 메서드를 `Rule.canX()` 형태로 만들 수 있다 = god-object 시그널"*.
64
+ - 책임 분배 = *참가자가 자기 카드로 결과 도출 + 메시지 협력*.
65
+
66
+ #### Thread 14 (OutputView.kt) — 출력 규칙도 Rule?
67
+
68
+ ```
69
+ > 최초 공개시 딜러는 1장, 플레이어는 2장을 노출한다.
70
+ ```
71
+
72
+ reviewer:
73
+
74
+ > *"이는 게임에서 결정한 규칙으로 명확한 비즈니스 로직이지 않을까요? 이것을 UI에서 결정하는 것이 게임의 규칙인지? UI의 규칙인지? 고민할 필요가 있습니다. (...) **하지만 이것도 Rule에 구현을 해야 할까요...?**"*
75
+
76
+ → **`Rule god-object 반복 시그널 — 모든 도메인을 Rule로 모으면 다음 규칙도 Rule이 됨`** ⭐⭐⭐.
77
+
78
+ #### reviewer 최종 메타 어휘 — *"쎄게 피드백 양해"*
79
+
80
+ reviewer 마지막 review:
81
+
82
+ > *"지금까지 3개의 미션을 통해 객체가 무엇인지, 스스로 일을 하거나 기능을 작게 나누어 객체의 책임을 분리하는 등 여러가지 연습을 해왔는데 그걸 모두 걷어차고 클래스 하나에 다 몰아 넣은 이유를 잘 모르겠어요.*
83
+ >
84
+ > *모든 도메인 클래스를 게임과 의존하지 않도록 만들 의도였으면 blackjack 패키지도 필요 없었습니다. blackjack.Rule만 유의미하지 나머지는 블랙잭이랑 관계 없으니까요.*
85
+ >
86
+ > *한편으로는 **왜 블랙잭 규칙이 유일하다고 보시는지도 고민해보셨으면 좋겠어요. 규칙의 세부사항은 언제나 바뀔 가능성이 있지 않을까요?***
87
+ >
88
+ > *시간이 지체되어서 1단계는 마무리 하고 2단계에서 다시 보도록 하겠습니다.*
89
+ >
90
+ > ***힘드시겠지만, 그동안 학습한 경험이 아쉬워서 조금 쎄게 피드백을 드린 점 양해부탁드립니다.***"*
91
+
92
+ → **MCP 룰 `reviewer-strong-feedback-apology-meta`** ⭐⭐⭐ **신규** — *피드백 강도 + 학생 학습 경험 아쉬움 + 양해 표현*. PR #106 (말리빈 *권력 자제*) 결의 *피드백 강도 메타* 다른 축 (`자제` vs `쎄게 + 양해`).
93
+
94
+ → **MCP 룰 `rule-uniqueness-assumption-question`** ⭐⭐ — *"왜 규칙이 유일하다고 보시는지" — 규칙의 변경 가능성 시그널*.
95
+
96
+ → **MCP `oh-my-oop` 핵심 가치 메타 어휘 정점** — *현실세계 메타포 vs 객체지향 세계 책임 분배 충돌*.
97
+
98
+ 학생 자가 답변 (Thread 7):
99
+
100
+ > *"결과를 내는 것은 블랙잭 룰에 의한 것이고, 룰이 바뀌었을 때 참가자에서 변경하는 것보다 블랙잭 규칙을 찾아 변경하는 것이 적절하다고 생각하여 변경하였습니다.*
101
+ > *+) 7a55ba918b73e04563816f36f10d5b24c4b3c5f9 **블랙잭 규칙은 유일하게 존재하는 개념이라고 보고 object로 변경하였습니다!**"*
102
+
103
+ → **학생 자가 *유일성 + object* 추가 시도 (그러나 reviewer 강한 거부 후)** = 학습 시간성 메타.
104
+
105
+ ### 2. enum vs data class 패키지 구분 비판 (Thread 0)
106
+
107
+ ```kotlin
108
+ // 패키지 구조
109
+ blackjack/enums/Action.kt
110
+ blackjack/enums/Suit.kt
111
+ blackjack/enums/Result.kt
112
+ ```
113
+
114
+ reviewer:
115
+
116
+ > *"만약 Action 객체가 enum class가 아닌 data class가 된다면 패키지가 바뀌어야 할까요? **객체의 타입은 상황에 따라 달라질 수 있습니다. 그렇기 때문에 특정 종류를 패키지로 구분하는 것은 좋지 않은 방법입니다.**"*
117
+
118
+ → **MCP 룰 `package-by-type-anti-pattern`** ⭐⭐ 신규 — *enum/data class 등 *타입 종류*로 패키지 분리 = 변경 시 패키지 이동 필요 = 잘못된 분리*. PR #80 (util-package-definition) 결의 *패키지 분류 기준* 다른 축.
119
+
120
+ ### 3. Suit `♥` 출력 = UI 책임 (Thread 1)
121
+
122
+ ```kotlin
123
+ enum class Suit(val display: String) {
124
+ HEART("하트"), ...
125
+ }
126
+ ```
127
+
128
+ reviewer:
129
+
130
+ > *"만약 하트를 ❤️이렇게 출력해달라고 한다면. 우리는 도메인 모델을 수정해야 할까요? 혹은 문자가 아닌 그림으로 나타내달라고 하면 어떻게 해야 할까요?"*
131
+
132
+ → **출력 표현 = UI 책임 (도메인 수정 필요 X)** = 누적 다수 (PR #15 다국어 어휘 + PR #130 medAndro 안드로이드 리소스).
133
+
134
+ ### 4. 승부 결과 = UI 관심사 (Thread 2)
135
+
136
+ ```kotlin
137
+ enum class Result(val display: String) {
138
+ WIN("승"), LOSE("패"), DRAW("무")
139
+ }
140
+ ```
141
+
142
+ reviewer: *"승부 결과 또한, 어떻게 출력될지를 결정하는 것은 UI의 관심사로 보입니다 😓"*
143
+
144
+ → **enum 출력 문자열 = UI 책임** = 누적 다수.
145
+
146
+ ### 5. 결과 도출 책임 = 참가자 vs Rule (Thread 3·7)
147
+
148
+ reviewer Thread 3:
149
+
150
+ > *"블랙잭 규칙으로 보면, 21점이 넘는다거나 하면 무조건 패배가 됩니다. 참가자 입장에서 승부가 벌어지고 있는데 단순히 점수만으로 추가로 결정하기에는 로직이 분산되어 있는 느낌이 들기도 합니다. **가령 점수가 높더라도 질 수도 있으니까요.**"*
151
+
152
+ reviewer Thread 7:
153
+
154
+ > *"승부를 벌이는 것은 플레이어 vs 딜러가 아니더라도 **참가자끼리라면 누구라도 결과를 만들어 낼 수 있지 않을까요?** 그렇다면 참가자 객체가 할 역할로 볼 수도 있지 않나요?*
155
+ > *> 딜러 vs 플레이어*
156
+ > *플레이어 vs 딜러*
157
+ > *플레이어 vs 플레이어*"*
158
+
159
+ → **참가자 vs 참가자 일반화** = PR #148·#151·#49·#132 결 합류 누적 5+ PR.
160
+
161
+ → **점수만으로 승부 결정 ≠ 블랙잭 규칙 (21점 초과 = 패)** ⭐⭐ — *도메인 룰 정확성*. PR #19·#125 (블랙잭 룰 오해) 결.
162
+
163
+ ### 6. Deck 유일성 + static 결합 위험 (Thread 4·5·10)
164
+
165
+ ```kotlin
166
+ // Deck.kt - 모든 곳에서 접근 가능
167
+ object Deck { val cards = mutableListOf(...) }
168
+ ```
169
+
170
+ reviewer Thread 4: *"모든 게임에 덱이 유일하게 존재하는 개념이라고 봐도 될까요? 그렇다면 여기저기서 덱에 접근하면 참사가 벌어지지는 않을까요?"*
171
+
172
+ 학생 자가 답변:
173
+
174
+ > *"덱이 유일하게 존재하는 개념보다는 게임이 시작할 때마다 새로운 덱을 사용하게 하고 덱이 필요한 곳에 주입하는 것이 좋을 것 같습니다."*
175
+
176
+ → **학생 자가 답변 — *유일성 가정 거부 + DI*** ⭐⭐ 학습 모범.
177
+
178
+ reviewer Thread 10 (시나리오 예시):
179
+
180
+ ```kotlin
181
+ val deck = Deck.create()
182
+ deck.cards.remove()
183
+ deck.cards.remove()
184
+ deck.cards.clear()
185
+ deck.pick()
186
+ deck.cards.remove()
187
+ deck.pick()
188
+ deck.cards.remove()
189
+ ```
190
+
191
+ reviewer: *"아래 코드는 어떤 문제가 있나요?"*
192
+
193
+ → **`mutable-collection-direct-access-scenario`** = **MCP 룰 후보** ⭐⭐ — *외부 mutable 직접 접근 시나리오 예시 + 학생 자가 진단*. PR #22 (`static-mutable-collection-unsafe`) 결.
194
+
195
+ → **테스트 가능성 (Thread 5)**: *"덱에서 카드를 한장 뽑으면 마지막 카드가 나온다 — 기본적인 기능에 대한 테스트도 누락"* = 누적 다수.
196
+
197
+ ### 7. 빌더 필수 속성 + `lateinit` 위험 (Thread 9)
198
+
199
+ ```kotlin
200
+ class PersonBuilder {
201
+ lateinit var name: String
202
+ fun name(v: String) { name = v }
203
+ fun build() = Person(name)
204
+ }
205
+ ```
206
+
207
+ reviewer:
208
+
209
+ > *"Builder의 특징은 선택적으로 속성을 부여하는 것 일텐데, name을 호출하지 않고 build() 하면 어떤 문제가 생기나요? 어떻게 해결해야 할까요? **\"호출하지 않으면 이름은 빈값이다\" 라는 답변은 아니길 바랍니다..** 힌트는 이름은 필수라는 점입니다."*
210
+
211
+ 학생 자가 답변:
212
+
213
+ > *"이름 없이 build() 했을 때, 해당 오류 메세지 확인했습니다!*
214
+ > *`Exception in thread \"main\" kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized`*
215
+ > ***생성자로 이름을 받게 하도록 변경하였습니다.**"*
216
+
217
+ → **`builder-required-property-as-constructor`** = **MCP 룰 후보** ⭐⭐ — *Builder = 선택적 속성 / 필수 속성 = 생성자*. PR #38 (`lateinit` 위험) 결 합류 누적 2 PR → ***`lateinit` 위험 어휘*** ⭐⭐⭐ 강화.
218
+
219
+ → **`reviewer-hint-vocabulary`** — *"힌트는 X"* = 학생 사고 유도 어휘.
220
+
221
+ ### 8. 점진적 테스트 묘사 (Thread 6)
222
+
223
+ reviewer:
224
+
225
+ > *"디테일하게 들어가본다면, 왜 Ace 한장이 있는데 점수가 다른지에 대한 묘사를 점진적으로 풀어주면 더욱 좋습니다.*
226
+ > *> 퀸 한장은 10점이다.*
227
+ > *> 에이스 카드가 포함되어 있을 때, 다른 카드의 합이 11점 이하면 보너스 점수 10점을 획득한다.*
228
+ > *> 에이스 카드가 포함되어 있을 때, 다른 카드의 합이 11점을 초과하면 총 보너스 점수가 없다."*
229
+
230
+ 학생 자가 답변: *"점진적인 묘사가 이해하기 쉬운 것 같아서 테스트에 반영하였습니다."*
231
+
232
+ → **`test-narrative-incremental-build`** ⭐⭐ — *기본 케이스 → 추가 조건 → 경계 조건*. PR #109 (BDD given-when-then) 결 합류.
233
+
234
+ ### 9. Dealer canDraw — static Deck 결합 (Thread 8)
235
+
236
+ ```kotlin
237
+ // Dealer.kt - Deck.shared 결합
238
+ fun draw() { cards.add(Deck.pop()) }
239
+ ```
240
+
241
+ reviewer 코드 제안:
242
+
243
+ ```kotlin
244
+ val participant: Participant
245
+ if (participant.canDraw()) { ... }
246
+ // 딜러는 16점 이하라면 항상 받지만, 플레이어는?
247
+ ```
248
+
249
+ → **`can-draw-vs-blind-draw`** ⭐⭐ — *카드 받기 전 받을 수 있는지 판단* + 딜러/플레이어 다형성 어휘. PR #151 (`canHit` vs `isBust` 부울 의미) 결.
250
+
251
+ ## 대표 인용
252
+
253
+ > [laco-dev Thread 11]
254
+ > *"현실세계라면 블랙잭 게임에서의 규칙이지만, 객체지향 세계에서 객체는 모두 스스로 일을 합니다."*
255
+
256
+ → **현실 세계 vs OOP 세계 메타포 충돌 어휘 정점**.
257
+
258
+ > [laco-dev Thread 13]
259
+ > *"Rule 논리대로면 이것도 다 Rule입니다. Rule.canDealerDraw(), Rule.canPlayerDraw()"*
260
+
261
+ → **Rule god-object 반복 시그널 어휘**.
262
+
263
+ > [laco-dev 최종 review]
264
+ > *"왜 블랙잭 규칙이 유일하다고 보시는지도 고민해보셨으면 좋겠어요. 규칙의 세부사항은 언제나 바뀔 가능성이 있지 않을까요?"*
265
+
266
+ → **규칙 유일성 가정 거부 어휘**.
267
+
268
+ > [laco-dev 최종 review]
269
+ > *"힘드시겠지만, 그동안 학습한 경험이 아쉬워서 조금 쎄게 피드백을 드린 점 양해부탁드립니다."*
270
+
271
+ → **reviewer 강한 피드백 양해 메타 어휘**.
272
+
273
+ > [tobae-time 최초 자가 답변]
274
+ > *"블랙잭 규칙에 관련된 행위를 모으다 보니, Rule이 너무 커진 것 같습니다."*
275
+
276
+ → **학생 자가 god-object 인지 메타 어휘**.
277
+
278
+ > [laco-dev Thread 9]
279
+ > *"\"호출하지 않으면 이름은 빈값이다\" 라는 답변은 아니길 바랍니다.."*
280
+
281
+ → **reviewer 답변 유도 + 부정 가이드 어휘**.
282
+
283
+ > [laco-dev Thread 0]
284
+ > *"객체의 타입은 상황에 따라 달라질 수 있습니다. 그렇기 때문에 특정 종류를 패키지로 구분하는 것은 좋지 않은 방법입니다."*
285
+
286
+ → **패키지 = 타입 종류로 분리 X 어휘**.
287
+
288
+ ## 얻은 교훈 (보편)
289
+
290
+ 1. **`Rule` god-object 신규 모범 사례** — **MCP 룰 `rule-as-god-object-anti-pattern` 후보** ⭐⭐⭐ 신규 정점.
291
+ 2. **reviewer 강한 피드백 양해 메타** — **MCP 룰 `reviewer-strong-feedback-apology-meta` 후보** ⭐⭐⭐ 신규.
292
+ 3. **현실 세계 vs OOP 세계 메타포 충돌** — *MCP `oh-my-oop` 핵심 가치 메타 어휘*.
293
+ 4. **규칙 유일성 가정 거부** — **MCP 룰 `rule-uniqueness-assumption-question` 후보** ⭐⭐.
294
+ 5. **패키지 = 타입 종류 분리 X** — **MCP 룰 `package-by-type-anti-pattern` 후보** ⭐⭐.
295
+ 6. **빌더 필수 속성 = 생성자 + `lateinit` 위험 누적 2 PR** — **MCP 룰 `builder-required-property-as-constructor` + `lateinit-initialization-checking-burden` 후보** ⭐⭐⭐.
296
+ 7. **외부 mutable 직접 접근 시나리오 진단** — **MCP 룰 `mutable-collection-direct-access-scenario` 후보** ⭐⭐.
297
+ 8. **점진적 테스트 묘사 (기본 → 조건 → 경계)** — **MCP 룰 `test-narrative-incremental-build` 후보** ⭐⭐.
298
+ 9. **참가자 vs 참가자 일반화** = 누적 5+ PR.
299
+ 10. **출력 표현 = UI 책임** = 누적 다수.
300
+
301
+ ## 메타 노트
302
+
303
+ - **tobae-time 2025 모바일 안드로이드 7기 코호트** — PR #115 1단계로 합류. PR #142 (doabletuple)·PR #143 (medAndro)·PR #109 (cucumber99)·PR #118 (jiyuneel)·PR #113 (gahyunkim) 외 다수 결의 *2025 코호트 누적 ≥12 PR*.
304
+ - **메타 케이스 6번째 — Rule god-object 학생 자가 시도 → reviewer 4 thread 반복 비판 → 강한 양해 메타** (학습 시간성 메타와 다른 *학습 *방향성* 충돌* 메타).
305
+ - **`Rule.kt` 같은 god-object 변형 — MCP validate 룰 후보 1순위**: lotto의 `god-object` 룰을 *클래스명 기반 god-object* (Rule/Game/Manager 등) 패턴 변형으로 확장 가능. evidence = laco-dev *"모든 메서드를 Rule.canX() 변환 가능"* 어휘.