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,188 @@
1
+ # PR #131 — [공백] 2단계 로또
2
+
3
+ - **Reviewee:** [@junseo511](https://github.com/junseo511)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/131
5
+ - **단계:** 2단계 (수동 로또)
6
+ - **리뷰어:** @krrong
7
+ - **라인 코멘트:** 56
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **후속 라운드 적극 반영** — 학생이 *commit 링크*를 댓글에 첨부 (ae35853, f328b98, 52e52ae 등).
12
+ - **`enum.from` *=when* 표현식 후속 리팩토링** — `else` 회피보다 *명확성* 선택.
13
+ - **`getRawNumbers` View로 이동** — 학생이 *"정말로 뷰를 위한 도메인의 로직이 되어버렸네요 🥲"* 자가 인정.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ ### 1. *2단계 요구사항 전부 Controller에* — 1단계 책임 분리 망각
18
+
19
+ 리뷰어: "*2단계 요구사항을 모두 컨트롤러에서 반영한 느낌*이에요. 🤔 마치 *자동차 경주와 1단계에서 배운 내용을 다 잊어버린 것처럼* 보여요. *오늘 수업에서 배운 내용을 잘 기억해 보시고 다시 구현*해 주시면 좋을 것 같습니다!" 학생: "아직 *컨트롤러의 함수명을 어떻게 지어야 하고, 얼만큼의 부피를 가지고 뷰와 모델을 작동시켜야 하는지 어렵*네요 🥲" — *전 단계 학습 망각* 인정.
20
+
21
+ ### 2. *수동 1장 + 자동 0장* 입력 시나리오 — *객체 생성 순서*
22
+
23
+ ```
24
+ 구입금액을 입력해 주세요.
25
+ 1400
26
+ 수동으로 구매할 로또 수를 입력해 주세요.
27
+ 1
28
+ 수동으로 구매할 번호를 입력해 주세요.
29
+ 1,2,3,4,5,6
30
+ ```
31
+
32
+ 리뷰어: "위처럼 입력하면 어떻게 될까요? *예상한 동작*일까요? 🤔" 학생: "*객체 생성의 순서를 조금 바꿔야 할 필요*가 있을 것 같네요 🧐" — *1400원 = 1장*인데 수동 1장 → 자동 0장이 *0인가 -*인가 검증 모호. *요구사항*: `예외 처리를 통해 에러가 발생하지 않도록 한다`. 1단계 요구사항을 *2단계 검증에도 일관*해야.
33
+
34
+ ### 3. `LottoWallet` 비대칭 — 수동만 *Wallet이 직접 추가*
35
+
36
+ ```kotlin
37
+ class LottoWallet {
38
+ private val lottoBundle: MutableList<Lotto> = mutableListOf()
39
+
40
+ fun add(lottoNumbers: List<Int>) { // ⚠ 수동: Wallet이 만듦
41
+ lottoBundle.add(Lotto.from(lottoNumbers))
42
+ }
43
+ }
44
+ ```
45
+
46
+ 리뷰어: "*자동 로또는 LottoMachine이 발급해 주는데, 수동 로또는 왜 LottoWallet 스스로 추가*를 하고 있을까요? 🤔" + "*LottoWallet이 등장하게 된 배경*은 무엇일까요?" + "*LottoWallet을 만들어 주었는데 정작 컨트롤러에서는 값을 꺼내어서 전달*하고 있네요 🤔" + "*LottoMarket에서 로또를 구매하기 위해서는 지갑을 주고 거기에 로또를 담아주는 행위는 어색*하지 않나요? *로또를 구매하니 LottoWallet을 돌려주는 게 더 명확*해 보이네요 🤔" — *현실 비유의 비대칭* (지갑은 *결과 보유물*이지 *제작 도구* 아님).
47
+
48
+ ### 4. *함수 분리 vs 함수 분해* — 명언
49
+
50
+ ```kotlin
51
+ private fun initWinningDiscriminator(): WinningDiscriminator {
52
+ val winningNumbers = getWinningNumbers() // 6줄
53
+ val bonusNumber = getBonusNumber() // 6줄
54
+ return WinningDiscriminator(winningNumbers, bonusNumber) // 3줄
55
+ }
56
+ ```
57
+
58
+ 리뷰어: "현재 세 줄, getWinningNumbers 6줄, getBonusNumber 6줄 *WinningDiscriminator 클래스 하나를 인스턴스 하기 위해 너무 많은 라인을 낭비*하고 있지는 않나요? 🤔 *함수는 하나의 일만 한다 라는 말이 정말 보너스 번호만 받아야 해, 당첨 번호만 받아야 해, 와 같은 시각으로 받아들여지지 않았으면* 좋겠어요. *WinningDiscriminator를 초기화하는 것도 하나의 일*로 볼 수 있으니까요. ***우리는 함수를 분리하는 것이지 분해하는 것이 아닙니다*** 😅" — *SRP 오해*에 대한 *한 줄 정의*. PR #80 *makeRandom+drawSix*와.
59
+
60
+ ### 5. `LottoCashier` *현실 메타포 부정합* + *책임 흩어짐*
61
+
62
+ 리뷰어: "현재의 구조는 *클래스들 간의 유기적인 관계가 조금 부족*해 보여요. *LottoCashier라는 네이밍만 봐서는 돈을 받고 로또를 팔 것처럼 느껴지거든요*. 😅 지금 *수동 로또는 LottoWallet이 스스로 만들고, LottoCashier는 로또를 몇 장 살 수 있는지만 알려주고, 그 결과와 숫자 생성기를 들고 달려가 어디선가 자동 로또를 만들어 오고* 있어요. 다음과 같이 변경해 볼까요? *LottoCashier는 돈을 받고 로또를 판매 → LottoCashier는 필요한 로또를 LottoMachine에서 출력 → 어떤 LottoMachine을 사용할지는 LottoCashier가 정할 수 있다 → LottoCashier는 Lotto뭉치를 반환*."
63
+
64
+ ### 6. `LottoMachine`이 *LottoNumber 범위에 관심* — 캐싱 전략 미활용
65
+
66
+ ```kotlin
67
+ class LottoMachine {
68
+ fun getAutoNumbers(): List<LottoNumber> {
69
+ val range = (MIN_NUMBER..MAX_NUMBER).toList() // ⚠ Machine이 범위 앎
70
+ .
71
+ }
72
+ }
73
+ ```
74
+
75
+ 리뷰어: "현재 LottoMachine은 *getAutoNumbers 함수에서 로또의 최대 최소 값을 가져와 리스트를 만들고*, 그를 바탕으로 로또 번호를 만들고 있는데요. *사실 LottoMachine은 로또의 최대, 최소 값에 대한 관심이 없을* 겁니다. *단지 모든 로또 번호 중에서 무작위로 값을 가져와야* 하죠. 이를 위해 *LottoNumber가 캐싱을 하고 있는 인스턴스들 전체를 반환*하도록 만들어 주고, *LottoMachine에서 가져다 사용*하면, *함수의 깊이 하나가 줄어들게 되고, 캐싱 전략을 적절하게 사용*하는 것이 아닐까 생각을 해 봤어요." — *Flyweight 적극 활용* + *책임 분리*.
76
+
77
+ ### 7. *Strategy 추상화 실패* — `default param`으로 인터페이스 오염
78
+
79
+ ```kotlin
80
+ interface LottoMachine {
81
+ fun generate(quantity: Int, manualTicket: List<List<Int>> = emptyList()): List<Lotto> // ⚠ default
82
+ }
83
+ ```
84
+
85
+ 학생: "근데 *자동 로또와 수동 로또를 얻는 과정에서 필요한 값이 너무 달라서 generate 함수에 필요한 변수로 아래 커밋과 같이 받았는데, 이 방법도 괜찮은지 고민*이 조금 되네요 🤔"
86
+
87
+ 리뷰어 (*잘못된 추상화 정의*): "*디폴트 값을 넘기면 어떤 문제가 발생*할 수 있을까요? *인터페이스로 추상화하는 이유*가 무엇일까에 대해서 먼저 고민해봐면 좋을 것 같은데요. *우리는 인터페이스로 추상화함으로써 역할과 구현을 구분*할 수 있고, *이를 통해 유연성*을 가질 수 있어요. 공백이 작성해 준 방법은 *manualTicket: List<List<Int>> = emptyList()로 선언되어 있고, 구현에 대한 내용이 인터페이스에 정의*되어 있다고 볼 수 있죠. 만약 *반자동 발매기가 생긴다면 어떻게 해야 할까요? 이 역시도 인터페이스의 수정이 일어나야 할까요*? ***로또를 생성하는 구체적인 방법에 대해서는 구현체가 결정할 일입니다***."
88
+
89
+ 후속: "*AutoLottoMachine에서는 manualTicket을 사용하지 않고 있습니다. 즉, 잘못된 추상화*라고 이야기할 수 있어요. LottoMachine은 *자동이냐 수동이냐에 관계 없이 수량을 넘겨받아 그만큼의 로또를 만들어 주는 일*을 합니다. 그리고 *로또 번호를 자동으로 사용할 것이냐 수동으로 사용할 것이냐는 구현체에서 결정할 일*이죠."
90
+
91
+ ```kotlin
92
+ interface LottoMachine {
93
+ fun generate(quantity: Int) // 공통 시그니처만
94
+ }
95
+ class AutoLottoMachine: LottoMachine {. }
96
+ class ManualLottoMachine(private val numbers: List<List<Int>>): LottoMachine {. }
97
+ ```
98
+
99
+ ### 8. `LottoMarket`이 *두 Machine 모두 직접 의존*
100
+
101
+ ```kotlin
102
+ class LottoMarket(
103
+ private val autoMachine: AutoLottoMachine,
104
+ private val manualMachine: ManualLottoMachine,
105
+ ) // ⚠ 추상화 무의미
106
+ ```
107
+
108
+ 리뷰어: "*LottoMarket이 ManualLottoMachine와 AutoLottoMachine를 모두 가지고 있어야 할까요*? *추상화한 LottoMachine을 잘 사용하지 못하고* 있는데요, *어떤 기계를 사용할지는 사용하는 곳에서 정할 수도 있*습니다. 의존성을 주입하는 방법은 *대표적으로 3가지*가 있으니 한 번 찾아 보시고, *어떤 기계를 사용할까를 어떻게 사용하는 곳에서 결정할 수 있을지 고민*해 보면 좋겠어요 🤠"
109
+
110
+ ### 9. *학생의 우회 제안* — 마켓이 모든 기계를 돌림
111
+
112
+ 학생: "마켓에서 buy를 실행하면 *모든 기계가 알아서 자동으로 돌아가게 해 보는 건* 어떨까요? 이렇게 *다 돌아가면서 쌓인 로또 지갑을 최종적으로 반환*하구요!!"
113
+
114
+ 리뷰어 (*추상화 목적 재정의*): "*LottoMachine을 추상화한 이유가 사라지게 되었네요*. 우리의 목적은 *LottoMarket이 로또를 발행할 때 어떤 기계를 사용하는지와 관계 없이 로또를 발행해 준다.* 입니다. 어떻게 하면 이렇게 만들어 줄 수 있을까요? *자동 로또와 수동 로또를 한 번에 구매해야만 할까요*?"
115
+
116
+ ### 10. *유효성 검증 함수* vs *인라인*
117
+
118
+ ```kotlin
119
+ init {
120
+ validateLottoNumbersDuplicate()
121
+ validateWinningNumberAndBonusNumberDuplicate() // ⚠ 긴 이름
122
+ validateLottoNumbersRange()
123
+ .
124
+ }
125
+ ```
126
+
127
+ 리뷰어: "유효성을 검증하는 것을 *한 눈에 알아볼 수 있도록 함수로 분리하고 init 블럭에서 호출한다. 동의*합니다. 하지만 *함수에 붙여 준 이름을 읽는 것보다 직접 작성된 코드를 읽는 것이 가독성이 더 좋다고 느껴지기도* 해요 😅"
128
+ ```
129
+ validateWinningNumberAndBonusNumberDuplicate()
130
+ require(!lotto.contains(bonusNumber)) {. }
131
+ ```
132
+ "*유효성 검증이 많아질수록 init 블럭 하위에 유효성 검증 함수들이 늘어날 테고, 정작 중요한 로직들을 찾아보기 위해서는 스크롤*을 해야 하기도 하겠죠?" — *함수 추출의 비용*: *간접화*가 *직접 코드 가독성*보다 못할 수도.
133
+
134
+ ### 11. `else` 회피의 *오역*
135
+
136
+ 학생: "처음에는 *when으로 인해 생기는 else를 지양*하고 싶어서 위와 같이 분리를 했습니다."
137
+
138
+ 리뷰어: "*else를 지양하는 이유*는 무엇일까요? *enum class를 사용하면 when에서 else 분기문 없이 처리가 가능*한데요. 이렇게 처리하도록 한 *이유에 대해서 고민*해 보는 것도 좋겠어요 🤠 — 개인적으로는 *현재 코드가 더 가독성 넘치고 좋은 것 같아요* 👍"
139
+
140
+ → *else 회피 원칙*은 *enum 분기 누락 방지*가 본질. *함수 분해로 우회*는 잘못된 적용.
141
+
142
+ ### 12. *원시값 포장* + *PurchaseAmount* 미도입
143
+
144
+ 리뷰어: "금액이라는 *원시값도 포장*해 볼까요? 그러면 *어떤 장점*이 있을까요? 🤔"
145
+
146
+ ### 13. *테스트 부재*
147
+
148
+ 리뷰어: "*클래스를 만들었으니 테스트도 추가*하면 좋겠네요! 😊"
149
+
150
+ ## 리뷰어 의견 요지
151
+
152
+ - ***1단계에서 배운 책임 분배*를 2단계에 *재적용*** — 새 요구사항이 *Controller에 쌓이면* 망각 신호.
153
+ - **`Wallet`은 *결과 보유물*** — *제작 도구* 아님.
154
+ - ***함수 분리 ≠ 함수 분해*** — *초기화 = 한 가지 일*.
155
+ - **`Cashier` 메타포가 *책임 흐름*에 부합해야**.
156
+ - **`LottoMachine`은 *범위/캐싱*에 무관** — `LottoNumber`가 인스턴스 캐시 보유.
157
+ - **`Strategy` *공통 시그니처*만** — *default param*은 *잘못된 추상화*.
158
+ - **DI 위치 = *사용하는 곳***. *Market이 두 Machine 다 의존*은 추상화 무의미.
159
+ - **검증 함수 추출 *남용 회피*** — *직접 코드 가독성*도 신호.
160
+ - **`else` 회피는 *enum 분기 누락 방지***. *함수 분해로 우회*는 오역.
161
+ - **원시값 포장 + 테스트 추가**.
162
+
163
+ - **대표 인용:**
164
+ > **우리는 함수를 분리하는 것이지 분해하는 것이 아닙니다** 😅
165
+ > — @krrong on `src/main/kotlin/lotto/controller/LottoController.kt`
166
+
167
+ > 마치 자동차 경주와 1단계에서 배운 내용을 *다 잊어버린 것처럼* 보여요.
168
+ > — @krrong on `src/main/kotlin/lotto/controller/LottoController.kt`
169
+
170
+ > **로또를 생성하는 구체적인 방법에 대해서는 구현체가 결정할 일입니다**.
171
+ > — @krrong on `src/main/kotlin/lotto/model/LottoMachine.kt`
172
+
173
+ > LottoMarket에서 로또를 구매하기 위해서는 *지갑을 주고 거기에 로또를 담아 주는 행위는 어색*하지 않나요? *로또를 구매하니 LottoWallet을 돌려주는 게 더 명확*해 보이네요 🤔
174
+ > — @krrong on `src/main/kotlin/lotto/model/LottoMarket.kt`
175
+
176
+ ## 얻은 교훈
177
+
178
+ - **단계 추가 = *책임 분배 재검토*** — *새 요구사항*은 *기존 도메인 객체*에 *분배*. Controller로 흘러들면 *전 단계 망각*.
179
+ - **현실 비유의 *방향성*** — `Wallet`은 *지갑 = 결과 보유*. *돈 → 구매 → 결과 지갑* 순서. *지갑을 주고 담아 와*는 *역방향* 어색.
180
+ - ***함수 분리 ≠ 함수 분해*** — *WinningDiscriminator 초기화 = 한 가지 일*. *6+6+3줄로 분해*는 *간접화의 늪*. 함수 *추출 비용*에 *직접 코드 가독성*도 측정.
181
+ - **`Cashier` 메타포 정합** — *돈 받기 → 기계 사용 결정 → 로또 출력 → 묶음 반환*. 책임 흐름이 *현실 행위*와 일치.
182
+ - **`Machine`은 *범위/캐싱*에 무관** — *LottoNumber* (값 자체)가 *캐싱 보유*. *Machine은 random select*만.
183
+ - **`Strategy = 공통 시그니처*** — *default param*은 *구현 세부가 인터페이스로 누출*. *반자동 추가 시 인터페이스 수정*하면 *Open-Closed 위반*.
184
+ - **DI 위치 = *사용하는 곳***. *Market이 두 Machine 다 의존*은 *추상화의 목적 (사용자 무관)을 깨뜨림*.
185
+ - **검증 함수 *남용 회피*** — `validateA()` + `validateB()` + `validateC()` 가 *init 블럭을 가득 채워* 진짜 로직을 *스크롤로 밀어 냄*. *짧은 require*는 인라인이 *가독성 우위*.
186
+ - **`else` 회피 = *enum 분기 누락 방지*** — *함수 분해로 우회*는 *원리 오역*. `enum.entries.find {. }`로 *Open-Closed*도 확보.
187
+ - **`PurchaseAmount` 원시값 포장의 장점** — *검증 시점 일원화*, *도메인 어휘*, *Tell Don't Ask*.
188
+ - **테스트 = *클래스를 만들었다는 신호***. *새 클래스 + 테스트 부재*는 *명세 부재*.
@@ -0,0 +1,24 @@
1
+ # PR #43 — [토마스] 2단계 로또
2
+
3
+ - **Reviewee:** [@ki960213](https://github.com/ki960213)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/43
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @galcyurio
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 핵심 지적
10
+
11
+ ### 1. indent 깊음 → 함수 분리
12
+
13
+ > indent가 너무 깊어지네요. 별도 함수로 분리하거나 지역 변수로 선언해서 가독성을 향상시켜보세요.
14
+
15
+ ### 2. Money → value class
16
+
17
+ > value class를 활용해보면 어떨까요?
18
+
19
+ ### 3. 테스트 함수명 명확 — 칭찬
20
+
21
+ ## 얻은 교훈
22
+
23
+ - **indent ≥ 3 = 함수 분리 시점**. 깊은 들여쓰기는 abstraction level 신호.
24
+ - **Money 같은 단일 값 = value class** (inline + 동치성).
@@ -0,0 +1,159 @@
1
+ # PR #8 — [토마스] 1단계 로또
2
+
3
+ - **Reviewee:** [@ki960213](https://github.com/ki960213)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/8
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @galcyurio
7
+ - **라인 코멘트:** 15
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`data class LottoNumber(val number: Int)`** → 후속 *Flyweight* (1-45 캐싱) + `valueOf()` 팩토리.
12
+ - **`NumberGenerator` 인터페이스** — 랜덤 주입.
13
+ - **`LottoResult` 도메인 객체** — `getRateOfReturn()` 메서드.
14
+ - **테스트 케이스 *명세서 수준*** — 리뷰어 칭찬: "테스트 케이스 이름들이 *깔끔하고 명확*하네요! :+1: *테스트 케이스들만 보아도 이 프로그램이 어떻게 동작하는지 알 수 있겠*네요."
15
+ - **`LottoNumber` 재사용** — 리뷰어 칭찬: "LottoNumber 재사용 :+1:".
16
+ - **전반 칭찬**: "*전체적으로 역할과 책임에 맞게 객체들을 깔끔하게 잘 분리*해 주셨네요 :+1:".
17
+
18
+ ## 못한 점 (설계 관점)
19
+
20
+ ### 1. `1`, `45` *하드코딩* — 상수 미참조
21
+
22
+ ```kotlin
23
+ data class LottoNumber(val number: Int) {
24
+ init {
25
+ require(number in MINIMUM_NUMBER..MAXIMUM_NUMBER) { ERROR_NUMBER_IN_RANGE.format(number) }
26
+ }
27
+
28
+ companion object {
29
+ private const val MINIMUM_NUMBER = 1
30
+ private const val MAXIMUM_NUMBER = 45
31
+ private const val ERROR_NUMBER_IN_RANGE = "로또 숫자는 1부터 45사이어야합니다. \n 잘못된 값: %d" // ⚠ 1, 45 다시 등장
32
+ }
33
+ }
34
+ ```
35
+
36
+ 리뷰어: "위의 상수에 따라 *정책이 변경될 수도 있으니 1, 45를 하드코딩하는 대신 상수를 참조*해 주세요." — *단일 변경 지점* 원칙. 후속: `"로또 숫자는 ${MINIMUM_NUMBER}부터 ${MAXIMUM_NUMBER}사이어야합니다."`.
37
+
38
+ ### 2. 인터페이스 이름 + 메서드 명 *중복*
39
+
40
+ ```kotlin
41
+ interface NumberGenerator {
42
+ fun generateNumbers(): List<Int> // ⚠ generateNumbers
43
+ }
44
+ ```
45
+
46
+ 리뷰어: "인터페이스 이름이 `NumberGenerator`이므로 *generate()로도 충분*해 보여요." — *컨텍스트 어휘 중복*. `numberGenerator.generate()`가 자연.
47
+
48
+ ### 3. 일급 컬렉션이 *List 타입 자체 구현* — 전체 인터페이스 노출
49
+
50
+ ```kotlin
51
+ data class Lotto(private val numbers: List<LottoNumber>) : List<LottoNumber> by numbers {
52
+ .
53
+ }
54
+ ```
55
+
56
+ 리뷰어: "일급 컬렉션에서 *컬렉션 타입을 구현하도록 되어 있는데* 이번 미션에서는 *모두 지워 보고 도메인에 어울리는 이름으로 함수*를 만들어 보시면 좋겠습니다. 그리고 *get(), set(), contains() 함수는 컬렉션을 구현하도록 하지 않더라도 여전히 operator overloading을 통해 재정의*할 수 있습니다." — *List 인터페이스 위임* = `forEach`, `map`, `iterator` 등 *모든 컬렉션 메서드 노출*. *일급 컬렉션 의도와 충돌*.
57
+
58
+ ### 4. List 자체 *외부에 직접 노출 시 방어적 복사*
59
+
60
+ 리뷰어: "간혹 *List 타입 자체가 필요한 경우*가 있는데 *그런 경우에는 아래와 같이 방어적 복사를 한 이후에 넘겨주시면* 됩니다."
61
+ ```kotlin
62
+ fun toList(): List<LottoNumber> = numbers.toList()
63
+ ```
64
+
65
+ ### 5. `data class` + `private constructor` 충돌 → value class
66
+
67
+ ```kotlin
68
+ class LottoNumber private constructor(val number: Int) {
69
+ override fun equals(other: Any?) =.
70
+ override fun hashCode() =.
71
+ }
72
+ ```
73
+
74
+ 리뷰어: "data class로 선언하면 *생성자를 private으로 선언해도 copy() 함수를 통해 생성이 가능*해서 class로 변경하신 것 같네요. 이럴 때는 *value class를 활용*하시면 좋습니다. 아래와 같은 장점이 있습니다.
75
+ > - data class의 equals(), hashCode(), toString()도 똑같이 구현된다.
76
+ > - copy() 함수를 사용할 수 없어서 *value class의 생성자를 private으로 선언할 수 있다*.
77
+ > - 컴파일러에서 *최적화를 할 수 있어서 성능상 이득*이다."
78
+
79
+ → *생성자 통제 + equals 자동*은 *value class*가 최적.
80
+
81
+ ### 6. `LottoStore.buyLotto` — *판매자가 사라고?*
82
+
83
+ ```kotlin
84
+ class LottoStore {
85
+ fun buyLotto(amount: Int): List<Lotto> {. } // ⚠ buyLotto
86
+ }
87
+ ```
88
+
89
+ 리뷰어: "LottoStore 입장에서는 *로또는 판매하는 게 더 적절한 네이밍*으로 보여요." 학생: "공개된 *메서드의 시그니처는 클라이언트가 객체에게 보낼 수 있는 메시지*인데, *클라이언트 입장에서 볼 때 로또 상점에게 '로또를 사라'라고 명령하는 것은 어색*하군요!" — *공개 메서드 시그니처 = 메시지*.
90
+
91
+ ### 7. `!!` 사용 — null 처리 강제 회피
92
+
93
+ ```kotlin
94
+ result[Rank.valueOf(winningLotto.getCountOfMatch(it), winningLotto.matchBonus(it))] =
95
+ result[Rank.valueOf(winningLotto.getCountOfMatch(it), winningLotto.matchBonus(it))]!! + 1
96
+ ```
97
+
98
+ 리뷰어: "*!!을 사용하는 대신에 null 처리*를 해 주시거나 *NonNull 타입으로 변경하여 null 처리가 필요 없게끔* 만들어 주세요." + "*중복을 제거*해 주세요." — *동일 표현식 2회 호출* + `!!` 모두 안티.
99
+
100
+ ### 8. Tell, Don't Ask — `numbers.contains` → `lotto.contains`
101
+
102
+ ```kotlin
103
+ data class Lotto(.) : List<LottoNumber> by numbers {
104
+ private fun List<LottoNumber>.isNotDuplicated(): Boolean = this.distinct().size == this.size
105
+ fun contains(lottoNumber: LottoNumber): Boolean = numbers.contains(lottoNumber)
106
+ fun count(predicate: (LottoNumber) -> Boolean): Int = numbers.count { predicate(it) }
107
+ }
108
+ ```
109
+
110
+ 리뷰어: "*바깥에 정보를 넘겨주는 대신에 Lotto에서 메시지를 받아 처리*하도록 만들어 보세요." + "*contains() 함수로 operator overloading이 가능*합니다. 이렇게 하면 외부에서 *lottoNumber in lotto*와 같이 작성할 수 있습니다."
111
+ ```kotlin
112
+ operator fun contains(lottoNumber: LottoNumber): Boolean = numbers.contains(lottoNumber)
113
+ ```
114
+ → *Kotlin idiom* 사용해 *도메인 어휘*를 *언어 어휘*에 매핑.
115
+
116
+ ### 9. 테스트 클래스 *오타*
117
+
118
+ ```kotlin
119
+ class gLottoResultTest { // ⚠ 앞에 'g'
120
+ ```
121
+
122
+ 리뷰어: "오타 발견!"
123
+
124
+ ## 리뷰어 의견 요지
125
+
126
+ - **상수 *모든 등장 자리* 참조**.
127
+ - **인터페이스 이름 + 메서드 명 *컨텍스트 중복 회피***.
128
+ - **일급 컬렉션은 *List 타입 자체 구현 X*** — 도메인 메서드만.
129
+ - **List 노출 시 *방어적 복사***.
130
+ - **`data class` + private constructor = *value class*** — copy 방지 + equals/hashCode/toString 자동.
131
+ - **`LottoStore.buyLotto` → `sell`** — *메시지로서 어울리는 동사*.
132
+ - **`!!` 회피** — null 처리 또는 NonNull 타입.
133
+ - **`Tell, Don't Ask`** — `lottoNumber in lotto`.
134
+
135
+ - **대표 인용:**
136
+ > 일급 컬렉션에서 컬렉션 타입을 구현하도록 되어 있는데 이번 미션에서는 모두 지워 보고 *도메인에 어울리는 이름으로 함수*를 만들어 보시면 좋겠습니다.
137
+ > — @galcyurio on `src/main/kotlin/domain/Lotto.kt`
138
+
139
+ > data class로 선언하면 생성자를 private으로 선언해도 copy() 함수를 통해 생성이 가능해서 class로 변경하신 것 같네요. 이럴 때는 *value class를 활용*하시면 좋습니다.
140
+ > — @galcyurio on `src/main/kotlin/domain/LottoNumber.kt`
141
+
142
+ > 공개된 메서드의 시그니처는 *클라이언트가 객체에게 보낼 수 있는 메시지*인데, *클라이언트 입장에서 볼 때 로또 상점에게 '로또를 사라'라고 명령하는 것은 어색*하군요!
143
+ > — @ki960213 on `src/main/kotlin/domain/LottoStore.kt`
144
+
145
+ > 바깥에 정보를 넘겨주는 대신에 *Lotto에서 메시지를 받아 처리*하도록 만들어 보세요.
146
+ > — @galcyurio on `src/main/kotlin/domain/Lotto.kt`
147
+
148
+ ## 얻은 교훈
149
+
150
+ - **상수 *모든 등장 자리* 참조** — 에러 메시지 안에서도 `${MINIMUM_NUMBER}부터 ${MAXIMUM_NUMBER}`. *단일 변경 지점*.
151
+ - **인터페이스 이름 + 메서드 명 중복 회피** — `NumberGenerator.generateNumbers()`는 *컨텍스트 어휘 반복*. `.generate()`로 충분.
152
+ - **일급 컬렉션 ≠ `List` 인터페이스 위임** — `: List<T> by numbers`로 위임하면 *모든 컬렉션 메서드*가 외부 노출. *도메인 메서드만 선택적 노출*이 의도.
153
+ - **List 자체 노출 시 *방어적 복사*** — `numbers.toList()`. *원본 컬렉션 누출*을 막음.
154
+ - **`data class` + `private constructor` 충돌 → *value class*** — `copy()` 노출 막으면서 equals/hashCode 자동.
155
+ - **`LottoStore.sell()`** — 메서드 이름은 *클라이언트가 보낼 메시지*. `buyLotto`는 *판매자에게 사라*가 되어 어색.
156
+ - **`!!` 사용 회피** — null 처리 또는 NonNull 타입. `result[x]!!`는 *Map 초기화 가정*에 의존.
157
+ - **`operator fun contains` 활용** — *Kotlin idiom*으로 도메인 어휘가 *언어 표현*에 자연스럽게 매핑. `if (lottoNumber in lotto)`.
158
+ - **테스트 클래스 이름 오타** — `gLottoResultTest` 같은 *손가락 미끄러짐*은 *PR 셀프 리뷰*가 잡아야.
159
+ - **`Flyweight` 패턴 학생 자발적 도입** — `valueOf(number)`로 1-45 *캐싱 객체*. *value class*와는 충돌 (가벼움 자체가 그 역할).
@@ -0,0 +1,50 @@
1
+ # PR #74 — [로또] 올리브 1단계 미션
2
+
3
+ - **Reviewee:** [@kimhm0728](https://github.com/kimhm0728)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/74
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 46
8
+
9
+ ## 못한 점 + 핵심 지적
10
+
11
+ ### 1. lint 실패
12
+
13
+ ```
14
+ ModelTest.kt:13:1 Wildcard import (cannot be auto-corrected)
15
+ ModelTest.kt:34:27 Newline expected after opening parenthesis
16
+ ```
17
+
18
+ ### 2. `LottoConstants` — 상수 분리 기준 자가 의문
19
+
20
+ ```kotlin
21
+ object LottoConstants {. }
22
+ ```
23
+
24
+ 리뷰어:
25
+
26
+ > 상수로 값이 분리되는 기준은 무엇일까요?? 2군데 이상에서 같이 사용되면 상수에 포함이 되는 것일까요? 그렇다면 향후 다시 1군데에서만 사용된다면 상수가 아니게 되는 것일까요? 클래스가 수백개 수천개가 된다면 2개 이상 사용하는지 어떻게 검사해야 할까요.. 각 상수에 대한 값을 표현하기에 적절한 객체는.
27
+
28
+ → "2군데 이상" 기준은 *유지 불가능*. 도메인 객체가 자기 상수 소유.
29
+
30
+ ### 3. LottoPrize 정의된 값을 또 하드코딩
31
+
32
+ ```kotlin
33
+ enum class LottoPrize(val matchingCount: Int,.) {
34
+ FIRST(6,.),
35
+ .
36
+ }
37
+
38
+ if (matched == 6) {. } // ⚠ LottoPrize.FIRST.matchingCount 안 씀
39
+ ```
40
+
41
+ > 하드코딩 대신 LottoPrize에 정의된 matchingCount 값을 활용해 볼 수 있지 않을까요?
42
+
43
+ ### 4. 복합 조건문 괄호 누락
44
+
45
+ → 가독성 + 우선순위 명시.
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **상수 분리 기준 = *2군데 이상*은 불안정**. 도메인 객체 소유가 안정적.
50
+ - **enum 데이터 = enum 자신이 활용**. 외부에서 매직넘버 다시 쓰면 enum 가치 잃음.
@@ -0,0 +1,176 @@
1
+ # PR #94 — [로또] 올리브 2단계 미션
2
+
3
+ - **Reviewee:** [@kimhm0728](https://github.com/kimhm0728)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/94
5
+ - **단계:** 2단계 (수동 로또 추가)
6
+ - **리뷰어:** @laco-dev (페로로)
7
+ - **라인 코멘트:** 34
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`LottoMachine` 인터페이스 + `AutoLottoMachine`/`ManualLottoMachine`** — Strategy 적용.
12
+ - **`LottoNumber.from(value)` Flyweight** — 1~45 캐싱 + `private constructor`.
13
+ - **`PurchaseOrder`로 입력 정보 묶음** — 가격/수동수/자동수 한 객체에.
14
+ - **자가 의문 PR에 풍부히 명시** — *팩토리 메서드 vs 주생성자*, *논리 오류 vs 비논리 오류*, *수동 발행 위치* 등을 학생이 먼저 논점화.
15
+ - **MethodSource로 두 구현체 공통 테스트 시도** — 추상에 대한 공통 행위 검증.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ ### 1. `LottoStore`가 일급 컬렉션에서 `object`(함수 묶음)로 격하
20
+
21
+ ```kotlin
22
+ // 변경 전
23
+ class LottoStore private constructor(val lottos: List<Lotto>) {
24
+ companion object { fun buyLottos(.): LottoStore {. } }
25
+ }
26
+
27
+ // 변경 후
28
+ object LottoStore {
29
+ fun buyAutoMaticLottos(.): List<Lotto> =.
30
+ fun combineLottos(manual: List<Lotto>, auto: List<Lotto>) = manual + auto
31
+ }
32
+ ```
33
+
34
+ 리뷰어: "지금의 LottoStore에 있는 역할은 모두 함수로서 기능을 하고 있을 텐데, 단순히 코드만 따로 분리한 것처럼 느껴져요. 이 기능은 컨트롤러의 역할로서 구현이 되어 있을 텐데, 굳이 나뉘었다면 목적이 무엇이라고 생각하시나요?" → 학생 수긍, `LottoStore` 자체를 삭제. *함수만 모아둔 객체는 모듈*.
35
+
36
+ ### 2. `WinningStatistics.get(LottoPrize)` — 반환 의미 모호
37
+
38
+ ```kotlin
39
+ operator fun get(lottoPrize: LottoPrize): Int =
40
+ statistics.getOrDefault(lottoPrize, DEFAULT_LOTTO_PRIZE_COUNT)
41
+ ```
42
+
43
+ 리뷰어: "`WinningStatistics.get(LottoPrize)`가 반환하는 값이 무엇일지 예측이 잘 될까요? 수량일 수도 있고, 전체 가격일 수도 있습니다." — `operator fun` overload는 *맥락*이 명확할 때만. `countOf(prize)` 같은 메서드명이 의도 명확.
44
+
45
+ ### 3. Controller 메서드가 *조립 + 출력* 혼재
46
+
47
+ ```kotlin
48
+ private fun getWinningStatistics(.): WinningStatistics {
49
+ return winningLotto.calculateWinningStatistics(lottos).also {
50
+ OutputView.printWinningStatistics(it) // ⚠ 사이드이펙트
51
+ }
52
+ }
53
+ ```
54
+
55
+ 리뷰어: "get() 함수가 출력까지 담당한다면 여러가지 일을 한다고 볼 수 있지 않을까요? 정말 이 값들이 필요해서 호출할 때마다 매번 출력이 될 수 있습니다." → `get*()`는 *값 반환*만, 출력은 별도 호출.
56
+
57
+ ### 4. `ManualLottoMachine`이 *상태(idx)* 보유
58
+
59
+ ```kotlin
60
+ class ManualLottoMachine(private val manualLottoNumbers: List<List<Int>>) : LottoMachine {
61
+ private var idx = 0
62
+ override fun generate(): List<Int> = manualLottoNumbers[idx++]
63
+ }
64
+ ```
65
+
66
+ 리뷰어: "내부적으로 idx라는 상태를 사용하기 때문에 이 함수가 반환하는 값이 매번 바뀌게 됩니다. 한 개만 발행하도록 하는 대신에 여러 개를 반환하도록 할 수도 있지 않을까요? `fun generate(count: Int): List<Lotto>`." — *호출 순서*에 의존하는 객체는 시간 결합. 일괄 반환으로 결합 제거.
67
+
68
+ ### 5. `PurchaseOrder.isPurchaseManual` 추가 검증 — 자가 생산 가능
69
+
70
+ ```kotlin
71
+ class PurchaseOrder(val price: Int, val manualLottoSize: Int = 0, lottoPrice: Int = Lotto.PRICE) {
72
+ val automaticLottoSize: Int
73
+ init {
74
+ require(price.divideByLottoPrice(lottoPrice) && price.isMoreThanMin(lottoPrice)) {. }
75
+ val totalLottoSize = price / lottoPrice
76
+ require(manualLottoSize.isPurchaseManual(totalLottoSize)) {. }
77
+ automaticLottoSize = totalLottoSize - manualLottoSize
78
+ }
79
+ }
80
+ ```
81
+
82
+ 리뷰어: "구매 가능한 최소 갯수를 확인하면서, 구매 가능한 자동 로또 갯수와 수동 로또 갯수가 명확해졌는데. 다시 한번 더 검사할 필요가 있을까 했어요." — 학생 반박: "구매 금액이 13000원인데 수동 로또의 갯수를 100개를 입력한다면…" → 학생 주장이 사실은 타당. 실제로 *어떤 추가 검증이 필요한가*를 명확히 한 사례.
83
+
84
+ ### 6. `retryWhileNoException` — 유틸이 *논리적*일 수 있는가?
85
+
86
+ ```kotlin
87
+ fun <T> retryWhileNoException(action: () -> T): T = try { action() } catch (e: Exception) {. }
88
+ ```
89
+
90
+ 리뷰어: "논리적인이라는 말을 하기에는 전제조건이 잘못되었어요. 유틸리티가 논리적일 수가 있을까요? 로또의 갯수가 유효하지 않으면 오류가 발생한다. // 유틸(?)" — *유틸리티는 행위 단위*, 도메인 검증을 흡수할 수 없음.
91
+
92
+ ### 7. `LottoMachine`에 *수동 로또까지* 끼워 넣는 어색함 — 학생 자가 의문
93
+
94
+ 학생: "ManualLottoMachine에서는 입력에 대한 `List<List<Int>>`를 프로퍼티로 가지고, generate()에서 이 프로퍼티를 인덱스 별로 하나씩 반환하기만 합니다. 수동 로또와 자동 로또의 인터페이스를 통일하기 위해 억지로 인터페이스의 구현체를 추가한 것 같은 느낌이 드는데, 리뷰어님은 어떻게 생각하시나요?" — 리뷰어: "`List<List<Int>>`가 불편한 것이라면 `List<Lotto>`를 사용하면 되는 것일까요?" + 시그니처 일괄 반환 제안.
95
+
96
+ ### 8. `InputView.validateAndConvertDigit()`가 *상수 반환*으로 변경
97
+
98
+ ```kotlin
99
+ private fun String.validateAndConvertDigit(): Int {
100
+ return toIntOrNull() ?: INVALID_DIGIT // ⚠ INVALID_DIGIT은 상수 Int
101
+ }
102
+ ```
103
+
104
+ 리뷰어: "Invalid 한 숫자라는 것은 누가 결정하는 게 맞을까요? InputView에서 숫자를 받고 나서는 그 값이 유효한지 아닌지 알 방법이 없게 됩니다." — sentinel 값 안티패턴. `null` 또는 sealed 결과로 *실패를 타입화*.
105
+
106
+ ### 9. 인터페이스 두 구현체를 한 테스트 클래스에서
107
+
108
+ ```kotlin
109
+ @MethodSource("로또 발행에 대한 테스트 데이터")
110
+ fun `로또의 번호를 임의로 지정해주면 해당 번호로 로또가 발행된다`(lottoMachine: LottoMachine, lottoSize: Int) {. }
111
+
112
+ companion object {
113
+ @JvmStatic fun `로또 발행에 대한 테스트 데이터`() = listOf(
114
+ Arguments.of(ManualLottoMachine(.), 2),
115
+ Arguments.of(LottoMachine {. }, 5),
116
+ )
117
+ }
118
+ ```
119
+
120
+ 리뷰어: "일반적으로 인터페이스 구현체들을 하나의 테스트에 모두 작성하지 않습니다. 각 구현체에 대한 기능을 테스트하기 때문에 각 테스트로 분리합니다." — 추상 *계약*은 공통 테스트, *구현*은 개별 테스트.
121
+
122
+ ### 10. `Lotto.create()` 외에 다른 생성 경로 — 학생 자가 의문
123
+
124
+ 학생: "Lotto의 주생성자인 `Lotto(numbers: Set<Int>)`로 인스턴스를 생성하는 경우가 없고, 팩토리 메서드를 통해 인스턴스를 생성하는 경우만 존재합니다. 이런 경우에도 주생성자를 public으로 열어두는 것이 맞을까요?" — 리뷰어: "위 구현의 관점에서 본다면 생성하기 위한 여러가지 방법을 제시하는 것이 아닌, 시스템적으로 생성을 제약하는 방법에 가깝습니다." → 학생 수긍 후 `private constructor`로.
125
+
126
+ ### 11. `create()` 함수의 검증이 *create*를 거치지 않으면 누락
127
+
128
+ ```kotlin
129
+ fun create(numbers: List<Int>): Lotto {
130
+ require(numbers.isValidSize()) { INVALID_SIZE }
131
+ return Lotto(numbers.sorted().map { LottoNumber.from(it) }.toSet())
132
+ }
133
+ ```
134
+
135
+ 리뷰어: "create() 함수로 만들지 않았다면 isValidSize()를 거치지 않기 때문에 항상 통과하겠네요?" — `private constructor`로 강제하지 않으면 *검증이 우회됨*.
136
+
137
+ ## 리뷰어 의견 요지
138
+
139
+ 1. **함수만 모아둔 객체는 *모듈*** — 인스턴스 의미 없으면 `object` 또는 그냥 함수.
140
+ 2. **`operator fun get`은 *맥락이 명확*할 때만** — `winningStatistics[X]`가 무엇을 반환하는지 모르면 `countOf(X)`.
141
+ 3. **Controller 메서드 = *조립 + 반환*** — 출력은 별도 호출, 사이드이펙트 섞지 말 것.
142
+ 4. **호출 순서 의존 객체는 *시간 결합*** — `idx++`로 호출마다 다른 값 반환은 *내부 상태에 의존*.
143
+ 5. **팩토리 메서드 + private constructor = *생성 제약*** — 부생성자 의도면 public 주생성자도 OK.
144
+ 6. **`Lotto.create()` 외 경로는 검증 우회** — 강제하지 않을 거면 *팩토리를 사용하는 의미가 없음*.
145
+ 7. **유틸은 도메인 *판단*을 흡수하지 않음** — `retryWhileNoException`이 도메인 오류와 시스템 오류를 한 그릇에 담는 것.
146
+ 8. **인터페이스 구현체는 개별 테스트** — 공통 계약 테스트는 별도, 구현 동작은 각자.
147
+ 9. **InputView에서 sentinel 반환 X** — `null` 또는 sealed로 *실패를 타입화*.
148
+ 10. **입력 폼은 *별도 객체로* 만들 수도 있음** — 식당 비유: 한 번에 묶어 받기 vs 항목별 받기.
149
+ 11. **재시도 = 키오스크 안내**, 알 수 없음 시스템 오류 X.
150
+
151
+ - **대표 인용:**
152
+ > 지금의 LottoStore에 있는 역할은 모두 함수로서 기능을 하고 있을 텐데, 단순히 코드만 따로 분리한 것처럼 느껴져요.
153
+ > — @laco-dev on `src/main/kotlin/lotto/model/LottoStore.kt`
154
+
155
+ > `WinningStatistics.get(LottoPrize)`가 반환하는 값이 무엇일지 예측이 잘 될까요? 수량일 수도 있고, 전체 가격일 수도 있습니다.
156
+ > — @laco-dev on `src/main/kotlin/lotto/model/WinningStatistics.kt`
157
+
158
+ > 내부적으로 idx라는 상태를 사용하기 때문에 이 함수가 반환하는 값이 매번 바뀌게 됩니다. 한 개만 발행하도록 하는 대신에 여러 개를 반환하도록 할 수도 있지 않을까요?
159
+ > — @laco-dev on `src/main/kotlin/lotto/model/ManualLottoMachine.kt`
160
+
161
+ > 미션에서 요구하는 논리적인 오류라고 하는 것은, 사용자가 경험하는 모든 과정에 있어서 정말로 Exception을 터트려야 하는 것인지, 아니면 어떠한 오류가 발생했을 때 적절하게 문제를 해결하도록 할 것인지를 이해하기를 기대하는 문제입니다.
162
+ > — @laco-dev on `src/main/kotlin/lotto/utils/Retry.kt`
163
+
164
+ ## 얻은 교훈
165
+
166
+ - **객체의 *역할*이 함수 호출 위임만 되면 객체로서의 의미 없음**. `LottoStore`가 buyLottos/combineLottos만 가지면 사실상 함수 묶음. *상태로 무엇을 하는가*가 객체의 정체성.
167
+ - **`operator fun get`은 *컬렉션-유사 객체*에서만 의미**. 도메인 객체에 붙이면 *반환 의미*가 호출자에게 안 보임.
168
+ - **사이드이펙트 + 반환 = 두 책임**. `get*().also { print(it) }`는 호출자가 *반환만* 원할 때 강제로 출력 발생.
169
+ - **호출 순서 의존 객체 회피**. `idx++` 같은 내부 카운터는 *시간 결합*. 일괄 호출 시그니처로 회피.
170
+ - **`private constructor` + 팩토리 = *시스템적 제약*** — 부생성자 의도면 public 주생성자 유지. 두 용도를 혼동하지 말 것.
171
+ - ***예외 사용 = 키오스크 안내 vs 시스템 오류*** — 사용자 입력 오류는 *재안내*, 정말 복구 불가능한 오류만 시스템 종료.
172
+ - **`null`이나 sealed로 *실패 타입화*** — InputView에서 sentinel Int 반환은 호출자가 *알 수 없음 오류*를 일으킬 가능성.
173
+ - **인터페이스 *구현체*는 개별 테스트**. 공통 *계약*은 추상 테스트 클래스로. 구현체별 *세부 행위*는 분리.
174
+ - **로또 가격 확장성 = trade-off**. 단일 가격이면 상수, 다중 가격이면 외부 주입. 항상 추상화하면 *과설계*.
175
+ - **검증을 객체가 받았다는 것 = 검증 완료**. `PurchaseOrder`가 `manualSize <= totalSize`를 보장하면 외부에서 다시 검증할 이유 없음.
176
+ - ***도메인 오류 vs 시스템 오류 구분 = 사용자 경험 차이***. 유틸리티에 둘 다 흡수하면 *모든 오류가 같은 안내*.