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,143 @@
1
+ # PR #46 — [반달] 2단계 로또
2
+
3
+ - **Reviewee:** [@no1msh](https://github.com/no1msh)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/46
5
+ - **단계:** 2단계 (수동 로또)
6
+ - **리뷰어:** @woowajames
7
+ - **라인 코멘트:** 19
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **기능 목록 README** — 칭찬: "*기능 목록 작성에 고민을 많이 하신 것* 같아요!".
12
+
13
+ ## 못한 점 (설계 관점)
14
+
15
+ ### 1. *수익률 소수점 둘째 자리 미적용*
16
+
17
+ 리뷰어: "*미션 실행 결과를 보면 당첨 통계는 소수점 둘째자리까지 보여주고* 있습니다. *동일하게 개선*해 보면 좋겠습니다."
18
+
19
+ ### 2. *기능 목록 단위 커밋* 권유
20
+
21
+ 리뷰어: "*추후에는 커밋 단위를 기능 목록 단위로 하시면 더 좋을 것* 같아요."
22
+
23
+ ### 3. `Lotto` *init과 부 생성자 호출 순서*
24
+
25
+ ```kotlin
26
+ class Lotto(val numbers: List<LottoNumber>) {
27
+ constructor(input: String) : this(input.split(",").map { LottoNumber(it.toInt()) }) {
28
+ // ⚠ 검증?
29
+ }
30
+ init { require(numbers.size == 6) }
31
+ }
32
+ ```
33
+
34
+ 리뷰어: "*이 부분이 실제로 동작하는 경우가 있을까요? 초기화 블록과 생성자의 호출 순서에 대해 알아*보세요! 🤔" — Kotlin: *부 생성자 → 주 생성자 → init*.
35
+
36
+ ### 4. `runCatching + onSuccess return + !!`
37
+
38
+ ```kotlin
39
+ runCatching { payment = Payment(money) }
40
+ .onSuccess { return payment!! } // ⚠
41
+ .onFailure { println(it.message) }
42
+ ```
43
+
44
+ 리뷰어: "*이렇게 표현할 수도 있어요*! 그리고 *while(true) {. }와 같은 구조는 자칫 무한 루프에 빠질 수 있는 위험 요소*가 있습니다. 특히 *컨트롤러에서는 while 문 내에서 또 while 문으로 들어가는 부분들이* 보입니다. *while 문을 제거하고 동일하게 동작할 수 있는 방법*을 고민해 보세요. 또한 *manualCount!!를 리턴해 주고 있는데요. !! 연산자 사용을 지양*해 보면 어떨까요?"
45
+
46
+ ### 5. *생성자 인자 vs 메서드 인자*
47
+
48
+ 리뷰어: "*메서드의 파라미터로 받아도 되는 부분을 생성자로 받아서 프로퍼티에 할당하는 것은 불필요*해 보입니다."
49
+
50
+ ### 6. *Controller에 여러 역할 혼재* — 수동 로또 생성 분리
51
+
52
+ 리뷰어: "*컨트롤러에 여러 가지 역할은 혼재해* 있습니다. *수동 로또 생성을 이렇게 컨트롤러 내부의 메서드로 존재하기 보다 별도의 클래스로 분리*하면 좋지 않을까요?"
53
+
54
+ ### 7. *LottoBundle*에서 수동/자동 분리 — 같은 곳?
55
+
56
+ 리뷰어: "*LottoBundle은 로또가 여러 장 모여 있는 클래스*입니다. *여기서 자동 생성을 한다면 수동 생성은 왜 이곳에서 이뤄지지 않을까요? 만약 역할이 많아진다고 생각되면 생성하는 부분은 별도로 분리*하면 좋겠죠? 😄"
57
+
58
+ ### 8. *오버로딩 = 외부 검증 중복 신호*
59
+
60
+ 리뷰어: "*이 함수가 이런 식으로 오버로딩되었다는 것은 숫자인지 아닌지 검증하는 로직이 외부에서 발생하고 있다는 의미*로 보입니다. *결국 같은 검증을 이곳저곳에서 하고 있다는 것인데 하나로 통일*해 보면 좋겠네요."
61
+
62
+ ### 9. `Payment` *수량 계산* + 별도 수량 함수 *분산*
63
+
64
+ 리뷰어: "*Payment에서 수량을 계산하는 함수가 있*습니다. 그리고 *여기에 또 수량 관련 함수가* 있네요. *비슷한 역할을 하는 게 흩어져* 있습니다. 또한 *ManualCount라는 클래스에서 AutoLottoCount를 계산하는 것도 이상*하게 보입니다."
65
+
66
+ ### 10. *생성자 2개 → 검증 중복*
67
+
68
+ 리뷰어: "*이런 식으로 생성자가 2개로 나뉠 이유가 없*습니다. *둘 중 하나를 선택해서 사용하시면 질문하셨던 검증 부분이 중복되는 것을 피할 수* 있습니다. *현재 각 생성자가 쓰이는 부분을 확인*해 보세요. *각각 한 곳에서 쓰이고 있기 때문에 통일하는 것은 크게 어렵지 않을 것*으로 보이네요."
69
+
70
+ ### 11. *수동 = 자동 + 입력 차이뿐* — 통합
71
+
72
+ 리뷰어: "*이 부분이 마음에 들지 않는다고 하셨습니다*. *LottoBundle 클래스에서 manualGenerate()와 autoGenerate()를 모두 해 주고 있*네요. *autoGenerate()는 쉽게 된다고 느끼는데 왜 manualGenerate()는 복잡하게 보일까요?* *자동이나 수동이나 실제 로또 도메인을 생각해 보면 6개의 숫자를 가지는 것으로 동일*합니다. 반달의 프로그램으로 대입하면 *'6개의 숫자를 가지는 것 = Lotto 클래스'*입니다. *단지 숫자를 자동으로 6개 만들어서 Lotto 클래스를 구성하느냐 입력 받은 값으로 구성하느냐의 차이 뿐*입니다. *거의 같다고 느껴지지 않나요? 그러면 '6개의 숫자를 가지는 것'에 대한 방식을 통일하면 좀 쉽게 접근이 가능*할 것이라 생각합니다. *현재 자동에 대한 6개의 숫자 모임(= Lotto 객체)은 RandomLottoGenerator 클래스에서 생성*하고 있습니다. *이러한 역할을 하는 수동 제너레이터를 만들어 볼 수 있지 않을까요*?"
73
+
74
+ ### 12. *매직 넘버 상수화*
75
+
76
+ 리뷰어: "*매직 넘버에 대한 상수화*를 하면 좋을 것 같습니다."
77
+
78
+ ### 13. `TotalPrize` *수익률 얻기 vs 생성*
79
+
80
+ 리뷰어: "*TotalPrize 입장에서 수익률을 얻는 게 아니라 생성하고* 있습니다. *네이밍이 조금 더 자연*스러워지면 어떨까요?"
81
+
82
+ ### 14. *별도 함수 분리* + *지역 변수 vs 직접*
83
+
84
+ 리뷰어: "*별도의 함수로 분리하면 더 깔끔할 것* 같네요." + "*굳이 지역 변수를 쓰지 않고 바로 넘겨줘도 좋을 거 같*습니다."
85
+
86
+ ### 15. *오버로딩 vs private constructor*
87
+
88
+ 리뷰어: "*취향의 영역인 거 같은데 private constructor 사용을 굳이 고집하지 않는다면 of() 함수 오버로딩을 쉽게 피할 수* 있을 것 같습니다. *오버로딩이 나쁘다는 게 아니라 중복된 로직이 나눠져 있는 게 약간 신경*이 쓰이네요. *이건 꼭 반영 안 하셔도 됩니다. 그냥 제 개인적인 생각*을 말씀드려 봤어요."
89
+
90
+ ### 16. *함수 길이 + 라인 분리*
91
+
92
+ 리뷰어: "*함수가 길기도 하지만 적당한 라인 분리가 안되어서 보기가 어려*워요. *관련 있는 부분으로 라인을 나눠* 보면 좋겠어요."
93
+
94
+ ### 17. *create 메서드 누락*
95
+
96
+ 리뷰어: "*숫자가 아닌 값이 들어올 때 → 어떻게 되어야 한다는 건지 불분명*합니다. 더불어 *피드백 반영이 안된 것이 위쪽에 있는데 'create를 사용하여 인자로 들어간 int값으로 LottoNumber를 만든다'라는 테스트에서 create의 메서드명이 변경되면 적절하지 않은 네이밍이라고 하였는데 현재 create라는 메서드가 없*네요. 함께 수정되면 좋겠습니다. *테스트 네이밍을 좀 더 신경*쓰시면 좋겠습니다."
97
+
98
+ ### 18. *정수형 vs 숫자*
99
+
100
+ 리뷰어: "*정확히는 정수형이 아닙니다. 현재 Int 값으로만 변환을 하고 있*습니다. *숫자라고 표현하는 게 차라리 적절*할 것 같습니다."
101
+
102
+ ## 리뷰어 의견 요지
103
+
104
+ - **소수점 둘째 자리**.
105
+ - **커밋 단위 = 기능 목록**.
106
+ - ***init + 부 생성자 호출 순서***.
107
+ - **`while + runCatching + !!` *무한 루프 위험***.
108
+ - **Controller *수동 생성 분리***.
109
+ - **`LottoBundle` *수동/자동 분리* 일관**.
110
+ - **오버로딩 = *외부 검증 중복 신호***.
111
+ - **`Payment` vs `ManualCount` *역할 분산***.
112
+ - **생성자 *중복 통합***.
113
+ - **수동 = 자동 + 입력 차이뿐 → 통합 (`Generator`)**.
114
+ - **매직 넘버 *상수***.
115
+ - **네이밍 *현실 동작*** (얻기 vs 생성).
116
+ - **함수 *라인 분리***.
117
+
118
+ - **대표 인용:**
119
+ > 자동이나 수동이나 실제 로또 도메인을 생각해 보면 *6개의 숫자를 가지는 것으로 동일*합니다. 반달의 프로그램으로 대입하면 *'6개의 숫자를 가지는 것 = Lotto 클래스'*입니다.
120
+ > — @woowajames on `src/main/kotlin/lotto/domain/LottoBundle.kt`
121
+
122
+ > 이런 식으로 *생성자가 2개로 나뉠 이유가 없*습니다. 둘 중 하나를 선택해서 사용하시면 질문하셨던 검증 부분이 중복되는 것을 피할 수 있습니다.
123
+ > — @woowajames on `src/main/kotlin/lotto/domain/Lotto.kt`
124
+
125
+ > 추후에는 *커밋 단위를 기능 목록 단위로 하시면 더 좋을 것* 같아요.
126
+ > — @woowajames (커밋 관리 가르침)
127
+
128
+ ## 얻은 교훈
129
+
130
+ - **소수점 *명세에 명시*** — 출력 형식도 *요구사항*.
131
+ - **커밋 단위 = *기능 목록 단위*** — *PR 리뷰 가독성* + *되돌리기 단위*.
132
+ - **`init` vs *부 생성자* 호출 순서** — Kotlin: *부 → 주 → init*. *부 생성자에 검증*만 두면 *주 생성자 호출 경로*에서 누락.
133
+ - **`while + runCatching + !!`** = *세 가지 위험 합산*. 무한 루프 + null 단언 + 흐름 모호.
134
+ - **Controller *역할 혼재 = 객체 분리 신호***.
135
+ - **`LottoBundle` *자동만 분리 = 수동도 분리* 일관성**.
136
+ - **오버로딩 = *외부 검증 중복 신호*** — *입력 형태 다양*하면 *팩토리 함수*에서 통합.
137
+ - **`Payment` 수량 + `ManualCount` 수량** = 책임 분산. *Order/Quantity 통합*.
138
+ - **생성자 2개 = *검증 중복***. *하나로 통일*.
139
+ - **수동 = 자동 + 입력 차이뿐** = *통합 추상화*. *6개 숫자 모음*이 *공통*. 가르침.
140
+ - **매직 넘버 *상수화*** — 모든 PR 공통.
141
+ - **`TotalPrize.calculate` *얻기 vs 생성* 네이밍**.
142
+ - **함수 *라인 분리*** = 가독성. PR #131 *분리 vs 분해* 균형.
143
+ - ***create 메서드 사라짐* 같은 *변경 일관성*** — 테스트가 *사라진 메서드*를 가리키면 *PR 셀프 리뷰 부재*.
@@ -0,0 +1,178 @@
1
+ # PR #13 — [수달] 1단계 로또
2
+
3
+ - **Reviewee:** [@otter66](https://github.com/otter66)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/13
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @namjackson
7
+ - **라인 코멘트:** 35
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Rank` enum에 `(countOfMatch, winningMoney, description)`** — 등수+상금+설명 한 곳.
12
+ - **`Rank.valueOf(countOfMatch, matchBonus)`** — 보너스 매치 조건을 enum factory에 흡수 시도.
13
+ - **`PurchaseAmount` 도입** — 금액 원시값 포장.
14
+ - **`WinningLottery`로 당첨 번호 + 보너스를 묶음** — 1차 책임 분리.
15
+ - **`LotteryNumber` 도메인 객체화** — 1~45 범위 검증을 객체 init으로.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ ### 1. 매직넘버 `6`이 generator에 박힘
20
+
21
+ ```kotlin
22
+ class LotteryGenerator {
23
+ fun generateLottery(): Lottery {
24
+ val lotteryNumbers: MutableList<LotteryNumber> = mutableListOf()
25
+ repeat(6) { // ⚠ 6의 의미가 코드 안에 없음
26
+ lotteryNumbers.add(generateUniqueLotteryNumber(lotteryNumbers))
27
+ }
28
+ return Lottery(lotteryNumbers)
29
+ }
30
+ }
31
+ ```
32
+
33
+ 리뷰어: "6이라는 숫자는 무엇을 의미하는 걸까요? 다른 컬렉션 API를 활용해 보면 어떨까요?" 학생 답: "Lottery가 가지는 번호의 개수이므로 Lottery에서 해당 상수를 가지도록 하고, 외부에서 가져다 쓸 수 있도록 하였습니다." — *6은 Lottery의 정체성*에 속함.
34
+
35
+ ### 2. `LotteryGenerator`/`LotteryNumberGenerator` 강결합 + 테스트 불가
36
+
37
+ ```kotlin
38
+ private fun generateUniqueLotteryNumber(lotteryNumbers: List<LotteryNumber>): LotteryNumber {
39
+ val lotteryNumberGenerator = LotteryNumberGenerator() // ⚠ 내장 인스턴스화
40
+ while (true) {
41
+ val randomLotteryNumber = lotteryNumberGenerator.generateLotteryNumber()
42
+ if (lotteryNumbers.contains(randomLotteryNumber)) continue
43
+ return randomLotteryNumber
44
+ }
45
+ }
46
+ ```
47
+
48
+ 리뷰어: "LotteryNumberGenerator는 LotteryGenerator와 강한 결합 구조네요! LotteryGenerator.generateLottery()를 테스트 가능한 구조로 만들어 보아요! (자동차경주 미션을 떠올려보아요!)" — 이전 미션의 *NumberGenerator 인터페이스 주입* 패턴 재적용 필요.
49
+
50
+ ### 3. 무한 루프 위험 — 중복 시 재시도
51
+
52
+ ```kotlin
53
+ while (true) {
54
+ val randomLotteryNumber = lotteryNumberGenerator.generateLotteryNumber()
55
+ if (lotteryNumbers.contains(randomLotteryNumber)) continue
56
+ return randomLotteryNumber
57
+ }
58
+ ```
59
+
60
+ 리뷰어: "lotteryNumberGenerator.generateLotteryNumber()가 항상 같은 값이 호출된다면, 종료되지 않을 거 같아요! 중복되지 않는 숫자들을 생성하는 방법을 고민해 보면 어떨까요?" — 학생 수정: "로또 번호로 사용이 가능한 숫자들만을 사용해 중복이 없는 로또 번호들을 만들도록 하였습니다!" → `(1..45).shuffled().take(6)`.
61
+
62
+ ### 4. `Rank.SECOND`/`THIRD` 구분이 `valueOf`에서만
63
+
64
+ ```kotlin
65
+ enum class Rank(val countOfMatch: Int, val winningMoney: Int, val description: String) {
66
+ SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치"),
67
+ THIRD(5, 1_500_000, "5개 일치"),.
68
+
69
+ companion object {
70
+ fun valueOf(countOfMatch: Int, matchBonus: Boolean): Rank {
71
+ if (countOfMatch == 5) return decideSecondOrThird(matchBonus)
72
+ return values().find { it.countOfMatch == countOfMatch } ?: MISS
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ 리뷰어: "2등과 3등은 countOfMatch가 동일하네요, 어떻게 2등과 3등을 구분할 수 있을까요? bonus 여부 또한 Rank가 가져야 하는 책임이 아닐까요?" — Rank에 *bonus 필요 여부* 필드를 추가하거나, 판별 로직을 더 일반화.
79
+
80
+ ### 5. Controller에 로직 집중
81
+
82
+ ```kotlin
83
+ private fun calculateResult(lotteries: List<Lottery>, winningLottery: WinningLottery): WinningResult {
84
+ val winningResult = WinningResult()
85
+ repeat(lotteries.size) {
86
+ val countOfMatch = lotteries[it].countMatches(winningLottery)
87
+ val matchBonus = lotteries[it].containBonusNumber(winningLottery.bonusNumber)
88
+ winningResult.countRank(Rank.valueOf(countOfMatch, matchBonus))
89
+ }
90
+ return winningResult
91
+ }
92
+ ```
93
+
94
+ 리뷰어: "lotteries의 데이터를 사용해서, Rank를 만들고, winningResult에 set하는 구조네요. **객체에게 메세지를 던져서 책임을 위임**해보도록 해요!" — `winningLottery.calculateResult(lotteries)` 한 줄로.
95
+
96
+ ### 6. `WinningResult`의 가변 `countMatchRanks`
97
+
98
+ ```kotlin
99
+ class WinningResult(val countMatchRanks: MutableList<Int> = MutableList(6) { 0 }) {
100
+ fun countRank(rank: Rank) { countMatchRanks[rank.ordinal]++ }
101
+ }
102
+ ```
103
+
104
+ 리뷰어 1: "countMatchRanks는 외부에서 수정이 가능한 구조네요!" 리뷰어 2: "countRank와 같은 set 함수는 언제, 얼마나 실행되었는지 관리하기가 까다로워지는데요, set를 외부에서 여러 번 실행되기보다, `List<Rank>`를 생성자로 받아서 처리해 보면 어떨까요?" — *생성 시 완성*된 객체로 만들면 시간차 무결성 보장.
105
+
106
+ ### 7. `println()`이 Controller에
107
+
108
+ ```kotlin
109
+ fun run() {
110
+ val winningResult = calculateResult(lotteries, winningLottery)
111
+ println() // ⚠ Controller가 출력 결정
112
+ outputView.printWinningStats(purchaseAmount, winningResult)
113
+ }
114
+ ```
115
+
116
+ 리뷰어: "View는 언제든 변경될 수 있어요, println()은 View에서 처리하도록 해요!" — 출력 형식은 View 책임.
117
+
118
+ ### 8. `OutputView`에 5개 등수 print 코드 중복
119
+
120
+ ```kotlin
121
+ println("${Rank.FIFTH.description} (${Rank.FIFTH.winningMoney})- ${result.countMatchRanks[Rank.FIFTH.ordinal]}")
122
+ println("${Rank.FOURTH.description} (${Rank.FOURTH.winningMoney})- ${result.countMatchRanks[Rank.FOURTH.ordinal]}")
123
+ //. 5번 반복
124
+ ```
125
+
126
+ 리뷰어: "중복된 코드를 분리해 보면 어떨까요?" — `Rank.values().filterNot { it == MISS }.forEach {. }`. 학생 수정: "associateWith를 이용해 해결."
127
+
128
+ ### 9. 테스트명/검증 모호
129
+
130
+ ```kotlin
131
+ @ValueSource(ints = [1, 45])
132
+ fun `번호를 하나 가진다`(number: Int) {. }
133
+ ```
134
+
135
+ 리뷰어: "테스트 케이스를 좀 더 구체적으로 사용해 보면 어떨까요? 하나의 요구사항 명세서라고 생각하면 좋아요! `1~45의 숫자로 로또 번호를 생성할 수 있다.`" + "에러 메시지까지 검증해 보면 어떨까요? 다른 의도하지 않은 에러가 같은 타입으로 에러가 발생할 경우, 테스트의 신뢰성이 떨어질 수도 있을 것 같아요!"
136
+
137
+ ### 10. `List<Lottery>` 일급 컬렉션 부재 — 학생 자가 의문
138
+
139
+ 학생: "Lotteries라는 일급 객체를 만들더라도 아무런 역할이 없는 단순히 리스트만 가지고 있는 객체가 될 것 같습니다. 이러한 경우에도 일급 객체를 만드는 것이 좋을까요?" — 리뷰어 후속: `lotteries`의 *집계 책임*이 있다면 일급 객체로. 단순 `List<Lottery>`로 외부에서 다 처리하면 절차적.
140
+
141
+ ## 리뷰어 의견 요지
142
+
143
+ 1. **매직넘버는 *위치 = 소유*** — 6은 Lottery의 정체성 → Lottery 안에 상수.
144
+ 2. **랜덤 의존은 *주입*** — 이전 미션(racingcar)의 패턴 재적용.
145
+ 3. **무한 루프 가능성 = 도메인 위반 신호** — 중복 회피를 *재시도*로 풀지 말고 *자료구조*로 풀어라(shuffle).
146
+ 4. **enum의 한 분기는 *enum이 책임지게*** — `SECOND.requiresBonus`/`isBonusMatched()` 필드 도입.
147
+ 5. **Controller = 조립**, 메시지 위임은 도메인에 — `winningLottery.calculateResult(lotteries)`.
148
+ 6. **객체는 *생성 시 완성*되어야 함** — 외부에서 setter를 여러 번 호출하는 누적 패턴 회피.
149
+ 7. **View 분리** — `println()`은 OutputView로.
150
+ 8. **테스트명 = 요구사항 명세서** — 요구사항 단어로 표현.
151
+
152
+ - **대표 인용:**
153
+ > 6이라는 숫자는 무엇을 의미하는 걸까요?
154
+ > — @namjackson on `src/main/kotlin/lotto/domain/LotteryGenerator.kt`
155
+
156
+ > LotteryNumberGenerator는 LotteryGenerator와 강한 결합 구조네요! LotteryGenerator.generateLottery()를 테스트 가능한 구조로 만들어 보아요! (자동차경주 미션을 떠올려 보아요!)
157
+ > — @namjackson on `src/main/kotlin/lotto/domain/LotteryGenerator.kt`
158
+
159
+ > 2등과 3등은 countOfMatch가 동일하네요, 어떻게 2등과 3등을 구분할 수 있을까요? bonus 여부 또한 Rank가 가져야 하는 책임이 아닐까요?
160
+ > — @namjackson on `src/main/kotlin/lotto/domain/Rank.kt`
161
+
162
+ > 객체에게 메세지를 던져서 책임을 위임해 보도록 해요!
163
+ > — @namjackson on `src/main/kotlin/lotto/controller/LottoController.kt`
164
+
165
+ > countRank와 같은 set 함수는 언제, 얼마나 실행되었는지 관리하기가 까다로워지는데요, set를 외부에서 여러 번 실행되기보다, `List<Rank>`를 생성자로 받아서 처리해 보면 어떨까요?
166
+ > — @namjackson on `src/main/kotlin/lotto/domain/WinningResult.kt`
167
+
168
+ ## 얻은 교훈
169
+
170
+ - **이전 미션 학습을 *명시적으로 재적용***. racingcar의 NumberGenerator 주입은 lotto에도 동일하게 — 패턴은 *과제를 넘어 일반화*.
171
+ - **매직넘버의 *소유*는 도메인 정체성**. `6`은 LottoSize 도메인 상수 — Lottery 안에서 정의.
172
+ - **중복 회피 = 자료구조 선택** — `shuffled().take(N)` (전수 셔플) vs 무한 루프 재시도. 도메인이 *유한 집합*이면 셔플이 항상 종료.
173
+ - **enum의 분기 조건은 enum 안에**. `Rank.valueOf` 안의 `if (countOfMatch == 5)` 매직넘버는 `Rank.SECOND.countOfMatch`로.
174
+ - **객체는 *생성 시 완성*** — `setter`를 외부에서 여러 번 호출하는 객체는 *시간 의존성*을 외부에 노출.
175
+ - **Controller = 조립**. 도메인 로직(`forEach + countRank`)은 도메인 객체(`winningLottery.calculateResult(lotteries)`)로 위임.
176
+ - **`println()` = View 책임**. Controller가 `println()`을 호출하면 *흐름 조립자*가 *출력 형식*까지 결정.
177
+ - **테스트명은 요구사항 문장**. `번호를 하나 가진다` → `1 이상 45 이하의 로또 번호를 생성할 수 있다`.
178
+ - **일급 컬렉션은 *집계 행위가 있을 때***. Lotteries에 별다른 메서드가 없다면 굳이 만들지 말고 List로 유지 — *책임이 생기면* 일급 객체로 승격.
@@ -0,0 +1,160 @@
1
+ # PR #53 — [수달] 2단계 로또
2
+
3
+ - **Reviewee:** [@otter66](https://github.com/otter66)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/53
5
+ - **단계:** 2단계 (수동 로또 추가)
6
+ - **리뷰어:** @namjackson
7
+ - **라인 코멘트:** 19
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`LotteryMachine` 도입** — *발행 기계*로 책임 응집 시도.
12
+ - **`Lotteries` 일급 컬렉션 + `plus(other)`** — 자동/수동 합치기 행위.
13
+ - **`LotteryNumber` `data class` + value 명명 적용** — `lotteryNumber.number` → `.value`.
14
+ - **`runCatching.getOrNull()` 패턴** — InputView에서 *null 반환*으로 Controller에 분기 위임.
15
+ - **자가 의문 PR에 풍부히 명시** — *View 책임 경계*, *data vs value class*, *LottoTicket 도입 여부* 등.
16
+ - **학습 로그 작성** — `data class vs value class`를 prolog에 정리.
17
+
18
+ ## 못한 점 (설계 관점)
19
+
20
+ ### 1. 수동/자동 흐름이 뒤바뀜
21
+
22
+ ```kotlin
23
+ fun run() {
24
+ val amount: PurchaseAmount = getPurchaseAmount()
25
+ val autoLotteries: Lotteries = getLotteries(amount.autoNumber) // ⚠ 자동을 먼저
26
+ val manualLotteries: Lotteries = getLotteries(amount.manualNumber) // ⚠ 수동을 나중에
27
+ val lotteries: Lotteries = autoLotteries.plus(manualLotteries)
28
+ }
29
+ ```
30
+
31
+ 리뷰어: "리팩토링 과정에서 *로직이 꼬인 것* 같아요! *기존 자동 로또 기능에, 수동 기능이 추가*된 부분이에요! *수동 로또 발행 이후, 남는 금액에 맞는 자동 로또가 발행*되도록 작업해 주세요!" — 요구사항: *수동 N장 + (남은 금액)/1000 장 자동*.
32
+
33
+ ### 2. `LotteryMachine.createWinningResult` — 책임 위치
34
+
35
+ ```kotlin
36
+ class LotteryMachine {
37
+ fun createWinningResult(winningLottery: WinningLottery, lotteries: Lotteries, amount: PurchaseAmount): WinningResult {. }
38
+ }
39
+ ```
40
+
41
+ 리뷰어: "LotteryMachine에서 winningLottery, lotteries, amount의 파라미터를 받아서, *당첨 결과를 리턴해 줄 필요*가 있을까요? LotteryMachine은 *어떤 책임*을 가지고 있을까요? *winning에 대한 당첨에 대한 부분은 winningLottery에 위임*해 보면 어떨까요?" — *발행 기계*가 *당첨 판정*까지 흡수.
42
+
43
+ ### 3. `winningResult[rank]!!.plus(1)` — `!!` 강제 언패킹
44
+
45
+ ```kotlin
46
+ val winningResult: MutableMap<Rank, Int> = Rank.values().associateWith { 0 }.toMutableMap()
47
+ repeat(lotteries.size) {
48
+ .
49
+ winningResult[rank] = winningResult[rank]!!.plus(1) // ⚠
50
+ }
51
+ ```
52
+
53
+ 리뷰어: "`!!`은 nullable한 변수를 notNull로 *강제로 변경*해 주는 동작을 해요, 변수에 null이 있는 경우, *에러가 발생*하곤 합니다. null을 처리할 수 있는 여러 방법을 고민해 보아요." + 후속: "당첨 리스트를, WinningResult의 *생성자로 전달*하여, Winning *집계하는 부분은 WinningResult에서* 하도록 해 보면 어떨까요?" — 누적 책임도 *결과 객체*에.
54
+
55
+ ### 4. `LotteryNumber(private val number)` getter + 변수명 중복
56
+
57
+ ```kotlin
58
+ data class LotteryNumber(private val number: Int) {
59
+ fun toInt(): Int = number
60
+ fun toString(): String = number.toString()
61
+ }
62
+ ```
63
+
64
+ 리뷰어: "코틀린에서는 getter를 따로 만들어 줄 필요가 없기도 해요, *number가 불변이라면, number를 노출해도 무방*. number라는 변수는 `lotteryNumber.number`라는 *중복 코드*가 발생되기도 하는데요, *value*와 같은 네이밍으로 `lotteryNumber.value`으로 *중복을 제거*할 수도 있을 거 같아요!" 학생: "외부에서 매개변수를 호출할 때 일관성을 위해 `.toInt()`, `.toString()`과 같이 작성하였는데, *내부에서 외부 로직과 관련 지어 변수명을 짓지 않도록* 하는 관점에서도 더 좋은 방법인 것 같습니다!"
65
+
66
+ ### 5. `value class` vs `data class` — 학생 자가 학습
67
+
68
+ 학생 학습 로그: "로또 번호를 원시값 포장하는 것에 대해 *data class*를 추천해 주셨는데, 현재 코드에서는 *value class*가 더 좋지 않을까? 라는 고민이 있습니다!" 리뷰어: "*value class와 data class는 서로 다른 역할*. 제가 data class를 언급한 부분은 직접 override한 *equals, hashCode 등을 자동으로 생성*해 주는 data class에 대한 *소개를 위함*이었고, *data class를 써야 한다는 코멘트는 아니긴* 했어요. 무엇을 사용하여 어떻게 구현하는지에 대한 *정답은 없다*고 생각이 들어요. 로또 번호가 *숫자로만 동일하면 되는 부분*일지, 아니면, 로또 번호를 *숫자를 가진 하나의 데이터 객체*라고 정의를 하는지에 따라 달라질 것 같아요." 학생 결론: "value class를 적용시켜 보았습니다! 객체 생성의 비용이 절감되고, 중복된 객체를 만들지 않기 위해 pool을 생성하는 과정을 줄일 수 있기 때문."
69
+
70
+ ### 6. InputView가 *수동 로또 N장*까지 직접 read + Lotteries 생성
71
+
72
+ ```kotlin
73
+ fun readLotteries(count: Int): Lotteries? {
74
+ val lotteries: MutableList<Lottery> = mutableListOf()
75
+ repeat(count) {
76
+ val lottery: Lottery = Lottery(readln().split(", ").map { LotteryNumber(it.toInt()) })
77
+ lotteries.add(lottery)
78
+ }
79
+ return runCatching { Lotteries(lotteries) }.getOrNull()
80
+ }
81
+ ```
82
+
83
+ 리뷰어: "로또 생성에 대한 부분은 *LottoMachine에 위임*해 보아도 좋을 거 같아요!" + "수동 로또를 *몇 장 살 것인가에 대한 Amount*에 대한 부분과 *구매하는 수동 로또 리스트와 분리*될 필요가 있을까요? 수동 로또 번호를 받게 되면, 구매하는 수동 로또의 갯수도 *당연히 알 수 있을 것* 같아요!" — *입력*과 *생성*의 분리. 학생 자가 답변: "View의 역할은 어디까지인지에 대해서는 *저만의 기준이 확정되지 않았습니다*. 추천해 주신 방법의 장점이 *view에서의 로직을 최소화*하고, 역할을 각 클래스에 맞게 분리할 수 있다는 장점 때문이 맞을까요?"
84
+
85
+ ### 7. View 책임 경계 — 학생 vs 페어 의견 차이
86
+
87
+ 학생 자가 의견 정리: "저는 *뷰에서 가공된 값을 보내고, controller의 기능을 최소화*한다는 것에 집중. 베르는 *뷰의 역할을 최소화 하고, controller를 통해 전달*해 도메인에서 값을 가공. 저의 방법에서는 controller의 기능이 최소화되는 장점이 있지만, *도메인의 역할을 뷰에게 빼앗긴 것* 같기도 하다는 단점. 베르의 방법에서는 controller의 기능이 조금은 늘어나는 단점이 있지만, *역할 분배가 좀 더 적절한* 것 같다는 장점." 학생: "아직 어떠한 방법이 더 좋은 방법인지 결정을 하지 못했기 때문에 다음 미션에서 *두 방법을 비교*해 보고자 합니다!"
88
+
89
+ ### 8. `LotteryGenerator`가 `LotteryMachine` 내부에서 직접 생성
90
+
91
+ ```kotlin
92
+ fun generateLotteries(count: Int): Lotteries {
93
+ val generator: LotteryGenerator = LotteryGenerator()
94
+ .
95
+ }
96
+ ```
97
+
98
+ 리뷰어: "LotteryGenerator는 *LotteryMachine 생성 시점에 주입*받아 보면 어떨까요? LotteryMachine에서 *로또를 생성하는 부분에서 상세한 생성 테스트*를 할 수 있을 것 같아요! *인터페이스를 분리*한다면, 원하는 로또 번호를 생성하는 LottoMachine을 *테스트*할 수 있을 것 같아요!" — 의존성 주입 + Fake 주입 가능.
99
+
100
+ ### 9. `PurchaseAmount`에 `autoNumber` 상태값 보유
101
+
102
+ ```kotlin
103
+ class PurchaseAmount(private val amount: Int, val manualNumber: Int) {
104
+ val autoNumber: Int = getPurchaseQuantity() - manualNumber // ⚠ 상태값
105
+ fun toInt(): Int = amount
106
+ }
107
+ ```
108
+
109
+ 리뷰어: "상태값을 가지는 변수보단 *Backing field*를 활용해 보면 어떨까요?" + "*불필요한 getter 함수*로 보여지네요! amount가 *불변 변수라면 외부에 공개해 주어도* 좋을 거 같아요!"
110
+
111
+ ### 10. `while (true)` 무한 루프 — `?: getPurchaseAmount()` 권장
112
+
113
+ ```kotlin
114
+ private fun getPurchaseAmount(): PurchaseAmount {
115
+ while (true) {
116
+ val amount: PurchaseAmount? = inputView.readPurchaseAmount()
117
+ if (amount != null) return amount
118
+ }
119
+ }
120
+ ```
121
+
122
+ 리뷰어: "이런 식으로도 사용할 수 있을 거 같아요! `return inputView.readPurchaseAmount() ?: getPurchaseAmount()`." — 재귀가 *while 무한 루프*보다 Kotlin idiomatic.
123
+
124
+ ## 리뷰어 의견 요지
125
+
126
+ - **요구사항 순서** — 자동 *남는 금액*은 *수동 발행 후*.
127
+ - **`LotteryMachine`의 책임** — *발행*에 집중, *당첨 판정*은 `WinningLottery`.
128
+ - **`!!` 회피** — null 처리 방법 다양화.
129
+ - **`value class` vs `data class`** — 정답 없음, *도메인 의미*에 따라 선택.
130
+ - **InputView 책임 경계** = 학생 vs 페어 의견 차이의 *명시적 트레이드오프*.
131
+ - **`LotteryMachine`이 `Generator` 주입받기** — 테스트 가능 구조.
132
+ - **Backing field + 외부 노출** — `private val` + getter 함수보다 `val` 직접.
133
+ - **`?: retry()`** > `while (true)`.
134
+
135
+ - **대표 인용:**
136
+ > 리팩토링 과정에서 로직이 꼬인 것 같아요! … 수동 로또 발행 이후, *남는 금액에 맞는 자동 로또가 발행*되도록 작업해 주세요!
137
+ > — @namjackson on `src/main/kotlin/lotto/controller/LottoController.kt`
138
+
139
+ > LotteryMachine에서 winningLottery, lotteries, amount의 파라미터를 받아서, *당첨 결과를 리턴해 줄 필요*가 있을까요? *winning에 대한 당첨에 대한 부분은 winningLottery에 위임*해 보면 어떨까요?
140
+ > — @namjackson on `src/main/kotlin/lotto/domain/LotteryMachine.kt`
141
+
142
+ > value class와 data class는 *서로 다른 역할*을 한다고 보면 좋을 거 같아요! … *무엇을 사용하여 어떻게 구현하는지에 대한 정답은 없다*고 생각이 들어요.
143
+ > — @namjackson on `src/main/kotlin/lotto/domain/LotteryNumber.kt`
144
+
145
+ > LotteryGenerator는 *LotteryMachine 생성 시점에 주입*받아 보면 어떨까요? *인터페이스를 분리*한다면, 원하는 로또 번호를 생성하는 LottoMachine을 *테스트*할 수 있을 것 같아요!
146
+ > — @namjackson on `src/main/kotlin/lotto/domain/LotteryMachine.kt`
147
+
148
+ ## 얻은 교훈
149
+
150
+ - **요구사항 *순서*에 충실** — *자동 N장*이 *남는 금액*이라면 *수동 발행 후* 잔액 기준.
151
+ - **`LotteryMachine`은 *발행*에 집중** — 당첨 판정은 `WinningLottery`로. 한 객체에 *발행 + 판정 + 통계*가 모이면 응집도↓.
152
+ - **`!!` 회피** — *명시적 null 처리* 또는 *애초 null이 안 되는 구조*.
153
+ - **`value class` vs `data class`** — 정답 없음. *로또 번호가 숫자로만 동일하면 되는가*(value class) vs *데이터 객체로 보는가*(data class).
154
+ - **getter 함수 vs `val` 직접 노출** — Kotlin은 `val` 자체가 getter. 추가 함수는 *의도가 있을 때*만.
155
+ - **변수명에 *내부 타입*을 두지 말 것** — `lotteryNumber.number` 같은 *타입 반복*은 *호출자 부담*. `.value`/`.toInt()`로.
156
+ - **InputView vs Controller 책임 경계** — *정답 없는 트레이드오프*. *역할 분배의 적절성* vs *Controller 단순성*.
157
+ - **`Generator` 주입** — `LotteryMachine`이 *Generator를 생성자에서 받으면* Fake로 테스트 가능.
158
+ - **`?: retry()`** — Kotlin idiomatic 재시도. `while(true)`보다 *간결 + 의도 명시*.
159
+ - **Backing field 활용** — `private var _x` + `val x get() = _x` 패턴은 *외부 불변 + 내부 가변* 표현.
160
+ - **학습 로그로 *기준 정립*** — *value class vs data class* 같은 토픽은 *결론*보다 *비교 정리*가 학습.
@@ -0,0 +1,71 @@
1
+ # PR #126 — [로또 1단계] 밀러 미션
2
+
3
+ - **Reviewee:** [@oungsi2000](https://github.com/oungsi2000)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/126
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 45
8
+
9
+ ## 못한 점 + 핵심 지적
10
+
11
+ ### 1. Lotto에서 Int 노출 + 파싱
12
+
13
+ ```kotlin
14
+ class Lotto(val numbers: List<Int>) {
15
+ fun fromInput(input: String): Lotto = Lotto(input.split(",").map { it.toInt() })
16
+ }
17
+ ```
18
+
19
+ > Int로는 로또 번호가 아닌 것을 걸러내기는 어려워보여요. 로또 번호에 대한 값 객체를 만들어보는 건 어떨까요?
20
+
21
+ > 입력 문자열을 파싱하는 것은, 콘솔 뷰에 굉장히 의존적이란 생각이 드네요. 안드로이드로 옮겼을 때도, 숫자 버튼을 눌렀을 때 항상 "," 로 구분되어있는 문자열이 입력으로 들어오는 것이 기대될까요?
22
+
23
+ → 도메인이 *파싱 형식*을 알면 *콘솔* 종속. View에서 파싱 후 도메인은 *완성된 값*.
24
+
25
+ ### 2. `RankMap` — 이름과 역할 모호
26
+
27
+ ```kotlin
28
+ class RankMap(val data: Map<Rank, Int>) {. }
29
+ ```
30
+
31
+ > RankMap이란 단어만 보고 다른 아무나 붙잡고 어떤 역할을 수행하는지 한 번에 유추해낼 수 있을까요?
32
+
33
+ → `WinningStatistic`/`RankCount` 같은 *역할*을 표현하는 이름.
34
+
35
+ ### 3. `global/Config` 패키지
36
+
37
+ ```
38
+ lotto/
39
+ global/
40
+ Config.kt
41
+ ```
42
+
43
+ > 상수를 한 파일에 몰아서 사용한 큰 이유가 있으신가요?
44
+
45
+ → `global/` god-folder.
46
+
47
+ ### 4. `LottoValidator` — 우회 가능
48
+
49
+ ```kotlin
50
+ object LottoValidator {
51
+ fun validate(numbers: List<Int>) {. }
52
+ }
53
+ val lotto = Lotto(numbers) // ⚠ Validator 안 거치고 직접 생성 가능
54
+ ```
55
+
56
+ > 어딘가에서 이 검증기를 통과했더라도, Lotto객체 등은 검증기의 도움 없이 바로 생성할 수 있겠지요. Lotto 객체 생성을 하고자 하는 다른 개발자는 이런 검증기가 있는지 조차 모를 수 있겠어요. 그럴 때 그렇게 만들어진 객체는 과연 신뢰도 높은 객체일까요?
57
+
58
+ → Validator는 *도메인 외부*에 둘 수 없음. Lotto.init이 invariant 강제.
59
+
60
+ ### 5. `@DisplayName` vs 메서드명
61
+
62
+ > 메서드 명 대신 DisplayName을 활용한 특별한 이유가 있으신가요?
63
+
64
+ → Kotlin은 백틱으로 함수명 자유. DisplayName은 자바 관습.
65
+
66
+ ## 얻은 교훈
67
+
68
+ - **외부 Validator의 함정** — 우회 가능하면 도메인이 *불완전한 상태*로 생성 가능. invariant는 init이 강제.
69
+ - **`global/Config` 패키지 = god-folder의 다른 이름**.
70
+ - **Kotlin 백틱 함수명 > DisplayName**. 코틀린식.
71
+ - **Int 노출 + 파싱이 도메인에 = 매체 종속**. 콘솔 idiom이 안드로이드/웹에서 어색.
@@ -0,0 +1,56 @@
1
+ # PR #149 — [로또 2단계] 밀러 미션
2
+
3
+ - **Reviewee:** [@oungsi2000](https://github.com/oungsi2000)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/149
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 41
8
+
9
+ ## 못한 점 + 핵심 지적
10
+
11
+ ### 1. 1단계 피드백 미반영 (racingcar 랜덤 테스트 패턴)
12
+
13
+ > 이전 피드백을 먼저 반영해주세요 로또에서 랜덤 테스트를 구성하지 못한다는 의미는, 자동차 경주에서의 랜덤 테스트를 가능하게 하는 방법에 대해.
14
+
15
+ → racingcar에서 배운 NumberGenerator 추상화 패턴 미적용.
16
+
17
+ ### 2. object → class 변경 이유?
18
+
19
+ ```kotlin
20
+ class LottoGenerator {. } // 이전엔 object
21
+ ```
22
+
23
+ > 갑자기 object -> class 로 변경된 이유는 무엇인가요?
24
+
25
+ ### 3. for + mutableList 패턴
26
+
27
+ → `List(count) { generate() }` 또는 `(1..count).map { generate() }`.
28
+
29
+ ### 4. `associate/group` 컬렉션 함수 활용
30
+
31
+ ```kotlin
32
+ val map = mutableMapOf<Rank, Int>()
33
+ lottos.forEach {. map[rank] = (map[rank] ?: 0) + 1. }
34
+ ```
35
+
36
+ → `lottos.groupingBy { it.match(winning) }.eachCount()`.
37
+
38
+ ### 5. 수동 로또가 LottoGenerator를 안 쓰는 분기
39
+
40
+ ```kotlin
41
+ val manual = Lotto(.) // ⚠ Generator 우회
42
+ ```
43
+
44
+ > LottoGenerator 라는 객체가 있는데, 수동 로또는 생성기를 통하지 않네요. 수동 로또를 어디서 만드는 지 과연 다른 개발자들을 짐작할 수 있을까요?
45
+
46
+ → 자동/수동 모두 Generator 인터페이스 구현체.
47
+
48
+ ### 6. `UserInput`의 메서드 — View 전용?
49
+
50
+ > 이 메서드들이 꼭 View에서 사용해야하는 메서드인가요?
51
+
52
+ ## 얻은 교훈
53
+
54
+ - **이전 피드백 흡수 = 다음 단계의 기반**. 1단계 안 받았으면 2단계도 무너짐.
55
+ - **`groupingBy { }.eachCount()`** = Map 집계의 표준. lotto 통계에 자연.
56
+ - **자동/수동 통합 = Strategy/Generator 인터페이스 둘 다 거치게**. 일관성.