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,167 @@
1
+ # PR #50 โ€” [์Šค์บ‡] 2๋‹จ๊ณ„ ๋กœ๋˜
2
+
3
+ - **Reviewee:** [@chws0508](https://github.com/chws0508)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/50
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„ (์ˆ˜๋™ ๋กœ๋˜)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @BeokBeok
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 23 (๋ฆฌ๋ทฐ์–ด 19 + ํ•™์ƒ 4)
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **์›์‹œ๊ฐ’ ํฌ์žฅ** โ€” ๋ฆฌ๋ทฐ์–ด ์นญ์ฐฌ: "*์›์‹œ๊ฐ’์„ ์ž˜ ํฌ์žฅํ•ด ์ฃผ์…จ๋„ค์š”* ๐Ÿ‘".
12
+ - **์ธํ„ฐํŽ˜์ด์Šค + ํ…Œ์ŠคํŠธ** โ€” ์นญ์ฐฌ: "*๋ชจ๋“  ๋กœ์ง์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์ฃผ์‹  ์  ์ข‹์Šต๋‹ˆ๋‹ค* ๐Ÿ‘".
13
+ - **`IllegalStateException`** โ€” ์นญ์ฐฌ: "*IllegalArgumentException๋ณด๋‹ค๋Š” IllegalStateException์ด ๋” ์ ํ•ฉํ•ด ๋ณด์ด๋„ค์š”* ๐Ÿ‘".
14
+ - **`Result` ํƒ€์ž… ํ™œ์šฉ** โ€” ์นญ์ฐฌ + ์˜๋ฏธ ๊ฒ€ํ†  ์š”๊ตฌ.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ ### 1. `validate*` *๊ฒ€์ฆ + ๋ณ€ํ™˜* โ€” ๋‘ ์ฑ…์ž„
19
+
20
+ ```kotlin
21
+ fun validateBonus(input: String): Int { // โš 
22
+ require(.)
23
+ return input.toInt()
24
+ }
25
+ ```
26
+
27
+ ๋ฆฌ๋ทฐ์–ด: "*ํ•จ์ˆ˜๋ช…๋งŒ ๋ดค์„ ๋•Œ์—๋Š” '๋ณด๋„ˆ์Šค๋ณผ ์œ ํšจ์„ฑ์„ ์ฒดํฌํ•œ๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ณด์—ฌ์š”*. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ๊ตฌํ˜„๋ถ€๋ฅผ ๋ณด๋ฉด, *์œ ํšจ์„ฑ์„ ์ฒดํฌํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฆฌํ„ด*์„ ํ•ด ์ฃผ๊ณ  ์žˆ๋„ค์š”. *ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•˜๋„๋ก* ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?"
28
+
29
+ ### 2. *์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋‘ ๋ถ„๋ฅ˜* โ€” Elizarov ์ธ์šฉ
30
+
31
+ ๋ฆฌ๋ทฐ์–ด: "*์ฝ”ํ‹€๋ฆฐ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜*๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
32
+ - *์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ*
33
+ - *์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ*
34
+
35
+ ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฃผ๋กœ *null ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๋ฆฌํ„ด*ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” *Exception์„ ๋˜์ง€๊ณ  ์ด Exception์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•Œ๋ ค์„œ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…*ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. *Exception์€ ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉ*ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ref. *https://elizarov.medium.com/kotlin-and-exceptions-8062f589d07*".
36
+
37
+ ### 3. `Result` ํƒ€์ž… *๋‚จ์šฉ*
38
+
39
+ ๋ฆฌ๋ทฐ์–ด: "*Result ํƒ€์ž…์„ ์ž˜ ํ™œ์šฉ*ํ•ด ์ฃผ์…จ๋„ค์š”. ๐Ÿ‘ *Result ํƒ€์ž…์€ ์„ฑ๊ณต(success)๊ณผ ์‹คํŒจ(failure) ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ *์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, *์–ด๋–ค ๊ฒฝ์šฐ์— ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์— ํ™œ์šฉํ•˜๊ธฐ ์ข‹*์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, *์—ฌ๊ธฐ์—์„œ๋Š” Result ํƒ€์ž…์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป๋Š” ์žฅ์ ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค. Result ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ *ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?" โ€” *Result๋Š” ์‹คํŒจ ์ข…๋ฅ˜ ์ถ”์ƒํ™”*. *๋‹จ์ˆœ ์‹œ์ *์—์„  *null/๊ธฐ๋ณธ๊ฐ’*.
40
+
41
+ ### 4. *runCatching = try-catch*
42
+
43
+ ๋ฆฌ๋ทฐ์–ด: "*runCatching์€ ๋‚ด๋ถ€์ ์œผ๋กœ try-catch ๋ฌธ์œผ๋กœ ๊ตฌํ˜„*๋˜์–ด ์žˆ์–ด์š”. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. *'์ผ๋ฐ˜์ ์ธ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ์—์„œ try-catch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.'* ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?". (`runCatching`๋„ *catch ํ‘œํ˜„*).
44
+
45
+ ### 5. *์ƒ์ˆ˜ `private` ์ ‘๊ทผ์ž*
46
+
47
+ ๋ฆฌ๋ทฐ์–ด:
48
+ ```kotlin
49
+ private const val UNKNOWN_ERROR = "์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค"
50
+ ```
51
+ "*ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด๋ผ๋ฉด private ์ ‘๊ทผ์ž๋ฅผ ๋ถ™์—ฌ ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”*?" + "*private ์ ‘๊ทผ์ž๊ฐ€ ์—†์œผ๋ฉด ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜ ๊ฐ’์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•˜์—ฌ ์˜๋„์น˜ ์•Š๊ฒŒ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ*์„ ๋ฏธ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. *๊ฐ€๊ธ‰์ ์ด๋ฉด private๋ฅผ ๋ถ™์—ฌ์„œ ์ž‘์„ฑํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์— private๋ฅผ ์ง€์šฐ๋Š” ์Šต๊ด€*์„ ๋“ค์ด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.".
52
+
53
+ ### 6. *Controller๊ฐ€ RankStatistics ๊ตฌํ•˜๋Š” ๋กœ์ง ๋„ˆ๋ฌด ์ž˜ ์•Ž*
54
+
55
+ ๋ฆฌ๋ทฐ์–ด: "*Controller๊ฐ€ RankStatistics๋ฅผ ๊ตฌํ•˜๋Š” ๋กœ์ง์„ ๋„ˆ๋ฌด ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์š”. RankStatistics๋ฅผ ๊ตฌํ•˜๋Š” ๋กœ์ง์€ RankStatistics์—์„œ ๊ตฌํ•˜๋„๋ก* ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?"
56
+
57
+ ### 7. *Validation ํด๋ž˜์Šค ๋ถ„๋ฆฌ* โ€” ์ถ”๊ฐ€ ๊ฐ์ฒด ์˜๋ฌด
58
+
59
+ ```kotlin
60
+ class LottoValidation {. } // โš  ๋„๋ฉ”์ธ๋งˆ๋‹ค ๋ณ„๋„
61
+ ```
62
+
63
+ ๋ฆฌ๋ทฐ์–ด: "์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ *XXXValidation์ด๋ผ๋Š” ํด๋ž˜์Šค๋“ค์„ ๊ตฌํ˜„*ํ•ด ์ฃผ์…จ๋„ค์š”. ์ด๋Ÿฐ ๊ตฌ์กฐ๋ผ๋ฉด, *๋„๋ฉ”์ธ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ Validation ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•  ๊ฒƒ* ๊ฐ™์•„์š”. ๋˜ํ•œ *Lotto์— ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, Lotto ํด๋ž˜์Šค์™€ LottoValidation ํด๋ž˜์Šค ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ*ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. *Validation ํด๋ž˜์Šค์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด ๋ณด์‹œ๊ณ , LottoValidation ํด๋ž˜์Šค๊ฐ€ ํ•˜๋Š” ์ผ์„ Lotto ํด๋ž˜์Šค์—์„œ ํ•˜๋„๋ก* ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?"
64
+
65
+ ### 8. *NOT_INTEGER_ERROR ์ƒ์ˆ˜ ์—ฌ๊ธฐ์ €๊ธฐ*
66
+
67
+ ๋ฆฌ๋ทฐ์–ด: "*NOT_INTEGER_ERROR๋ผ๋Š” ์ƒ์ˆ˜๊ฐ’์ด ์—ฌ๊ธฐ์ €๊ธฐ ์ •์˜๊ฐ€ ๋˜์–ด ์žˆ์–ด์š”. ์ง€๊ธˆ ๊ตฌ์กฐ์—์„œ๋Š” ๋งŒ์•ฝ ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ์†Œ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒ๊ธด๋‹ค๋ฉด, ๊ด€๋ จ ๋ฌธ๊ตฌ๋ฅผ ์ผ์ผ์ด ์ฐพ์•„์„œ ๋ณ€๊ฒฝํ•ด ์ค˜์•ผ ํ•ด์š”*. *์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ๊ตฌ๋Š” OutputView์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก* ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?"
68
+
69
+ ### 9. `.toList()` *๋ถˆํ•„์š” ํ˜ธ์ถœ*
70
+
71
+ ```kotlin
72
+ (MIN..MAX).toList().shuffled() // โš 
73
+ ```
74
+
75
+ ๋ฆฌ๋ทฐ์–ด:
76
+ ```kotlin
77
+ val possibleLottoNumbers = MINIMUM_LOTTO_NUMBER..MAXIMUM_LOTTO_NUMBER
78
+ return Lotto(possibleLottoNumbers.map { LottoNumber(it) }.shuffled().take(LOTTO_NUMBER_COUNT))
79
+ ```
80
+ "*๋ชจ๋“  ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋“ค(map, shuffled, take ๋“ฑ)์€ ๋งค๋ฒˆ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ฒŒ* ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, *toList ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค*.".
81
+
82
+ ### 10. *๋กœ๋˜ ์‹œ์ž‘/๋ ๊ฐ’ ์—ฌ๊ธฐ์ €๊ธฐ*
83
+
84
+ ๋ฆฌ๋ทฐ์–ด: "*๋กœ๋˜์˜ ์‹œ์ž‘๊ฐ’๊ณผ ๋๊ฐ’์ด ์—ฌ๊ธฐ์ €๊ธฐ ์ •์˜*๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. *๋กœ๋˜์˜ ์‹œ์ž‘๊ฐ’๊ณผ ๋๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฒŒ ๋˜๋ฉด, ๊ด€๋ จ ๊ฐ’์„ ์ผ์ผ์ด ์ฐพ์•„์„œ ์ˆ˜์ •*ํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค." โ€” ๋‹จ์ผ ์ง„์ž…์ .
85
+
86
+ ### 11. *InputView/Output ์ธํ„ฐํŽ˜์ด์Šค ์ด์œ *
87
+
88
+ ๋ฆฌ๋ทฐ์–ด: "*InputView์™€ Output์˜ Interface๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์…จ๋„ค์š”. ์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์„๊นŒ์š”*?" โ€” ํ•™์ƒ ์ž๊ฐ€ ์ •๋ฆฌ ๊ถŒ์œ .
89
+
90
+ ### 12. `var` vs `val` *์ปฌ๋ ‰์…˜*
91
+
92
+ ```kotlin
93
+ var lottos: List<Lotto> = listOf()
94
+ ```
95
+
96
+ ๋ฆฌ๋ทฐ์–ด: "*List, Map๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต*ํ•ด์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— *var ๋Œ€์‹  val์„ ์‚ฌ์šฉ*ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ด์š”." โ€” *List += newItem* ๊ฐ™์€ *์žฌํ• ๋‹น ํšŒํ”ผ*.
97
+
98
+ ### 13. *๊ฐ„์ ‘ ํ˜ธ์ถœ = ๋„ˆ๋ฌด ๋งŽ์€ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ*
99
+
100
+ ๋ฆฌ๋ทฐ์–ด: "*ํ•จ์ˆ˜๋ช…๋งŒ ๋ดค์„ ๋•Œ์—๋Š” 'RankInformation์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ณด์ด๋Š”๋ฐ์š”*. *์‹ค์ œ ๊ตฌํ˜„๋ถ€์—์„œ๋Š” RankCount๋ฅผ ์—…๋ฐ์ดํŠธ*ํ•˜๊ณ  ์žˆ๋„ค์š”. *ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, ๋„ˆ๋ฌด ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด '๊ฐ„์ ‘ ํ˜ธ์ถœ'์ด ๋˜์–ด ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์•Œ๊ธฐ ๋” ์–ด๋ ต๊ฒŒ* ๋งŒ๋“ญ๋‹ˆ๋‹ค." โ€” PR #131 (krrong) *ํ•จ์ˆ˜ ๋ถ„๋ฆฌ vs ๋ถ„ํ•ด*์™€ ๊ฐ™์€ ๊ฒฐ.
101
+
102
+ ### 14. *Interface ๋ช…์— 'Interface' ๋ถ™์ž„*
103
+
104
+ ๋ฆฌ๋ทฐ์–ด: "*์ธํ„ฐํŽ˜์ด์Šค๋ช…์— ๊ตณ์ด Interface๋ผ๊ณ  ๋ช…์‹œํ•˜์ง€ ์•Š์œผ์…”๋„* ๋ฉ๋‹ˆ๋‹ค." โ€” Kotlin ์ปจ๋ฒค์…˜.
105
+
106
+ ### 15. *ํด๋ž˜์Šค ํ—ค๋” ๊ฐ€๋…์„ฑ*
107
+
108
+ ```kotlin
109
+ class WinningNumber(private val lottoNumbers: List<LottoNumber>, private val bonusNumber: LottoNumber) : Lotto(lottoNumbers) {
110
+ ```
111
+
112
+ ๋ฆฌ๋ทฐ์–ด:
113
+ ```kotlin
114
+ class WinningNumber(
115
+ private val lottoNumbers: List<LottoNumber>,
116
+ private val bonusNumber: LottoNumber
117
+ ) : Lotto(lottoNumbers) {
118
+ ```
119
+ "*๊ฐ€๋กœ๋กœ ๋„ˆ๋ฌด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ์—๋Š” ๊ฐœํ–‰์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ*ํ•ด์š”. ref. https://kotlinlang.org/docs/coding-conventions.html#class-headers"
120
+
121
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
122
+
123
+ - **`validate + ๋ณ€ํ™˜` *ํ•œ ํ•จ์ˆ˜์— ๋‘ ์ผ* X**.
124
+ - **์˜ˆ์™ธ ์ฒ˜๋ฆฌ *๋‘ ๋ถ„๋ฅ˜*** โ€” Elizarov.
125
+ - **`Result` *๋‚จ์šฉ*** โ€” *์‹คํŒจ ์ข…๋ฅ˜ ์ถ”์ƒํ™” ์‹œ*๋งŒ.
126
+ - **`runCatching` = *try-catch ๋ณ€ํ˜•*** โ€” ์š”๊ตฌ์‚ฌํ•ญ ์œ„๋ฐฐ.
127
+ - **์ƒ์ˆ˜ *private* ๊ธฐ๋ณธ**.
128
+ - **Controller๊ฐ€ *๋„๋ฉ”์ธ ๋กœ์ง ๋„ˆ๋ฌด ์•Ž***.
129
+ - **`Validation` ๋ณ„๋„ ํด๋ž˜์Šค = *์ฑ…์ž„ ๋ถ„์‚ฐ***.
130
+ - **์ƒ์ˆ˜ *๋‹จ์ผ ์ง„์ž…์ *** (์œ„์น˜ + ๋ณ€๊ฒฝ).
131
+ - **`.toList()` *Kotlin ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜ ์ž๋™ ๋ณต์‚ฌ*** ๋ฌด์ง€.
132
+ - **์ธํ„ฐํŽ˜์ด์Šค *์ด์  ์ž๊ฐ€ ์ •๋ฆฌ***.
133
+ - **์ปฌ๋ ‰์…˜ `val`** (var X).
134
+ - **๋„ˆ๋ฌด ์ž˜๊ฒŒ ๋‚˜๋ˆˆ ํ•จ์ˆ˜ = *๊ฐ„์ ‘ ํ˜ธ์ถœ ๋น„์šฉ***.
135
+ - **Interface ๋ช…์— 'Interface' ๋ถ™์ด์ง€ ์•Š๊ธฐ**.
136
+ - **ํด๋ž˜์Šค ํ—ค๋” *๊ฐœํ–‰ ๊ฐ€๋…์„ฑ***.
137
+
138
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
139
+ > ์ฝ”ํ‹€๋ฆฐ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
140
+ > - ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ
141
+ > - ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
142
+ > โ€” @BeokBeok on `src/main/kotlin/lotto/util/Validation.kt`
143
+
144
+ > ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, *๋„ˆ๋ฌด ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด '๊ฐ„์ ‘ ํ˜ธ์ถœ'์ด ๋˜์–ด ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์•Œ๊ธฐ ๋” ์–ด๋ ต๊ฒŒ* ๋งŒ๋“ญ๋‹ˆ๋‹ค.
145
+ > โ€” @BeokBeok on `src/main/kotlin/lotto/domain/RankInformation.kt`
146
+
147
+ > LottoValidation ํด๋ž˜์Šค๊ฐ€ ํ•˜๋Š” ์ผ์„ *Lotto ํด๋ž˜์Šค์—์„œ ํ•˜๋„๋ก* ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?
148
+ > โ€” @BeokBeok on `src/main/kotlin/lotto/util/LottoValidation.kt`
149
+
150
+ > runCatching์€ *๋‚ด๋ถ€์ ์œผ๋กœ try-catch ๋ฌธ์œผ๋กœ ๊ตฌํ˜„*๋˜์–ด ์žˆ์–ด์š”. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ '์ผ๋ฐ˜์ ์ธ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ์—์„œ try-catch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.'.
151
+ > โ€” @BeokBeok on `src/main/kotlin/lotto/controller/LottoController.kt`
152
+
153
+ ## ์–ป์€ ๊ตํ›ˆ
154
+
155
+ - **`validate + ๋ณ€ํ™˜` ๋ถ„๋ฆฌ** โ€” *ํ•จ์ˆ˜ ํ•œ ๊ฐ€์ง€ ์ผ*. `validateAndConvert` ๋˜๋Š” *๋‘ ํ•จ์ˆ˜*.
156
+ - **์˜ˆ์™ธ ์ฒ˜๋ฆฌ = *์˜ˆ์ƒ vs ์˜ˆ์ƒ ์™ธ*** โ€” Elizarov ๊ธ€. *PR #5, #36, #90, #50 ๊ณตํ†ต ์ธ์šฉ*.
157
+ - **`Result` *๋‚จ์šฉ ํšŒํ”ผ*** โ€” *์‹คํŒจ ์ข…๋ฅ˜ ์ถ”์ƒํ™”*๊ฐ€ ๊ฐ€์น˜. *๋‹จ์ˆœ ์‹œ์ *์€ *null + while*.
158
+ - **`runCatching` = *try-catch ํ‘œํ˜„*** โ€” ์š”๊ตฌ์‚ฌํ•ญ์ด *try-catch ๊ธˆ์ง€*๋ฉด *runCatching๋„ ํšŒํ”ผ*.
159
+ - **์ƒ์ˆ˜ *private ๊ธฐ๋ณธ*** โ€” *์™ธ๋ถ€ ์ ‘๊ทผ*์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ํ’€๊ธฐ.
160
+ - **Controller *๋„๋ฉ”์ธ ๋กœ์ง ๋ฌด์ง€*** = *Tell-Don't-Ask*.
161
+ - **`Validation` ๋ณ„๋„ ํด๋ž˜์Šค = *๋ณ€๊ฒฝ ๋‹ค์ค‘ ์ง€์ *** โ€” ๋„๋ฉ”์ธ ๊ฐ์ฒด *init*์ด *์ฑ…์ž„ ์‘์ง‘*.
162
+ - **์ƒ์ˆ˜ *๋‹จ์ผ ์ง„์ž…์ ***.
163
+ - **`.toList()` *Kotlin ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜๊ฐ€ ์ž๋™ ๋ณต์‚ฌ*** โ€” ๋ถˆํ•„์š” ํ˜ธ์ถœ ์•Œ์•„์ฑ„๊ธฐ.
164
+ - **์ปฌ๋ ‰์…˜ `val`** โ€” `List`/`Map` ์ž์ฒด๊ฐ€ *๋ถˆ๋ณ€*. ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ๋Š” `MutableList` ์‚ฌ์šฉ.
165
+ - **๋„ˆ๋ฌด ์ž˜๊ฒŒ ๋‚˜๋ˆˆ ํ•จ์ˆ˜ = *๊ฐ„์ ‘ ํ˜ธ์ถœ ๋น„์šฉ*** โ€” *์ฝ๊ธฐ ๋ถ€๋‹ด* > *์žฌ์‚ฌ์šฉ ๊ฐ€์น˜*.
166
+ - **Interface๋ช…์— *Interface* ๋ถ™์ด์ง€ ์•Š๊ธฐ** โ€” Kotlin ์ปจ๋ฒค์…˜.
167
+ - **ํด๋ž˜์Šค ํ—ค๋” *๊ฐœํ–‰*** โ€” *๊ฐ€๋กœ ๊ธธ์ด*๋Š” *๊ฐ€๋…์„ฑ*์— ์ง์ ‘.
@@ -0,0 +1,155 @@
1
+ # PR #116 โ€” [๋กœ๋˜ 1๋‹จ๊ณ„] ์˜ค์ด ๋ฏธ์…˜
2
+
3
+ - **Reviewee:** [@cucumber99](https://github.com/cucumber99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/116
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @lee-ji-hoon (์ฝ”๋‹ˆ)
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 32
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`LottoNumber` `value class`** โ€” ์›์‹œ๊ฐ’ ํฌ์žฅ + ์ธ๋ผ์ธ ์ตœ์ ํ™”.
12
+ - **TDD ํ๋ฆ„ ์ฒซ ์‹œ๋„** โ€” ํ•™์ƒ PR: "ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ โ†’ ๋„๋ฉ”์ธ ๋กœ์ง ์ž‘์„ฑ โ†’ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ์‹œ ๋ฆฌํŒฉํ† ๋ง์„ ๋ฐ˜๋ณต."
13
+ - **`Lotto.countMatchingNumber`/`checkBonusNumber`** โ€” Tell, Don't Ask ์ ์šฉ.
14
+ - **`enumValues<Rank>().associateWith { 0 }` ์ดˆ๊ธฐ Map** โ€” ํ•จ์ˆ˜ํ˜• ์–ดํœ˜.
15
+ - **`groupingBy {. }.eachCount()`** โ€” ๋ˆ„์  ํŒจํ„ด ์••์ถ•.
16
+ - **์ž๊ฐ€ ์˜๋ฌธ PR์— ํ’๋ถ€ํžˆ ๋ช…์‹œ** โ€” *value class*, *test์˜ ๊ฐ€๋…์„ฑ*, *MVC ์—ญํ•  ๊ฒฝ๊ณ„*, *๋“œ๋ผ์ด๋ฒ„/๋„ค๋น„๊ฒŒ์ดํ„ฐ* ๋“ฑ.
17
+
18
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
19
+
20
+ ### 1. `Amount`๋ผ๋Š” ์ด๋ฆ„ โ€” ๋„๋ฉ”์ธ ์–ดํœ˜ ๋ชจํ˜ธ
21
+
22
+ ```kotlin
23
+ class Amount(val money: Int) {
24
+ init { require(money >= LOTTO_PRICE) }
25
+ }
26
+ ```
27
+
28
+ ๋ฆฌ๋ทฐ์–ด: "`Amount`๋ผ๋Š” ๋„ค์ด๋ฐ๋งŒ ๋ดค์„ ๋•Œ๋Š” ๊ทธ๋ƒฅ ๋‹จ์ˆœ `๊ฐ€๊ฒฉ`์„ ์˜๋ฏธํ•˜๋Š”๋ฐ ๋กœ๋˜์˜ ๊ฐ€๊ฒฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋งž๋Š”๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š”๋ฐ์š”. ์ œ๊ฐ€ ์™œ ์ด๋Ÿฐ ๋А๋‚Œ์ด ๋“ค์—ˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค." โ€” `Amount`๋Š” *์ˆ˜๋Ÿ‰/๊ธˆ์•ก ์ผ๋ฐ˜*. `PurchaseAmount`/`LottoPurchasePrice` ๊ฐ™์ด *๋ฌด์—‡์˜*๊ฐ€ ๋ถ™์–ด์•ผ ๋„๋ฉ”์ธ ์–ดํœ˜.
29
+
30
+ ### 2. `Amount`๋Š” `class`, `LottoNumber`๋Š” `value class` โ€” ์ผ๊ด€์„ฑ
31
+
32
+ ๋ฆฌ๋ทฐ์–ด: "`Lotto`์—๋Š” value class์ธ๋ฐ ์—ฌ๊ธฐ๋Š” value class๊ฐ€ ์•„๋‹ˆ๋”๋ผ๊ณ ์š”. ์–ด๋–ค ์ด์œ ์ผ๊นŒ์š”?" ํ•™์ƒ ๋‹ต: "LottoNumber๋Š” ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์ด ๋งŽ์•„์„œ ์„ฑ๋Šฅ ๊ณ ๋ ค. `Amount`๋Š” ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ." โ€” *์‚ฌ์šฉ ๋นˆ๋„*์— ๋”ฐ๋ฅธ ์„ ํƒ. ๊ทธ๋Ÿฌ๋‚˜ *์›์‹œ๊ฐ’ ํฌ์žฅ ์˜๋„*๋Š” ๋™์ผ.
33
+
34
+ ### 3. `LottoMatcher.calculateRank` โ€” `public` ํ…Œ์ŠคํŠธ ๋…ธ์ถœ
35
+
36
+ ```kotlin
37
+ class LottoMatcher(.) {
38
+ fun matchLotto(publishedLotto: List<Lotto>): Map<Rank, Int> {. }
39
+ fun calculateRank(lotto: Lotto): Rank {. } // โš  matchLotto์—์„œ๋งŒ ์‚ฌ์šฉ
40
+ }
41
+ ```
42
+
43
+ ๋ฆฌ๋ทฐ์–ด: "์ด ํ•จ์ˆ˜๋Š” `matchLotto`์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์— private์ด์–ด์•ผ ํ•  ๊ฑฐ ๊ฐ™์€๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ ์—ด๋ ค ์žˆ๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ธฐ์กด์— private์˜€๋Š”๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ public์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋ผ๋ฉด `private ํ•จ์ˆ˜๋ฅผ ์™œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋‚˜?`๋ผ๋Š” ์งˆ๋ฌธ์„ ๋จผ์ € ํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์€๋ฐ์š”. ์ด ํ•จ์ˆ˜๋Š” ์• ์ดˆ์— ๋ณ„๋„์˜ ์ฑ…์ž„์˜ ์ผ๋ถ€๋กœ์„œ ์›๋ž˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๋“ค์–ด ์žˆ์–ด์•ผ ํ–ˆ๋˜ ๊ฒƒ์ด๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์ผ ๊ฒ๋‹ˆ๋‹ค." โ€” *ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ = ์ฑ…์ž„ ๋ถ„๋ฆฌ ์‹ ํ˜ธ*.
44
+
45
+ ### 4. `LottoMatcher`์— `MutableMap` rankMap ๋ณด์œ 
46
+
47
+ ```kotlin
48
+ private val rankMap: MutableMap<Rank, Int> = enumValues<Rank>().associateWith { 0 }.toMutableMap()
49
+
50
+ fun matchLotto(publishedLotto: List<Lotto>): Map<Rank, Int> {
51
+ publishedLotto.groupingBy { calculateRank(it) }.eachCount()
52
+ .forEach { (rank, count) -> rankMap[rank] = count }
53
+ return rankMap
54
+ }
55
+ ```
56
+
57
+ `rankMap`์ด *ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ๋ˆ„์ *๋˜๋Š” ์‹œ๊ฐ„ ๊ฒฐํ•ฉ. ํ•™์ƒ๋„ ํ›„์† ๋ผ์šด๋“œ์—์„œ `Map<Rank, Int>` ๋ฐ˜ํ™˜์œผ๋กœ ์ˆ˜์ •.
58
+
59
+ ### 5. `LottoMachine`์ด ๋žœ๋ค ๋‚ด์žฅ โ€” ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€ (TDD ๋ถ€์ •ํ•ฉ)
60
+
61
+ ```kotlin
62
+ class LottoMachine {
63
+ private val numbers: List<LottoNumber> = (MIN..MAX).map(::LottoNumber)
64
+ private fun publishLotto(): Lotto = Lotto(numbers.shuffled().take(6).sortedBy { it.value })
65
+ }
66
+ ```
67
+
68
+ ๋ฆฌ๋ทฐ์–ด: "๋กœ๋˜์˜ ๋„๋ฉ”์ธ์„ ์ƒ๊ฐํ•ด ๋ดค์„ ๋•Œ `๋žœ๋ค์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋กœ๋˜ ๋ฒˆํ˜ธ`๋„ ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ์ ์ธ ๋‚ด์šฉ์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•˜๋Š”๋ฐ์š”. ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ง€๊ธˆ ์—†๊ณ  ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์œผ๋กœ ๋ณด์—ฌ์š”. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค." ํ›„์†: "TDD ๊ด€์ ์—์„œ ๋‹ค์‹œ ์ƒ๊ฐ์„ ํ•ด ๋ณผ๊นŒ์š”? ์ฒ˜์Œ์— ๋งŒ๋“ค์–ด์งˆ ๋•Œ `LottoMachine`์€ ๋žœ๋ค๋œ ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ `Lotto`๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•˜๊ณ  ์‹œ์ž‘์„ ํ–ˆ์„ ๊ฑฐ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฌ๋ฉด `๋žœ๋ค๋œ ์ˆซ์ž`๊ฐ€ ์ด `LottoMachine`์˜ ํ•ต์‹ฌ์ผ ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”. ๊ทธ๋ž˜์„œ ์ด Machine์ด ์ง„์งœ๋กœ TDD๋กœ ์ž‘์„ฑ์ด ๋œ ๊ฒŒ ๋งž์„๊นŒ? ๋ผ๋Š” ์˜๊ตฌ์‹ฌ์— ๋“œ๋ ธ๋˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค." โ€” TDD = *ํ…Œ์ŠคํŠธ๊ฐ€ ๋จผ์ €*์ธ๋ฐ ํ•ต์‹ฌ์ด ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€๋ฉด *TDD ๋ถ€์ •ํ•ฉ*.
69
+
70
+ ### 6. `OutputView`๊ฐ€ ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ง์ ‘ ๋ฐ›์Œ
71
+
72
+ ```kotlin
73
+ fun printPublishedLotto(quantity: Int, publishedLotto: List<Lotto>) {
74
+ println("${quantity}๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.")
75
+ publishedLotto.forEach { lotto -> println(lotto.numbers.map { it.value }) }
76
+ }
77
+ ```
78
+
79
+ ๋ฆฌ๋ทฐ์–ด: "๋ชจ๋ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋‹จ์ˆœ ํ‘œ์‹œํ•ด์•ผ ๋  `List<String>`์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์–ด๋–จ์ง€ ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค!" ํ›„์†: "View๊ฐ€ Model์„ ๋ชจ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋…ธ๋ ฅ์„ ํ•ด ์ฃผ์‹  ๊ฑฐ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋์„ ๋•Œ View์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์–ด๋А ์ •๋„ Controller๋กœ ๊ฐ€๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ? ๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋„ค์š”. ๊ฐ€๋ น `LottoController`์˜ `publishLotto` ํ•จ์ˆ˜๊ฐ€ `printPublishedLotto`์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์ฃผ๊ธฐ ์œ„ํ•ด์„œ Model์„ ๊ฐ€๊ณตํ•ด ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ ์ด๊ฒŒ Controller์˜ ์—ญํ• ์ด ๋งž์„๊นŒ?" โ€” Model โ†’ View ์ง์ ‘ vs Controller ๋ณ€ํ™˜์€ *ํŠธ๋ ˆ์ด๋“œ์˜คํ”„*.
80
+
81
+ ### 7. `Lotto.from(input: List<Int>)` ์™ธ์—๋„ ์ƒ์„ฑ์ž ๋…ธ์ถœ
82
+
83
+ ```kotlin
84
+ class Lotto(val numbers: List<LottoNumber>) {
85
+ companion object { fun from(input: List<Int>): Lotto = Lotto(input.map(::LottoNumber)) }
86
+ }
87
+ ```
88
+
89
+ ๋ฆฌ๋ทฐ์–ด: "`companion object`์˜ from์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€ `Lotto`๋ผ๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•˜๋ผ! ๋ผ๊ณ  ๋งŒ๋“ค์–ด ์ฃผ์‹  ๊ฑฐ ๊ฐ™์•„์š”. ๊ทผ๋ฐ ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” `Lotto`์— ๊ทธ๋ƒฅ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค ๋ณด๋‹ˆ ์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ๋„ ๊ฐ€๋Šฅํ•  ๊ฑฐ ๊ฐ™์•„์š”. โ€ฆ ์˜ค์ด์˜ ์ƒ๊ฐ๊ณผ ๋‹ค๋ฅด๊ฒŒ model์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์„ ๊ฑฐ ๊ฐ™์€๋ฐ์š”!" ํ•™์ƒ: "์ƒ์„ฑ์ž๋ฅผ `private`์œผ๋กœ ์„ ์–ธํ•˜๋ฉด `Lotto("tester")`์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ์€ ๋ฐฉ์ง€." โ€” ์˜๋„ ๊ฐ•์ œ๋Š” *private constructor + factory*.
90
+
91
+ ### 8. `PrizeCalculator` โ€” ์ฑ…์ž„ ํฉ์–ด์ง
92
+
93
+ ```kotlin
94
+ class PrizeCalculator {
95
+ fun calculateEarningRate(money: Int, result: Map<Rank, Int>): Double {. }
96
+ }
97
+ ```
98
+
99
+ ๋ฆฌ๋ทฐ์–ด: "์ „์ฒด์ ์ธ Model์„ ๋ดค์„ ๋•Œ ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜๋Š”๋ฐ์š”. `PrizeCalculator`์€ ์ˆ˜์ต๋ฅ ์„ ๊ฒฐ์ •ํ•˜๊ณ  ์žˆ๋Š” `Model`์ธ๋ฐ์š”. ์ˆ˜์ต๋ฅ ์€ ๋กœ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ณณ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ๋กœ์ง์ด ์•„๋‹๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์š”." + "ํ˜น์€ Util์˜ ๋А๋‚Œ์ด ๊ฐ•ํ•˜๊ธด ํ•˜๋„ค์š”." ํ•™์ƒ: "`LottoMatcher`์— ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ๊นŒ์ง€ ๋ถ€์—ฌํ•˜๋ฉด `LottoMatcher` ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ๊ฒƒ ๊ฐ™์•„์„œ ์šฐ์„ ์€ ๋ถ„๋ฆฌ. ํŠนํžˆ ๋‹ค๋ฃจ๋Š” ์ƒํƒœ๊ฐ€ ์—†๊ณ  ๋‹จ์ˆœ ๊ณ„์‚ฐ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Util์˜ ๋А๋‚Œ." โ€” *Util*์€ *ํ–‰์œ„*๋งŒ, *Model*์€ *์ƒํƒœ + ํ–‰์œ„*.
100
+
101
+ ### 9. `LOTTO_NUMBER_COUNT` ์ค‘๋ณต ์„ ์–ธ โ€” `Lotto`์™€ `LottoMachine`
102
+
103
+ ```kotlin
104
+ class Lotto { companion object { private const val LOTTO_NUMBER_COUNT = 6 } }
105
+ class LottoMachine { companion object { private const val LOTTO_NUMBER_COUNT = 6 } }
106
+ ```
107
+
108
+ ๋ฆฌ๋ทฐ์–ด: "`LottoMachine`์˜ `LOTTO_NUMBER_COUNT`๋ฅผ 7๋กœ ๋ณ€๊ฒฝ์„ ํ•ด ๋ดค์„ ๋•Œ `์ž…๋ ฅ๋œ ๊ธˆ์•ก์— ๋งž๊ฒŒ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•œ๋‹ค`๋งŒ ์‹คํŒจํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”. 1. `LOTTO_NUMBER_COUNT`๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๊ณณ์ด 2๊ณณ์ด๊ธฐ์— Machine์˜ Count๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ Lotto์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ . 2. โ€ฆ ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ์„ ๋•Œ `LOTTO_NUMBER_COUNT`๋Š” Lotto๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” LottoNumber์˜ ์ˆ˜๋Ÿ‰์ด๋ฏ€๋กœ Lotto์˜ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ–ˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ ์˜ค์ด๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ค๊นŒ์š”?" ํ•™์ƒ: "๋ฆฌ๋ทฐ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ์•„๋งˆ ๋๊นŒ์ง€ ๋ชฐ๋ž์„ ์ˆ˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค."
109
+
110
+ ### 10. ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€ ํ•˜๋“œ์ฝ”๋”ฉ
111
+
112
+ ```kotlin
113
+ val exception = assertThrows<IllegalArgumentException> { LottoMatcher(.) }
114
+ assertThat(exception.message).isEqualTo("[ERROR] ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ณผ์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
115
+ ```
116
+
117
+ ๋ฆฌ๋ทฐ์–ด: "์ „๋ฐ˜์ ์œผ๋กœ ๊ฒ€์ฆ์„ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ํ•˜์…จ๋Š”๋ฐ์š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?" ํ•™์ƒ: "์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•  ๊ฒฝ์šฐ ํ•˜๋“œ ์ฝ”๋”ฉ์œผ๋กœ ๊ฒ€์ฆ์„ ํ•˜๋Š” ๊ฒƒ์ด TDD๋ผ๋Š” ๋ฐฉ์‹๊ณผ ๋” ์ž˜ ์–ด์šธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค." โ€” TDD์—์„œ *์ƒ์ˆ˜ ์ฐธ์กฐ*๋ณด๋‹ค *ํ•˜๋“œ์ฝ”๋”ฉ*์ด ๋” *๋ช…์„ธ์„œ ๊ฐ™๋‹ค*๋Š” ์˜๋„.
118
+
119
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
120
+
121
+ 1. **์ด๋ฆ„์€ *๋ฌด์—‡์˜ ๋ฌด์—‡*์ธ๊ฐ€** โ€” `Amount`๋ณด๋‹ค `PurchaseAmount`/`LottoPrice`๊ฐ€ ๋„๋ฉ”์ธ ์–ดํœ˜.
122
+ 2. **ํ…Œ์ŠคํŠธ ์œ„ํ•ด publicํ™” = ์ฑ…์ž„ ๋ถ„๋ฆฌ ์‹ ํ˜ธ** โ€” *private ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ๋ง ๊ฒƒ*. ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋ฉด *๋‹ค๋ฅธ ๊ฐ์ฒด*์˜ ์ฑ…์ž„์œผ๋กœ.
123
+ 3. **๋žœ๋ค ์˜์กด์„ ์™ธ๋ถ€ ์ฃผ์ž…** โ€” TDD ์ •ํ•ฉ์„ฑ ํ™•๋ณด.
124
+ 4. **View์— Model ์ง์ ‘ vs Controller ๋ณ€ํ™˜** โ€” *์–ด๋А ์ชฝ๋„ ์ •๋‹ต ์•„๋‹˜*, ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ธ์ง€.
125
+ 5. **`from`๋งŒ ์žˆ๊ณ  ์ฃผ์ƒ์„ฑ์ž๊ฐ€ public** โ€” ์˜๋„ *๊ฐ•์ œ*ํ•˜๋ ค๋ฉด `private constructor`.
126
+ 6. **์ˆ˜์ต๋ฅ ์€ *๋กœ๋˜ ๊ฒฐ๊ณผ์˜ ํ–‰์œ„*** โ€” ๋ณ„๋„ Calculator๋กœ ๋นผ๋ฉด *Util*ํ™”.
127
+ 7. **์ƒ์ˆ˜์˜ *์†Œ์œ *๋Š” ํ•œ ๊ณณ** โ€” `LOTTO_NUMBER_COUNT`๋Š” Lotto์˜ ์ •์ฒด์„ฑ.
128
+ 8. **ํ…Œ์ŠคํŠธ๋ช… = given-when-then** โ€” ํ•จ์ˆ˜๋ช…๋„ *์ƒํ™ฉ-์ž…๋ ฅ-๊ธฐ๋Œ€๊ฒฐ๊ณผ*.
129
+ 9. **๋“œ๋ผ์ด๋ฒ„/๋„ค๋น„๊ฒŒ์ดํ„ฐ ํŽ˜์–ด** โ€” *์„ค๊ณ„๋„*๋ฅผ ๋จผ์ € ๊ทธ๋ ค์•ผ *๊ฐ™์€ ๋ฐฉํ–ฅ*.
130
+
131
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
132
+ > ์ด ํ•จ์ˆ˜๋Š” `matchLotto`์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์— private์ด์–ด์•ผ ํ•  ๊ฑฐ ๊ฐ™์€๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ ์—ด๋ ค ์žˆ๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. โ€ฆ private ํ•จ์ˆ˜๋ฅผ ์™œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋‚˜?
133
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/model/LottoMatcher.kt`
134
+
135
+ > TDD ๊ด€์ ์—์„œ ๋‹ค์‹œ ์ƒ๊ฐ์„ ํ•ด ๋ณผ๊นŒ์š”? โ€ฆ ๋žœ๋ค๋œ ์ˆซ์ž๊ฐ€ ์ด `LottoMachine`์˜ ํ•ต์‹ฌ์ผ ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”.
136
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/model/LottoMachine.kt`
137
+
138
+ > `companion object`์˜ from์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€ `Lotto`๋ผ๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•˜๋ผ! ๋ผ๊ณ  ๋งŒ๋“ค์–ด ์ฃผ์‹  ๊ฑฐ ๊ฐ™์•„์š”. ๊ทผ๋ฐ ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” `Lotto`์— ๊ทธ๋ƒฅ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค ๋ณด๋‹ˆ ์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ๋„ ๊ฐ€๋Šฅํ•  ๊ฑฐ ๊ฐ™์•„์š”.
139
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/model/Lotto.kt`
140
+
141
+ > `LOTTO_NUMBER_COUNT`๋Š” Lotto๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” LottoNumber์˜ ์ˆ˜๋Ÿ‰์ด๋ฏ€๋กœ Lotto์˜ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ–ˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ ์˜ค์ด๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ค๊นŒ์š”?
142
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/model/LottoMachine.kt`
143
+
144
+ ## ์–ป์€ ๊ตํ›ˆ
145
+
146
+ - **์ด๋ฆ„์€ *๋ฌด์—‡์˜ ๋ฌด์—‡*** โ€” `Amount`/`Result`/`Calculator` ๊ฐ™์€ *์ด์นญ ๋ช…์‚ฌ*๋Š” ๋„๋ฉ”์ธ ์–ดํœ˜ ๋ถ€์žฌ ์‹ ํ˜ธ. `PurchaseAmount`/`LottoMatchResult`/`PrizeRule` ๊ฐ™์ด *์ˆ˜์‹์–ด + ๋ช…์‚ฌ*.
147
+ - **private ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ถฉ๋™ = ์ฑ…์ž„ ๋ถ„๋ฆฌ ์‹ ํ˜ธ**. *ํ…Œ์ŠคํŠธ needed โ†’ public โ†’ ์ƒˆ ์ฑ…์ž„ ๊ฐ์ฒด*๋กœ ์ด๋™.
148
+ - **๋žœ๋ค ์˜์กด ์™ธ๋ถ€ ์ฃผ์ž… = TDD ์ •ํ•ฉ์„ฑ**. *ํ•ต์‹ฌ์ด ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€๋Šฅ*ํ•˜๋ฉด TDD๋ฅผ *์ง„์งœ๋กœ ํ•œ ๊ฒƒ* ์•„๋‹˜.
149
+ - **View๊ฐ€ Model์„ ์ง์ ‘ vs Controller ๋ณ€ํ™˜** โ€” *์–ด๋А ์ชฝ๋„ ์ •๋‹ต ์•„๋‹˜*. *Controller์— ๊ฐ€๊ณต์ด ๊ฐ€๋„* / *View๊ฐ€ Model์„ ๋ด๋„* ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ธ์ง€.
150
+ - **`private constructor` + factory = ์˜๋„ ๊ฐ•์ œ**. factory๋งŒ ๋งŒ๋“ค๊ณ  ์ฃผ์ƒ์„ฑ์ž๊ฐ€ public์ด๋ฉด ํ˜ธ์ถœ์ž๋Š” *์–ด๋А ๊ธธ๋กœ ๊ฐ€๋„ ๋จ* โ€” ์˜๋„ ํฉ์–ด์ง.
151
+ - **์ˆ˜์ต๋ฅ ์€ *๋กœ๋˜ ๊ฒฐ๊ณผ์˜ ํ–‰์œ„*** โ€” ๋”ฐ๋กœ Calculator๋กœ ๋นผ๋ฉด *์ƒํƒœ ์—†๋Š” Util*. *Model๋กœ ์‚ด๋ฆฌ๋ ค๋ฉด* ๊ฒฐ๊ณผ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ.
152
+ - **์ƒ์ˆ˜์˜ *์†Œ์œ *๋Š” ํ•œ ๊ณณ** โ€” ์ค‘๋ณต ์„ ์–ธ์€ *๋ณ€๊ฒฝ ์‹œ ํ•œ์ชฝ๋งŒ ์žŠ์„* ํ•จ์ •. ํ…Œ์ŠคํŠธ๊ฐ€ *ํ•œ์ชฝ ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ ๋‹ค ๊นจ์ง€์ง€ ์•Š๋Š” ๊ฒƒ*์ด ์œ„ํ—˜ ์‹ ํ˜ธ.
153
+ - **ํ…Œ์ŠคํŠธ๋ช… = given-when-then ์••์ถ•**. *ํ•จ์ˆ˜๋ช…*๋„ *์ƒํ™ฉยท์ž…๋ ฅยท๊ธฐ๋Œ€*๊ฐ€ ๋ณด์ด๋„๋ก.
154
+ - **TDD์—์„œ *์ƒ์ˆ˜ ์ฐธ์กฐ* vs *ํ•˜๋“œ์ฝ”๋”ฉ*** โ€” *๋ช…์„ธ์„œ๋กœ์„œ์˜ ํ…Œ์ŠคํŠธ*๋Š” *๋ณ€๊ฒฝ์— ๋‘”๊ฐ*ํ•ด์•ผ ํ•จ. ํ•˜๋“œ์ฝ”๋”ฉ์ด ๊ทธ ์˜๋„์— ๋” ๋งž์„ ์ˆ˜ ์žˆ์Œ.
155
+ - **ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ *์„ค๊ณ„๋„*** โ€” ๋“œ๋ผ์ด๋ฒ„/๋„ค๋น„๊ฒŒ์ดํ„ฐ ์—ญํ• ์˜ ๋ชจํ˜ธํ•จ์€ *์„ค๊ณ„๋„ ๋ถ€์žฌ* ์‹ ํ˜ธ. *ํฐ ๊ทธ๋ฆผ*์„ ๋จผ์ € ํ•ฉ์˜.
@@ -0,0 +1,223 @@
1
+ # PR #147 โ€” [์˜ค์ด] 2๋‹จ๊ณ„ ๋กœ๋˜
2
+
3
+ - **Reviewee:** [@cucumber99](https://github.com/cucumber99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/147
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„ (์ˆ˜๋™ ๋กœ๋˜)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @lee-ji-hoon (์ฝ”๋‹ˆ)
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 40 (๋ฆฌ๋ทฐ์–ด 26 + ํ•™์ƒ 14)
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`LottoMachine` ์ธํ„ฐํŽ˜์ด์Šค + `publish` ์ถ”์ƒํ™”** โ€” Strategy ์‹œ๋„.
12
+ - **`model โ†’ domain` ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ** โ€” ์˜๋„ ๋ฉ”ํƒ€-์งˆ๋ฌธ.
13
+ - **`Rank` enum + `entries.find`** โ€” ํ›„์† ๋ผ์šด๋“œ์—์„œ enum ์•ˆ์ „์„ฑ ์ธ์‹.
14
+ - **`์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ List<List<Int>>` ํšŒํ”ผ** โ€” ํ›„์† *LottoTicket* ๋„์ž….
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ ### 1. *์ˆ˜๋™ ๋กœ๋˜ ์ˆ˜ ์ž…๋ ฅ ํ›„ ์ฒœ์› ๋‹จ์œ„ ๊ฒ€์ฆ* โ€” ์ž…๋ ฅ ์ˆœ์„œ ์˜์กด
19
+
20
+ ```
21
+ 1. ๊ธˆ์•ก ์ž…๋ ฅ 1400์›
22
+ 2. ์ˆ˜๋™์œผ๋กœ ๊ตฌ๋งคํ•  ๋กœ๋˜ ์ˆ˜ ์ž…๋ ฅ 1
23
+ 3. ERROR: ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ฒœ์› ๋‹จ์œ„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. โš  ๋Šฆ์€ ๊ฒ€์ฆ
24
+ ```
25
+
26
+ ๋ฆฌ๋ทฐ์–ด: "*์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ '[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ ์ฒœ์› ๋‹จ์œ„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.'์ด ๋œจ๋Š” ๊ฒŒ ๋งž์„๊นŒ์š”*? *๊ธˆ์•ก์— ๋Œ€ํ•œ ๊ฒƒ์„ ๊ฒ€์ฆ์„ ๋กœ๋˜ ์ˆ˜ ์ž…๋ ฅ ์ดํ›„์— ํ•˜๋Š” ๊ฒŒ ๋งž์„์ง€* ๊ณ ๋ฏผํ•ด ๋ด…์‹œ๋‹ค! ํ˜น์€ *๊ผญ ์ฒœ์› ๋‹จ์œ„์ผ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”. ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ์ค„ ์ˆ˜๋„ ์žˆ์„ ๊ฑฐ ๊ฐ™๋„ค์š”*! *์š”๊ตฌ์‚ฌํ•ญ์— ์ฒœ์› ๋‹จ์œ„๋Š” ์—†์—ˆ์œผ๋‹ˆ๊นŒ์š”*~!" โ€” *๊ฑฐ์Šค๋ฆ„๋ˆ vs ์ฒœ์› ๋‹จ์œ„*.
27
+
28
+ ### 2. *Interface vs enum ์ •์ฑ…* โ€” ํ•™์ƒ ์„ ํƒ ์ •๋‹นํ™”
29
+
30
+ ```kotlin
31
+ interface LottoMachine { fun publish(.): List<Lotto> }
32
+ class AutoLottoMachine : LottoMachine {. }
33
+ class ManualLottoMachine : LottoMachine {. }
34
+ ```
35
+
36
+ ๋ฆฌ๋ทฐ์–ด (๋Œ€์•ˆ ์ œ์‹œ):
37
+ ```kotlin
38
+ enum class LottoMachinePolicy { AUTO, MANUAL }
39
+ class LottoMachine(private val lottoMachinePolicy: LottoMachinePolicy) {
40
+ fun publishLottoTickets(info: LottoPurchaseInfo): List<Lotto> {
41
+ when (lottoMachinePolicy) {
42
+ AUTO -> {. }
43
+ MANUAL -> {. }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+ "์ด๋Ÿฐ ํ˜•ํƒœ๋กœ LottoMachine์ด *๋งŒ๋“ค์–ด์งˆ ๋•Œ! ํ˜น์€ publishLottoTickets์— ์ด publish๋Š” ์–ด๋–ค ์ •์ฑ…์œผ๋กœ ํ• ๊บผ์•ผ!๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์„ ํ…๋ฐ์š”. interface๋กœ ์ถ”์ƒํ™”๋ฅผ ํ•˜์‹  ์˜ค์ด์˜ ๊ด€์ ์ด ๊ถ๊ธˆ*ํ•˜๋„ค์š”~!" โ€” *Strategy vs enum ์ •์ฑ… ์ธ์ž* ํŠธ๋ ˆ์ด๋“œ์˜คํ”„.
49
+
50
+ ### 3. `manualNumbers: List<List<Int>>` *๋‚ด๋ถ€ ๊ฒ€์ฆ ๋ถ€์žฌ*
51
+
52
+ ๋ฆฌ๋ทฐ์–ด: "*manualNumbers๊ฐ€ List<List<Int>>๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ ์ € List ์•ˆ์— List<Int>๊ฐ€ ๊ฒ€์ฆ์ด ํ•„์š” ์—†์„๊นŒ์š”? ์Œ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ์š”*!. *์‹ค์ œ๋กœ ํ™•์ธํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋„ค์š”*!" โ€” *์›์‹œ ์ปฌ๋ ‰์…˜ ์ค‘์ฒฉ*์€ *๊ฒ€์ฆ ๋ฏธ์™„ ์ƒํƒœ*.
53
+
54
+ ### 4. `toString` ๋„๋ฉ”์ธ ์นจํˆฌ
55
+
56
+ ```kotlin
57
+ class LottoNumber(.) {
58
+ override fun toString(): String = value.toString()
59
+ }
60
+ ```
61
+
62
+ ๋ฆฌ๋ทฐ์–ด: "*toString์„ ๋‹จ์ง€ value๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ์„ ํ•œ ๊ฑฐ๋ผ๋ฉด toString์˜ ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋А๊ปด์ง€์ง€ ์•Š*๋‚˜์š”? *LottoNumber๋ฅผ toString() ํ–ˆ๋‹ค๊ณ  value์˜ ๊ฐ’์ด ๋‚˜์˜ค๊ฒ ๊ตฌ๋‚˜!๋ผ๋Š” ๊ฒƒ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”*?" + "์—ฌ๊ธฐ *toString override๋œ ๊ฒƒ์€ ์–ด๋–ค ์ด์œ *์ผ๊นŒ์š”?" โ€” *toString์˜ ๊ด€์Šต*: ๊ฐ์ฒด *๋””๋ฒ„๊ทธ ํ‘œํ˜„*. *Value ๋…ธ์ถœ ์šฐํšŒ*๋กœ ์“ฐ๋ฉด *์–ดํœ˜ ์ถฉ๋Œ*.
63
+
64
+ ### 5. *`number` โ†’ `it` ๊ฐ€๋…์„ฑ ํ›„ํ‡ด*
65
+
66
+ ```kotlin
67
+ numbers.map { it.toLottoNumber() } // ์ด์ „: numbers.map { number -> number.toLottoNumber() }
68
+ ```
69
+
70
+ ๋ฆฌ๋ทฐ์–ด: "๊ธฐ์กด์—” `number ->`๋กœ ์ž˜ ํ‘œํ˜„ํ•ด ์ฃผ์…จ๋Š”๋ฐ! *it์œผ๋กœ ์ˆ˜์ •์„ ํ•˜์…จ๋”๋ผ๊ณ ์š”!*. ์ง€๊ธˆ์€ *numbers๋ผ๊ณ  ๋˜์–ด ์žˆ์œผ๋‹ˆ number๊ฒ ๊ตฌ๋‚˜ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด๋Š” ์‚ฌ๋žŒ ์ž…์žฅ์—์„œ๋Š” 1๋ฒˆ ๋” ์ƒ๊ฐ์„ ๊ฑฐ์ณ์„œ number๊ฒ ๊ตฌ๋‚˜๋ผ๋Š” ๊ฒƒ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ*์ด๊ธฐ ๋•Œ๋ฌธ์— *๋ณด๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด์„œ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ˆ˜์ •*ํ•˜๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?" โ€” *์•”๋ฌต it*์€ *1๋‹จ๊ณ„ ์ถ”๋ก *.
71
+
72
+ ### 6. `Lotto.NUMBER_COUNT` *๋ชจํ˜ธ*
73
+
74
+ ๋ฆฌ๋ทฐ์–ด: "๊ธฐ์™• ์ˆ˜์ •ํ•˜๋Š” ๊น€์— *Lotto.NUMBER_COUNT๋ฉด ์ด๊ฒŒ ์–ด๋–ค COUNT์ธ์ง€ ์ฒ˜์Œ ๋ณด๋Š” ์‚ฌ๋žŒ์ด ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”*? ์ œ๊ฐ€ ์ป๋‹ค๋ฉด *์ง€๊ธˆ Lotto์˜ ์ˆ˜๋Ÿ‰์ธ๊ฐ€? ํ–ˆ์„ ๊ฑฐ ๊ฐ™*์•„์š”!" โ€” *์ปจํ…์ŠคํŠธ๊ฐ€ ํด๋ž˜์Šค๋ช…์— ๋“ค์–ด ์žˆ์–ด๋„ ๋ชจํ˜ธ*. `NUMBERS_PER_LOTTO` ๊ฐ™์ด.
75
+
76
+ ### 7. `Rank.valueOf` *์ถ”๊ฐ€ ๋ถ„๊ธฐ ๋ˆ„๋ฝ ์œ„ํ—˜*
77
+
78
+ ```kotlin
79
+ fun valueOf(countOfMatch: Int, matchBonus: Boolean): Rank = when {
80
+ countOfMatch == 6 -> FIRST
81
+ countOfMatch == 5 && matchBonus -> SECOND
82
+ .
83
+ else -> MISS
84
+ }
85
+ ```
86
+
87
+ ๋ฆฌ๋ทฐ์–ด: "์ด๊ฑด ์ œ๊ฐ€ *๋ฆฌ๋ทฐํ•˜๋‹ค๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„ ์ค‘์— ํ•˜๋‚˜์ธ๋ฐ ์ง€๊ธˆ์ด๋ผ๋„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด ๋‘˜๊ฒŒ์š”*! *valueOf ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‚˜์ค‘์— Rank ํ•˜๋‚˜๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ valueOf when์—์„œ ๋†“์น˜๊ธฐ ์‰ฝ์ง€ ์•Š์„๊นŒ์š”*?
88
+ ```kotlin
89
+ enum class Rank(.) {
90
+ FIRST(6, 2_000_000_000),
91
+ .
92
+ FIFTH(2, 1_000), // ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€
93
+ MISS(0, 0),
94
+ }
95
+ ```
96
+ ์ด๋ ‡๊ฒŒ ๋์„ ๋•Œ *valueOf์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ์•ˆ ๋‚˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๊ทธ๋ƒฅ ์ผ๋‹ค๊ฐ€ MISS๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜๋„ ์žˆ์„ ๊ฑฐ ๊ฐ™*์•„์š”! *enum์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” entries์™€ find๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•*์ž…๋‹ˆ๋‹ค!" โ€” PR #131 *else ํšŒํ”ผ*์™€ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ณธ์งˆ.
97
+
98
+ ### 8. *View๊ฐ€ ๋„ˆ๋ฌด ๋˜‘๋˜‘* โ€” ๋ฉ์ฒญํ•œ View
99
+
100
+ ๋ฆฌ๋ทฐ์–ด: "์ด ๋ถ€๋ถ„์€ *1๋‹จ๊ณ„ ๋•Œ ํ•ด ๋ณด๋ ค๋‹ค๊ฐ€ 2๋‹จ๊ณ„ ๋•Œ ์–ด์ฐจํ”ผ ๋ณ€๊ฒฝ ํฌ์ธํŠธ๋กœ ์žˆ์„ ๊ฑฐ ๊ฐ™์•˜๋Š”๋ฐ ๋งž์•˜*๋„ค์š”!.. *UI์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋А ์ •๋„ UI์—์„œ Model์„ ์•„๋Š” ๊ฒƒ์€ ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค๊ณ ๋„ ์ƒ๊ฐ*์„ ํ•˜๋Š”๋ฐ์š”. *๊ทธ๋Ÿฐ๋ฐ UI๊ฐ€ ์–ด๋– ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ํ–‰๋™์„ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.๋ผ๊ณ  ์ƒ๊ฐ*์„ ํ•˜๋Š”๋ฐ์š”. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋ง์€ ***'View๋Š” ๋ฉ์ฒญํ•ด์•ผ ํ•œ๋‹ค.'***๋ผ๋Š” ๋ง์ธ๋ฐ์š”. *์ง€๊ธˆ View๋Š” ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•ด ๋ณด์ด๋Š”๋ฐ* ์˜ค์ด๊ฐ€ ํ•œ ๋ฒˆ ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋„ค์š”.". ๊ฐ•์‚ฌ ๋™์ผ ์–ด๋ก.
101
+
102
+ ### 9. `LottoMachine` ํ…Œ์ŠคํŠธ๊ฐ€ *์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์˜์กด*
103
+
104
+ ๋ฆฌ๋ทฐ์–ด: "*LottoMachine ์ž…์žฅ์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ '์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ'๊ณผ ๊ด€๋ จ์ด ์žˆ์„๊นŒ์š”? LottoMachine์˜ given์—๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ณผ๋Š” ์ƒ๊ด€์ด ์—†์„ ๊ฒ๋‹ˆ๋‹ค*."
105
+
106
+ ### 10. *ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ช…์— '์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค'* โ€” ๊ด€์‹ฌ์‚ฌ ์•„๋‹˜
107
+
108
+ ๋ฆฌ๋ทฐ์–ด: "ํ…Œ์ŠคํŠธ ์ž…์žฅ์—์„œ *์–ด๋– ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋Š” ํฐ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹ˆ์ง€ ์•Š์„๊นŒ์š”*? ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฒ€์ฆ์„ ํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ฒƒ์€ *'๊ตฌ์ž… ๊ธˆ์•ก์ด ์ฒœ์› ์ด์ƒ์ด์—ฌ์•ผ ํ•œ๋‹ค.'๋กœ ๋ณด์ด๋Š”๋ฐ์š” ๊ทธ๋Ÿผ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ์ƒํ™ฉ์ผ ๋ฟ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ•จ์ˆ˜๋ช…์— ๋“ค์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์„๊นŒ์š”*?" โ€” *๋ช…์„ธ ์–ดํœ˜ = ๊ฒฐ๊ณผ ์ƒํƒœ*, ๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์•„๋‹˜.
109
+
110
+ ### 11. *์ƒ์ˆ˜ ์ง์ ‘ import*ํ•ด ํ…Œ์ŠคํŠธ?
111
+
112
+ ```kotlin
113
+ LottoPurchaseInfo.LOTTO_PRICE
114
+ ```
115
+
116
+ ๋ฆฌ๋ทฐ์–ด: "*LottoPurchaseInfo.LOTTO_PRICE๋ฅผ ๊ทธ๋Œ€๋กœ importํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ์ฃผ์…จ๋Š”๋ฐ์š”*! https://jojoldu.tistory.com/615 *์ด๋Ÿฐ ์˜๊ฒฌ๋„ ์žˆ๋Š”๋ฐ ์˜ค์ด์˜ ์˜๊ฒฌ์€ ์–ด๋–จ์ง€* ๊ถ๊ธˆํ•˜๋„ค์š”~!" โ€” *ํ…Œ์ŠคํŠธ๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ์ฐธ์กฐ*ํ•˜๋Š” ์•ˆํ‹ฐ (PR #113 `var price`์™€ ๊ฐ™์€ ํŒจํ„ด).
117
+
118
+ ### 12. *emptyList ๋ฐ˜ํ™˜* โ€” null ๋˜๋Š” sealed๊ฐ€ ๋ช…ํ™•
119
+
120
+ ```kotlin
121
+ fun publishManual(count: Int): List<Lotto> {
122
+ if (count == 0) return emptyList() // โš  ๋นˆ ์˜๋„ ๋ชจํ˜ธ
123
+ .
124
+ }
125
+ ```
126
+
127
+ ๋ฆฌ๋ทฐ์–ด: "์ง€๊ธˆ ๋กœ๋˜ ๋จธ์‹ ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ์ธ๋ฐ์š”! 1. *์ˆ˜๋™ ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ 0๊ฐœ๋กœ ์ž…๋ ฅ* 2. *0๊ฐœ๋กœ ์ž…๋ ฅํ–ˆ์œผ๋‹ˆ emptyList() ๋ฐ˜ํ™˜* ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ *emptyList()๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์ง€ ๋ง์ง€๋ฅผ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฐ์ฒด๊ฐ€ controller๊ฐ€ ํ•ด์•ผ ํ•  ์—ญํ• ์ด์—ˆ๋Š”์ง€ model์˜ ์—ญํ• ์ด์—ˆ๋Š”์ง€* ๊ณ ๋ฏผํ•ด ๋ด…์‹œ๋‹ค!" + "*์–ด๋– ํ•œ ์ƒํ™ฉ์— ์–ด๋–ค Model์„ ๋งŒ๋“ค์ง€๋Š” ์ถฉ๋ถ„ํžˆ Controller๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ฃ . ํ•˜์ง€๋งŒ emptyList๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์„๊นŒ* ํ–ˆ์Šต๋‹ˆ๋‹ค. *null๋กœ ๋ฐ˜ํ™˜์„ ํ•œ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ์ƒํ™ฉ์ด๋‹ค.๋ผ๊ณ  return ๊ฐ’์œผ๋กœ ์•Œ๋ ค์ค„ ์ˆ˜* ์žˆ์ฃ . ํ˜น์€ *sealed๋ฅผ ์‚ฌ์šฉํ•ด์„œ '์–ด๋– ํ•œ ์ƒํƒœ'์ธ์ง€๋„ ์•Œ๋ ค์ค„ ์ˆ˜* ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”!"
128
+
129
+ ### 13. `LottoPurchaseInfo` *๋„ค์ด๋ฐ ๋ญ‰๊ฐœ๊ธฐ*
130
+
131
+ ๋ฆฌ๋ทฐ์–ด: "*LottoPurchaseInfo ๋กœ๋˜ ๊ตฌ๋งค ์ •๋ณด์ธ๋ฐ, manualLottoCount๋Š” ์‹ค์ œ๋กœ ์ง€๊ธˆ ๊ตฌ๋งคํ•œ ์ •๋ณด์ธ๊ฐ€์š”? ์•„์ง ๊ตฌ๋งค์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ๊ฑฐ์ณ์ง€์ง€ ์•Š์€ ์ •๋ณด ๊ฐ’์ธ๋ฐ Info๋ผ๋Š” ๋„ค์ด๋ฐ์„ ํ†ตํ•ด์„œ ๋ญ‰๋šฑ๊ทธ๋ ค์„œ ์ •์˜๊ฐ€ ๋œ ๊ฐ*์ด ์—†์ง€ ์•Š์•„ ์žˆ๋„ค์š”. *ManualLottoCount๋ฅผ ๋”ฐ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•*์ผ ๊ฑฐ ๊ฐ™์€๋ฐ ํ•œ ๋ฒˆ ๊ณ ๋ฏผํ•ด ๋ด…์‹œ๋‹ค~!"
132
+
133
+ ### 14. *`model` โ†’ `domain` ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ ์˜๋„*
134
+
135
+ ๋ฆฌ๋ทฐ์–ด: "๊ธฐ์กด์—” model์ด๋ผ๋Š” ํŒจํ‚ค์ง€๋„ ๋‚˜์˜์ง€๋Š” ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ *domain์œผ๋กœ ์˜ฎ๊ธฐ์‹  ์˜๋„๊ฐ€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ์š”*!"
136
+
137
+ ### 15. *try-catch vs null vs sealed class* โ€” ํ•™์ƒ ์ž๊ฐ€ ์˜๋ฌธ
138
+
139
+ ํ•™์ƒ: "*์ฝ”ํ‹€๋ฆฐ๋งŒ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ค‘ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ณต์žกํ•ด์„œ null๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉด sealed class๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.๋ผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ ๋กœ๋˜ ๋ฏธ์…˜์— ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ผˆ*์Šต๋‹ˆ๋‹ค." + "*๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ (๋กœ๋˜ ์ˆซ์ž์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋“ฑ)๋‚˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ (์ž˜๋ชป๋œ ๊ฐ’์ด ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ)๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์ธ์ง€ ์ดํ•ด๊ฐ€ ๋˜์—ˆ์ง€๋งŒ, sealed class๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋ฟ๋”๋Ÿฌ sealed class๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๋•Œ ์™ธ๋ถ€์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆ*ํ•ฉ๋‹ˆ๋‹ค."
140
+
141
+ ๋ฆฌ๋ทฐ์–ด: "๋„ค *์ถฉ๋ถ„ํžˆ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋˜๊ฐ€ ๊ทธ๋ฆฌ ํฐ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ*์ด์ฃ . ๊ทธ๋Ÿฐ๋ฐ *null๋กœ ๋ฐ˜ํ™˜์„ ํ•˜๋А๋ƒ ์•„๋‹ˆ๋ฉด sealed๋กœ ๋ช…์‹œํ•ด์„œ ์–ด๋– ํ•œ '์ƒํƒœ'์ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ž˜ ์•„์…จ์œผ๋ฉด ์ข‹๊ฒ *์–ด์„œ ์•„๋ž˜ ๋‚ด์šฉ์— ์˜๊ฒฌ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™์•„์š”
142
+ ```kotlin
143
+ fun main() {
144
+ val result: Int? = getInputNumber()
145
+ // ์™œ null์ธ ๊ฑฐ์ง€?? ๋ฌด์—‡์„ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฑฐ์ง€??
146
+ }
147
+
148
+ private fun getInputNumber(): Int? {
149
+ return readlnOrNull()?.toIntOrNull()
150
+ }
151
+ ```
152
+ *getInputNumber ์ž…์žฅ์—์„œ๋Š” Number๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ˆ Int๊ฐ€ ์•„๋‹ˆ๋ฉด null์ด๋‹ค.๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ main() ํ•จ์ˆ˜ ์ž…์žฅ์—์„œ๋Š” null์ด ๋“ค์–ด์˜ค๋ฉด ์ด๊ฑฐ๋Š” ๋ญ˜ ํ•˜๋ผ๋Š” ๊ฑฐ์ง€?๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ*์ฃ . ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ *sealed๋กœ ๋ฌถ์–ด์„œ ์–ด๋– ํ•œ '์ƒํƒœ'์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด ๊ทธ ์ƒํƒœ์— ๋”ฐ๋ฅธ ํ›„์† ๋™์ž‘์„ main์—์„œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ ๊ฐ™์€๋ฐ์š”*!"
153
+
154
+ โ†’ *null์˜ ์†์‹ค*: *ํ˜ธ์ถœ์ž๊ฐ€ ์–ด๋–ค ํ–‰๋™์„ ํ•ด์•ผ ํ• ์ง€ ๋ชจํ˜ธ*. *sealed*๋Š” *์–ด๋–ค ์ƒํƒœ์ธ์ง€ + ๋Œ€์‘*๊นŒ์ง€ ํ‘œํ˜„.
155
+
156
+ ### 16. *runCatching์ด try-catch๋ณด๋‹ค ๋‚ซ๋‚˜?* โ€” Result ๊ฐ์ฒด
157
+
158
+ ๋ฆฌ๋ทฐ์–ด: "*try-catch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” try์—์„œ ์–ด๋– ํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ๋‹จ์ˆœ catchํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ธ๋ฐ์š”. ์ด๋•Œ ์ด ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์œ„์ž„ํ•˜๋Š” ๊ฒŒ ์ข€ ๊นŒ๋‹ค๋กœ์šด ํŽธ*์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋ฉด *runCatching๋„ ๋˜‘๊ฐ™์ด catch๋ฅผ ํ•˜๊ธด ํ•˜์ง€๋งŒ Result๋ผ๋Š” ๊ฐ์ฒด๋กœ ๋ฌถ์ด๋‹ค ๋ณด๋‹ˆ ๋ณธ์ธ ๋ ˆ์ด์–ด์—์„œ error๋ฅผ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด ํ˜น์€ ๊ฐ์ฒด์—๊ฒŒ ์–ด๋– ํ•œ ์ƒํƒœ์ž„์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ„ํŽธํ•˜๋‹ค๋Š” ์žฅ์ *์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋Š” https://toss.tech/article/21010 *์ด ๊ธ€์„ ์ฝ์–ด ๋ณด๋ฉด* ์ข‹์„ ๊ฑฐ ๊ฐ™๋„ค์š”." โ€” *Toss ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ*๋„ ์šฐํ…Œ์ฝ” ๊ณตํ†ต ์ž๋ฃŒ.
159
+
160
+ ### 17. *Amount ์ผ๋ฐ˜ํ™” vs LottoPrice ๋„๋ฉ”์ธ ๋ช…์‹œ*
161
+
162
+ ๋ฆฌ๋ทฐ์–ด: "๋‹จ์ˆœ *Amount๋ณด๋‹ค๋Š” LOTTO_PRICE ๊ฐ™์€ Lotto ๋„๋ฉ”์ธ์— ์–ฝํ˜€์ ธ ์žˆ์œผ๋‹ˆ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•œ ์ด๋ฆ„*์ด๋ฉด ์ข‹๊ฒ ๋‹ค๋ผ๋Š” ์ƒ๊ฐ์€ ์žˆ๋„ค์š”"
163
+
164
+ ### 18. *์ถ”์ƒํ™” ์ด์œ : '๋„๋ฉ”์ธ ๋กœ์ง ๋…ธ์ถœ' ์–ด์ƒ‰*
165
+
166
+ ๋ฆฌ๋ทฐ์–ด (ํ•™์ƒ ๋ณ€ํ˜ธ์— ๋ฐ˜๋ฐ•): "๋„ค ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ *'๋„๋ฉ”์ธ ๋กœ์ง์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์–ด์„œ ์ถ”์ƒํ™”๋ฅผ ํ–ˆ๋‹ค.' ์ด ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋กœ์ง์ด ๋…ธ์ถœ์ด ๋˜๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ์ถ”์ƒํ™”๋ฅผ ํ–ˆ๋‹ค๋Š” ๋ง์ด ์–ด์ƒ‰*ํ•˜๋„ค์š” ๐Ÿค” 1. *ํ•˜๋‚˜์˜ LottoMachine์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋– ํ•œ ๋กœ๋˜๋ฅผ ๋งŒ๋“ค๊ฒ ๋‹ค. ํ†ต๋ณด (enum)* 2. *์—ฌ๋Ÿฌ ๊ฐœ์˜ LottoMachine์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” LottoMachine์„ ์“ด๋‹ค. (ํ˜„์žฌ ๋ฐฉ์‹)* ๋‘˜ ๋‹ค ๊ฒฐ๊ตญ *controller์—์„œ ๊ฒฐ์ •์„ ํ•˜๊ฒŒ ๋˜๋ฉฐ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™*์€๋ฐ์š”. *Controller์—์„œ ํ˜„์žฌ View์˜ ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ์„œ ์–ด๋– ํ•œ Model์„ ๋งŒ๋“ค์ง€์™€ ์–ด๋– ํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋“ฑ๋“ฑ์˜ ํŒ๋‹จ ์ •๋„๋Š” ์ €๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ * ์ƒ๊ฐ์„ ํ•˜๋Š”๋ฐ์š”." โ€” *์ถ”์ƒํ™” ์ •๋‹นํ™”*๊ฐ€ *๋ถ€์ •ํ™•*ํ•˜๋ฉด *์ž˜๋ชป๋œ ์ถ”์ƒํ™”*.
167
+
168
+ ### 19. *MISS๋Š” ์ถœ๋ ฅ ํ•„์š” ์—†์Œ* โ€” matchLotto์—์„œ ๊ฑธ๋Ÿฌ์•ผ
169
+
170
+ ๋ฆฌ๋ทฐ์–ด: "*Rank.MISS์ธ ๊ฒฝ์šฐ ์–ด๋– ํ•œ ์ถœ๋ ฅ๋„ ํ•„์š”๊ฐ€ ์—†๋˜ ๊ฒƒ์ด๋ผ๋ฉด matchLotto๋ผ๋Š” ํ•จ์ˆ˜์—์„œ ๊ฑธ๋Ÿฌ์ค„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ* ๊ฐ™์€๋ฐ ์ด ๋ถ€๋ถ„์€ ๊ทธ๋ฆฌ ํฐ ์‚ฌํ•ญ์€ ์•„๋‹ˆ๊ธฐ์— *๋‚˜์ค‘์— ๊ณ ๋ ค๋งŒ ํ•ด ๋ณด์‹œ๋ฉด* ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."
171
+
172
+ ### 20. `LottoMachine` *๊ธฐ๋ณธ๊ฐ’ emptyList* ์–ด์ƒ‰
173
+
174
+ ๋ฆฌ๋ทฐ์–ด: "*LottoMachine์—์„œ ์ƒ์„ฑ์ž๋กœ ๊ธฐ๋ณธ๊ฐ’์ด emptyList์ธ ๊ฒƒ์€ ๋ญ”๊ฐ€ ์–ด์ƒ‰*ํ•˜๋„ค์š”. *LottoMachine ๊ด€์ ์—์„œ๋Š” ์ƒ์„ฑ์ด ๋˜์—ˆ์„ ๋•Œ ์–ด๋– ํ•œ ๊ฐ’์ด 1๊ฐœ๋ผ๋„ ์กด์žฌ๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™*์€๋ฐ์š” ๐Ÿค”" โ€” *์ƒ์„ฑ์ž ๊ธฐ๋ณธ๊ฐ’ = ์˜๋ฏธ ์žˆ๋Š” ๊ธฐ๋ณธ*์ด์–ด์•ผ.
175
+
176
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
177
+
178
+ - **์ž…๋ ฅ *์ˆœ์„œ๊ฐ€ ๊ฒ€์ฆ ์ˆœ์„œ*์™€ ์ผ์น˜ (UX)**.
179
+ - **`Strategy interface` vs `enum policy`** = ํŠธ๋ ˆ์ด๋“œ์˜คํ”„.
180
+ - **`List<List<Int>>` ๋‚ด๋ถ€ ๊ฒ€์ฆ ๋ถ€์žฌ**.
181
+ - **`toString` *์˜๋„ ์ถฉ๋Œ*** โ€” ๊ฐ’ ์ˆจ๊ธฐ๊ธฐ X.
182
+ - **`it` vs *๋ช…์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ*** โ€” ๊ฐ€๋…์„ฑ.
183
+ - **`Rank.valueOf` *์ถ”๊ฐ€ ๋ถ„๊ธฐ ๋ˆ„๋ฝ* โ†’ entries+find**.
184
+ - **View๋Š” ๋ฉ์ฒญํ•ด์•ผ**.
185
+ - **ํ…Œ์ŠคํŠธ *given์ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์˜์กด* X**.
186
+ - **`emptyList` ๋ฐ˜ํ™˜ โ†’ *null ๋˜๋Š” sealed***.
187
+ - **null์˜ *ํ˜ธ์ถœ์ž ์ •๋ณด ์†์‹ค*** โ€” sealed๋กœ ์ƒํƒœ ํ‘œํ˜„.
188
+ - **`runCatching` *Result ๊ฐ์ฒด๋กœ ์œ„์ž„ ์šฉ์ด*** (Toss ๊ธ€).
189
+ - **`LottoPurchaseInfo` *Info ๋ญ‰๊ฐœ๊ธฐ* ํšŒํ”ผ**.
190
+ - **`MISS` ์ถœ๋ ฅ ํ•„ํ„ฐ๋ง**.
191
+ - **`emptyList()` ๊ธฐ๋ณธ๊ฐ’ โ†’ *์˜๋ฏธ ์žˆ๋Š” ๊ธฐ๋ณธ***.
192
+
193
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
194
+ > valueOf ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด *๋‚˜์ค‘์— Rank ํ•˜๋‚˜๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ valueOf when์—์„œ ๋†“์น˜๊ธฐ ์‰ฝ์ง€ ์•Š์„๊นŒ์š”*? enum์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” *entries์™€ find๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉ*ํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค!
195
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/domain/Rank.kt`
196
+
197
+ > ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋ง์€ **'View๋Š” ๋ฉ์ฒญํ•ด์•ผ ํ•œ๋‹ค.'**
198
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/view/OutputView.kt`
199
+
200
+ > getInputNumber ์ž…์žฅ์—์„œ๋Š” Number๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ˆ Int๊ฐ€ ์•„๋‹ˆ๋ฉด null์ด๋‹ค.๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ *main() ํ•จ์ˆ˜ ์ž…์žฅ์—์„œ๋Š” null์ด ๋“ค์–ด์˜ค๋ฉด ์ด๊ฑฐ๋Š” ๋ญ˜ ํ•˜๋ผ๋Š” ๊ฑฐ์ง€?๋ผ๋Š” ์ƒ๊ฐ*์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .
201
+ > โ€” @lee-ji-hoon on `README.md` (sealed class ์„ค๋ช…)
202
+
203
+ > '๋„๋ฉ”์ธ ๋กœ์ง์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์–ด์„œ ์ถ”์ƒํ™”๋ฅผ ํ–ˆ๋‹ค.'์ด ๋ถ€๋ถ„์—์„œ *๋„๋ฉ”์ธ ๋กœ์ง์ด ๋…ธ์ถœ์ด ๋˜๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ์ถ”์ƒํ™”๋ฅผ ํ–ˆ๋‹ค๋Š” ๋ง์ด ์–ด์ƒ‰*ํ•˜๋„ค์š”.
204
+ > โ€” @lee-ji-hoon on `src/main/kotlin/lotto/domain/LottoMachine.kt`
205
+
206
+ ## ์–ป์€ ๊ตํ›ˆ
207
+
208
+ - ***๊ฒ€์ฆ ์ˆœ์„œ = ์ž…๋ ฅ ์ˆœ์„œ***. *๊ธˆ์•ก โ†’ ์ˆ˜๋™ ์ˆ˜ ์ž…๋ ฅ ํ›„*์— ๊ธˆ์•ก ์˜ค๋ฅ˜ ์•Œ๋ฆฌ๋ฉด *UX ์ตœ์•…*.
209
+ - **`Strategy interface` vs `enum policy` *ํ˜„์žฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ*์— ๋”ฐ๋ผ** โ€” *์™ธ๋ถ€ ์ถ”๊ฐ€ ๊ตฌํ˜„์ฒด ๊ฐ€๋Šฅ*ํ•˜๋ฉด interface, *๊ณ ์ •๋œ ์ข…๋ฅ˜*๋ฉด enum.
210
+ - **`Rank.valueOf when` *์ถ”๊ฐ€ ๋ถ„๊ธฐ ๋ˆ„๋ฝ*** โ€” *enum์˜ ์žฅ์ ์€ entries + find๋กœ ํ™œ์šฉ*. PR #131 (krrong)์˜ *else ํšŒํ”ผ*์™€ ๋ณธ์งˆ ๊ฐ™์Œ.
211
+ - **`toString` ์˜๋„** = *๋””๋ฒ„๊ทธ ํ‘œํ˜„*. *value ์ˆจ๊ธฐ๊ธฐ*๋กœ *์˜ค์šฉ*ํ•˜๋ฉด ํ˜ธ์ถœ์ž ํ—ท๊ฐˆ๋ฆผ.
212
+ - **์•”๋ฌต `it` vs ๋ช…์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ** โ€” *1๋‹จ๊ณ„ ์ถ”๋ก *๋„ ๋น„์šฉ. *๋ณ€์ˆ˜๋ช…*์ด *๋ฌธ์„œ*.
213
+ - **View๋Š” ๋ฉ์ฒญํ•ด์•ผ** โ€” *๋น„์ฆˆ๋‹ˆ์Šค ํ–‰๋™ X, UI ํ‘œ์‹œ๋งŒ*.
214
+ - **ํ…Œ์ŠคํŠธ *given*์€ *ํ•ด๋‹น ๊ฐ์ฒด ์ž…๋ ฅ*** โ€” `LottoMachine` ํ…Œ์ŠคํŠธ๊ฐ€ `์‚ฌ์šฉ์ž ์ž…๋ ฅ`์— ์˜์กดํ•˜๋ฉด *Mock ๊นŠ์ด* ๋ถ€๋‹ด.
215
+ - **ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ช… = *๋ช…์„ธ ๊ฒฐ๊ณผ*** โ€” *'์˜ˆ์™ธ ๋ฐœ์ƒ'*์€ *๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜*. *'์ฒœ์› ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค'*๊ฐ€ ๋ช…์„ธ.
216
+ - **ํ…Œ์ŠคํŠธ๊ฐ€ *์ž๊ธฐ ์ž์‹  ์ฐธ์กฐ*** โ€” `LottoPrice.PRICE`๋กœ ํ…Œ์ŠคํŠธํ•˜๋ฉด *์ƒ์ˆ˜ ๋ณ€๊ฒฝ ์‹œ๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ*.
217
+ - **`emptyList()` ๋ฐ˜ํ™˜ vs *null ๋˜๋Š” sealed*** โ€” *๋นˆ ์˜๋„ ๋ชจํ˜ธ*. *๋ช…ํ™•ํ•œ ์ƒํƒœ*๊ฐ€ *ํ˜ธ์ถœ์ž ํ›„์† ํ–‰๋™*์— ๋„์›€.
218
+ - **null vs sealed** โ€” null = *ํ˜ธ์ถœ์ž๊ฐ€ ํ–‰๋™ ๋ชจ๋ฆ„*. sealed = *์ƒํƒœ + ๋Œ€์‘ ๊ฐ€๋Šฅ*.
219
+ - **`runCatching` *Result ์œ„์ž„ ์šฉ์ด*** โ€” *catch ์œ„์น˜ ๋น„๊ฒฐ์ •* ๋ฌธ์ œ๋ฅผ *๊ฐ์ฒด๋กœ ์ „๋‹ฌ*. Toss ๊ธ€.
220
+ - **`LottoPurchaseInfo` *Info* ๋ญ‰๊ฐœ๊ธฐ** โ€” *๊ฒ€์ฆ๋œ ์ •๋ณด*์™€ *๋ฏธ๊ฒ€์ฆ ์ •๋ณด*๋ฅผ *ํ•œ ํด๋ž˜์Šค*์— ๋‘๋ฉด *์ƒํƒœ ๋ชจํ˜ธ*.
221
+ - **`MISS` ์ถœ๋ ฅ ํ•„ํ„ฐ๋ง = *๋„๋ฉ”์ธ์˜ ํ‘œํ˜„ ์ฑ…์ž„ ์ธ์‹***.
222
+ - **`emptyList()` ๊ธฐ๋ณธ๊ฐ’** = *์ƒ์„ฑ์ž ์˜๋„ ๋ชจํ˜ธ*. *์˜๋ฏธ ์žˆ๋Š” ๊ธฐ๋ณธ*์ด *Optional ํ‘œํ˜„*๋ณด๋‹ค ์ž์—ฐ.
223
+ - **์ถ”์ƒํ™” ์ •๋‹นํ™” = *๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ*** โ€” *๋„๋ฉ”์ธ ๋…ธ์ถœ*์€ *์ถ”์ƒํ™” ์ด์œ *๊ฐ€ ์•„๋‹˜ (interface๋„ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋…ธ์ถœ). *์ง„์งœ ์ด์œ *๋Š” *๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด ๊ฐ€๋Šฅ์„ฑ*.
@@ -0,0 +1,68 @@
1
+ # PR #125 โ€” [๋กœ๋˜ 1๋‹จ๊ณ„] ์ด๋“  ๋ฏธ์…˜
2
+
3
+ - **Reviewee:** [@devfeijoa](https://github.com/devfeijoa)
4
+ - **PR:** https://github.com/woowacourse/kotlin-lotto/pull/125
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @malibinYun
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 48
8
+
9
+ ## ๋ชปํ•œ ์  + ํ•ต์‹ฌ ์ง€์ 
10
+
11
+ ### 1. OutputView๊ฐ€ ๊ฒฐ๊ณผ *์ƒ์„ฑ*๊นŒ์ง€
12
+
13
+ ```kotlin
14
+ class OutputView {
15
+ fun printResult(lottos: List<Lotto>, winning: WinningLotto) {
16
+ val results = lottos.map {. } // โš  View๊ฐ€ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ
17
+ .
18
+ }
19
+ }
20
+ ```
21
+
22
+ > ํ‹ฐ์ผ“ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ผ์€ ๋ทฐ์˜ ์—ญํ• ์ผ๊นŒ์š”?
23
+
24
+ โ†’ View๋Š” *๋ฐ›์€ ๊ฒฐ๊ณผ ์ถœ๋ ฅ*๋งŒ.
25
+
26
+ ### 2. `LottoResult` โ€” ์ด๋ฆ„๊ณผ ์ฑ…์ž„ ๋ถˆ์ผ์น˜
27
+
28
+ ```kotlin
29
+ class LottoResult(.) {
30
+ fun calculate(.): Map<Rank, Int> =.
31
+ fun profitRate(.): Double =.
32
+ // ๊ณ„์‚ฐ๋งŒ ์ˆ˜ํ–‰, ๊ฒฐ๊ณผ ์ž์ฒด๋Š” ๋ณด์œ  X
33
+ }
34
+ ```
35
+
36
+ > LottoResult ๋ผ๋Š” ์ด๋ฆ„์ด๋ผ ์–ด๋– ํ•œ ๊ฒฐ๊ณผ ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฑฐ๋ผ ๊ธฐ๋Œ€ํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฐ์ฒด์˜€๋„ค์š”! ์ด ๊ฐ์ฒด๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋А๋‚Œ์ด ๋“ค์–ด์š”.
37
+
38
+ โ†’ ์ด๋ฆ„ `LottoResult` = ๋ณด์œ , ์‹ค์ œ๋Š” ๊ณ„์‚ฐ. ๋‘ ์ฑ…์ž„ (๊ณ„์‚ฐ + ํ‘œํ˜„) ๋ถ„๋ฆฌ.
39
+
40
+ ### 3. `LottoStore`์™€ `LottoGenerator` ์ฐจ์ด?
41
+
42
+ ```kotlin
43
+ val tickets = lottoStore.getTickets(.)
44
+ // vs
45
+ val tickets = lottoGenerator.generate(.)
46
+ ```
47
+
48
+ > ์•„๋ž˜ ๋‘ ์ฝ”๋“œ์—์„œ ๋งŽ์€ ์ฐจ์ด์ ์ด ์žˆ์—ˆ๋‚˜์š”?
49
+
50
+ โ†’ "Store" (๋ณด์œ ) vs "Generator" (์ƒ์„ฑ) โ€” ๋„๋ฉ”์ธ ์˜๋ฏธ ๋‹ค๋ฆ„. ํ•™์ƒ์ด *Store*๋ฅผ *Generator*์ฒ˜๋Ÿผ ์“ด ๊ฒฝ์šฐ.
51
+
52
+ ### 4. `LottoTicketCounter` โ€” ํ•จ์ˆ˜๋กœ ์ถฉ๋ถ„
53
+
54
+ ```kotlin
55
+ class LottoTicketCounter {
56
+ fun count(price: Int): Int =.
57
+ }
58
+ ```
59
+
60
+ > ์ด ๊ฐ’์€ ๊ผญ ํ•จ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„ ๋ณด์ด๋„ค์š”!
61
+
62
+ โ†’ `Money` property๋กœ ์ถฉ๋ถ„.
63
+
64
+ ## ์–ป์€ ๊ตํ›ˆ
65
+
66
+ - **์ด๋ฆ„์€ *๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ*๊ฐ€ ์•„๋‹ˆ๋ผ *์ฑ…์ž„*์„ ํ‘œํ˜„**. `LottoResult`๊ฐ€ ๊ณ„์‚ฐ๋งŒ = god-object. *Result*๋Š” ๋ณด์œ , *Calculator*๋Š” ๊ณ„์‚ฐ, *Formatter*๋Š” ํ‘œํ˜„.
67
+ - **ํ˜„์‹ค ์–ดํœ˜ ์ฐจ์ด** โ€” Store vs Generator. ๋น„์œ ๋กœ ๋„๋ฉ”์ธ ์˜๋ฏธ ๊ฒ€์ฆ.
68
+ - **ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง„ ํด๋ž˜์Šค** = top-level fun ๋˜๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ.