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,155 @@
1
+ # PR #141 — [다이스] 2단계 로또
2
+
3
+ - **Reviewee:** [@moondev03](https://github.com/moondev03)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/141
5
+ - **단계:** 2단계 (수동 로또)
6
+ - **리뷰어:** @krrong
7
+ - **라인 코멘트:** 27 (리뷰어 21 + 학생 6)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`LottoBundle` 일급 컬렉션** — Strategy 시도.
12
+ - **후속 라운드 반응 좋음** — 리뷰어 칭찬: "*의도했던 바를 정확히 파악해 주셨네요* 💯".
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ ### 1. `LottoNumber.MIN/MAX` + `RandomLottoNumbersGenerator` *양쪽 보유*
17
+
18
+ ```kotlin
19
+ class LottoNumber {
20
+ companion object { const val MIN = 1; const val MAX = 45 }
21
+ }
22
+ class RandomLottoNumbersGenerator {
23
+ val numbers = (1..45).shuffled().take(6) // ⚠ 다시 1..45
24
+ }
25
+ ```
26
+
27
+ 리뷰어: "*로또의 최대, 최소 값이 LottoNumber, RandomLottoNumbersGenerator 모두 가지고 있어요. 최대 최소 값은 누구의 관심사일까요? 🤔 LottoNumber에서 만들어 놓은 값을 잘 활용하려면 어떻게 해야 할까요*?"
28
+
29
+ 리뷰어 후속: "*LottoNumber의 최대, 최소 값은 LottoNumber만이 관심 있는 값이죠. 자동 숫자 생성기는 LottoNumber에게 이렇게 요청할 수 있겠어요. '너가 가진 모든 번호를 주겠니?'* 그러면 *인스턴스화 시켜 놓은 값들을 적절히 활용*할 수 있을 것 같아요". 강사 동일 가르침 (*LottoMachine은 범위에 관심 없다*).
30
+
31
+ ### 2. *Pair + nullable 반환* — 두 의미 손실
32
+
33
+ ```kotlin
34
+ fun buyLottos(.): Pair<Lottos, Lottos>? =.
35
+ ```
36
+
37
+ 리뷰어: "*Pair로 반환을 하고 있는데 게다가 값이 있을지도 없을지도 모른다*..? *로또를 구매하는 일을 한다고 생각해 보고 조금 더 명확한 값을 반환*해 보도록 할까요? 🤠" + "nit: *Pair를 만들 때는 a to b처럼 사용*할 수도 있어요!"
38
+
39
+ ### 3. *디폴트 파라미터의 위험*
40
+
41
+ 리뷰어: "*디폴트 파라미터를 정의해 두면 어떤 문제가 생길 수 있을까요*?".
42
+
43
+ ### 4. *`service` 패키지 의도*
44
+
45
+ 리뷰어: "*service 패키지는 어떤 역할을 하나요? model과는 어떤 차이가 있기에 패키지를 구분*했나요? 🤔"
46
+
47
+ ### 5. *구매 수량 + 주문 클래스 분리* 전략
48
+
49
+ ```kotlin
50
+ // 현재: 금액에서 수동/자동을 줄여 가며 계산
51
+ ```
52
+
53
+ 리뷰어 (제안): "자동 로또와 수동 로또의 *구매 수를 계산하기 위해 금액을 줄이는 전략을 사용했네요*! 다음과 같은 *클래스를 만드는 전략*은 어떤가요? 🤔
54
+ 1. *구매 수량 클래스* - 수동 구매 수 - 자동 구매 수
55
+ 2. *주문 클래스* - 금액 - 수동 구매 수 - 자동 구매 수"
56
+
57
+ 추가 (현실 비유): "실제로 *로또를 사러 가서 돈, 수동 번호를 주며 자동 몇 개요~ 하고 주문하는 것처럼 Order에 수동 로또 번호도 추가*해 보면 어떨까요? 🤔"
58
+
59
+ ### 6. *CsvSource 보다 분리*
60
+
61
+ 리뷰어: "테스트를 보다 *split이 왜 필요할까 하는 의문점*이 들었어요. *수익률을 계산하는 테스트를 진행하기 위해서는 테스트의 가독성을 위해 CsvSource를 사용하는 것보다 분리해서 작성하는 게 좋아* 보여요."
62
+
63
+ ### 7. *`Lotto.contains` 의도* — 보너스인지 모름
64
+
65
+ 리뷰어: "사실 의도는 *'로또가 x를 포함하면 true를 반환한다'와 같이 수정하기를 바*랐어요. *Lotto의 관점에서 바라봤을 때 들어오는 값이 보너스 번호인지 그냥 번호인지 알 필요가 없으니까요* 🤠" — *호출자가 의미 구분*, 도메인은 *순수 행위*.
66
+
67
+ ### 8. *테스트 가독성*
68
+
69
+ 리뷰어:
70
+ ```kotlin
71
+ @Test
72
+ fun `1등의 수익률은 2000000이다`() {
73
+ val result = mapOf(LottoRank.FIRST to 1)
74
+ val actual = LottoResult(result).calculateTotalReturn(1000).toDouble()
75
+ assertThat(actual).isEqualTo(2000000.00)
76
+ }
77
+ ```
78
+ "조금 더 가독성을 개선하고 싶다면 아래처럼 작성할 수도 있겠어요 🤠"
79
+
80
+ ### 9. `LottoMachine` *발급 책임* — 구조 변경
81
+
82
+ 리뷰어: "이 부분은 *구조적인 변경이 커질 수도 있을 것 같아 참고만 하셔도* 좋을 것 같아요 🤠 현재 *LottoMachine은 LottoNumbersGenerator에게 받아온 숫자들을 로또로 만들어 주고* 있는데요. *현실 세계에 대입해 보면 로또는 기계에게 로또 몇 장 줘!라고 이야기해서 로또를 받아 와요*. 즉, *LottoMachine이 Lotto를 혹은 LottoBundle을 발급한다!라고도 볼 수* 있죠. 그리고 *로또를 파는 상점에서는 돈과 어떤 로또 기계를 사용할지를 받아 로또를 판다*. 이렇게 구성하면 *LottoMachine의 뎁스가 낮아지고 ManualLottoNumbersGenerator는 불필요한 count 멤버변수를 갖지 않을 수* 있어요!".
83
+
84
+ ### 10. *출력 형식 불일치* — `Int` vs `List<LottoNumber>`
85
+
86
+ 리뷰어: "*로또 구매 수를 출력할 때는 Int를 따로따로 넘겨주고, 로또 번호를 출력할 때는 List<LottoNumber>의 형태를 넘겨주고* 있네요. *각각의 기준이 있는 걸까요*? 🤔" — *일관성 검토*.
87
+
88
+ ### 11. *테스트 = LottoMachine 진짜 책임 검증?*
89
+
90
+ 리뷰어: "*이 테스트는 정말 LottoMachine의 테스트가 맞을까요*? 🤔"
91
+
92
+ ### 12. *InputView가 Model을 모르는 이유*
93
+
94
+ 리뷰어: "*OutputView에서도 당연히 Model을 받아 사용할 수 있어요. 저 또한 Model을 넘겨주는 것이나 List를 넘겨주는 것 모두 가능하고, 둘 중 어느 방법을 선택해야 하느냐는 트레이드 오프의 영역이라고 생각*해요. 그런데, *다이스의 설계에서 OutputView는 Model을 알고 있는데, InputView는 왜 Model을 알지 못할까요? 이 부분은 앞으로 개발을 하면서 고민*해 보시면 좋을 것 같아요 😊" — *비대칭 점검*.
95
+
96
+ ### 13. *모든 LottoNumber 메시지* — 도메인 어휘
97
+
98
+ 리뷰어: "*모든 LottoNumber를 가져오는 것 또한 메시지를 넘길 수 있겠네요* 🤠"
99
+
100
+ ### 14. *generateLottoBundle 포함 가능*
101
+
102
+ 리뷰어: "*generateLottoBundle 안에 포함되어도 될 것처럼 보이네요* 🤠"
103
+
104
+ ### 15. *amount 가시성*
105
+
106
+ 리뷰어: "*amount는 외부에서 사용하지 않으니 가시성을 수정해 볼 수* 있겠어요"
107
+
108
+ ### 16. *테스트명 + 변수명 일치*
109
+
110
+ 리뷰어: "*테스트명과 변수명도 무엇을 테스트하는지에 맞춰 변경하면 좋겠어요* 🤠"
111
+
112
+ ## 리뷰어 의견 요지
113
+
114
+ - **MIN/MAX *단일 출처 = LottoNumber***. *Generator는 메시지로 요청*.
115
+ - **`Pair? + nullable` *두 의미 손실*** → data class.
116
+ - **`a to b` *Pair Kotlin idiom***.
117
+ - **디폴트 파라미터 *위험 검토***.
118
+ - **`service` 패키지 *의도 검증***.
119
+ - **구매 수량 + 주문 클래스 *책임 분배***.
120
+ - **CsvSource *과사용 검토***.
121
+ - **`Lotto.contains(x)` *의미 중립*** — 보너스/일반 호출자 의미.
122
+ - **`LottoMachine = Lotto 발급* 현실 비유**.
123
+ - **출력 형식 *일관성*** (Int vs List).
124
+ - **InputView/OutputView *비대칭 점검***.
125
+ - **가시성 *최소화***.
126
+
127
+ - **대표 인용:**
128
+ > LottoNumber의 최대, 최소 값은 *LottoNumber만이 관심 있는 값*이죠. 자동 숫자 생성기는 LottoNumber에게 이렇게 요청할 수 있겠어요. *'너가 가진 모든 번호를 주겠니?'*
129
+ > — @krrong on `src/main/kotlin/lotto/service/RandomLottoNumbersGenerator.kt`
130
+
131
+ > 다이스의 설계에서 *OutputView는 Model을 알고 있는데, InputView는 왜 Model을 알지 못할까요*?
132
+ > — @krrong on `src/main/kotlin/lotto/view/InputView.kt`
133
+
134
+ > 실제로 로또를 사러 가서 *돈, 수동 번호를 주며 자동 몇 개요~ 하고 주문하는 것처럼* Order에 수동 로또 번호도 추가해 보면 어떨까요?
135
+ > — @krrong on `src/main/kotlin/lotto/domain/Order.kt`
136
+
137
+ > Lotto의 관점에서 바라봤을 때 *들어오는 값이 보너스 번호인지 그냥 번호인지 알 필요가 없으니까요*.
138
+ > — @krrong on `src/main/kotlin/lotto/domain/Lotto.kt`
139
+
140
+ ## 얻은 교훈
141
+
142
+ - **MIN/MAX *단일 출처 = LottoNumber***. *Generator는 LottoNumber.getAll() 메시지*로 요청. 강사 동일 가르침.
143
+ - **`Pair? + nullable`** = *두 의미 손실*. *data class*는 *필드 이름*, *Result 객체*는 *상태 표현*.
144
+ - **`a to b` Kotlin idiom** = *Pair* 생성 자연.
145
+ - **디폴트 파라미터 = *잘못된 추상화 신호***.
146
+ - **`service` vs `model` 패키지 *의도 검증*** — *Layered Architecture*가 *DDD*인지 *책임 분배*인지.
147
+ - **`Order` 도메인 객체** — *돈 + 수동 번호 + 자동 수*를 *하나의 메시지*로. *현실 메타포* 충실.
148
+ - **CsvSource *과사용*** — *테스트 1개면 vanilla `@Test`*.
149
+ - **`Lotto.contains(x)` *의미 중립*** — 도메인은 *값 검사*만, *의미 분류*는 호출자.
150
+ - **`LottoMachine = Lotto 발급* 현실 비유** — *기계에게 로또 몇 장 줘* + *상점에서 어떤 기계 사용할지 결정*. PR #131 *Cashier-Machine 흐름*과 같은 결.
151
+ - **출력 형식 *일관성*** — `Int`와 `List`가 *섞이면* 호출자 *어떤 형식 기대*에 혼란.
152
+ - **InputView/OutputView *비대칭 점검*** — *OutputView는 Model 알고*, *InputView는 Model 모름*은 *비대칭 신호*. 둘 다 Model 가능.
153
+ - **가시성 *최소화*** — *외부 사용 없으면 private*.
154
+ - **테스트명 + 변수명 일치** — *변수명이 테스트 의도 드러내야*.
155
+ - **함수 *포함 가능성*** — *별도 함수가 의미가 약하면* 통합 검토.
@@ -0,0 +1,143 @@
1
+ # PR #69 — [오둥이] 1단계 로또
2
+
3
+ - **Reviewee:** [@murjune](https://github.com/murjune)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/69
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag (규일)
7
+ - **라인 코멘트:** 43 (리뷰어 31 + 학생 12)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **원시값 포장** — 리뷰어 칭찬: "*원시값 포장 잘해 주셨네요*👍".
12
+ - **`init` 검증** — "*init 블록을 통한 초기 Validation Check 아주 좋네요*👍".
13
+ - **`companion object` 상수** — "companion object를 통한 *상수값 관리 좋습니다*💯".
14
+ - **`operator fun contains`** — `number in lotto` 표현. 칭찬: "*operator 함수의 활용 좋습니다*~".
15
+ - **`fun interface LottoGenerator`** — SAM. 칭찬: "interface의 활용 *정말 좋네요*💯".
16
+ - **`value class`** — 사용.
17
+ - **`LOTTO_NUMBER_RANGE`** — 칭찬: "범위 지정 좋습니다👍".
18
+ - **테스트 정밀도** — "*Lotto에서 들어갈 수 있는 모든 경우에 대해서 테스트*해 주셨네요💯".
19
+ - **`junit @ParameterizedTest`** 활용.
20
+
21
+ ## 못한 점 (설계 관점)
22
+
23
+ ### 1. Controller가 *runCatching*으로 검증
24
+
25
+ ```kotlin
26
+ fun run() {
27
+ val purchaseMoney = runCatching {. }.getOrElse {. }
28
+ }
29
+ ```
30
+
31
+ 리뷰어: "*runCatching을 사용한 이유가 궁금*합니다🤔 *해당 내용을 보면 inputView에 대한 Validation 실패인데 과연 해당 내용을 체크해 주는 게 Controller에서 담당해야 할 기능인지에 대해서도 고민*해 볼 필요가 있을 것 같습니다!" — *Controller가 검증 책임*인가 *InputView/도메인*인가. PR #36 (galcyurio)과 같은 *Elizarov 글* 시리즈.
32
+
33
+ ### 2. `operator fun contains` *의도 메타-질문*
34
+
35
+ ```kotlin
36
+ class Lotto {
37
+ operator fun contains(number: LottoNumber): Boolean =.
38
+ }
39
+ ```
40
+
41
+ 리뷰어: "operator 함수의 활용 좋습니다~ 고민해 볼 내용이 *operator 함수로 작성하신 이유가 궁금*합니다🤔" — *Kotlin idiom* `number in lotto` 표현을 *도메인 어휘 일치*로 정당화해야.
42
+
43
+ ### 3. `let { }` 가독성 — *apply/forEach* 대안
44
+
45
+ ```kotlin
46
+ return getRankMap().let {. }
47
+ ```
48
+
49
+ 리뷰어: "*let을 사용하는 것도 좋기는 하지만 좀 더 의미를 명확하게* 아래처럼 하는 방법도 있을 것 같아서 참고 부탁드립니다~ 1. *getRankMap().apply {. }* 2. *getRankMap().ranks.forEach {. }*" — *scope function*의 의도 (변환/this 설정/부수효과)를 *어휘 일치*로.
50
+
51
+ ### 4. `fun interface LottoGenerator` *키워드 이유*
52
+
53
+ ```kotlin
54
+ fun interface LottoGenerator {
55
+ fun generate(): List<LottoNumber>
56
+ }
57
+ ```
58
+
59
+ 리뷰어: "*LottoGenerator interface 앞에 fun 키워드가 붙은 이유가 궁금*합니다🤔" — *SAM (Single Abstract Method)*로 *람다 변환 가능*. 의도 명시.
60
+
61
+ ### 5. `value class` vs `data class` — 메타-질문 반복
62
+
63
+ 리뷰어: "*value class를 사용해 주셨군요*👍 수정이 필요한 것은 아니고 같이 고민해 보면 좋을 것 같아서 코멘트 남겨 두었습니다~ *value class와 data class는 어떤 차이점이 존재*할까요?? 해당 내용을 *value class로 작성하신 이유*가 궁금합니다!"
64
+
65
+ ### 6. *1..45 변경 시 깨질 위험*
66
+
67
+ 리뷰어: "*그럴 일은 없겠지만 1..45라는 최소, 최대값이 만약 바뀌게 된다면, 해당 기능은 사용을 못하게 될 텐데, 확장성을 위해서 고민*을 해 보는 것도 좋을 것 같습니다💪"
68
+
69
+ ### 7. `ConsoleLottoGameInputView` *class* 선택 이유
70
+
71
+ 리뷰어: "*ConsoleLottoGameInputView를 class로 작성하신 이유가 궁금*합니다!🤔" + "*ConsoleLottoGameOutputView를 class로 작성하신 이유가 궁금*합니다!🤔" — *object vs class* 선택 정당화.
72
+
73
+ ### 8. 테스트 *랜덤 시나리오 부재*
74
+
75
+ 리뷰어: "*로또 번호 생성기에 대해서 주어진 값을 테스트하는 것도 좋지만, 랜덤으로 번호가 주여졌을 경우도 테스트해 보는 것도 좋은 경험*이 될 것 같다는 생각이 듭니다!💪" + "*해당 부분도 setUp을 랜덤하게 구현될 수 있도록 고민*해 보는 것도 좋을 것 같습니다!🤔"
76
+
77
+ ### 9. 매직 넘버 `-1, 10, 1` 상수화
78
+
79
+ 리뷰어: "*하드 코딩으로 들어간 -1, 10, 1에 대해서 상수 값으로 분류*를 해 보는 것도 고민해 볼 필요는 있을 것 같습니다!💪"
80
+
81
+ ### 10. EOF 설정 + 디버깅용 *println*
82
+
83
+ 리뷰어: "*다음 설정 옵션을 활성화하여 EOF 경고를 없애*주세요🥲 *File > Preferences > Editor > General > Ensure every saved file ends with a line break*" + 디버깅 코드: "*해당 내용이 들어간 이유가 있을까요*??😅"
84
+
85
+ ### 11. *공통 테스트 데이터* — `DEFAULT_LOTTO`
86
+
87
+ 리뷰어: "Lotto(1, 2, 3, 4, 5, 6)의 경우 *테스트에서 많이 사용*되고 있는데, *이를 재사용하기 위해서 DEFAULT_LOTTO = Lotto(1, 2, 3, 4, 5, 6) 등으로 작성*해 보시는 것도 고민해 보면 좋을 것 같습니다!" — test fixture.
88
+
89
+ ### 12. `BonusLottoNumber`의 `List<LottoNumber>` *의존*
90
+
91
+ ```kotlin
92
+ class BonusLottoNumber(val lottoNumber: LottoNumber, winningNumbers: List<LottoNumber>) {. }
93
+ ```
94
+
95
+ 리뷰어: "*BonusLottoNumber가 List<LottoNumber>에 대한 의존성을 가지게* 되었군요! *보너스 번호의 경우 로또 결과에 대해서 중복값이면 안 된다는 이유로 인하여 발생한 것이라면 괜찮아 보이기*는 합니다~" — *의존 정당화*는 *도메인 invariant*가 기준.
96
+
97
+ ### 13. *예외 케이스 인식* — 리뷰어 격려
98
+
99
+ 리뷰어: "*개발자가 알고 있는 경우 외의 예외 케이스는 언제든 발생*할 수 있어서, 코멘트 남겨 둔 내용이었습니다~" — *알고 있는 예외 + 알 수 없는 예외*. *방어적 코딩*의 범위 인식.
100
+
101
+ ## 리뷰어 의견 요지
102
+
103
+ - ***Controller의 검증 책임*** 점검 — *InputView/도메인*과 분리.
104
+ - **`operator fun contains` *도메인 어휘 일치***.
105
+ - **`let` 보다 *명확한 scope function* (apply/forEach)**.
106
+ - **`fun interface` *SAM 의도 명시***.
107
+ - **`value class` vs `data class` *근거 정리***.
108
+ - **`1..45` 변경 *확장성***.
109
+ - **`InputView/OutputView` *class vs object* 정당화**.
110
+ - **테스트 *랜덤 시나리오***.
111
+ - **매직 넘버 *상수화***.
112
+ - **EOF / 디버깅 코드 *제거***.
113
+ - **`DEFAULT_LOTTO` test fixture**.
114
+ - **`BonusLottoNumber`의 *도메인 의존* 정당화 OK**.
115
+
116
+ - **대표 인용:**
117
+ > runCatching을 사용한 이유가 궁금합니다🤔 *해당 내용을 보면 inputView에 대한 Validation 실패인데 과연 해당 내용을 체크해 주는 게 Controller에서 담당해야 할 기능인지*에 대해서도 고민해 볼 필요가 있을 것 같습니다!
118
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
119
+
120
+ > let을 사용하는 것도 좋기는 하지만 *좀 더 의미를 명확하게* 아래처럼 하는 방법도 있을 것 같아서 참고 부탁드립니다.
121
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
122
+
123
+ > 1..45라는 *최소, 최대값이 만약 바뀌게 된다면, 해당 기능은 사용을 못하게 될 텐데, 확장성을 위해서 고민*을 해 보는 것도 좋을 것 같습니다.
124
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/LottoNumber.kt`
125
+
126
+ > 개발자가 알고 있는 경우 외의 *예외 케이스는 언제든 발생*할 수 있어서, 코멘트 남겨 둔 내용이었습니다.
127
+ > — @Gyuil-Hwnag (방어적 코딩 격려)
128
+
129
+ ## 얻은 교훈
130
+
131
+ - **Controller *검증 책임*은 *얇아야*** — *InputView*는 *형식*, *도메인*은 *논리*. *Controller의 runCatching*은 *어느 단계 검증인지* 모호.
132
+ - **`operator fun contains`는 *도메인 어휘 일치*가 정당화** — *Kotlin idiom*만 보고 도입하면 *어휘 충돌*.
133
+ - **`let` 보다 *의도 명확*** — `apply` (this 설정), `forEach`, `also` (부수효과). *Kotlin scope function*은 *부수 의도 차이*가 핵심.
134
+ - **`fun interface` = *SAM 명시*** — *람다로 즉시 사용* 가능. *명시적 단일 메서드*.
135
+ - **`value class`는 *최적화 + 타입 안전*** — `data class`는 *힙 + copy/equals 자동*. *작은 래퍼*에 부적합.
136
+ - **`1..45` *상수 확장성*** — *변경 가능성*이 *낮아도 단일 변경 지점* 가치.
137
+ - **`InputView` *class vs object*** — *변경 가능성*이 *class* 선택 기준.
138
+ - **테스트 *랜덤 시나리오*** — *주어진 값*과 *랜덤 시나리오* 모두. *Random 외부 주입*이 *재현 가능 랜덤*.
139
+ - **매직 넘버 *모두 상수화*** — *-1, 10, 1*도 *의미*가 있으면 상수.
140
+ - **EOF / 디버깅 코드 = *PR 셀프 리뷰 항목***.
141
+ - **`DEFAULT_LOTTO` test fixture** — *공통 데이터 재사용*. PR #21 *MethodSource 지역성*과 함께 *테스트 가독성*의 균형.
142
+ - ***도메인 의존 정당화 = invariant*** — `BonusLottoNumber`가 `winningNumbers` 의존하는 건 *중복 방지 invariant* 표명. 결합도라기보다 *모델링*.
143
+ - **방어적 코딩 = *알 수 있는 + 알 수 없는 예외*** — *방어 범위 자각*이 *과방어 회피*.
@@ -0,0 +1,177 @@
1
+ # PR #90 — [오둥이] 2단계 로또
2
+
3
+ - **Reviewee:** [@murjune](https://github.com/murjune)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/90
5
+ - **단계:** 2단계 (수동 로또)
6
+ - **리뷰어:** @Gyuil-Hwnag (규일)
7
+ - **라인 코멘트:** 45 (리뷰어 33 + 학생 12)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`LottoCount` value class + `require`** — 리뷰어 칭찬: "require에 대한 활용 *정말* 좋네요👍".
12
+ - **`AutoLottieGenerator` / `ManualLottieGenerator` 인터페이스 분리** — Strategy 시도.
13
+ - **`Thread.setDefaultUncaughtExceptionHandler` 도입** — 학생: "*추가된 이유를 알고 있습니다*🤔".
14
+ - **`tailrec` 키워드** — 재귀 함수 최적화 의식.
15
+ - **`data object` 사용** — Kotlin 1.9+ 어휘 활용.
16
+ - **`@BeforeEach` 테스트 fixture 활용** — 칭찬: "*기능 활용 좋습니다*~👍".
17
+ - **패키지 분리** — 칭찬: "패키지 분리 좋습니다~👍".
18
+ - **`LottoResult` Success/Failure 상태값** — 학생 후속 도입.
19
+
20
+ ## 못한 점 (설계 관점)
21
+
22
+ ### 1. *try-catch 요구사항* — runCatching이 답인가?
23
+
24
+ 리뷰어: "*이번 미션 힌트에서 '일반적인 코틀린 코드에서 try-catch를 사용하지 않는다.'라는 요구사항*이 있는데, *이에 대한 요구사항이 try-catch 대신에 runCatching을 사용하는 것일까??* 고민해 보셔도 좋을 것 같습니다! 관련해서 읽어 보시면 좋은 글 있어서 첨부하였습니다~ https://elizarov.medium.com/kotlin-and-exceptions-8062f589d07" — *Elizarov 글*은 PR #36과 같은 인용 (다른 강사). *catch의 다른 형태가 아닌 본질*: 정상 흐름은 *null + while 패턴*.
25
+
26
+ ### 2. `View`에서 `Int` 반환 — *Int → LottoNumber 추상화*
27
+
28
+ ```kotlin
29
+ class ConsoleLottoGameInputView {
30
+ fun readWinning(): List<Int> {. } // ⚠ 원시
31
+ }
32
+ ```
33
+
34
+ 리뷰어: "*요구사항에 있는 대로 Int를 LottoNumber로 추상화*해 보는 것도 좋을 것 같습니다!! *과연 해당 로직은 View가 책임을 가지고 있는 게 맞는지도 고민*해 볼 필요도 있겠네요~💪" — *View → Domain 의존*은 허용. *원시값 포장*은 *경계가 명확한 곳*에.
35
+
36
+ ### 3. *Generator 인터페이스 2개* 통합?
37
+
38
+ ```kotlin
39
+ interface AutoLottieGenerator { fun generate(.): List<Lotto> }
40
+ interface ManualLottieGenerator { fun generate(.): List<Lotto> }
41
+ ```
42
+
43
+ 리뷰어: "AutoLottieGenerator과 ManualLottieGenerator의 *generate한다는 같은 기능을 가진 인터페이스가 두 가지가 존재*하는데 *두 가지의 인터페이스를 하나로 통합할 수* 있을까요??🤔"
44
+
45
+ 리뷰어 후속 (sealed class 제안):
46
+ ```kotlin
47
+ sealed class LottoGeneratorType {
48
+ data class Manual(val cost: Money): LottoGeneratorType()
49
+ data class Auto(val lottoNumbers: List<List<LottoNumber>>): LottoGeneratorType()
50
+ }
51
+
52
+ interface LottoGenerator {
53
+ fun generate(type: LottoGeneratorType): List<Lotto>
54
+ }
55
+
56
+ class DefaultLottoGenerator: LottoGenerator {
57
+ override fun generate(type: LottoGeneratorType): List<Lotto> {
58
+ return when (type) {
59
+ is LottoGeneratorType.Manual -> {}
60
+ is LottoGeneratorType.Auto -> {}
61
+ }
62
+ }
63
+ }
64
+ ```
65
+ "다만 위와 같은 형태가 되려면 *Lotto와 LottoResult, 수동 & 자동 로또 생성기 등에 대한 코드를 통합하는 작업이 들어가야* 겠군요!"
66
+
67
+ ### 4. `BonusLottoNumber?`, `Count?` *nullable* — Result 타입 권장
68
+
69
+ ```kotlin
70
+ class BonusLottoNumber(lottoNumber: GeneralLottoNumber?,.) {. }
71
+ fun createBonusLottoNumber(): BonusLottoNumber? {. } // ⚠ nullable
72
+ ```
73
+
74
+ 리뷰어 (3회 반복): "BonusLottoNumber를 *nullable하도록 작성하신 이유*가 있을까요??🤔" + "Count도 *nullable*하도록 작성하신 이유가 있을까요??🤔" + "*nullable하게 반환하는 것보다 성공, 실패 등의 상태 등으로 만들어 반영*해 보는 것도 좋을 것 같다는 생각이 듭니다!" 학생 후속: `LottoResult.Success` / `LottoResult.Failure` 도입. 리뷰어 추가: "*LottoResult에 대한 조건이 점점 증가하게 된다면, 그에 따라서 모든 내용을 작성하게 될 수 있으므로 LottoResult.Failure이라는 것으로 한 번에 묶는 것도 고민*해 보면 좋을 듯 싶습니다~"
75
+
76
+ ### 5. *재실행 패턴* — 사용하지 않는 반환값
77
+
78
+ ```kotlin
79
+ private fun readBonusLottoNumber(): BonusLottoNumber? {
80
+ return runCatching {. }.getOrElse {
81
+ readBonusLottoNumber() // ⚠ return을 다시 안 씀
82
+ }
83
+ }
84
+ ```
85
+
86
+ 리뷰어: "사실상 아래의 내용들은 *return을 하지만 전혀 사용을 안 하고 있다*는 생각이 드네요🥲 *재실행을 하더라도 해당 내용들을 유의미하게 사용하여 재실행을 시키는 방법을 고민*해 볼 수 있을 것 같습니다!" + 후속 (오류 메시지 출력): "*BonusLottoNumber의 생성자에서 적용해 둔 '%s: 보너스 번호는 우승 로또 번호와 중복될 수 없습니다.'가 출력이 되도록 구현*해 보는 것도 좋을 것 같습니다~💪" + "*단순 재실행이 아닌 Money에서 정의한 오류 문구를 출력하고 재실행을 시키는 방식*으로 수정해 봐도 좋을 것 같다는 생각이 듭니다~💪" — *재시도와 사용자 피드백*은 별개 책임.
87
+
88
+ ### 6. *팩토리 함수 vs 부 생성자*
89
+
90
+ ```kotlin
91
+ class BonusLottoNumber(.) {
92
+ companion object {
93
+ fun of(.): BonusLottoNumber? {. }
94
+ }
95
+ }
96
+ ```
97
+
98
+ 리뷰어: "*팩토리 함수를 만들었지만 현재 팩토리 함수는 부 생성자를 사용하는 것보다 좋은 효과를 보여주지는 않는 것 같*아 보이긴 합니다! (companion object의 of로 해당 BonusLottoNumber를 만들어서 사용하는 것과 *BonumLottoNumber.lottoNumber로 사용하는 것을 비교*해 봤을 때입니다!)" + "*어떤 상황에서 생성자보다 팩토리 함수를 사용하는 것이 더 나을까요*?" + 후속:
99
+ ```kotlin
100
+ val bonusLottoNumber = BonusLottoNumber(GeneralLottoNumber(bonusNumber), winningLottoNumbers)
101
+ bonusLottoNumber.lottoNumber.toIntOrNull() ?: createBonusLottoNumber(winningLottoNumbers)
102
+ ```
103
+ "*현재 작성해 주신 내용을 보면 팩토리 함수를 만들었지만, '팩토리 함수가 있음으로서 장점이 있는가?'라는 물음에는 해결이 되지 않는 것* 같습니다!!"
104
+
105
+ → *팩토리 함수 = 구분되는 의도 (네이밍, 분기, 검증)이 있을 때*.
106
+
107
+ ### 7. *Money/Count 무한 재귀* — 입력 없을 시
108
+
109
+ 리뷰어: "*Validation Check 너무 잘해 주셨네요*~👍 Money와 Count에 대한 *입력은 없을 경우 무한 재귀로 빠지*는군요~" — *재시도 종료 조건* 부재.
110
+
111
+ ### 8. `tailrec` *학생 의도*
112
+
113
+ 리뷰어: "tailrec 키워드를 통해서 *재귀 함수를 호출해 주셨군요*!! 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *tailrec을 사용함으로써 어떤 이점이 존재할까요*??🤔" — *꼬리 재귀 최적화* 이해 점검.
114
+
115
+ ### 9. `data object` vs `object`
116
+
117
+ 리뷰어: "*data object를 사용해 주셨군요*!! 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *object와 data object는 어떤 차이점이 있을까요*?🤔" — `data object`는 *toString, equals 명시 (Kotlin 1.9)*.
118
+
119
+ ### 10. `inline` 함수 *장점*
120
+
121
+ 리뷰어: "inline 함수로 *작성을 해 주셨군요*~ inline 함수를 사용함으로써 *얻을 수 있는 장점은 어떤 것이 있을까요*??🤔 고민해 보면 추후에 좋을 내용인 것 같아서 남겨 두었습니다!" — *고차 함수 호출 비용 회피*.
122
+
123
+ ### 11. `0` 매직 넘버 — `INIT_COUNT` 상수화
124
+
125
+ 리뷰어: "해당 내용에 들어간 *0도 INIT_COUNT (예시) 등으로 묶는 게 가독성 측면에서 이점이 있을지* 고민해 보는 것도 좋을 것 같습니다~"
126
+
127
+ ### 12. *테스트 fixture* 개념
128
+
129
+ 리뷰어: "테스트 코드에 대해서 전반적으로 고민해 보면 좋을 내용인 것 같아서 코멘트 남겨 두었습니다~ *테스트 코드에는 test fixture라는 개념이 존재*하는데 내용을 살펴 보고 해당 내용을 어떻게 수정하면 좋을지 고민해 보시면 좋을 것 같다는 생각이 듭니다!💪" — *공통 테스트 데이터 설정 + 재사용*.
130
+
131
+ ### 13. 테스트 함수명 *모호*
132
+
133
+ 리뷰어: "*해당 테스트 함수를 보고 어떤 기능을 테스트하는 함수인지 알 수 있게 네이밍 고민*해 보셔도 좋을 것 같습니다!🤔"
134
+
135
+ ### 14. *자동 vs 수동 generator 통합*
136
+
137
+ 리뷰어: "프로젝트의 많은 구성이 바뀌겠지만 추후에 *로또 자동, 수동 생성기를 하나의 generate 함수에서 하나로 통합해 보는 작업*을 해 보셔도 좋을 것 같습니다!💪"
138
+
139
+ ## 리뷰어 의견 요지
140
+
141
+ - ***try-catch 미사용 = catch 표현 회피*** 아니라 *예외 발생 자체 줄이기*. Elizarov 글 권장.
142
+ - **`View`가 *도메인 타입 반환* 가능** — *원시값 포장*은 *경계*에서.
143
+ - **`AutoGenerator` + `ManualGenerator` → *sealed class + 단일 인터페이스***.
144
+ - **`nullable` 반환 → *Result/Success/Failure***.
145
+ - **재시도 패턴 + *오류 메시지 활용***.
146
+ - **팩토리 함수 = *구분 의도가 있을 때***.
147
+ - **`tailrec`, `data object`, `inline` *학습 점검***.
148
+ - **테스트 fixture 활용**.
149
+ - **자동/수동 generator 통합 가능**.
150
+
151
+ - **대표 인용:**
152
+ > 이번 미션 힌트에서 "*일반적인 코틀린 코드에서 try-catch를 사용하지 않는다.*"라는 요구사항이 있는데, *이에 대한 요구사항이 try-catch 대신에 runCatching을 사용하는 것일까*??
153
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/controller/LottoController.kt`
154
+
155
+ > 사실상 아래의 내용들은 *return을 하지만 전혀 사용을 안 하고 있다*는 생각이 드네요🥲
156
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/view/ConsoleLottoGameInputView.kt`
157
+
158
+ > 현재 작성해 주신 내용을 보면 팩토리 함수를 만들었지만, *"팩토리 함수가 있음으로서 장점이 있는가?"라는 물음에는 해결이 되지 않는 것 같*습니다!!
159
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/BonusLottoNumber.kt`
160
+
161
+ > 두 가지의 인터페이스를 하나로 통합할 수 있을까요?🤔 (sealed class 예시 포함)
162
+ > — @Gyuil-Hwnag on `src/main/kotlin/lotto/domain/LottoGenerator.kt`
163
+
164
+ ## 얻은 교훈
165
+
166
+ - **`try-catch 미사용` 요구사항 = *catch의 다른 형태가 아닌 본질***. *runCatching*도 *예외 사용*. 정상 흐름은 *null + while* 또는 *Result*.
167
+ - **`View`가 도메인 타입 반환 OK** — *Presentation → Domain 의존*은 허용 (PR #21 galcyurio도 같은 의견).
168
+ - **`sealed class` + *단일 인터페이스*가 *2개 인터페이스 + when 분기*보다 자연**.
169
+ - **`nullable` 반환 → *Result/Success/Failure 상태***. nullable은 *원인 정보 손실*.
170
+ - **재시도 ≠ 사용자 피드백** — `runCatching {. }.getOrElse { recurse() }`는 *오류 메시지 출력*과 *재시도*를 분리.
171
+ - **팩토리 함수 = *생성자보다 의도가 명확*할 때만** — `BonusLottoNumber.of(n)`와 `BonusLottoNumber(n)`이 같은 효과면 *팩토리 무용*. 분기 (`Range A → typeA, Range B → typeB`)나 *서로 다른 입력 변환*일 때 가치.
172
+ - **`tailrec` *꼬리 재귀 최적화*** — JVM에서 *스택 오버플로 회피*.
173
+ - **`data object` = *toString/equals 자동* (Kotlin 1.9)** — *Sentinel 객체* (NONE, EMPTY 등)에 유용.
174
+ - **`inline` 함수 *고차 함수 호출 비용 회피*** — 람다 객체 생성 → 인라인.
175
+ - **재시도 *종료 조건*** — 입력이 없으면 *무한 재귀*. *try N times* 또는 *EOF 처리*.
176
+ - **테스트 *fixture*** — `@BeforeEach`로 *공통 setup*. 또는 *factory function*.
177
+ - **자동/수동 generator 통합 = *Open-Closed*** — *제 3 종류 추가*에도 인터페이스 무변경.
@@ -0,0 +1,69 @@
1
+ # PR #20 — [반달] 1단계 로또
2
+
3
+ - **Reviewee:** [@no1msh](https://github.com/no1msh)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/20
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @woowajames
7
+ - **라인 코멘트:** 49
8
+
9
+ ## 잘한 점
10
+
11
+ - **`LottoNumber` value class** — 칭찬받음.
12
+ - **`Rank` enum**, `Money`/`Bank`/`Lotto` 분리.
13
+
14
+ ## 못한 점 + 핵심 지적
15
+
16
+ ### 1. lint 실패 다수
17
+
18
+ > 대부분의 테스트 코드에서 lint 테스트가 실패하고 있습니다. 인텔리제이에서 제공하는 정렬 기능을 습관화하고 이용해보세요.
19
+
20
+ ### 2. 정상 케이스 테스트 누락
21
+
22
+ ```kotlin
23
+ @Test fun `범위 밖이면 예외`() {. } // 예외만 테스트
24
+ ```
25
+
26
+ > 범위 밖에 있는 경우에 대한 검증을 했다면 범위 내에 에러가 발생하지 않는 검증은 불필요한 검증으로 보입니다. 오히려 create()가 정상적으로 동작했는지에 대한 검증이 필요할 것 같아요. create()의 결과가 무엇이고 제대로 그 결과가 나왔는지 확인해볼까요?
27
+
28
+ ### 3. Money 테스트 — 정상 동작 미검증
29
+
30
+ ```kotlin
31
+ @Test fun `1000원 단위가 아니면 에러`() {. }
32
+ ```
33
+
34
+ > Money 클래스가 어떤 값을 넣어도 에러만 발생하고 있다면 제대로 동작하는 것일까요?
35
+
36
+ → *Happy path* 우선, *예외*는 부차.
37
+
38
+ ### 4. Rank 테스트 2등만
39
+
40
+ → 모든 등수 테스트.
41
+
42
+ ### 5. `check` 함수명 → Kotlin API와 충돌
43
+
44
+ ```kotlin
45
+ fun check(.) {. }
46
+ ```
47
+
48
+ > check는 코틀린 api로 존재하기 때문에 함수명에 사용하면 오해의 여지가 있을 수도 있을 것 같아요.
49
+
50
+ → stdlib과 *동명* 회피.
51
+
52
+ ### 6. RandomLottoGenerator가 다른 클래스 상수 참조
53
+
54
+ ```kotlin
55
+ class RandomLottoGenerator {
56
+ fun generate(): Lotto {
57
+ (LottoNumber.MIN..LottoNumber.MAX).shuffled() // ⚠ LottoNumber 상수 의존
58
+ }
59
+ }
60
+ ```
61
+
62
+ > 다른 클래스의 상수를 참조해서 사용하면 의존성이 생깁니다. 의존성 주입(메서드 주입)을 받으면 어떨까요?
63
+
64
+ ## 얻은 교훈
65
+
66
+ - **Happy path 테스트 우선** — 예외만 검증 = 객체가 *제대로 동작하는지* 확신 못함.
67
+ - **stdlib 동명 회피** — `check`, `apply`, `let` 같은 Kotlin 함수와 같은 이름.
68
+ - **다른 클래스의 상수 참조 = 결합도 ↑**. 의존성 주입 또는 자기 상수 보유.
69
+ - **Rank 케이스 전부 테스트** — 각 등수 = 비즈니스 분기.