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,137 @@
1
+ # PR #72 — [서기] 1단계 로또
2
+
3
+ - **Reviewee:** [@Yunseok-Nam](https://github.com/Yunseok-Nam)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/72
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @vagabond95 (스카이)
7
+ - **라인 코멘트:** 24 (리뷰어 16 + 학생 8)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **인터페이스 활용** — 리뷰어 칭찬: "인터페이스 활용 👍".
12
+ - **`Rank` 보너스 번호 체크 분기 통합** — 리뷰어 칭찬: "*보너스 번호 체크 여부를 넣어서, 2등에 대한 별도 분기 처리를 하지 않아도 되겠*네요! *보통 놓치기 쉬운 부분인데 잘 구현해 주셨습니다* 👍 💯".
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ ### 1. `PurchaseAmount` 만들었지만 *Int 반환*
17
+
18
+ ```kotlin
19
+ class PurchaseAmount(val value: Int) {. }
20
+ fun calculateCount(amount: PurchaseAmount): Int = amount.value / PURCHASE_UNIT // ⚠
21
+ ```
22
+
23
+ 리뷰어: "*PurchaseAmount 클래스를 만들어 주셨는데, Int 타입을 리턴해 주게 된다면 해당 클래스를 사용하는 의미가 반감*될 것 같아요." — *값 객체 만들었으면 그 객체로 다루기*.
24
+
25
+ ### 2. *PURCHASE_UNIT을 Controller가 앎*
26
+
27
+ ```kotlin
28
+ val count = amount.value / PURCHASE_UNIT // ⚠
29
+ ```
30
+
31
+ 리뷰어: "*PURCHASE_UNIT는 PurchaseAmount 내부에서 알고 있으니, PurchaseAmount에서 직접 이 값을 리턴*해 주는 것은 어떨까요? *controller에서 모델에 대한 세부 사항에 되도록 의존하지 않도록* 구현해 보면 좋을 것 같아요 :)" + "*PURCHASE_UNIT이라는 상수 중복도 제거*할 수 있게 되구요." — Tell, Don't Ask.
32
+
33
+ ### 3. *값 재사용 없으면 바로 return*
34
+
35
+ 리뷰어: "*값을 재사용하지 않는다면 바로 리턴해도 좋겠*네요!" — 불필요한 중간 변수.
36
+
37
+ ### 4. `generateLotto` *LottoStore 반환* — 시그니처 모순
38
+
39
+ ```kotlin
40
+ fun generateLotto(): LottoStore =. // ⚠
41
+ ```
42
+
43
+ 리뷰어: "*generateLotto 함수인데 리턴은 LottoStore인 게 조금 어색*한 것 같아요." — *함수명-반환 타입* 일치.
44
+
45
+ ### 5. *split이 도메인에* — View 책임
46
+
47
+ ```kotlin
48
+ fun parse(input: String): List<Int> = input.split(SPLIT_DELIMITER).map { it.toInt() } // ⚠
49
+ ```
50
+
51
+ 리뷰어: "*SPLIT_DELIMITER는 view 레벨에서 알 수 있는 값이므로, split 과정은 view에서 수행하는 것이 적절*하지 않을까요?".
52
+
53
+ ### 6. *중복 방지 자료구조 (Set)*
54
+
55
+ ```kotlin
56
+ class Lotto(val numbers: List<Int>) {
57
+ init { require(numbers.distinct().size == 6) } // ⚠ List + 검증
58
+ }
59
+ ```
60
+
61
+ 리뷰어: "검증을 꼼꼼하게 잘 해 주셨네요 👍 그런데, *로또 번호의 경우 특성상 값이 겹치면 안 되기 때문에 아예 중복을 막을 수 있는 자료구조를 사용*해 보는 것도 좋을 것 같아요. *내부에서는 검증이 완료되었지만, 외부에서는 자료구조만 봤을 때 중복이 됐는지 되지 않았는지 알 수 없으니 또다시 중복 처리를 이어나갈 가능성도 있구요*!" — *invariant를 타입으로 표현*.
62
+
63
+ ### 7. *외부에서 컬렉션 수정 가능* — 일급 컬렉션 의미 반감
64
+
65
+ 리뷰어: "*외부에서 컬렉션 수정이 가능한 타입*이네요. *이럴 경우 일급 컬렉션은 단순한 wrapping class 밖에 안 되기 때문에 활용하는 이유가 반감*될 것 같아요." — *MutableList* 노출 X.
66
+
67
+ ### 8. *Controller가 lottos를 상태로* — Lottos와 역할 중복
68
+
69
+ ```kotlin
70
+ class LottoController {
71
+ private val lottos: MutableList<Lotto> = mutableListOf() // ⚠
72
+ }
73
+ ```
74
+
75
+ 리뷰어: "*lottos를 상태로 가지고 있을 필요가 있을까요*~? *이로 인해 lottos와 역할이 상당히 겹쳐* 보여요." — *Controller에 상태* = *Lottos와 책임 중복*.
76
+
77
+ ### 9. *Lottos가 스스로 수행*
78
+
79
+ 리뷰어: "*이 로직도 Lottos가 '스스로' 수행하는 것이 더 자연*스럽지 않을까요~?" — Tell, Don't Ask.
80
+
81
+ ### 10. *`Lotto` vs `Lotto 개수`* — 메서드 위치
82
+
83
+ 리뷰어: "*Lotto보다는 Lotto의 개수와 관련된 함수에 가깝지 않을까요*~?" — *함수 위치 = 책임 일치*.
84
+
85
+ ### 11. *Set이면 `distinctBy` 불필요*
86
+
87
+ 리뷰어: "*set 자료구조로 변경되었으므로, distinctBy 처리가 제거되어도 동일한 결과*가 나올 것 같아요!" — *자료구조 invariant*가 *검증 코드 대체*.
88
+
89
+ ### 12. `object` *vs class* — 학생 자가 질문
90
+
91
+ 리뷰어: "*해당 클래스를 object로 선언해 주었을 때, 장/단점은 무엇이 있을까요*? 추가로 *object 클래스를 활용하는 기준이 따로 있으실지* 궁금합니다 :)" — 패턴.
92
+
93
+ ### 13. *purchaseAmount = 0* 예외
94
+
95
+ 리뷰어: "*purchaseAmount가 0인 경우에 대한 예외 처리가 필요*해 보여요!"
96
+
97
+ ## 리뷰어 의견 요지
98
+
99
+ - **값 객체 만들었으면 *그 객체로 다루기*** — Int 반환 = 의미 반감.
100
+ - **Controller가 모델 세부에 의존 X**.
101
+ - **함수명 = *반환 타입 일치***.
102
+ - **`split` *View 책임***.
103
+ - **중복 방지 = *Set 자료구조***.
104
+ - **컬렉션 외부 수정 *MutableList 노출 X***.
105
+ - **Controller 상태 vs Lottos = 책임 중복**.
106
+ - **Tell, Don't Ask** — Lottos 스스로.
107
+ - **함수 위치 = *책임 일치***.
108
+ - **자료구조 invariant** → 검증 코드 단순화.
109
+ - **0 예외 처리**.
110
+
111
+ - **대표 인용:**
112
+ > PurchaseAmount 클래스를 만들어 주셨는데, *Int 타입을 리턴해 주게 된다면 해당 클래스를 사용하는 의미가 반감*될 것 같아요.
113
+ > — @vagabond95 on `src/main/kotlin/lotto/domain/PurchaseAmount.kt`
114
+
115
+ > 외부에서는 자료구조만 봤을 때 *중복이 됐는지 되지 않았는지 알 수 없으니 또다시 중복 처리를 이어나갈 가능성도 있*구요!
116
+ > — @vagabond95 on `src/main/kotlin/lotto/domain/Lotto.kt`
117
+
118
+ > 외부에서 컬렉션 수정이 가능한 타입이네요. 이럴 경우 *일급 컬렉션은 단순한 wrapping class 밖에 안 되기 때문에 활용하는 이유가 반감*될 것 같아요.
119
+ > — @vagabond95 on `src/main/kotlin/lotto/domain/Lottos.kt`
120
+
121
+ > 보통 놓치기 쉬운 부분인데 잘 구현해 주셨습니다 👍 💯
122
+ > — @vagabond95 on `src/main/kotlin/lotto/domain/Rank.kt`
123
+
124
+ ## 얻은 교훈
125
+
126
+ - **값 객체 *유지*** — `PurchaseAmount.numberOfLottos(): LottoCount`. *Int 반환*은 *값 객체 의미 반감*.
127
+ - **Controller *모델 세부 의존 X*** — `PURCHASE_UNIT` 같은 *도메인 상수*는 *도메인 객체 내부*에.
128
+ - **함수명 = *반환 타입 일치*** — `generateLotto(): LottoStore`는 *의도 불일치*.
129
+ - **`split`은 *View 책임*** — *delimiter*는 *입력 형식*에 속함.
130
+ - **중복 방지 *자료구조*** = *Set*. *invariant를 타입으로*.
131
+ - **`MutableList` 외부 노출 X** — *일급 컬렉션 의미*는 *불변 + 행위 부여*. *Mutable 노출*은 *wrapper 수준*.
132
+ - **Controller 상태 = *Lottos와 책임 중복*** — *상태 + 행위*가 *한 객체*에 응집해야.
133
+ - **Tell, Don't Ask** — `lottos.calculate()`, `lottos.match()`.
134
+ - **함수 위치 = *책임 일치*** — *Lotto 개수*는 *Lottos*. *Lotto 자체*는 *6개 번호*.
135
+ - **자료구조 invariant** = 검증 코드 단순. `Set.distinctBy` 불필요.
136
+ - **0 예외** — *경계값 처리*.
137
+ - **`object` 기준 *자가 정리*** — *상태 없음 + 단일 인스턴스 + 변경 가능성 낮음*. 패턴.
@@ -0,0 +1,17 @@
1
+ # PR #86 — [로또] 서기 2단계 미션
2
+
3
+ - **Reviewee:** [@Yunseok-Nam](https://github.com/Yunseok-Nam)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/86
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @vagabond95
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 핵심 지적
10
+
11
+ > 중첩된 컬렉션은 코드를 이해하기 어렵게 만드는 것 같아요. 중첩되지 않은 형태로 개선해볼 수 있을까요~?
12
+
13
+ → `List<List<Int>>` 같은 형태 대신 도메인 객체 (`List<Lotto>`)로.
14
+
15
+ ## 얻은 교훈
16
+
17
+ - **중첩 컬렉션 회피** — `List<List<T>>`는 의미 모호. 도메인 객체로 wrapping.
@@ -0,0 +1,62 @@
1
+ # PR #102 — [로또] 차람 2단계 미션
2
+
3
+ - **Reviewee:** [@aprilgom](https://github.com/aprilgom)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/102
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 46
8
+
9
+ ## 못한 점 + 핵심 지적
10
+
11
+ ### 1. `run()`이 너무 많은 일
12
+
13
+ ```kotlin
14
+ fun run() {
15
+ // 입력 + 검증 + 발급 + 매칭 + 출력
16
+ }
17
+ ```
18
+
19
+ → 함수 분리.
20
+
21
+ ### 2. `Money.divide` nullable 반환
22
+
23
+ ```kotlin
24
+ class Money {
25
+ operator fun div(other: Money): Money? =. // ⚠ nullable
26
+ }
27
+ ```
28
+
29
+ > 나눌경우 nullable하도록 설정하신 이유가 있을까요?? 이로 인하여 Money를 계산하는 부분에서 불필요한 nullcheck 하는 로직이 들어가고 있는 것 같습니다.
30
+
31
+ → 0 나눗셈은 예외 또는 *Optional 표현 명시*. 임의의 nullable 회피.
32
+
33
+ ### 3. 수동 로또 생성 객체 부재
34
+
35
+ ```kotlin
36
+ class RandomLottoTicketGenerator {. }
37
+ // ⚠ 수동 생성 객체 없음
38
+ ```
39
+
40
+ > 현재 RandomLottoTicket을 생성해주는 객체는 존재하지만 수동으로 로또 티켓을 만들어주는 내용은 존재하지 않는 것 같네요
41
+
42
+ → Strategy 인터페이스로 자동/수동 통합.
43
+
44
+ ### 4. `Rank.decideRank()` when 사용
45
+
46
+ ```kotlin
47
+ fun decideRank(.): Rank = when (.) {. }
48
+ ```
49
+
50
+ > decideRank 함수에서 Enum의 API를 활용하여 when식은 가능하면 쓰지 않고 구현해 보는 방식을 고민해보면 좋을 것 같다는 생각이 듭니다
51
+
52
+ → `entries.find {. } ?: MISS` 패턴.
53
+
54
+ ### 5. `initList` 메서드명 — 의미 불명
55
+
56
+ > 코드양이 많아질 경우 initList라는 네이밍에 대해서 고민해보는 것도 좋을 것 같습니다!
57
+
58
+ ## 얻은 교훈
59
+
60
+ - **nullable의 의미는 *부재***. 0 나눗셈 같은 *오류* 표현 X.
61
+ - **자동/수동 통합** = Strategy 인터페이스 + 두 구현체.
62
+ - **enum API > when 분기** — `entries.find {. }`로 fallback.
@@ -0,0 +1,146 @@
1
+ # PR #64 — [차람] 1단계 로또
2
+
3
+ - **Reviewee:** [@aprilgom](https://github.com/aprilgom)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/64
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag (규일)
7
+ - **라인 코멘트:** 50
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`LottoPurchase`, `LottoResult`, `LottoTicket` 분리 + 원시값 포장 + init 검증** — 리뷰어 칭찬: "*LottoTicket 원시값 포장과 init으로 초기 Validation Check 좋네요*~👍".
12
+ - **`enum class` 활용** — 리뷰어 칭찬: "enum class에 대한 활용 좋네요~".
13
+ - **`companion object` String.Format** — 칭찬: "*Format을 활용하니까 코드를 한눈에 보기 좋네요*!".
14
+ - **`InputView` interface화** — 리뷰어 칭찬: "*inputView를 이전과 다르게 interface화*시켜 주셨네요~👍".
15
+ - **`by 키워드`** — 칭찬: "by 키워드의 사용 좋네요👍".
16
+ - **`intersect` 활용** — 칭찬: "*intersect 너무 잘 사용*해 주셨네요!!💯💯💯".
17
+ - **`value class LottoNumber`** — 칭찬: "*value class를 사용*해 주셨군요👍".
18
+ - **`junit @ParameterizedTest` 활용** — 칭찬: "*junit의 기능들 활용 좋습니다*👍".
19
+
20
+ ## 못한 점 (설계 관점) — 메타-질문 + 학생 깊은 답변
21
+
22
+ ### 1. *View 인스턴스 = Controller 지역 변수*
23
+
24
+ ```kotlin
25
+ class LottoController {
26
+ fun run() {
27
+ val inputView = InputView() // ⚠ 지역
28
+ val outputView = OutputView()
29
+ .
30
+ }
31
+ }
32
+ ```
33
+
34
+ 리뷰어: "*반드시 수정이 필요한 내용은 아니며, inputView와 outputView을 지역 변수로 선언하신 이유*가 궁금합니다! 1. *구현할 수 있는 다른 방법은 어떤 것이* 있을까요?? 2. *현재 방법대로 구현을 했을 때는 어떤 단점이 존재*할까요??"
35
+
36
+ 학생: "1. *InputView와 OutputView를 Controller 밖에서 만들어서 가져오는 방법*이 있습니다. (main에서 LottoController(InputView, OutputView)) 아니면 *object 키워드를 써서 싱글턴*으로 만들어 버리는 방법도 있습니다. (object InputView) 2. 이 프로젝트에서는 *View가 만들어지는 시점을 어디에 둬도 크게 상관 없겠다 싶어 Controller에서 만들어 쓰고* 있었습니다.. *눈 앞의 명세만 구현한 셈*이네요.. 당장의 동작에는 별 문제가 없어 보이니, 그렇다면 *구조를 개선하기 위해 다른 요구사항이 찾아왔을 때 이 구조가 얼마나 대처할 수 있는지* 생각해 봤습니다. 만약에 *콘솔 어플리케이션이 아닌 키오스크로 로또를 뽑고 싶다*고 해 봤을 때, 대처가 가능할까요? 아마 안될 것 같습니다. 그래서, 먼저 *키오스크가 됐던 콘솔이 됐던 View에서 기대되는 동작들을 뽑아 인터페이스로* 만들어 봤습니다. 이후에 *Controller 내부에서 View의 구현체(ConsoleView 등..) 인스턴스를 만들어 쓸 경우 컨트롤러의 재사용이 힘드니 컨트롤러 내부에서 만들지 않고 외부에서 인터페이스로 받아* 줬습니다. *Controller에서는 이제 interface만 사용할 뿐 구현이 어떻게 된 지는 상관하지 않으니 이제 키오스크 View도 넣어 줄 수 있습니다*."
37
+
38
+ → *현실 변경 시나리오(키오스크)로 추상화 정당화*. *이상적 학습 답변*.
39
+
40
+ ### 2. `InputView` *Class vs object* — 같은 질문, 같은 답변
41
+
42
+ 리뷰어: "*InputView를 Class로 지정하신 이유*가 궁금합니다! 🤔" 학생: "지금 이 프로젝트에서는 *굳이 Class일 필요는 없어 보이고 object로 만들어도 상관없*어 보입니다. 하지만, *항상 요구사항은 변경이 있을 수 있으니 좋은 구조를 만들어 변경 사항에 최소한의 비용으로 대처*할 수 있다면 좋을 것 같네요. 위의 지적해 주신 부분(*컨트롤러 내부에서 View 인스턴스를 만들어서 쓰고 있는 코드*)와 같은 답변을 드릴 수 있을 것 같습니다."
43
+
44
+ ### 3. `LottoTicketMakeMethod` *동사 빠진 네이밍*
45
+
46
+ ```kotlin
47
+ interface LottoTicketMakeMethod {
48
+ fun makeTicket(): LottoTicket
49
+ }
50
+ ```
51
+
52
+ 리뷰어: "interface에 대한 활용 좋습니다!👍 수정이 반드시 필요한 것은 아니나 *LottoTicketMakeMethod라는 네이밍은 살짝 의미가 모호*해질 수도 있겠다는 생각도 드네요🤔 *LottoTicket을 만드는 것이니 LottoTicketGenerator 등등 여러 가지 이름을 적용*해 볼 수 있을 것 같습니다!" 학생: "*확실히 지금 네이밍은 행위를 하는 주체로 보이지는 않네요. LottoTicketGenerator 쪽이 더 나은 것 같습니다*!" — *Method*는 OOP 어휘에서 *내장 의미가 다름* (메서드). *Generator/Strategy*가 명확.
53
+
54
+ ### 4. `value class` vs `data class` — 학생 깊은 분석
55
+
56
+ 리뷰어: "*value class와 data class는 어떤 차이점이 존재*할까요?? 해당 내용을 *value class로 작성하신 이유*가 궁금합니다!🤔"
57
+
58
+ 학생 (놀라운 깊이): "*value class는 원시 타입도 모두 래핑하는 것이 제약조건*이라 사용했습니다. value class는 *하나의 값을 래핑해서 타입을 만들어 주고 싶지만 인스턴스를 만들어서 힙에 올려 두고 싶지 않을 때, 이것을 클래스의 사용처에 inline화*시키는.. *최적화를 위한 그런 키워드*라 알고 있습니다. 예를 들어 *fun foo(a: LottoNumber): Int의 경우는 자바로 변환될 때 int foo-맹글링해시코드(int a)*가 됩니다. 공식 문서를 보니 *웬만한 경우에는 inline화 되나 제네릭, 인터페이스나 Nullable처럼 원래 타입으로 쓰이지 않을 때에는 inline화 되지 않는다*고 하는데.. *rule of thumb이라고 적어 놓으니 정확한 기준인지를 모르겠*습니다 😞 페어의 피드백도 봤는데, *같은 번호의 LottoNumber 인스턴스가 중복이 될 가능성*이 있을 것 같습니다. *data class는 hashcode, isEqual 등을 컴파일러가 대신 작성해 주는 키워드*입니다. 이 쪽은 *value class와 달리 항상 힙에 올라가는 것으로 보이니.. 이 경우는 굳이 오버헤드를 감수해 가며 data class를 사용할 필요는 없을 것* 같습니다."
59
+
60
+ → *내부 컴파일러 동작 + 트레이드오프*까지 정리.
61
+
62
+ ### 5. `LottoNumber` *단독 의미 부재* — 자가 의문
63
+
64
+ 학생: "개인적으로는 *LottoNumber가 LottoTicket에서 떨어져 있을 때, 그것이 로또 번호로서의 의미를 가질까*? *로또 숫자는 여럿이 같이 존재해야 의미를 가지지 않을까*? *세상에는 숫자 하나만 가지고 하는 로또는 없지 않은가*? 그렇다면 *LottoNumber를 래핑하는 것은 의미가 있나? 적어도 LottoTicket 단위여야 의미를 갖지 않을까*?" — *원시값 포장의 *경계 가치* 의심.
65
+
66
+ ### 6. `set` 네이밍 — *기능 늘면 모호*
67
+
68
+ 리뷰어: "*set으로 네이밍 지어주시는 것도 좋긴 하지만, 추후 LottoTicket에 대한 기능이 늘어날 경우 네이밍으로 인하여 어떤 기능을 담당하는지 헷갈릴 수도* 있겠다는 생각이 들긴 합니다!" — *Kotlin setter* 컨벤션 충돌.
69
+
70
+ ### 7. `toIntList()` *반환 의도 불명*
71
+
72
+ ```kotlin
73
+ fun toIntList(): List<Int>
74
+ ```
75
+
76
+ 리뷰어: "*toIntList()로 네이밍 지어 주시는 것도 좋긴 하지만, 자칫 잘못 해석할 여지*가 있어서 네이밍 고민해 보시는 것도 좋을 것 같다는 생각이 듭니다!! *toIntList()라는 메서드 명만 보면 어떤 것을 반환해 주는 거지*?? 라는 생각이 들 수도 있겠다는 생각이 들기도 합니다🤔" — *어떤 도메인 의미*인지 이름에서 사라짐.
77
+
78
+ ### 8. *테스트 네이밍 명세성* — 자동차 경주 예시
79
+
80
+ ```kotlin
81
+ @Test
82
+ fun `자동차가 1칸 이동하면 거리는 1이다`() {
83
+ val myCar = Car("Duru")
84
+ myCar.move(1)
85
+ assertThat(myCar.distance).isEqualTo(1)
86
+ }
87
+ ```
88
+
89
+ 리뷰어: "*테스트 코드 깔끔하게 잘 작성*해 주셨네요!! 너무 잘해 주셨지만 참고할 만한 내용이 있어서 코멘트 남겼습니다~ *테스트 코드의 경우 어떤 테스트인지 확실하게 알 수 있게 네이밍을 정해 주는 것도 좋은 것* 같습니다!" 학생: "확실히 *테스트 코드의 네이밍에 많이 소홀*했던 것 같습니다. *머릿속에 떠오르지 않으면 적당히 짓고 넘겨 버리는 경향*이 있는데, *안 좋은 버릇인 것* 같습니다."
90
+
91
+ ### 9. *주석으로 남긴 죽은 코드*
92
+
93
+ 리뷰어: "*해당 내용은 주석으로 남겨 두신 이유*가 궁금합니다!🤔" 학생: "*구매한 로또의 등수 통계 기능을 테스트 가능하게 만들다 남은 흔적*입니다.. *커밋하기 전에 지워야 했는데 꼼꼼하지 못했*습니다."
94
+
95
+ ### 10. `CsvSource` *하드코딩 대체*
96
+
97
+ 리뷰어: "위에서 사용되는 *하드 코딩 되어 있는 내용들에 대해서는 @CsvSource 및 테스트 코드의 여러 기능들을 통해서 제공*해 보는 방법도 고민해 볼 만할 것 같습니다!!"
98
+
99
+ ### 11. *Set과 List 통합* — 같은 도메인, 다른 컬렉션
100
+
101
+ 리뷰어: "*해당 내용에 대해서도 set과 list를 따로 구분하지 않고 통합할 수 있는 방법은 있을지 고민*해 보는 것도 좋을 것 같습니다💪" — 두 타입 사이 변환이 *호출 코드에 흩어짐*.
102
+
103
+ ### 12. `ktlint`, EOF, 코드 정렬
104
+
105
+ 리뷰어: "*gradlew clean ktlintCheck*", "*File > Preferences > Editor > General > Ensure every saved file ends with a line break*", "*맥 사용 시에는 control + cmd + L로 코드 정렬*". 학생: "lint.. 노력하겠습니다 😭".
106
+
107
+ ## 리뷰어 의견 요지
108
+
109
+ - ***View 인스턴스 위치*** = 미래 변경(키오스크 등) 대응 기준.
110
+ - **`InputView` *class vs object*** — 단순하면 object, 변경 가능성 있으면 class.
111
+ - **인터페이스 *동사 네이밍*** — `MakeMethod`보다 `Generator`.
112
+ - **`value class` vs `data class` *근거 자가 정리*** 권장.
113
+ - ***LottoNumber 단독 의미*** — 도메인 의미 경계 검토.
114
+ - **`set`, `toIntList` *모호 네이밍 회피***.
115
+ - **테스트 네이밍 = *어떤 상황 → 어떤 동작 → 어떤 결과***.
116
+ - **주석 코드 = *커밋 전 삭제***.
117
+ - **`CsvSource` *하드코딩 대체***.
118
+ - **`Set`/`List` *변환 책임 일원화***.
119
+ - **ktlint + EOF + 정렬**.
120
+
121
+ - **대표 인용:**
122
+ > 콘솔 어플리케이션이 아닌 *키오스크로 로또를 뽑고 싶다고 해 봤을 때, 대처가 가능할까요? 아마 안될 것 같습니다*.
123
+ > — @aprilgom on `src/main/kotlin/lotto/controller/LottoController.kt`
124
+
125
+ > 우리는 함수를 분리하는 것이지 분해하는 것이 아닙니다 (PR #131과 비교) — 여기 강사는 *적극 칭찬 + 메타 질문*으로 학생 사유 유도.
126
+
127
+ > LottoNumber가 LottoTicket에서 떨어져 있을 때, *그것이 로또 번호로서의 의미를 가질까*?
128
+ > — @aprilgom on `src/main/kotlin/lotto/domain/LottoNumber.kt`
129
+
130
+ > value class는 *하나의 값을 래핑해서 타입을 만들어 주고 싶지만 인스턴스를 만들어서 힙에 올려 두고 싶지 않을 때, 이것을 클래스의 사용처에 inline화*시키는.. 최적화를 위한 그런 키워드.
131
+ > — @aprilgom on `src/main/kotlin/lotto/domain/LottoNumber.kt`
132
+
133
+ ## 얻은 교훈
134
+
135
+ - **View 인스턴스 = *현실 변경 시나리오*가 판단 기준** — *키오스크/콘솔 둘 다 지원*이 *interface 주입*의 정당화. *눈 앞의 명세만 구현*은 학생 자가 진단의 *반성 어휘*.
136
+ - **인터페이스 *동사 네이밍*** — `Method`는 *OOP 메서드 의미*와 충돌. `Generator`, `Strategy`, `Factory`처럼 *행위 주체* 어휘.
137
+ - **`value class` 정당화 = *inline 최적화 + 타입 안전 + 힙 회피*** — *data class는 힙*이라 *작은 래퍼*에 부적합.
138
+ - **`LottoNumber` 단독 의미 의심** — *6개가 모여야 로또*라는 *도메인 의미*. *단독 객체*가 *진짜 도메인 객체*인지 의심해도 좋음.
139
+ - **테스트 네이밍 = *상황 → 동작 → 결과***. `자동차가 1칸 이동하면 거리는 1이다`처럼 *명세 한 줄*.
140
+ - **주석 코드 *커밋 금지*** — *학습 흔적*은 *별도 브랜치*에. PR은 *최종 상태*만.
141
+ - **`CsvSource` *데이터-driven 테스트*** — *하드코딩 다수 케이스*는 *시그널 약함*.
142
+ - **`Set`/`List` *변환 책임 일원화*** — 두 타입을 *호출 코드*에서 변환하면 *Liskov 위반*.
143
+ - **ktlint *자동화*** — *코드 스타일 검토*는 *기계 작업*. 리뷰는 *설계*에 집중.
144
+ - **이 PR의 *교육적 가치* = 학생의 답변** — *키오스크 시나리오*, *value class inline 메커니즘*, *LottoNumber 단독 의미 자가 의문*. *리뷰어 칭찬 + 메타 질문 + 학생 깊은 답변*의 3박자.
145
+ - **`InputView class vs object`** — *변경 가능성*이 *class 선택* 정당화. 정적 *object*는 *Mock 불가*.
146
+ - **`makeXxx` vs `setXxx` *Kotlin getter/setter 충돌*** — `set` prefix는 *Kotlin property setter* 컨벤션과 부딪힘.
@@ -0,0 +1,26 @@
1
+ # PR #11 — [우기] 1단계 로또
2
+
3
+ - **Reviewee:** [@boogi-woogi](https://github.com/boogi-woogi)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/11
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 학생 자가 의문
10
+
11
+ > 사실 이 함수가 이 클래스 내부에서 사용되는 것은 아니지만 LottoResult와 관련되어 있다고 생각하여 해당 클래스의 companion object로 선언하였습니다.
12
+
13
+ > 이렇게 enum 클래스 내부에 있는 숫자들도 상수로 분리하는 것이 좋을까요?
14
+
15
+ ## 핵심 지적
16
+
17
+ ```kotlin
18
+ private fun PurchaseMoney.validateMoneyUnit() = require(this.money % LOTTO_PRICE == 0)
19
+ ```
20
+
21
+ → 확장 함수 활용.
22
+
23
+ ## 얻은 교훈
24
+
25
+ - **함수 위치 = 호출처 + 책임 일관성**.
26
+ - **enum의 데이터 숫자도 *enum 자체의 영역*** — 외부 상수 분리는 *재사용 범위*에 따라.
@@ -0,0 +1,26 @@
1
+ # PR #29 — [우기] 2단계 로또
2
+
3
+ - **Reviewee:** [@boogi-woogi](https://github.com/boogi-woogi)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/29
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 13
8
+
9
+ ## 학생 자가 의문 + 리뷰어 답변
10
+
11
+ 학생:
12
+
13
+ > Controller의 인자의 개수를 줄이기 위해서 여러 방법을 생각해보다가 한가지 궁금한 점이 생겼습니다! 여기서 의존성을 주입해줄때 이것을 그냥 클래스 내부에서 생성해주는 것과.
14
+
15
+ 리뷰어:
16
+
17
+ > 가능하면 생성자로 주입받는 것을 권장합니다. 멤버 변수는 클래스 내부에 정의한 함수에서 쉽게 데이터를 접근할 수 있다는 장점을 갖지만, 멤버 변수의 값에 따라 함수의 호출 결과의.
18
+
19
+ ### Lotto가 WinningLotto 너무 잘 앎
20
+
21
+ > Lotto 클래스가 WinningLotto 클래스를 너무 잘 알고 있어요. Lotto 클래스에서 메시지를 보내도록 코드를 개선해보면 어떨까요?
22
+
23
+ ## 얻은 교훈
24
+
25
+ - **DI = 생성자 주입 표준**. 멤버 변수 직접 생성 회피.
26
+ - **하위 객체가 상위를 알면 결합도 ↑**. Lotto → WinningLotto 의존은 *역방향*.
@@ -0,0 +1,52 @@
1
+ # PR #26 — [빅스] 1단계 로또
2
+
3
+ - **Reviewee:** [@briandr97](https://github.com/briandr97)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/26
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @woowahan-leah
7
+ - **라인 코멘트:** 42
8
+
9
+ ## 못한 점 + 핵심 지적
10
+
11
+ ### 1. `Bank` object god-helper
12
+
13
+ ```kotlin
14
+ object Bank {
15
+ fun calculate(.): Int =.
16
+ fun statistics(.): Map<Rank, Int> =.
17
+ }
18
+ ```
19
+
20
+ > Bank object가 하는 역할이 WinStatistics나 WinningResult에 없는 이유가 뭘까요? 애초에 저희가 일급 컬렉션을 만들거나 원시값을 포장하는 이유가 뭘까요?
21
+
22
+ → Bank가 외부 비교/통계 책임 = god-object. WinStatistics 같은 도메인 객체로 위임.
23
+
24
+ ### 2. enum 추가 시 코드 수정 필요
25
+
26
+ ```kotlin
27
+ when (rank) {
28
+ Rank.FIRST ->.
29
+ Rank.SECOND ->.
30
+ // Rank 추가 시 매번 추가
31
+ }
32
+ ```
33
+
34
+ > Rank값이 추가될때마다 매번 이 코드를 수정해줘야 할까요? 힌트: enum 클래스에서 제공하는 함수를 이용해보세요.
35
+
36
+ → `Rank.entries.forEach {. }`로 자동 순회.
37
+
38
+ ### 3. `Judgement` object도 god-helper
39
+
40
+ ```kotlin
41
+ object Judgement {
42
+ fun rank(lotto: Lotto, winning: WinningLotto): Rank =.
43
+ }
44
+ ```
45
+
46
+ > Judgement object가 하는 역할이 WinningNumbers, 혹은 WinningResult나 ComparingResult에 없는 이유가 뭘까요? 객체에 메시지를 전달하는 것이 아니라 값을 직접 꺼내어(get) 조작한다면 애초에 저희가 일급 컬렉션을 만들거나 원시값을 포장하는 이유가.
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **god-object 패턴의 다른 이름들** — `Bank`, `Judgement`, `Analyzer`, `Calculator`, `Manager` 모두 외부에서 데이터 꺼내 처리. 도메인 객체 메시지로.
51
+ - **enum 자동 순회 = OCP** — `entries.forEach`로 enum 추가 시 코드 무수정.
52
+ - **원시값 포장의 *목적***은 *행위 부여*. 데이터만 wrapping 후 외부에서 꺼내 처리 = 포장의 의미 잃음.
@@ -0,0 +1,123 @@
1
+ # PR #51 — [빅스] 2단계 로또
2
+
3
+ - **Reviewee:** [@briandr97](https://github.com/briandr97)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/51
5
+ - **단계:** 2단계 (수동 로또 추가)
6
+ - **리뷰어:** @woowahan-leah
7
+ - **라인 코멘트:** 24
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`InputResponseView`로 입력 요청 + 입력 수용 통합** — 도메인별 분리 시도.
12
+ - **`assertThrows` + `kotest`의 `shouldHaveMessage`** — 테스트 가독성↑.
13
+ - **`MethodSource` ParameterizedTest** — 테스트 케이스 외부화.
14
+ - **자가 의문 PR에 풍부히 명시** — *checkError 위치*, *Purchaser의 지저분함* 인지.
15
+ - **리뷰어 제안 사후 `LottoCount`로 책임 분리 시도**.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ ### 1. `Purchaser` — 3단계 외부 초기화
20
+
21
+ ```kotlin
22
+ val purchaser = checkError { Purchaser(getMoney()) }
23
+ checkError { purchaser.decideManualLottoCount(getManualLottoCount()) }
24
+ checkError { purchaser.purchaseManualLottoBundle(getManualLottoBundle(purchaser.manualLottoCount)) }
25
+ ```
26
+
27
+ 리뷰어: "Purchaser의 상태가 세 번에 나뉘어 초기화되고 있습니다. 1. 여러 번 나뉘어져 초기화될 필요가 있을까? 2. 외부의 조작 없이 *스스로 일할 수 있도록* 만들어 보면 어떨까? 3. 꼭 Purchaser가 이 모든 일을 해야 할까?" — *생성 시점 = 완성 시점*이 객체의 원칙.
28
+
29
+ ### 2. `checkError {. }`로 모든 호출 감싸기
30
+
31
+ 리뷰어: "에러가 발생할 가능성이 있는 모든 구문을 감싸도록 구현하시는 과정에서 이러한 코드가 나온 것 같아요. 현재 구현에서는 *에러가 발생할 가능성*이 있는 영역을 하나의 분기점이라고 여겼다면, Input에서 받는 입력을 분기점이라고 가정하여 블록을 나누는 방법도 있을 것 같네요." 후속: "매번 생성할 때 체크하는 것이 아니라요. *Input 단위로 끊기*도 옵션." → 학생: "에러 발생에 따른 다음 동작이 다를 때 이런 부분을 적용하면 좋다는 말씀이신가요?" 리뷰어: "맞습니다."
32
+
33
+ ### 3. `WinStatistics`에 `LOTTO_PRICE = 1000` 중복
34
+
35
+ ```kotlin
36
+ class WinStatistics(.) {
37
+ companion object { private const val LOTTO_PRICE = 1000 }
38
+ }
39
+ class Purchaser(spentMoney: Money) {
40
+ val purchasedLottoCount: Int = (spentMoney / LOTTO_PRICE).toInt()
41
+ }
42
+ ```
43
+
44
+ 리뷰어: "요구사항이 바뀌어 로또 한 장이 2000원으로 올랐다면 이곳과 Purchaser 모두 수정되어야 할까요?" 학생: "LOTTO_PRICE를 util의 common으로 빼 전역으로 사용하도록 수정. 이제 한 군데에서 수정하면 모든 곳에 적용." — *상수의 *한 곳* 소유*.
45
+
46
+ ### 4. `catch (e: Exception)` 수준의 `checkError`
47
+
48
+ 리뷰어: "`catch (e: Exception)`이 지양되는 이유는 뭘까요? 이러한 코드는 프로그램이 커질수록 예상치 못한 버그를 발견하기 어렵게 만들 수 있어요. 모든 에러를 catch문이 먹어서 프로그래머가 인지하지 못하는 일이 생길 수 있습니다." — *모든 예외 흡수*는 *디버깅 지옥*. CustomError 또는 sealed 분기.
49
+
50
+ ### 5. `LottoCount`가 수동/자동 모두 알아야
51
+
52
+ ```kotlin
53
+ class LottoCount(spentMoney: Money, val manualCount: Int) {
54
+ val totalCount = (spentMoney / Money(LOTTO_PRICE)).toInt()
55
+ val autoCount = totalCount - manualCount
56
+ init {
57
+ require(totalCount > 0)
58
+ require(manualCount >= 0)
59
+ require(manualCount <= totalCount)
60
+ }
61
+ }
62
+ ```
63
+
64
+ 리뷰어: "한 발자국 더 나아가 보자면. 로또를 구매하는 곳에서 수동 로또인지, 자동 로또인지 알 필요가 있을까요? Purchaser에게 로또를 구매하는 책임만 갖게 하고 구체적으로 어떤 방법으로 구매하는지는 *다른 클래스에서 알아서* 하도록 해도 괜찮았을 것 같네요. 이 과정에서 *상속이나 인터페이스의 구현*이 사용될 수 있겠지만 구체적인 방법은 직접 고민." — 결국 *Strategy / Generator 인터페이스* 권장.
65
+
66
+ ### 6. 테스트 픽스처 의미 모호
67
+
68
+ ```kotlin
69
+ private val otherLottoBundle = LottoBundle(listOf(
70
+ Lotto(1, 2, 3, 4, 5, 6),
71
+ Lotto(2, 3, 4, 5, 6, 7),
72
+ ))
73
+ // 사용처
74
+ purchaser.purchaseManualLottoBundle(otherLottoBundle)
75
+ ```
76
+
77
+ 리뷰어: "이러한 값을 테스트를 위한 Fixture라고 합니다. 이러한 픽스처는 어떻게 사용하는 것이 직관적일까요? 다음 구문을 보고 다른 개발자가 한눈에 otherLottoBundle 값을 예상할 수 있을까요?" 학생: "변수명을 `manualLottoBundle`로, 전역으로 따로 빼지 않고 각 함수 내부에서 사용." — 픽스처의 *전역 vs 함수 내 선언* 트레이드오프.
78
+
79
+ ### 7. 주석 처리된 코드 잔존
80
+
81
+ ```kotlin
82
+ fun inputMoney(): Long? {
83
+ return readLine()?.toLongOrNull() // ?: throw IllegalArgumentException("$PREFIX.")
84
+ }
85
+ ```
86
+
87
+ 리뷰어: "이 주석은 꼭 필요한 주석일까요? 간단한 주석을 남길 때에도 주석이 꼭 필요한 상황인지 고려하시는 게 좋습니다. … 클린 코드 책에서 설명하는 주석에 대한 장을 읽어보시면 좋을 것 같아요!"
88
+
89
+ ### 8. PR에 이전 페어 커밋 잔존
90
+
91
+ 리뷰어: "이전 페어의 커밋 기록이 보이는 이유가 뭘까요~? 테코톡 시간에도 다뤄진 주제인 *rebase*를 한번 활용해 보세요." — Git history 관리도 협업 책임.
92
+
93
+ ## 리뷰어 의견 요지
94
+
95
+ - **생성 = 완성** — 객체가 3단계로 초기화되면 *지저분함 신호*.
96
+ - **`catch (e: Exception)` 수준 흡수 회피** — *예외 종류*별 구체적 핸들링.
97
+ - **재시도 단위 = *Input 단위*** — *생성 호출마다* 감싸기보다 *입력 분기*에서 한 번에.
98
+ - **상수의 *한 곳* 소유** — 중복 선언은 *변경 영향* 흩어짐.
99
+ - **Strategy/Generator 분리** = 수동/자동의 자연스러운 답.
100
+ - **픽스처 *의미 명시*** — 변수명 또는 *함수 내 선언*으로.
101
+ - **주석은 *왜*에만**, *코드 폐기*는 삭제.
102
+ - **PR history도 협업 책임** — rebase로 정리.
103
+
104
+ - **대표 인용:**
105
+ > Purchaser의 상태가 세 번에 나뉘어 초기화되고 있습니다. 1. 여러 번 나뉘어져 초기화될 필요가 있을까? 2. 외부의 조작 없이 스스로 일할 수 있도록 만들어 보면 어떨까? 3. 꼭 Purchaser가 이 모든 일을 해야 할까?
106
+ > — @woowahan-leah on `src/main/kotlin/domain/Purchaser.kt`
107
+
108
+ > `catch (e: Exception)`이 지양되는 이유는 뭘까요? 이러한 코드는 프로그램이 커질수록 예상치 못한 버그를 발견하기 어렵게 만들 수 있어요.
109
+ > — @woowahan-leah on `src/main/kotlin/LottoController.kt`
110
+
111
+ > 로또를 구매하는 곳에서 수동 로또인지, 자동 로또인지 알 필요가 있을까요?
112
+ > — @woowahan-leah on `src/main/kotlin/domain/Purchaser.kt`
113
+
114
+ ## 얻은 교훈
115
+
116
+ - **객체는 *생성 시점에 완성***. 외부에서 단계별로 `decide*`/`purchase*`를 호출하는 구조는 *지저분함*. *생성자에 모든 정보* 또는 *별도 객체로 분해*.
117
+ - **재시도 단위는 *Input 분기***. 매 호출을 `checkError`로 감싸면 *catch (Exception)* 수준. *입력 받기-검증-처리* 한 블록을 *Input 단위*로.
118
+ - **예외 종류 구체화** — `CustomError extends IllegalArgumentException` 같이 *분류*로 만들면 호출자가 *어떻게 반응*을 명시.
119
+ - **상수의 *한 곳* 소유** — 가격/사이즈 같은 도메인 상수는 *한 객체*가 관리, 다른 곳은 *import*.
120
+ - **수동/자동 = Strategy 분리** — 한 객체에 두 책임을 모두 부여하면 *생성자/메서드 파라미터*가 커지고 *외부에서 어느 길*인지 매번 분기.
121
+ - **테스트 픽스처는 *의미 명시*** — 변수명에 *상황*을 담거나, *전역 픽스처*보다 *함수 내 선언*으로 자명하게.
122
+ - **주석은 *왜*에만**, *폐기 코드*는 git history가 보존하니 *삭제*.
123
+ - **PR history도 협업**. rebase/squash로 *의미 단위 커밋*.