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,44 @@
1
+ # PR #53 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ] ์‚ฐ๊ตฐ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@s9hn](https://github.com/s9hn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/53
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @vagabond95
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 7
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **Driver ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋А์Šจํ•œ ์—ฐ๊ฒฐ** โ€” ์›€์ง์ž„ ๊ฒฐ์ •์˜ ์ถ”์ƒํ™”.
12
+ - **DriverDecision enum** โ€” ๊ฒฐ์ • ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ ๋ช…์‹œ.
13
+ - **backing field๋กœ ์™ธ๋ถ€ read-only**.
14
+ - **colon/separator ์ƒ์ˆ˜ํ™” (๊ผผ๊ผผํ•œ ์œ„์ƒ)**.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **`Application`์ด Controller ์ฑ…์ž„ ์ผ๋ถ€ ๋ณด์œ ** โ€” Controller ๋ถ„๋ฆฌ ์˜๋ฏธ ์•ฝํ™”.
19
+ - **`Referee.filter`๋กœ ๋ณ„๋„ ํ•จ์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅํ•œ๋ฐ ๊ทธ๋Œ€๋กœ ๋‘ **.
20
+
21
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
22
+
23
+ ๋ฆฌ๋ทฐ์–ด @vagabond95์˜ ๋ฉ”์‹œ์ง€:
24
+
25
+ 1. **์›์‹œ๊ฐ’์€ `private set`์ด backing field๋ณด๋‹ค ๊ฐ„๊ฒฐ** โ€” "์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ mutableXXX ๋…ธ์ถœ ํšŒํ”ผ๊ฐ€ ํ•„์š”ํ•œ ์ผ€์ด์Šค๋งŒ backing field ์ •๋‹นํ™”."
26
+
27
+ 2. **Application์€ *์‹คํ–‰ ์ง„์ž…์ *๋งŒ** โ€” ๋น„์ฆˆ๋‹ˆ์Šค ์˜์กด์„ฑ ๋ณด์œ  ํšŒํ”ผ.
28
+
29
+ 3. **enum + ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉ ์นญ์ฐฌ**.
30
+
31
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
32
+ > backing field ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์‹  ๋ถ€๋ถ„ ์ข‹์Šต๋‹ˆ๋‹ค ๐Ÿ‘ ๋‹ค๋งŒ, ์ €๋Š” ์›์‹œ๊ฐ’์ธ ๊ฒฝ์šฐ์—๋Š” setter ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋” ์„ ํ˜ธํ•˜๋Š”๋ฐ์š”. ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์ด read only ํƒ€์ž…์ด ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š” ์ผ€์ด์Šค์—์„œ๋Š”, mutableXXX ๊ฐ™์€ ํƒ€์ž…์„ ๋ฆฌํ„ดํ•ด์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— backing field ๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›์‹œ๊ฐ’์€ ํฌ๊ฒŒ ์ƒ๊ด€์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋„ ํ•˜๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ๊ตฌ์š”
33
+ >
34
+ > โ€” @vagabond95 on `src/main/kotlin/domain/Car.kt`
35
+
36
+ > Controller ๋ฅผ ๋ณ„๋„๋กœ ๋‘” ์ด์ƒ, main ์—์„œ๋Š” ์‹ค์ œ ๋™์ž‘์— ๋Œ€ํ•œ ์ •๋ณด ํ˜น์€ ์˜์กด์„ฑ์„ ์ตœ๋Œ€ํ•œ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.
37
+ >
38
+ > โ€” @vagabond95 on `src/main/kotlin/Application.kt`
39
+
40
+ ## ์–ป์€ ๊ตํ›ˆ
41
+
42
+ - **์›์‹œ๊ฐ’ = `private set`. ์ปฌ๋ ‰์…˜ = backing field**. ์ปฌ๋ ‰์…˜์˜ mutable/immutable ๋…ธ์ถœ ๋ถ„๋ฆฌ์—๋Š” backing field๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์›์‹œ๊ฐ’์€ `private set`์ด ๊น”๋”.
43
+ - **Application/main = ์˜์กด์„ฑ 0**. ์ง„์ž…์ ์€ Controller ์ƒ์„ฑํ•˜๊ณ  ํ˜ธ์ถœ๋งŒ. ๋น„์ฆˆ๋‹ˆ์Šค ์˜์กด์„ฑ์ด main์— ์žˆ์œผ๋ฉด Controller ๋ถ„๋ฆฌ ๋ฌด์˜๋ฏธ.
44
+ - **enum + ์ธํ„ฐํŽ˜์ด์Šค**์˜ ํ˜‘๋ ฅ โ€” DriverDecision enum์ด ๊ฒฐ๊ณผ์˜ *์˜๋ฏธ*๋ฅผ, Driver ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ *๊ฒฐ์ • ๋ฐฉ์‹*์„ ํ‘œํ˜„. ๋‘ ์ถ”์ƒ์ด ํ˜‘๋ ฅ.
@@ -0,0 +1,43 @@
1
+ # PR #78 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ - ๋ฆฌํŒฉํ† ๋ง] ์‚ฐ๊ตฐ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@s9hn](https://github.com/s9hn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/78
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„ (๋ฆฌํŒฉํ† ๋ง)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @vagabond95
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 5
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`set private`๋กœ backing field ๋‹จ์ˆœํ™”** โ€” ์›์‹œ๊ฐ’ ์ ์šฉ.
12
+ - **์ ‘๊ทผ ์ œํ•œ์ž ๊ผผ๊ผผ**.
13
+ - **enum + ์ธํ„ฐํŽ˜์ด์Šค**.
14
+
15
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
16
+
17
+ - **`DriverDecision`์˜ `distance`๊ฐ€ String** โ€” UI ํ‘œํ˜„์ด ๋„๋ฉ”์ธ enum์— ์นจํˆฌ.
18
+ - **CarTest๊ฐ€ "-" ํ‘œํ˜„์— ์˜์กด** โ€” ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ๊ฐ€ UI ๊ฒฐ๊ณผ ๊ฒ€์ฆ.
19
+
20
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
21
+
22
+ ๋ฆฌ๋ทฐ์–ด @vagabond95์˜ ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€:
23
+
24
+ 1. **enum์˜ *๋ฐ์ดํ„ฐ*๋Š” ๋„๋ฉ”์ธ ์˜๋ฏธ** โ€” `distance`๊ฐ€ "-" ๊ฐ™์€ UI ๋ฌธ์ž๋ฉด, *UI ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ ์‹œ ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ*. boolean (`true`/`false`)์ด ๋„๋ฉ”์ธ.
25
+
26
+ 2. **ํ…Œ์ŠคํŠธ์˜ ์˜์กด = ๊ฒ€์ฆ ๋Œ€์ƒ**. CarTest๊ฐ€ UI ํ‘œํ˜„ ("-")์— ์˜์กดํ•˜๋ฉด UI ๋ณ€๊ฒฝ ์‹œ CarTest๋„ ๊นจ์ง. ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ๋Š” ๋„๋ฉ”์ธ ๊ฐ’๋งŒ ๊ฒ€์ฆ.
27
+
28
+ 3. **`set private`๋กœ backing field ๋Œ€์ฒด ์นญ์ฐฌ** โ€” ์›์‹œ๊ฐ’ ์ผ€์ด์Šค์— ์ ํ•ฉ.
29
+
30
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
31
+ > ๋‹ค๋งŒ, distance ๋ฅผ string ์ด ์•„๋‹Œ true / false ๋“ฑ์œผ๋กœ ํ‘œํ˜„ํ–ˆ์œผ๋ฉด ๋” ์ข‹์•˜์„๊ฑฐ ๊ฐ™์•„์š”. `"-"` ๊ฐ’์€ ์–ด๋””๊นŒ์ง€๋‚˜ UI ์™€ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„์ด๊ณ , UI ์™€ ๊ด€๋ จ๋œ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ domain ์˜์—ญ์˜ ์ฝ”๋“œ์—๋„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์•„๋ณด์ž…๋‹ˆ๋‹ค.
32
+ >
33
+ > โ€” @vagabond95 on `src/main/kotlin/domain/DriverDecision.kt`
34
+
35
+ > DriverDecision ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฆฌ๋ทฐ์˜ ์—ฐ์žฅ์„ ์œผ๋กœ, ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—ญ์‹œ '๋„๋ฉ”์ธ'์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ "ui" ๊ฒฐ๊ณผ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋ ๊ฑฐ ๊ฐ™์•„์š”. '์ž๋™์ฐจ์˜ ์ฃผํ–‰ ๊ฑฐ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•  ๊ฒƒ์ธ์ง€'์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐ”๋€Œ๋ฉด CarTest ์˜ ์ฝ”๋“œ ์—ญ์‹œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ• ํ…Œ๋‹ˆ๊นŒ์š”.
36
+ >
37
+ > โ€” @vagabond95 on `src/test/kotlin/domain/CarTest.kt`
38
+
39
+ ## ์–ป์€ ๊ตํ›ˆ
40
+
41
+ - **enum์˜ ๋ฐ์ดํ„ฐ๋Š” *๋„๋ฉ”์ธ ์˜๋ฏธ*๋งŒ**. `"-"` ๊ฐ™์€ UI ํ‘œํ˜„์ด enum์— ๋“ค์–ด๊ฐ€๋ฉด UI ๋ณ€๊ฒฝ์ด enum ๋ณ€๊ฒฝ, ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ. ๋‘ ๋ณ€๊ฒฝ ์ด์œ ๊ฐ€ ํ•˜๋‚˜์˜ enum์— ๋ชจ์ž„.
42
+ - **ํ…Œ์ŠคํŠธ์˜ ์˜์กด = ๊ฒ€์ฆ ๋Œ€์ƒ์˜ ์ผ๋ถ€**. ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ๊ฐ€ UI ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋ฉด, ๊ทธ ํ…Œ์ŠคํŠธ๋Š” ๋„๋ฉ”์ธ์ด ์•„๋‹Œ *๋„๋ฉ”์ธ + UI* ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฉ์ด ๋ฌด๋„ˆ์ง.
43
+ - **`"-"`์˜ ์ž๋ฆฌ = OutputView ์ƒ์ˆ˜**. ๋„๋ฉ”์ธ์€ boolean / ๊ฑฐ๋ฆฌ(Int), ํ‘œํ˜„์€ View๊ฐ€ ์ฑ…์ž„.
@@ -0,0 +1,55 @@
1
+ # PR #107 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ] ์‹ฌ์ง€ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@sh1mj1](https://github.com/sh1mj1)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/107
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @ghojeong
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 8
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`TryCount` ๋„๋ฉ”์ธ ๊ฐ์ฒด + ํŒฉํ† ๋ฆฌ ํŒจํ„ด** โ€” ์›์‹œ ๊ฐ•๋ฐ• ํƒˆ์ถœ.
12
+ - **`NumberGenerator` ์ธํ„ฐํŽ˜์ด์Šค + `ExplicitNumberGenerator` ํ…Œ์ŠคํŠธ ๋”๋ธ”**.
13
+ - **`Car`์˜ ์ด๋ฆ„ ๊ฒ€์ฆ์„ model์—์„œ** โ€” ๋„๋ฉ”์ธ invariant.
14
+ - **์ƒ์ˆ˜์— `private` ์ ์šฉ**.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **`RacingGame`(Controller)์ด NumberGenerator๋ฅผ ์ง์ ‘ ๋ฐ›์Œ** โ€” DI ํ๋ฆ„ ๊ธธ์–ด์ง.
19
+ - **`TryCount`๋ฅผ data class๋กœ ์“ฐ๊ณ  ์‹ถ์ง€๋งŒ private constructor์™€ ์ถฉ๋Œ** โ€” copy๋กœ ์šฐํšŒ ๊ฐ€๋Šฅํ•ด์„œ ์ง„์ •ํ•œ private ์•„๋‹˜.
20
+ - **Car๋Š” data class, TryCount๋Š” ์ผ๋ฐ˜ class** โ€” ๋‘˜ ์‚ฌ์šฉ ๊ธฐ์ค€ ๋น„๋Œ€์นญ.
21
+
22
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
23
+
24
+ ๋ฆฌ๋ทฐ์–ด @ghojeong์˜ ํ•ต์‹ฌ ๊ฐ€๋ฅด์นจ:
25
+
26
+ 1. **DI ํ‚ค์›Œ๋“œ๋ณด๋‹ค *์—ญํ• ๊ณผ ์ฑ…์ž„*** โ€” "DI ๋ผ๋Š” ํ‚ค์›Œ๋“œ์— ์ง‘์ฐฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” NumberGenerator ์™€ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ class ๊ฐ€ ๋ˆ„๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ์—ญํ• ๊ณผ ์ฑ…์ž„ ๊ด€์ ์—์„œ ์ƒ๊ฐ." ์กฐ์˜ํ˜ธ "๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด" 3์š”์†Œ (์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ).
27
+
28
+ 2. **์ด๋ฆ„ ๊ฒ€์ฆ์˜ *๋ชจ๋ธ ์œ„์น˜* ์ •๋‹นํ™”** โ€” "์ด๋ฆ„์ด 5์ž ๋„˜์€ ์ฑ„๋กœ ์„œ๋ฒ„ ํ†ต์‹ ํ•˜๋ฉด ํฌ๋ž˜์‹œ ๊ฐ€๋Šฅ. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋ธ ๊ฒ€์ฆ์ด ๋งž๋‹ค." ๊ฒ€์ฆ ์œ„์น˜๋Š” *์‹คํŒจ์˜ ์˜ํ–ฅ*์œผ๋กœ ๊ฒฐ์ •.
29
+
30
+ 3. **์ƒ์ˆ˜ private ๊ถŒ์žฅ** โ€” IDE ์ž๋™์™„์„ฑ์— ๋„ˆ๋ฌด ๋งŽ์€ ํ•ญ๋ชฉ์ด ๋œจ๋ฉด ํ˜‘์—…์ž ํ˜ผ๋ž€.
31
+
32
+ 4. **data class ์‚ฌ์šฉ ์ผ๊ด€์„ฑ** โ€” Car๋Š” data class, TryCount๋Š” ์ผ๋ฐ˜ class. ํ•™์ƒ์ด *์™œ* ๋‹ค๋ฅด๊ฒŒ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ธฐ.
33
+
34
+ 5. **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ *์ง„์ •ํ•œ ๊ฐ€์น˜* = "๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š”์ง€" ๋ช…ํ™•**. toInt ํ˜ธ์ถœ์ด ๊ตฐ๋”๋”๊ธฐ์—ฌ๋„ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๋ฉด OK.
35
+
36
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
37
+ > DI ๋ผ๋Š” ํ‚ค์›Œ๋“œ์— ์ง‘์ฐฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” NumberGenerator ์™€ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ class ๊ฐ€ ๋ˆ„๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ์—ญํ• ๊ณผ ์ฑ…์ž„ ๊ด€์ ์—์„œ ์ƒ๊ฐ์„ ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์„ค๊ณ„๋ฅผ ํ•  ๋•Œ์˜ 3๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ์ด๋ผ๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ์ฑ…์—์„œ ๊ผฝ์Šต๋‹ˆ๋‹ค.
38
+ >
39
+ > โ€” @ghojeong on `src/main/kotlin/controller/RacingGame.kt:24`
40
+
41
+ > ๊ฐ€๋ น ์ด๋ฆ„์ด ๊ณต๋ฐฑ์ด ํ—ˆ์šฉ๋˜๊ฑฐ๋‚˜ 5๊ธ€์ž๋ฅผ ๋„˜์€ ์ƒํƒœ๋กœ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ด์ง€ ๋ชปํ•ด ํฌ๋ž˜์‹œ๊ฐ€ ๋‚˜๋Š” ์ค‘๋Œ€ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ €๋„ ์ด๋ ‡๊ฒŒ ๋ชจ๋ธ์„ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
42
+ >
43
+ > โ€” @ghojeong on `src/test/kotlin/domain/CarTest.kt:21`
44
+
45
+ > Car ๋Š” data class ๋ฅผ ํ™œ์šฉํ•˜์…จ์ง€๋งŒ, count ์›์‹œ๊ฐ’์„ ํฌ์žฅํ•œ TryCount ๋Š” data class ๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์œผ์…จ๊ตฐ์š”. ์‹ฌ์ง€๋‹˜์€ Car ์— data class ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค ํŽธ๋ฆฌํ•จ์„ ์–ป์œผ์…จ๋Š”์ง€, TryCount ์—์„œ๋Š” ์™œ data class ๋ฌธ๋ฒ•์ด ๋ถˆํŽธํ•˜์˜€๋Š”์ง€ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
46
+ >
47
+ > โ€” @ghojeong on `src/main/kotlin/domain/Car.kt:6`
48
+
49
+ ## ์–ป์€ ๊ตํ›ˆ
50
+
51
+ - **DI๋Š” *์ˆ˜๋‹จ*์ด์ง€ *๋ชฉ์ * ์•„๋‹ˆ๋‹ค**. "์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ์ฃผ์ž…ํ• ์ง€"๊ฐ€ ์•„๋‹ˆ๋ผ "์ด ๊ฐ์ฒด๊ฐ€ ๋ˆ„๊ตฌ์™€ ํ˜‘๋ ฅํ•ด์•ผ ํ•˜๋Š”๊ฐ€"๊ฐ€ ์ถœ๋ฐœ์ . ํ˜‘๋ ฅ์ž๊ฐ€ ์ •ํ•ด์ง€๋ฉด ์ฃผ์ž… ์ž๋ฆฌ๋Š” ๋”ฐ๋ผ์˜ด.
52
+ - **๊ฒ€์ฆ์˜ ์œ„์น˜ = "์‹คํŒจ์˜ ์˜ํ–ฅ"์œผ๋กœ ๊ฒฐ์ •**. ๋„๋ฉ”์ธ์ด ์™ธ๋ถ€ ์‹œ์Šคํ…œ(์„œ๋ฒ„, ํŒŒ์ผ, DB)๊ณผ ํ†ต์‹ ํ•˜๋ฉด, ์ž˜๋ชป๋œ ์ž…๋ ฅ์ด *์™ธ๋ถ€์—์„œ ๊นจ์ง€๋Š” ๊ฒŒ* ๋” ์œ„ํ—˜. ๋ชจ๋ธ ๊ฒ€์ฆ์ด ์ •๋‹นํ™”๋จ.
53
+ - **๋ชจ๋“  ์‚ฌ์†Œํ•œ ๊ฒฐ์ •์—๋Š” *์ด์œ *๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค**. data class vs class๋ฅผ *์™œ* ๋‹ค๋ฅด๊ฒŒ ๊ณจ๋ž๋Š”์ง€๊ฐ€ ํ•™์ƒ์˜ ๊ธฐ์ค€์ด ๋จ. ๊ฒฐ๊ณผ๋ณด๋‹ค *๊ณผ์ •์˜ ์ด์œ *๊ฐ€ ํ•™์Šต.
54
+ - **public ์ƒ์ˆ˜์˜ ๋น„์šฉ = IDE ์ž๋™์™„์„ฑ ๋…ธ์ด์ฆˆ**. private๋Š” ๋‹จ์ง€ ์บก์Аํ™” ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ *๋™๋ฃŒ๋ฅผ ์œ„ํ•œ ์ฒญ๊ฒฐ*.
55
+ - **ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์˜ ๊ฐ€์น˜ = "๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€" ๋ช…ํ™•ํ•จ**. ๊ตฐ๋”๋”๊ธฐ toInt ํ˜ธ์ถœ์ด ์žˆ์–ด๋„ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๋ฉด OK. *์ง€๋‚˜์นœ ๋ฏธ์  ์ถ”๊ตฌ*๋Š” ํ•™์Šต ๋‹จ๊ณ„์— ๋ฐฉํ•ด.
@@ -0,0 +1,61 @@
1
+ # PR #115 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ - ๋ฆฌํŒฉํ† ๋ง] ์‹ฌ์ง€ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@sh1mj1](https://github.com/sh1mj1)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/115
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„ (๋ฆฌํŒฉํ† ๋ง)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @ghojeong
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 15
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`MoveStrategy` ์ธํ„ฐํŽ˜์ด์Šค + ์ „๋žต ํŒจํ„ด ๋ณธ๊ฒฉ ๋„์ž…** โ€” Car๋Š” ์–ด๋–ป๊ฒŒ ์ˆซ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ๋ชจ๋ฆ„.
12
+ - **`MoveStrategyUsingNumber`๋ฅผ *๋ณ„๋„ ํด๋ž˜์Šค*๋กœ** (์ต๋ช… ํ•จ์ˆ˜ ๋Œ€์‹ ) โ€” ์š”๊ตฌ์‚ฌํ•ญ์— ๋ถ€ํ•ฉํ•˜๋Š” ์ž๋ฆฌ ๋ช…ํ™•.
13
+ - **NumberGenerator + MoveStrategy ๋ถ„๋ฆฌ** โ€” ๋‘ ์ฑ…์ž„์ด ํ•œ ๊ฐ์ฒด์— ํ•ฉ์ณ์ง€์ง€ ์•Š์Œ.
14
+ - **ํƒ€์ž…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ›๊ธฐ** (Controller๊ฐ€ MoveStrategy ๋ฐ›๊ธฐ).
15
+ - **ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€์— `MoveStrategyIsAlways` ๋ณ„๋„ ๊ตฌํ˜„** โ€” ํ…Œ์ŠคํŠธ ๋”๋ธ”์˜ ์ž๋ฆฌ ๋ถ„๋ช….
16
+ - **ํ…Œ์ŠคํŠธ ํƒ€์ž…์„ *๊ตฌํ˜„์ฒด*๋กœ ๋ช…์‹œ** โ€” ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹  ์‹ค๊ตฌํ˜„์ฒด๋กœ ํ•จ์œผ๋กœ์จ *์–ด๋–ค ๊ตฌํ˜„*์„ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€ ๋ช…์‹œ.
17
+ - **์ž๊ฐ€ ๋ถ„์„์œผ๋กœ DI ๊นŠ์ด ๋ฌธ์ œ *์Šค์Šค๋กœ ํ•ด๊ฒฐ*** โ€” Car๋Š” ์ˆซ์ž ์ƒ์„ฑ์„ ์•Œ ํ•„์š” ์—†์Œ โ†’ MoveStrategy๋กœ ์œ„์ž„.
18
+
19
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
20
+
21
+ - **`TryCount`์˜ private constructor + data class ์ถฉ๋Œ ๋ฏธํ•ด๊ฒฐ** โ€” ํ•™์ƒ์ด ์ผ๋ฐ˜ class๋กœ ํšŒํ”ผ.
22
+
23
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
24
+
25
+ ๋ฆฌ๋ทฐ์–ด @ghojeong์˜ *์ตœ์ƒ์œ„ ์นญ์ฐฌ* ๋ฆฌ๋ทฐ. ํ•™์ƒ์ด 1๋‹จ๊ณ„ ํ”ผ๋“œ๋ฐฑ์„ ์ž๊ฐ€ ํ•™์Šต์œผ๋กœ ๋ฐœ์ „์‹œํ‚จ ์ด์ƒ์  ์‚ฌ๋ก€.
26
+
27
+ 1. **๋ถˆํŽธ ์ธ์ง€ + ์ž๊ฐ€ ํ•ด๊ฒฐ = ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋ณธ์งˆ** โ€” "๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๋ณ„๋กœ ์•ˆ ์ค‘์š”. ๋ถˆํŽธํ•จ์„ ์Šค์Šค๋กœ ์ธ์ง€ํ•˜๊ณ , ์ธ์ง€ํ•œ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด ์ œ์ผ ์ค‘์š”. ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๋ถˆํŽธ์„ ํ•ด๊ฒฐํ•˜๋Š” ์ˆ˜๋งŽ์€ ๋ฐฉ๋ฒ• ์ค‘ ์ •ํ˜•ํ™”๋œ ๋ฐฉ๋ฒ• ํ•˜๋‚˜์— ๋ถˆ๊ณผ."
28
+
29
+ 2. **"๊ฐ์ฒด์ง€ํ–ฅ์— ๋งž๋А๋ƒ"์˜ ๋‹ต = "๋ฌด์Šจ ๊ฐ์ฒด๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ๋‚˜"** โ€” ํ•™์ƒ ์Šค์Šค๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ถฉ๋ถ„. ํ•™์ƒ์€ ์ด๋ฏธ ๋‹ต์„ ๋“ค๊ณ  ์žˆ์Œ.
30
+
31
+ 3. **data class + private constructor์˜ ์ถฉ๋Œ** โ€” `copy()` ๋ฉ”์„œ๋“œ๋กœ ์šฐํšŒ ๊ฐ€๋Šฅ. *์ง„์ •ํ•œ private*์€ ๋ถˆ๊ฐ€. ์•ˆ๋“œ๋กœ์ด๋“œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ด€์ ์—์„œ "๊ฐ™์€ data โ†’ ๊ฐ™์€ ์ฐธ์กฐ" ์œ ์ง€๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ.
32
+
33
+ 4. **์ต๋ช… ํ•จ์ˆ˜ vs ๋ณ„๋„ ํด๋ž˜์Šค** โ€” ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ณ  ์‹ค๊ตฌํ˜„์„ ์ต๋ช…์œผ๋กœ ์ž์ฃผ ์“ฐ์ง€๋งŒ, ๋ณ„๋„ ํด๋ž˜์Šค๊ฐ€ *์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…์‹œ*.
34
+
35
+ 5. **ํ…Œ์ŠคํŠธ์˜ ํƒ€์ž… = ๊ตฌํ˜„์ฒด๋กœ ๋ช…์‹œ** โ€” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„์ฒด๋กœ ๋ฐ›์œผ๋ฉด "์ด๊ฑด *์ด ๊ตฌํ˜„*์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค"๊ฐ€ ๋ถ„๋ช….
36
+
37
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
38
+ > ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์‚ฌ์‹ค ๋ณ„๋กœ ์•ˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ์ง€๋‹˜์ด ๋ถˆํŽธํ•จ์„ ๋А๋‚€ ๋ถ€๋ถ„์„ ์Šค์Šค๋กœ ์ธ์ง€ํ•˜๊ณ , ์ธ์ง€ํ•œ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด ์ œ์ผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๋ถˆํŽธํ•จ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋ฐฉ๋ฒ• ์ค‘, ์ •ํ˜•ํ™”๋˜์–ด ์—…๊ณ„์— ํ†ต์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.
39
+ >
40
+ > โ€” @ghojeong on `src/main/kotlin/Application.kt:1`
41
+
42
+ > ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋“ค์–ด๋งž๋А๋ƒ๋ผ๋Š” ์งˆ๋ฌธ์—๋Š” ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ฌ์ง€๋‹˜ ์Šค์Šค๋กœ, ๋ฌด์Šจ "๊ฐ์ฒด" ๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ๋‹ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
43
+ >
44
+ > โ€” @ghojeong on `src/main/kotlin/Application.kt:1`
45
+
46
+ > ๊ธฐ๊ป MoveStrategy ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ–ˆ์ง€๋งŒ, ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๋งŽ์€๋ฐ, ์š”๊ตฌ์‚ฌํ•ญ์— ๋ถ€ํ•ฉ๋˜๋Š” MoveStrategyUsingNumber ๋ฅผ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•ด์ฃผ์‹ ์  ๋ฉ‹์ง‘๋‹ˆ๋‹ค.
47
+ >
48
+ > โ€” @ghojeong on `src/main/kotlin/domain/MoveStrategyUsingNumber.kt:8`
49
+
50
+ > ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์ด ์ตœ์ ํ™”์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ”„๋ก ํŠธ ๊ด€๋ จ ํ”„๋ ˆ์ž„์›Œํฌ ํ˜น์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š”, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ดํ›„์—, ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ™”๋ฉด์„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ์ตœ์ ํ™”๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
51
+ >
52
+ > โ€” @ghojeong on `src/main/kotlin/domain/TryCount.kt:1`
53
+
54
+ ## ์–ป์€ ๊ตํ›ˆ
55
+
56
+ - **๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„ = ๋„๊ตฌ. ๋ถˆํŽธ ์ธ์ง€ = ์ง„์งœ ๋ณธ์งˆ.** "์ด ์ฝ”๋“œ์˜ ๋ถˆํŽธํ•จ์ด ๋ญ์ง€? โ†’ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ? โ†’ OOP๊ฐ€ ๊ทธ ํ•ด๊ฒฐ์˜ *์ •ํ˜•ํ™”๋œ* ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜"๊ฐ€ ์‚ฌ๊ณ  ํ๋ฆ„.
57
+ - **์ž๊ฐ€ ์ ๊ฒ€์˜ ์งˆ๋ฌธ**: "๋‚ด๊ฐ€ ํ’€์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, *๋ฌด์Šจ ๊ฐ์ฒด*๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ๋‚˜?" ๊ทธ ๋‹ต์ด ๋ถ„๋ช…ํ•˜๋ฉด OOP ์ž˜ ์ ์šฉํ•œ ๊ฒƒ. ๋‹ต ๋ชป ํ•˜๋ฉด ํ‘œ๋ฉด๋งŒ ํ‰๋‚ด.
58
+ - **์ธํ„ฐํŽ˜์ด์Šค + ์ต๋ช… ํ•จ์ˆ˜ vs ๋ณ„๋„ ํด๋ž˜์Šค**. ๋ณ„๋„ ํด๋ž˜์Šค๊ฐ€ *์š”๊ตฌ์‚ฌํ•ญ ์ž์ฒด*๋ฅผ ์ฝ”๋“œ์— ๋‚จ๊น€. ์ต๋ช…์€ ๋น ๋ฅด์ง€๋งŒ ๊ทธ ์ž๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์–ด๋ ค์›€. *์š”๊ตฌ์‚ฌํ•ญ์ด ์˜๊ตฌํ•œ ๊ฒƒ*์€ ํด๋ž˜์Šค๋กœ.
59
+ - **data class์˜ ๋™์น˜์„ฑ = ์ฐธ์กฐ ๋™์น˜์„ฑ๊ณผ ๋งž๋ฌผ๋ ค ๋ Œ๋”๋ง ์ตœ์ ํ™” ์˜ํ–ฅ**. value ๊ฐ™์œผ๋ฉด ์ฐธ์กฐ๋„ ๊ฐ™๊ฒŒ = ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ์Šคํ‚ต ๊ฐ€๋Šฅ. private constructor + copy ์šฐํšŒ๋Š” ์ด invariant ๊นจ๋œจ๋ฆผ.
60
+ - **ํ…Œ์ŠคํŠธ์˜ ํƒ€์ž… = ์ธํ„ฐํŽ˜์ด์Šค vs ๊ตฌํ˜„์ฒด ์„ ํƒ**. ์ธํ„ฐํŽ˜์ด์Šค๋Š” "์ด ์ถ”์ƒ์— ๋Œ€ํ•œ ๊ฒ€์ฆ"์ด์ง€๋งŒ ๊ตฌํ˜„์ฒด๋กœ ๋ฐ›์œผ๋ฉด "์ด ๊ตฌํ˜„์ฒด ๊ฒ€์ฆ"์œผ๋กœ ๋ช…์‹œ. *์–ด๋А ๊ฒŒ ๋งž๋А๋ƒ*๋Š” ํ…Œ์ŠคํŠธ ์˜๋„์— ๋”ฐ๋ผ.
61
+ - **๋ฆฌ๋ทฐ์–ด๊ฐ€ "๋ฐ•์ˆ˜์ณค์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์นญ์ฐฌํ•˜๋Š” PR์˜ ํŠน์ง•** = (1) 1๋‹จ๊ณ„ ํ”ผ๋“œ๋ฐฑ ํก์ˆ˜ (2) ์ž๊ฐ€ ํ•™์Šต์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋ฐœ์ „ (3) ๊ทธ ๊ฒฐ์ •์˜ ์ด์œ ๋ฅผ PR ๋ณธ๋ฌธ์— ์ •๋ฆฌ. ์ด์ƒ์  ํ•™์Šต ๊ณก์„ .
@@ -0,0 +1,51 @@
1
+ # PR #119 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ตฌํ˜„] ์•Œ์†ก ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค (2๋‹จ๊ณ„)
2
+
3
+ - **Reviewee:** [@songpink](https://github.com/songpink)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/119
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @KwonDae
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 18
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **MVC์˜ ์˜๋ฏธ๋ฅผ ์ž๊ธฐ ์–ธ์–ด๋กœ ์ •๋ฆฌ** โ€” "Controller๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ณ , ์ •๋ณด ๊ด€๋ฆฌ๋Š” model"์ด๋ผ๋Š” ์ •์˜๋ฅผ ์ง์ ‘ ์‹œ๋„ํ•˜๋ฉฐ ํ† ๋ก ์„ ๋Œ์–ด์˜ด.
12
+ - **`RacingGame` ๋ชจ๋ธ ๋„์ž…์œผ๋กœ ๊ฒŒ์ž„ ์ƒํƒœ์˜ ์ž๋ฆฌ ์ •์ฐฉ** โ€” ๋ฆฌ๋ทฐ์–ด ํ”ผ๋“œ๋ฐฑ ํ›„ "๊ฒฝ์ฃผ์žฅ"์ด๋ผ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ถ”๊ฐ€ํ•ด Car๋“ค์„ ํ•œ ๊ณณ์— ๋ชจ์Œ.
13
+ - **์šฐ์Šน์ž ํŒ๋ณ„ ์ฑ…์ž„์„ ๊ฒฝ์ฃผ์žฅ์œผ๋กœ ์ด๋™** โ€” `FinalWinner`๋ผ๋Š” ์ ˆ์ฐจ์  ํ•จ์ˆ˜ํ˜• ํด๋ž˜์Šค์—์„œ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ.
14
+ - **Car๊ฐ€ ์ž๋™์ฐจ ๋ฐ์ดํ„ฐ์™€ ์›€์ง์ธ๋‹ค๋Š” ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ–๋Š”๋‹ค๋Š” ์ •์˜๋ฅผ ๋ช…ํ™•ํžˆ** โ€” ๋ฆฌ๋ทฐ์–ด๊ฐ€ "๋งž์Šต๋‹ˆ๋‹ค ๐Ÿ‘"๋กœ ํ™•์ธ.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **Model์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ˆ„๋ฝ** โ€” `Car` ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถ€์กฑ. ๋„๋ฉ”์ธ ๋กœ์ง์ด ๊ฒ€์ฆ ์—†์ด ์ง„ํ™”.
19
+ - **`RandomNumberGenerator`๊ฐ€ Model์— ์ข…์†** โ€” ๋ฌด์ž‘์œ„๊ฐ€ ๋„๋ฉ”์ธ ์•ˆ์— ์žˆ์–ด ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›Œ์ง. ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒ์œผ๋กœ ๋ถ„๋ฆฌ ํ•„์š”.
20
+ - **`OutputView`๊ฐ€ Car๋ฅผ ์ง์ ‘ ์›€์ง์ด๋ ค๋Š” ํ”์ ** โ€” ์ถœ๋ ฅ ์ฑ…์ž„์ž๊ฐ€ ๋„๋ฉ”์ธ์„ ์กฐ์ž‘. ์ถœ๋ ฅ์€ ๋ฐ›์•„์„œ ๊ทธ๋ฆฌ๊ธฐ๋งŒ.
21
+ - **`FinalWinner`๋ผ๋Š” ์ ˆ์ฐจ ํด๋ž˜์Šค** โ€” "์šฐ์Šน์ž๋ฅผ ๊ฐ€๋ฆฌ๋Š”" ํ•จ์ˆ˜์ผ ๋ฟ์ธ๋ฐ ํด๋ž˜์Šค๋กœ. ๋‹จ๋… object๋กœ ๋ถ„๋ฆฌํ•  ๋งŒํผ ์‘์ง‘๋œ ์ฑ…์ž„์ด ์•„๋‹˜ โ€” ๊ทธ ํ–‰์œ„์˜ ์ฃผ์ธ์€ ๊ฒฝ์ฃผ์žฅ(`RacingGame`).
22
+ - **๋ฐ˜์˜ ๋ฏธ์™„**: ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๊ฐ€์ด๋“œํ•œ ์ „๋žต ํŒจํ„ด/์ถ”์ƒํ™” ์ ์šฉ์ด ์‹œ๊ฐ„ ๋ถ€์กฑ์œผ๋กœ ์ผ๋ถ€ ๋ฏธ๋ฐ˜์˜.
23
+
24
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
25
+
26
+ ๋ฆฌ๋ทฐ์–ด @KwonDae๋Š” ์ด ๋ผ์šด๋“œ์—์„œ **์ฒด์ŠคํŒ ๋น„์œ **๋กœ MVC์˜ ์ฑ…์ž„์„ ์‹œ๊ฐํ™”ํ–ˆ๋‹ค. "์ฒด์ŠคํŒ = ๊ฒฝ์ฃผ์žฅ(RacingGame model), ํ”Œ๋ ˆ์ด์–ด = Controller". ๋ชจ๋ธ์€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ช…๋ น๋งŒ ๋‚ด๋ฆฐ๋‹ค. ์ด ํ•œ ๊ฐ€์ง€ ๋น„์œ ๋กœ ๋ชจ๋“  ์ฑ…์ž„ ์œ„์น˜ ์งˆ๋ฌธ์ด ์ •๋ฆฌ๋จ.
27
+
28
+ ๋˜ํ•œ **"์šฐ์Šน์ž๋ฅผ ๊ฐ€๋ฆฌ๋Š” ์ฑ…์ž„์€ ์–ด๋””์—?"** ๋ผ๋Š” ์งˆ๋ฌธ์— ์„ธ ํ›„๋ณด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์‹œ(controller / ๊ฒฝ์ฃผ์žฅ / ์ฐจ)ํ•ด์„œ reviewee๊ฐ€ ์Šค์Šค๋กœ ๋‹ต์— ๋„๋‹ฌํ•˜๊ฒŒ ํ•จ. ์ด๋Ÿฐ ์งˆ๋ฌธ ์„ค๊ณ„๊ฐ€ ํ•™์Šต์„ ์œ ๋„.
29
+
30
+ ๋žœ๋ค ์˜์กด์— ๋Œ€ํ•ด์„œ๋Š” **์ถ”์ƒํ™”(interface)์™€ ์ „๋žต ํŒจํ„ด**์„ ์ง์ ‘ ๋ช…์‹œํ•˜๋ฉฐ ํ•™์Šต ์ž๋ฃŒ ๋งํฌ๊นŒ์ง€ ํ•จ๊ป˜ ์ œ๊ณต.
31
+
32
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
33
+ > ์ฒด์ŠคํŒ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณผ๊ฒŒ์š”, ์ฒด์Šค๋ฅผ ํ”Œ๋ ˆ์ดํ•˜๋Š” ๋‘ ์œ ์ €๋Š” Controller๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๊ณ , ์ฒด์ŠคํŒ์€ RacingGame์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ์ฒด์ŠคํŒ์—๋Š” ํ˜„์žฌ ์ฒด์ŠคํŒ์˜ ์ƒํƒœ(๋ˆ„๊ฐ€ ์ด๊ธฐ๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ๋ง๋“ค์ด ์ฃฝ๊ณ  ์‚ด์•˜๋Š”์ง€ ๋“ฑ๋“ฑ) ์ƒํƒœ๋ฅผ ๊ฐ–๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ €๋Š” ๋‹จ์ง€ ์ฒด์ŠคํŒ์—๊ฒŒ ์–ด๋–ค ๋ง์„ ์–ผ๋งˆ๋‚˜ ์›€์ง์ด๋ผ๊ณ  ๋ช…๋ นํ•  ๋ฟ์ด์ฃ 
34
+ >
35
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/controller/RacingCarRun.kt`
36
+
37
+ > ํ•˜๋‚˜์˜ ๊ฒฝ์ฃผ์žฅ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฐจ๋Ÿ‰๋“ค์ด ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฐจ๋Ÿ‰๋“ค ์ค‘ ์šฐ์Šน์ž๋ฅผ ๊ฐ€๋ฆฌ๋Š” ์ฑ…์ž„์€ ์–ด๋””์— ์žˆ์œผ๋ฉด ์ข‹์„๊นŒ์š”. ๋ช…๋ น์„ ํ•˜๋Š” controller vs ์ „์ฒด์ ์ธ ๊ฒฝ์ฃผ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์ฃผ์žฅ vs ์ฐจ
38
+ >
39
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/model/FinalWinner.kt`
40
+
41
+ > ์‹ค์ œ๋กœ domain ์—์„œ๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•œ ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ์ฃ . (interface๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ณณ์—์„œ override๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค!)
42
+ >
43
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/model/RandomNumberGenerator.kt`
44
+
45
+ ## ์–ป์€ ๊ตํ›ˆ
46
+
47
+ - **๋ชจ๋ธ = ์ƒํƒœ + ํ–‰๋™, Controller = ํ๋ฆ„ ๋ช…๋ น.** ์ฒด์ŠคํŒ ๋น„์œ ์ฒ˜๋Ÿผ ๋ชจ๋ธ์ด ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ๋“ค๊ณ  ์žˆ๊ณ  ์ž๊ธฐ ๊ทœ์น™์œผ๋กœ ํ–‰๋™ํ•œ๋‹ค. Controller๋Š” "์ด ์นธ์œผ๋กœ ์›€์ง์—ฌ"๋ผ๊ณ  ๋ช…๋ นํ•  ๋ฟ. ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋ชจ๋ธ์ด ์•ˆ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒŒ ํ•ต์‹ฌ.
48
+ - **"X-er"๋ผ๋Š” ์ ˆ์ฐจ์  ๋ช…์‚ฌ ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ์˜์‹ฌํ•˜๋ผ.** `FinalWinner`, `Generator`, `Handler`, `Manager` ๊ฐ™์€ -er ์ ‘๋ฏธ์‚ฌ๋Š” ํ–‰์œ„๋งŒ ๋“ค๊ณ  ์ƒํƒœ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜ํ˜• ๊ฐ์ฒด์ผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ ํ–‰์œ„์˜ ์ง„์งœ ์ฃผ์ธ์ด ๋ˆ„๊ตฌ์ธ์ง€ ๋ฌผ์–ด๋ณด๋ฉด ๋ณดํ†ต ๋‹ต์ด ๋‚˜์˜จ๋‹ค.
49
+ - **๋ฌด์ž‘์œ„๋Š” ๋„๋ฉ”์ธ ๋ฐ–.** Random/Clock/HTTP ๊ฐ™์€ ์™ธ๋ถ€ ์ž์›์€ ๋„๋ฉ”์ธ์ด ์ง์ ‘ ์˜์กดํ•˜๋ฉด ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ๋น„๊ฒฐ์ •์ ์ด ๋œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ•˜๊ณ  ์ฃผ์ž….
50
+ - **์„ธ ํ›„๋ณด ์ œ์‹œ๋ฒ•** โ€” ์ข‹์€ ๋ฆฌ๋ทฐ์–ด ํŒจํ„ด: "A vs B vs C"๋กœ ํ›„๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉด ํ•™์ƒ์ด ์Šค์Šค๋กœ ๋น„๊ต/์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. "์ •๋‹ต์€ X"๋ณด๋‹ค ํ•™์Šต ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค.
51
+ - **ํ˜„์‹ค ๋น„์œ ์˜ ๊ฐ•๋ ฅํ•จ๊ณผ ํ•œ๊ณ„.** ์ฒด์ŠคํŒ/๋งˆํŠธ/์ฃผ์ฐจ์žฅ ๊ฐ™์€ ๋น„์œ ๋Š” ์ฑ…์ž„ ์œ„์น˜ ๋ฐœ๊ฒฌ์˜ ์ฒซ ๋„๊ตฌ. ๋‹จ, ๋น„์œ ์— ๋ฉˆ์ถ”์ง€ ๋ง๊ณ  "๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค"๋Š” ์ถ”์ƒ์œผ๋กœ ํ•œ ๋ฐœ ๋” ๊ฐ€์•ผ OOP๊ฐ€ ๋œ๋‹ค.
@@ -0,0 +1,55 @@
1
+ # PR #98 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ตฌํ˜„] ์•Œ์†ก ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@songpink](https://github.com/songpink)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/98
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @KwonDae
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 34
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`Car`์— ์›€์ง์ด๋Š” ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ ์‹œ๋„** โ€” ๋ฆฌ๋ทฐ์–ด๊ฐ€ "์›€์ง์ž„ ์ฑ…์ž„์„ ์ž๋™์ฐจ์—๊ฒŒ ์™„์ „ํžˆ ๋ถ€์—ฌํ–ˆ๋„ค์š” ๐Ÿ‘"๋ผ๋ฉฐ ๋ช…์‹œ์  ์นญ์ฐฌ.
12
+ - **์ƒ์ˆ˜ํ™” ์˜๋„ ์ž์ฒด๋Š” ๋ช…ํ™•** โ€” Settings/Ranges๋กœ ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์ถ”์ถœํ•˜๋ ค๋Š” ๋…ธ๋ ฅ. (์œ„์น˜ ์„ ํƒ์ด ๋‹ค์Œ ํ† ๋ก )
13
+ - **PR description์— ์ž๊ธฐ ์˜๋ฌธ ์ œ๊ธฐ** โ€” "moveRange๊ฐ€ ์•„๋‹ˆ๋ผ move์—ฌ๋„ ์˜๋ฏธ ์ „๋‹ฌ์ด ๋˜๋Š”๊ฐ€" ๊ฐ™์€ ๋ฉ”ํƒ€ ์งˆ๋ฌธ ์ ๊ทน.
14
+ - **๋ฆฌ๋ทฐ ํ๋ฆ„์— ๋Œ€ํ•œ ์†”์งํ•œ ์‘๋‹ต** โ€” ์‹œ๊ฐ„ ๋ถ€์กฑ, ๋ˆ„๋ฝ ๋“ฑ์„ ์ธ์ •ํ•˜๊ณ  ๋‹ค์‹œ ์š”์ฒญํ•˜๋Š” ํƒœ๋„.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **`Run.fun()` ๋ฉ”์„œ๋“œ๊ฐ€ ๋น„๋Œ€ โ€” ๋ชจ๋“  ์ฑ…์ž„์ด ํ•œ ํ•จ์ˆ˜์—** โ€” ์‚ฌ์šฉ์ž ์ž…๋ ฅ + ๊ฒ€์ฆ + ๊ฒŒ์ž„ ์ง„ํ–‰ + ๊ฒฐ๊ณผ ์ถœ๋ ฅ์ด ํ•œ๊ณณ์— ์žˆ์–ด ๊ฐ์ฒด์ง€ํ–ฅ์ด ์•„๋‹ˆ๋ผ ์ ˆ์ฐจ์  ๋ชจ๋†€๋ฆฌ์Šค.
19
+ - **`Ranges` / `Settings`๋ผ๋Š” ์ •์  ์ƒ์ˆ˜ ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค** โ€” ์žฌ์‚ฌ์šฉ๋˜์ง€๋„ ์•Š๋Š”๋ฐ public์œผ๋กœ ์—ด์–ด ์‚ฌ์šฉ์ฒ˜ ๋ชจ๋‘๊ฐ€ ๊ฒฐํ•ฉ. ๋„๋ฉ”์ธ ์œ„์น˜๋ฅผ ์žƒ์€ ๋ฐ์ดํ„ฐ.
20
+ - **`Ranges.move`์ฒ˜๋Ÿผ ์ถ”์ƒ์  ์ด๋ฆ„** โ€” ๋ฌด์—‡์˜ ๋ฒ”์œ„์ธ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฆ„. ๋„๋ฉ”์ธ ์–ดํœ˜๋ฅผ ์žƒ์€ ๋„ค์ด๋ฐ.
21
+ - **`ExceptionHandling`์ด boolean ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒ€์ฆ๊ธฐ** โ€” ๊ฒ€์ฆ์€ throw๋กœ ๋๋‚˜์•ผ ํ˜ธ์ถœ์ž๊ฐ€ ๋ถ„๊ธฐ๋ฅผ ์•ˆ ๋งŒ๋“ ๋‹ค. boolean ๋ฐ˜ํ™˜์€ ํ˜ธ์ถœ์ž์— ์ œ์•ฝ์„ ๋งŒ๋“ฌ.
22
+ - **๊ฒ€์ฆ์ด Controller ์•ˆ์—์„œ ์ง์ ‘ ์ผ์–ด๋‚จ** โ€” ์ž…๋ ฅ ๊ฒฝ๊ณ„(InputView)๋‚˜ ๋„๋ฉ”์ธ ๊ฐ์ฒด(Car)๊ฐ€ ์•„๋‹ˆ๋ผ ํ๋ฆ„ ์ œ์–ด์ž๊ฐ€ invariants๋ฅผ ๋“ค๊ณ  ์žˆ์Œ.
23
+ - **`Car`๊ฐ€ `var` ํ”„๋กœํผํ‹ฐ** โ€” ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ. ์บก์Аํ™” ๋ฏธํก.
24
+ - **์ตœ์ข… ์šฐ์Šน์ž ์ถœ๋ ฅ + ๋ผ์šด๋“œ ํšŸ์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜์—** โ€” ๋‘ ์ฑ…์ž„์˜ ๊ฒฐํ•ฉ.
25
+
26
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
27
+
28
+ ๋ฆฌ๋ทฐ์–ด @KwonDae๋Š” ๋‘ ๊ฐ€์ง€ ํฐ ๋ฉ”ํƒ€ ๊ฐ€์ด๋“œ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ œ์‹œํ•œ๋‹ค.
29
+
30
+ 1. **"๊ฐ์ฒด์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋ผ"** โ€” Car ๊ฐ์ฒด์— ๋งค์„ธ์ง€๋ฅผ ๋ณด๋‚ด ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์›์น™(slipp ๊ธ€ ์ธ์šฉ). ์ƒํƒœ๋ฅผ ๊บผ๋‚ด ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ˆ์ฐจ์  ์‚ฌ๊ณ ๋ฅผ ๊นจ๋Š” ๋ฐฉํ–ฅ.
31
+ 2. **"๊ฒ€์ฆ์€ ์ฑ…์ž„ ๋ถ„๋ฆฌ์˜ ์‹œ์ž‘"** โ€” Validation์€ ๊ฒ€์ฆ๋งŒ ํ•œ๋‹ค(์ •์ƒ ์ง„ํ–‰ or throw), ์žฌ์ž…๋ ฅ ๊ฐ™์€ ํ๋ฆ„์€ ํ˜ธ์ถœ์ž์˜ ์ผ์ด๋‹ค. ๋งˆํŠธ ๋น„์œ ๋กœ ํ‚ค์˜ค์Šคํฌ/์Šค์บ๋„ˆ/๋ชจ๋‹ˆํ„ฐ์˜ ๋ถ„๋ฆฌ๋ฅผ ์„ค๋ช….
32
+
33
+ ๋˜ํ•œ ๋งค์ง ๋„˜๋ฒ„์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ฅผ ๋‹จ์ˆœ "์ƒ์ˆ˜ํ™” ๋ฌด์กฐ๊ฑด"์ด ์•„๋‹ˆ๋ผ **"์˜๋ฏธ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋ผ"** ๋Š” ์‹์œผ๋กœ ๊ท ํ˜• ์žˆ๊ฒŒ ์ œ์‹œ.
34
+
35
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
36
+ > ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์ง€ ๋ง๊ณ  ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ์ผ์„ ํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค. ... Car ๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ๋˜์ ธ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚ด๊ฒŒ๋” ํ•˜๋Š”๊ฒŒ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ฒ ์ฃ ?
37
+ >
38
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/controller/Car.kt:12`
39
+
40
+ > Validation(๊ฒ€์ฆ)์„ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ์ •์ƒ ๋™์ž‘์ด๋ผ๋ฉด ์ง„ํ–‰, ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ IllegalArgumentException ๋งŒ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๊ฒŒ ๋‹ด๋‹น ์—ญํ• ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” ๊ฒ€์ฆ์„ ํ˜ธ์ถœํ•œ๊ณณ์—์„œ ํ• ์ผ์ž…๋‹ˆ๋‹ค.
41
+ >
42
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/controller/ExceptionHandling.kt`
43
+
44
+ > ์šฐ๋ฆฌ๊ฐ€ ๋งˆํŠธ๋ฅผ ๊ฐ€์„œ ๊ณ„์‚ฐ๋Œ€์— ๋ฌผ๊ฑด์„ ์˜ฌ๋ ค๋†“์•˜์–ด์š” ... ๊ทธ๋Ÿผ ๋ฌผ๊ฑด์„ ์˜ฌ๋ ค๋†“๋Š” ๊ณณ, ์Šค์บ”ํ•˜๋Š” ์žฅ์น˜, ๋ณด์—ฌ์ฃผ๋Š” ๋ชจ๋‹ˆํ„ฐ ๋ชจ๋‘ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๋Š”๋ฐ ์ด๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ์ž ํ•  ์ผ์„ ๋ถ„๋ฆฌํ•ด๋ณผ๊นŒ์š”?
45
+ >
46
+ > โ€” @KwonDae on `src/main/kotlin/racingcar/controller/Run.kt`
47
+
48
+ ## ์–ป์€ ๊ตํ›ˆ
49
+
50
+ - **๊ฒ€์ฆ์˜ ์ฑ…์ž„์€ "์ •์ƒ ํ†ต๊ณผ ๋˜๋Š” throw" ๋‘ ๊ฐ€์ง€๋ฟ.** ์žฌ์ž…๋ ฅ/์—๋Ÿฌ ํ‘œ์‹œ๋Š” ํ˜ธ์ถœ์ž์˜ ์ฑ…์ž„. ๊ฒ€์ฆ์ด boolean์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ if๋ฅผ ๋งŒ๋“ค์–ด ๋˜ ๋ถ„๊ธฐ ๊ฒฐ์ •์„ ํ•ด์•ผ ํ•œ๋‹ค โ€” ๊ฒฐํ•ฉ๋„ ์ฆ๊ฐ€.
51
+ - **๊ฐ์ฒด์Šค๋Ÿฌ์›€ = ๋ฉ”์‹œ์ง€๋กœ ์ผ์„ ์‹œํ‚จ๋‹ค.** ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊บผ๋‚ด์„œ ์™ธ๋ถ€๊ฐ€ ๊ฐ€๊ณตํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ ˆ์ฐจ์ ์ด๋‹ค. `car.move()`๋ฅผ ํ˜ธ์ถœํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ์ฒด์—๊ฒŒ ์ž์œจ์„ฑ์„ ์ฃผ๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ‘œํ˜„.
52
+ - **์ƒ์ˆ˜์˜ ์ž๋ฆฌ๋Š” ๊ทธ ๋„๋ฉ”์ธ์˜ ์ฃผ์ธ ๊ณ.** "์žฌ์‚ฌ์šฉ๋˜๋Š”๊ฐ€"๊ฐ€ ์ฒซ ์งˆ๋ฌธ. ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ฒ˜์˜ private์œผ๋กœ. ์žฌ์‚ฌ์šฉ๋˜๋ฉด ๊ทธ ๋„๋ฉ”์ธ์˜ companion์œผ๋กœ.
53
+ - **์ด๋ฆ„์€ ๋„๋ฉ”์ธ ์–ดํœ˜๋ฅผ ์‚ด๋ฆฐ๋‹ค.** `move`๋ณด๋‹ค `moveCondition` ๋˜๋Š” `moveThreshold` โ€” ์ด ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์™ธ๋ถ€ ์ปจํ…์ŠคํŠธ ์—†์ด ๋ณด์ด๊ฒŒ.
54
+ - **ํ•จ์ˆ˜ ํ•œ ๊ฐ€์ง€ ์ฑ…์ž„ = ์ž‘์€ ํ•จ์ˆ˜.** "15๋ผ์ธ + ํ•œ ๊ฐ€์ง€ ์ผ"์ด๋ผ๋Š” ์šฐํ…Œ์ฝ”์˜ ์š”๊ตฌ๋Š” ํ•จ์ˆ˜ํ˜• ์‚ฌ๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฑ…์ž„ ๋ถ„๋ฐฐ์˜ ์ฒซ ํ›ˆ๋ จ. ํฐ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ฑ…์ž„ ์‹๋ณ„์˜ ์‹ ํ˜ธ.
55
+ - **ํ˜„์‹ค ๋น„์œ ๋Š” ์ฑ…์ž„ ๋ถ„๋ฐฐ์˜ 1์ฐจ ๋„๊ตฌ.** ๋งˆํŠธ์˜ ํ‚ค์˜ค์Šคํฌ/์Šค์บ๋„ˆ/๋ชจ๋‹ˆํ„ฐ ๋น„์œ ์ฒ˜๋Ÿผ, ํ˜„์‹ค์—์„œ ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๊ทธ๋ฆฌ๋ฉด ๊ฐ์ฒด ๋ถ„๋ฆฌ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์˜จ๋‹ค โ€” ๋‹จ, ๋น„์œ ์— ๊ฐ‡ํžˆ์ง€ ๋ง๊ณ  ๋ฉ”์‹œ์ง€ ๋ชจ๋ธ๋กœ ํ•œ ๋‹จ๊ณ„ ๋” ์ถ”์ƒํ™”ํ•  ๊ฒƒ.
@@ -0,0 +1,48 @@
1
+ # PR #52 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ] ์ˆ˜์ง„ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@sujin9](https://github.com/sujin9)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/52
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @vagabond95
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 13
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`RacingCar`, `RacingGame`, `Validator`, `InputView`, `OutputView` ์ฑ…์ž„ ๋ถ„๋ฆฌ**.
12
+ - **์ƒ์ˆ˜ `Const`๋กœ ๋ชจ์Œ** (์ดํ›„ ํ•™์ƒ์ด ๋ถ„์‚ฐ).
13
+ - **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ช…ํ™•์„ฑ**.
14
+
15
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
16
+
17
+ - **`Validator` ๋ชจํ˜ธํ•œ ์ด๋ฆ„** โ†’ `InputValueValidator`๋กœ ๋ณ€๊ฒฝ (god-object ์œ„ํ—˜).
18
+ - **`Const.kt` ๋‹จ์ผ ํŒŒ์ผ์— ๋ชจ๋“  ์ƒ์ˆ˜** โ€” ์‘์ง‘๋„ ๋‚ฎ์Œ.
19
+ - **`RacingCar`์— ์ถœ๋ ฅ ํ˜•์‹ (toString) ๋ณด์œ ** โ€” OutputView ์ฑ…์ž„ ์นจ๋ฒ”.
20
+ - **`maxOf` ๋ฏธ์‚ฌ์šฉ (์ˆ˜๋™ ๋น„๊ต)**.
21
+ - **`it` ์—ฐ์† ์‚ฌ์šฉ์œผ๋กœ ๊ฐ€๋…์„ฑ ์ €ํ•˜**.
22
+
23
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
24
+
25
+ ๋ฆฌ๋ทฐ์–ด @vagabond95์˜ ํ•ต์‹ฌ:
26
+
27
+ 1. **๋ชจํ˜ธํ•œ ์ด๋ฆ„ = god-object์˜ ์‹ ํ˜ธ** โ€” Validator โ†’ InputValueValidator โ†’ "์ง€๊ธˆ์€ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๋” ์„ธ๋ถ„ํ™”ํ•˜๋ฉด ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง."
28
+
29
+ 2. **์ƒ์ˆ˜์˜ ์ž๋ฆฌ = ์žฌ์‚ฌ์šฉ์„ฑ**. ํ•œ ๊ณณ๋งŒ ์“ฐ๋ฉด ๊ทธ ์ž๋ฆฌ์—. ์—ฌ๋Ÿฌ ๊ณณ์ด๋ฉด ํŒŒ์ผ ๋ถ„๋ฆฌ, ๋‹จ *๊ณตํ†ต ์„ฑ๊ฒฉ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„*.
30
+
31
+ 3. **์ถœ๋ ฅ ํ˜•์‹ ์ฑ…์ž„ = OutputView**. `toString()`์ด ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๋“ค์–ด๊ฐ€๋ฉด ์ถœ๋ ฅ ๋ณ€๊ฒฝ ์‹œ ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ.
32
+
33
+ 4. **`maxOf` ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜ ์ ๊ทน ํ™œ์šฉ**.
34
+
35
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
36
+ > ๋ฌด์—‡์„ ๊ฒ€์ฆํ•˜๋Š”์ง€๊ฐ€ ์ด๋ฆ„์— ์ข€ ๋” ๋“œ๋Ÿฌ๋‚˜๋ฉด ์ข‹๊ฒ ์–ด์š”. ๋„ค์ด๋ฐ์ด ๋ชจํ˜ธํ• ์ˆ˜๋ก ์•ˆํ‹ฐํŒจํ„ด์ธ god-object ๊ฐ€ ๋˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
37
+ >
38
+ > โ€” @vagabond95 on `src/main/kotlin/racingcar/domain/Validator.kt`
39
+
40
+ > ์ด๋ถ€๋ถ„์€ '์–ด๋–ป๊ฒŒ ๊ทธ๋ฆด์ง€'์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋ฏ€๋กœ OutputView ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ์•Š์„๊นŒ์š”~?
41
+ >
42
+ > โ€” @vagabond95 on `src/main/kotlin/racingcar/domain/RacingCar.kt`
43
+
44
+ ## ์–ป์€ ๊ตํ›ˆ
45
+
46
+ - **๋ชจํ˜ธํ•œ ์ด๋ฆ„ โ†’ god-object ์œ„ํ—˜**. "Manager", "Util", "Validator"๋Š” ๋ฌด์—‡์„ *Manage/Util/Validate*ํ•˜๋Š”์ง€ ๋ช…์‹œํ•ด์•ผ ํ•จ.
47
+ - **์ƒ์ˆ˜์˜ ์‘์ง‘๋„ = ์‚ฌ์šฉ์ฒ˜์™€์˜ ๊ฑฐ๋ฆฌ**. ํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์“ฐ๋ฉด ๊ทธ ํด๋ž˜์Šค์˜ companion object. ์—ฌ๋Ÿฌ ๊ณณ์ด๋ฉด *๋ชฉ์ ๋ณ„ ํŒŒ์ผ*. `Const.kt`์ฒ˜๋Ÿผ ์žกํƒ•์€ ๊ฐ€์žฅ ๋‚˜์œ ํ˜•ํƒœ.
48
+ - **toString์˜ ํ•จ์ •** โ€” ๋„๋ฉ”์ธ์— ๋‘๋ฉด "๋„๋ฉ”์ธ์ด ์ž๊ธฐ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์•Œ์•„์•ผ ํ•จ" โ†’ ์ถœ๋ ฅ ๋ณ€๊ฒฝ์ด ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ. ๋ฐฑ์—”๋“œ ์ปจ๋ฒค์…˜์€ OutputView๋กœ.
@@ -0,0 +1,47 @@
1
+ # PR #61 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ - ๋ฆฌํŒฉํ† ๋ง] ์ˆ˜์ง„ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@sujin9](https://github.com/sujin9)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/61
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„ (๋ฆฌํŒฉํ† ๋ง)
6
+ - **๋ฆฌ๋ทฐ์–ด:** @vagabond95
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 12
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`_movingState` + custom getter (backing property)** โ€” Kotlin idiom ๋„์ž….
12
+ - **`InputValueValidator`๋กœ ์ด๋ฆ„ ๋ช…ํ™•ํ™”**.
13
+ - **์ƒ์ˆ˜ ์‚ฌ์šฉ์ฒ˜์— ๋ถ„์‚ฐ**.
14
+ - **ํ™•์žฅ ํ•จ์ˆ˜ ์ ์šฉ** โ€” `"89".isNumber()`.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ `NumberValidator` ํด๋ž˜์Šค ๋‚ด๋ถ€์—** โ€” top-level์ด ๋” ์ ํ•ฉ.
19
+ - **`NumberValidator` ์ž์ฒด ์ฑ…์ž„ ๋ถ€์žฌ** โ€” ํ™•์žฅ ํ•จ์ˆ˜ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋นˆ ํด๋ž˜์Šค.
20
+
21
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
22
+
23
+ ๋ฆฌ๋ทฐ์–ด @vagabond95์˜ ๋ฉ”์‹œ์ง€:
24
+
25
+ 1. **๋‹จ์ผ ์ฑ…์ž„ ์˜๋ฌธ ์ž์ฒด๊ฐ€ ๊ฒฝ๊ณ  ์‹ ํ˜ธ** โ€” "ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์–ด๋””๊นŒ์ง€ ์„ธ๋ถ„ํ™”ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„ ์ž์ฒด๊ฐ€ SRP๋ฅผ ๋ชป ์ง€ํ‚ค๊ณ  ์žˆ๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ๋‹ค."
26
+
27
+ 2. **ํ™•์žฅ ํ•จ์ˆ˜์˜ ์ž๋ฆฌ = top-level** โ€” `String.isNumber()`๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๋‘˜ ํ•„์š” ์—†์Œ.
28
+
29
+ 3. **์ƒ์ˆ˜ ํŒŒ์ผ์˜ *๊ณตํ†ต ์„ฑ๊ฒฉ ์ด๋ฆ„*** โ€” `Const`๋ณด๋‹ค `MessageConst`, `LimitConst` ๊ฐ™์ด.
30
+
31
+ 4. **backing property** โ€” `_xxx`/`xxx` ํŒจํ„ด์ด Kotlin idiom. ๋‹จ, ๋‹จ์ผ ๋ณ€์ˆ˜ + custom setter๋กœ๋„ ๋™์ผ ํšจ๊ณผ.
32
+
33
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
34
+ > ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์–ด๋””๊นŒ์ง€ ์„ธ๋ถ„ํ™”ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„ ์ž์ฒด๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ์‹ ํ˜ธ์ผ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”!
35
+ >
36
+ > โ€” @vagabond95 on `src/main/kotlin/racingcar/domain/InputValueValidator.kt`
37
+
38
+ > ํ•ด๋‹น extension function ์€ ๊ตณ์ด NumberValidator ๋‚ด๋ถ€์— ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ  NumberValidator ์—ญํ•  ์ž์ฒด๋„ ํ˜„์žฌ๋Š” ๋ฌด์˜๋ฏธํ•˜๋ฏ€๋กœ ์ œ๊ฑฐํ•ด๋„ ๊ดœ์ฐฎ์•„ ๋ณด์—ฌ์š”!
39
+ >
40
+ > โ€” @vagabond95 on `src/main/kotlin/racingcar/domain/validator/NumberValidator.kt`
41
+
42
+ ## ์–ป์€ ๊ตํ›ˆ
43
+
44
+ - **"์–ด๋””๊นŒ์ง€ ๋ถ„๋ฆฌํ• ๊นŒ"์˜ ๊ณ ๋ฏผ ์ž์ฒด๊ฐ€ SRP ์œ„๋ฐ˜ ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ๋‹ค**. ์ž์—ฐ์Šค๋Ÿฌ์šด ์ฑ…์ž„ ๋ถ„๋ฆฌ๋Š” ์ž๋ช…ํ•จ. ๊ณ ๋ฏผ์ด ๊ธธ์–ด์ง€๋ฉด ํด๋ž˜์Šค๊ฐ€ ์ž˜๋ชป ๋‚˜๋‰œ ์ƒํƒœ์ผ ๊ฐ€๋Šฅ์„ฑ.
45
+ - **ํ™•์žฅ ํ•จ์ˆ˜์˜ ์ž๋ฆฌ = top-level**. ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ™•์žฅ ํ•จ์ˆ˜๋Š” *๊ทธ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์ฒ˜๋Ÿผ* ๋™์ž‘ํ•˜์ง€๋งŒ, ์ง„์งœ *์œ ํ‹ธ*์ด๋ฉด top-level์ด ๊น”๋”.
46
+ - **๋นˆ ํด๋ž˜์Šค (ํ™•์žฅ ํ•จ์ˆ˜๋งŒ ํ˜ธ์ŠคํŒ…)๋Š” ๊ฐ์ฒด ์•„๋‹˜**. ๋ฉค๋ฒ„ ์—†์ด ํ•จ์ˆ˜๋งŒ ์žˆ์œผ๋ฉด ๊ทธ๊ฑด ํ•จ์ˆ˜ ๋ชจ์Œ = top-level ๋˜๋Š” object.
47
+ - **backing property** = `private var _xxx` + `val xxx: Type get() = _xxx`. Kotlin์—์„œ ์™ธ๋ถ€ read-only + ๋‚ด๋ถ€ mutable์˜ ํ‘œ์ค€ ํŒจํ„ด.
@@ -0,0 +1,49 @@
1
+ # PR #47 โ€” [๋ถ€๋‚˜] ์ฝ”ํ‹€๋ฆฐ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@tmdgh1592](https://github.com/tmdgh1592)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/47
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @namjackson
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 38
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ ๊ธฐ๋ณธ๊ฐ’ ํ™œ์šฉ** โ€” ์˜์กด์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ›๋Š” ์‹œ๋„. ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์นญ์ฐฌ.
12
+ - **๋žœ๋ค ๊ฒฐ๊ณผ๋ฅผ `isMove` ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด ๋…ธ์ถœ** โ€” ์™ธ๋ถ€์— raw ๋‚œ์ˆ˜๋ฅผ ํ˜๋ฆฌ์ง€ ์•Š๊ณ  ์˜๋ฏธ ์žˆ๋Š” boolean์œผ๋กœ ๋ณ€ํ™˜ํ•œ ์ ์€ ์บก์Аํ™” ์‹œ๋„๋กœ ๊ธ์ •์  (๋‹ค๋งŒ Random ์ž์ฒด ์˜์กด์€ ๋‚จ์Œ).
13
+ - **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ ๊ทน ์ž‘์„ฑ** โ€” ๋‹จ์ˆœ happy path๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ˆ์™ธ ์ƒํ™ฉ๊นŒ์ง€ ๋‹ค๋ฃจ๋ ค๋Š” ์‹œ๋„.
14
+ - **๋ฆฌ๋ทฐ์˜ ์˜๋„๋ฅผ ๊นŠ๊ฒŒ ๊ณฑ์”น๋Š” ์‘๋‹ต** โ€” ๋‹จ์ˆœ "์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ DTO ๊ฒฝ๊ณ„, Repository ํ•„์š”์„ฑ ๋“ฑ์„ ๋ณธ์ธ์˜ ์–ธ์–ด๋กœ ์žฌ์ •๋ฆฌํ•œ ๊ธด ์‘๋‹ต์„ ๋‚จ๊น€.
15
+
16
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
17
+
18
+ - **`Random`์— ๋Œ€ํ•œ ์ง์ ‘ ์˜์กด** โ€” `RacingService`๊ฐ€ `Random`์„ ์ง์ ‘ ํ˜ธ์ถœ. ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ†ต์ œํ•  ์ˆ˜ ์—†์Œ (non-newable).
19
+ - **`BlankRemover`, `Strings`, `Dimens`, `Validator` ๊ฐ™์€ ์œ ํ‹ธ ํด๋ž˜์Šค๊ฐ€ ์‚ฐ์žฌ** โ€” ์ฑ…์ž„์ด ๋ถ„์‚ฐ๋˜๊ณ  ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ์ƒ๊ธฐ๋Š” ๊ตฌ์กฐ. ํŠนํžˆ `Validator`๋Š” ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•ด ์‚ฌ์šฉ์ฒ˜๊ฐ€ ๋ชจ๋‘ ์˜์กด.
20
+ - **`Validator` ๊ฐ™์€ ํ—ฌํผ ๊ฐ์ฒด๊ฐ€ ๋„๋ฉ”์ธ ์•ˆ์— ์‚ด์•„ ์žˆ์Œ** โ€” ๊ฒ€์ฆ์„ ๋ณ„๋„ ๊ฐ์ฒด๋กœ ๋นผ๋†“์œผ๋‹ˆ "๊ฒ€์ฆ์€ ๋ˆ„๊ฐ€ ํ•˜๋Š”๊ฐ€"๊ฐ€ ํฉ์–ด์ง. ์ •์ž‘ ๋„๋ฉ”์ธ ๊ฐ์ฒด(Car)๋Š” ์ž๊ธฐ invariants๋ฅผ ์•ˆ ์ง€ํ‚ค๋Š” ๋ฌด๋ฐฉ๋น„ ์ƒํƒœ.
21
+ - **Controller โ†’ Service.createCars โ†’ Service.insertCars ์ ˆ์ฐจ ํ˜ธ์ถœ** โ€” ์™ธ๋ถ€๊ฐ€ service์˜ ์ ˆ์ฐจ๋ฅผ ์•Œ๊ณ  ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ. Tell-Don't-Ask ์œ„๋ฐฐ.
22
+ - **`getWinners` ํ…Œ์ŠคํŠธ๊ฐ€ `insertCars`/`getAll`์— ์˜์กด** โ€” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๊ฒฐํ•จ์ด ์ƒ๊ธฐ๋ฉด ๋ฌด๊ด€ํ•œ ํ…Œ์ŠคํŠธ๋„ ๊นจ์ง. ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ ๋ถ€์กฑ.
23
+ - **private ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ๊ฐ€์‹œ์„ฑ์„ ํ’€์–ด๋ฒ„๋ฆผ** โ€” "ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ"๊ฐ€ production ํ‘œ๋ฉด์ ์„ ๋Š˜๋ฆฌ๋Š” ์•ˆํ‹ฐํŒจํ„ด.
24
+ - **View ํ‘œ์‹œ์šฉ ๋ฌธ์ž์—ด("-" ๋“ฑ)์ด Model ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ง** โ€” View๊ฐ€ ์•Œ์•„์•ผ ํ•  ํ‘œํ˜„ ์ฑ…์ž„์ด ๋„๋ฉ”์ธ์œผ๋กœ ์ƒˆ์–ด ๋“ค์–ด์˜ด.
25
+
26
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
27
+
28
+ ๋ฆฌ๋ทฐ์–ด @namjackson์€ **"Random์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์˜์กด"** ๊ณผ **"Service์— ๋ฉ”์‹œ์ง€๋กœ ์œ„์ž„"** ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์งš์—ˆ๋‹ค. ๋˜ํ•œ ์œ ํ‹ธ์„ฑ ํด๋ž˜์Šค(Validator, BlankRemover)๊ฐ€ ๋งŒ๋“œ๋Š” ๋ถ„์‚ฐ๋œ ์ฑ…์ž„๊ณผ ๊ฒฐํ•ฉ๋„ ๊ฒฝ๊ณ . ํ…Œ์ŠคํŠธ ๊ด€์ ์—์„œ๋Š” (1) ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์˜์กดํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜ ์ทจ์•ฝ์„ฑ, (2) private ํ•จ์ˆ˜ ๋…ธ์ถœ์ด ํ…Œ์ŠคํŠธ ์„ค๊ณ„์˜ ์‹ ํ˜ธ์ž„์„ ๊ฐ•์กฐ.
29
+
30
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
31
+ > Randomํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์˜์กด์ด ์ƒ๊ฒผ๋„ค์š”! Randomํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜์กด๋„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„๊ฑฐ๊ฐ™์•„์š”!
32
+ >
33
+ > โ€” @namjackson on `src/main/kotlin/racingcar/service/RacingService.kt`
34
+
35
+ > racingService์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ์–ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ•˜๋„๋ก ์ฑ…์ž„์„ ์œ„์ž„ํ•ด๋ณด๋ฉด์–ด๋–จ๊นŒ์š”?
36
+ >
37
+ > โ€” @namjackson on `src/main/kotlin/racingcar/controller/RacingController.kt:16`
38
+
39
+ > ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๋‚˜, ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋Š” ์ง€์–‘ํ•ด์ฃผ์„ธ์š”! ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•˜์ง€์•Š๊ณ  ํ…Œ์ŠคํŠธํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™์•„์š”!
40
+ >
41
+ > โ€” @namjackson on `src/main/kotlin/racingcar/service/RacingService.kt:10`
42
+
43
+ ## ์–ป์€ ๊ตํ›ˆ
44
+
45
+ - **ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋Š” ์„ค๊ณ„์˜ ์‹ ํ˜ธ๋‹ค.** Random/Clock ๊ฐ™์€ ์™ธ๋ถ€ ์ž์›์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ  ์ฃผ์ž…๋ฐ›์œผ๋ฉด, ๋„๋ฉ”์ธ์€ ์ˆœ์ˆ˜ํ•ด์ง€๊ณ  ํ…Œ์ŠคํŠธ๋Š” ๊ฒฐ์ •์ ์ด ๋œ๋‹ค.
46
+ - **์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” ์ฑ…์ž„์„ ํฉ์–ด๋†“๋Š”๋‹ค.** "์–ด๋”” ๋‘์ง€ ๋ชจ๋ฅผ ๋•Œ ์ž„์‹œ๋กœ ๋ฝ‘์•„ ๋‘” ์ž๋ฆฌ"๊ฐ€ ๊ตณ์–ด์ง€๋ฉด, ๋ชจ๋“  ์‚ฌ์šฉ์ฒ˜๊ฐ€ ๊ทธ ์œ ํ‹ธ์— ๊ฒฐํ•ฉ๋˜์–ด ๋” ์ด์ƒ ์˜ฎ๊ธธ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ๊ฒ€์ฆ ๊ฐ™์€ invariant๋Š” ๊ทธ invariant๋ฅผ ๊ฐ€์ง„ ๋„๋ฉ”์ธ ๊ฐ์ฒด๊ฐ€ ๋“ค๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
47
+ - **"createX ํ›„ useX"๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‘ ๋ฒˆ ๋ณด๋‚ด๋ผ๋Š” ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋‹ค.** ์™ธ๋ถ€๊ฐ€ ๊ฐ์ฒด์˜ ์ ˆ์ฐจ๋ฅผ ์•Œ๊ณ  ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ๊ทธ ์ ˆ์ฐจ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค (Tell-Don't-Ask).
48
+ - **ํ…Œ์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฒ€์ฆ ๋Œ€์ƒ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.** ์˜์กด์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ํ…Œ์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์˜ ์ธ์งˆ์ด ๋œ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜๋ผ.
49
+ - **private ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฑด ๋ณ„๊ฐœ์˜ ์ฑ…์ž„์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.** ๊ฐ€์‹œ์„ฑ์„ ํ‘ธ๋Š” ๋Œ€์‹ , ๊ทธ ์ฑ…์ž„์„ ๋ณ„๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•˜๋Š” ํŽธ์ด ๋ณดํ†ต ๋” ์˜ณ๋‹ค.
@@ -0,0 +1,53 @@
1
+ # PR #64 โ€” [๋ถ€๋‚˜] 2๋‹จ๊ณ„ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@tmdgh1592](https://github.com/tmdgh1592)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/64
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @namjackson
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 24
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **์ด์ „ ๋ผ์šด๋“œ ํ”ผ๋“œ๋ฐฑ์„ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์œผ๋กœ ํก์ˆ˜** โ€” Repository ๋ ˆ์ด์–ด ์ œ๊ฑฐ, `CarName`/`CarsDto` ๋“ฑ ๊ฐ’ ๊ฐ์ฒดํ™”ยทDTO ๋ถ„๋ฆฌ๋ฅผ ์ง์ ‘ ๋‹จํ–‰.
12
+ - **๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์›์‹œ๊ฐ’์„ ๊ฐ์ฒด๋กœ ๊ฐ์Œˆ** โ€” `CarName`์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ invariants๋ฅผ ๋“ค๊ณ  ์žˆ๋Š” ๊ฐ’ ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•ด ์›์‹œ ๊ฐ•๋ฐ•์„ ํ•ด์†Œํ•˜๋ ค๋Š” ์‹œ๋„.
13
+ - **Fake ๊ฐ์ฒด๋กœ Mock ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ€์ฒด** โ€” ํ…Œ์ŠคํŠธ ๋”๋ธ”์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ–‰๋™์œผ๋กœ ์˜ฎ๊ธด ๋ชจ๋ฒ” ์‚ฌ๋ก€. `CarMoveCondition` ์ธํ„ฐํŽ˜์ด์Šค + `FakeForSuccess`/`FakeForFailed` ๊ตฌํ˜„.
14
+ - **OCP๋ฅผ ์˜์‹ํ•œ ์ „๋žต ์ถ”์ƒํ™”** โ€” `CarMoveCondition`, `MoveStep`(sealed) ๋“ฑ ๋ณ€ํ™” ๊ฐ€๋Šฅ ์ง€์ ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฒฉ๋ฆฌํ•œ ์‹œ๋„.
15
+ - **๋ฆฌ๋ทฐ์˜ ์˜๋„๋ฅผ ๋ณธ์ธ ์–ธ์–ด๋กœ ๊นŠ๊ฒŒ ๊ณฑ์”น์Œ** โ€” ๋‹จ์ˆœ ์ ์šฉ์ด ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ์–ด๋–ป๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ ๊ธธ๊ฒŒ ์ •๋ฆฌํ•˜๋ฉฐ ํ† ๋ก ์„ ๋Œ์–ด๊ฐ.
16
+
17
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
18
+
19
+ - **Domain Model์ด DTO๋ฅผ ์•Œ๊ณ  ์žˆ์Œ** โ€” `Car`๊ฐ€ `CarDto`์— ์˜์กด. ๋ ˆ์ด์–ด ๊ฒฝ๊ณ„๊ฐ€ ์ƒˆ๊ณ , ๋„๋ฉ”์ธ์ด ์™ธ๋ถ€ ํ˜•์‹์˜ ๋ณ€ํ™”์— ๋Œ๋ ค๋‹ค๋‹ˆ๊ฒŒ ๋จ.
20
+ - **์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์— ๊ตฌํ˜„ ๋‹จ์„œ๊ฐ€ ๋ฐ•ํž˜** โ€” `RandomGenerator`์ฒ˜๋Ÿผ "์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”๊ฐ€"๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์— ๋“ค์–ด๊ฐ€๋ฉด, ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋ฉด ์ด๋ฆ„์ด ๋ฌด์˜๋ฏธํ•ด์ง. ์ถ”์ƒ์€ "๋ฌด์—‡์„ ํ•œ๋‹ค"๋กœ.
21
+ - **"์ด๋™ ๊ฒฐ์ •"์˜ ์ฑ…์ž„ ์œ„์น˜๊ฐ€ ํ”๋“ค๋ฆผ** โ€” `Cars`๊ฐ€ `generateNumber`๋ฅผ ๊ฐ€์ง€๋ฉด์„œ, Car๋Š” ๋‹จ์ง€ ๋ฐ›์€ ์ˆ˜๋ฅผ ๋น„๊ต๋งŒ ํ•จ. "์ „์ง„ํ• ์ง€ ๋ง์ง€"์˜ ์˜์‚ฌ๊ฒฐ์ • ์ฃผ์ฒด๊ฐ€ ๋ชจํ˜ธ.
22
+ - **YAGNI ์œ„๋ฐฐ ๊ฐ€๋Šฅ์„ฑ โ€” ๊ณผํ•œ ์‚ฌ์ „ ์ถ”์ƒํ™”** โ€” `MoveStep` sealed๋กœ 0/1๋งŒ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ด๋ฏธ ๋‘ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ฆ. ๊ฐ€๋ณ€์„ฑ์ด ์‹ค์ œ๋กœ ๋“ค์–ด์™”์„ ๋•Œ ์ถ”๊ฐ€ํ•˜๋Š” ํŽธ์ด ๋ณดํ†ต ๋” ์•ˆ์ „.
23
+ - **Fake ๊ฐ์ฒด๊ฐ€ production ํŒจํ‚ค์ง€์— ์œ„์น˜** โ€” ์‹ค ๋ฐฐํฌ ์ฝ”๋“œ์— ํ…Œ์ŠคํŠธ์šฉ ๊ตฌํ˜„์ด ์„ž์ด๋ฉด production ์˜์กด ๊ทธ๋ž˜ํ”„๊ฐ€ ์˜ค์—ผ.
24
+
25
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
26
+
27
+ ๋ฆฌ๋ทฐ์–ด @namjackson์€ ์ด ๋ผ์šด๋“œ์—์„œ ๋‘ ๊ฐ€์ง€ ํฐ ์ฃผ์ œ๋ฅผ ์งš์—ˆ๋‹ค.
28
+
29
+ 1. **์ถ”์ƒํ™”์˜ ์˜๋„** โ€” ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด "์–ด๋–ป๊ฒŒ"๋ฅผ ๋…ธ์ถœํ•˜์ง€ ๋ง ๊ฒƒ(`RandomGenerator` โ†’ `NumberGenerator`), Fake๋ฅผ production ํŒจํ‚ค์ง€์— ๋‘์ง€ ๋ง ๊ฒƒ.
30
+ 2. **์ฑ…์ž„์˜ ์ง„์งœ ์ž๋ฆฌ** โ€” `Cars`๊ฐ€ number๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ Car๊ฐ€ ๋ฐ›๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด "Car ์ž์‹ ์˜ ์˜์‚ฌ๊ฒฐ์ •"์ด ์‚ฌ๋ผ์ง„๋‹ค๋Š” ์ . ๊ทธ๋ฆฌ๊ณ  ๋ณ€ํ™” ๊ฐ€๋Šฅ์„ฑ(์ž๋™์ฐจ๋งˆ๋‹ค ๋‹ค๋ฅธ ์กฐ๊ฑด, ์ด๋™ ๊ฑฐ๋ฆฌ ๋‹ค๋ฆ„)์„ ์˜ˆ๋กœ ๋“ค์–ด "์–ด๋””์— ์ฑ…์ž„์„ ๋‘๋ฉด ๋ณ€ํ™”์— ์œ ์—ฐํ•œ๊ฐ€"๋ฅผ ๋ฌป๋Š” ์‹.
31
+
32
+ ๋˜ํ•œ YAGNI๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ โ€” "๋ณ€๊ฒฝ ์˜ˆ์ƒํ•ด ๋ฏธ๋ฆฌ ์งœ๋Š” ๊ฒƒ๋ณด๋‹ค, ์ฑ…์ž„์„ ์ž˜ ๋‚˜๋ˆˆ ์ฝ”๋“œ + ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ํฐ ์•ˆ์ „๋ง."
33
+
34
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
35
+ > ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” Random์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š”๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ๊นŒ์š”? ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š”๊ธฐ๋Šฅ์€ Number๋ฅผ generateํ•ด์ฃผ๋Š”๊ฒƒ์ด์ง€, ํ•ด๋‹น Number๊ฐ€ Random์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์ผ์ •ํ•œ Number๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์ด์ง€ ์•Š์„๊นŒ์šค?
36
+ >
37
+ > โ€” @namjackson on `src/main/kotlin/racingcar/utils/random/RandomGenerator.kt`
38
+
39
+ > number๋ฅผ ๊ฐ€์ง€๊ณ  ์ „์ง„ํ• ์ง€ ๋ง์ง€์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ์–ด๋””์— ์žˆ๋Š”๊ฒƒ์ด ์ข‹์„๊นŒ์š”? Car๊ฐ€ ์›€์ง์ด๋Š” ๊ธฐ์ค€์ด ๋žœ๋ค๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, Car๋งˆ๋‹ค ์›€์ง์ด๋Š” ๊ธฐ์ค€์ด ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด, Car๋งˆ๋‹ค ํ•œ๋ฒˆ์— ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด, ์–ด๋–ค๊ตฌ์กฐ๊ฐ€ ์ข€๋” ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ• ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜๊ณ ...
40
+ >
41
+ > โ€” @namjackson on `src/main/kotlin/racingcar/service/RacingService.kt`
42
+
43
+ > YAGNI ... ํ™•์žฅ์„ ์˜ˆ์ƒํ•ด์„œ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ๋งํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ฒŒ๋˜๋ฉด, ์˜ˆ์ƒ๋œ ํ™•์žฅ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋” ์•ˆ์ข‹์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ์ˆ˜๋„ ์žˆ์–ด์š”!
44
+ >
45
+ > โ€” @namjackson on `src/main/kotlin/racingcar/service/RacingService.kt`
46
+
47
+ ## ์–ป์€ ๊ตํ›ˆ
48
+
49
+ - **์ถ”์ƒ์˜ ์ด๋ฆ„์€ What์ด์ง€ How๊ฐ€ ์•„๋‹ˆ๋‹ค.** "Random"์ด๋ผ๋Š” ๊ตฌํ˜„ ๋‹จ์„œ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ช…์— ๋“ค์–ด๊ฐ€๋Š” ์ˆœ๊ฐ„, ๊ทธ ์ถ”์ƒ์€ ์ž ์žฌ์  ๊ตฌํ˜„ ํ•œ ๊ฐ€์ง€์— ์ข…์†๋œ๋‹ค. `NumberGenerator`๋ผ๊ณ  ๋ถ€๋ฅด๋ฉด fake/random/sequential์ด ๋ชจ๋‘ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.
50
+ - **๋ ˆ์ด์–ด ์‚ฌ์ด๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์ด์–ด์•ผ ํ•œ๋‹ค.** Domain์€ DTO๋ฅผ ๋ชจ๋ฅด๊ณ , DTO๋งŒ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” mapper๊ฐ€ ๊ฒฝ๊ณ„๋ฅผ ์ฑ…์ž„์ง„๋‹ค. ๋„๋ฉ”์ธ์ด DTO๋ฅผ ์•Œ๋ฉด ์™ธ๋ถ€ ํ˜•์‹์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋„๋ฉ”์ธ์ด ํ”๋“ค๋ฆฐ๋‹ค.
51
+ - **OCP๋Š” ์˜ˆ์ธก์ด ์•„๋‹ˆ๋ผ ์‹ ํ˜ธ์— ๋‹ตํ•œ๋‹ค.** ํ•œ ๊ฐ€์ง€ ๋ณ€ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏธ๋ฆฌ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ข…์ข… YAGNI ์œ„๋ฐ˜์ด๋‹ค. ์‹ค์ œ๋กœ ๋‘ ๋ฒˆ์งธ ๋ณ€ํ˜•์ด ๋“ฑ์žฅํ•  ๋•Œ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ถ”์ƒ์˜ ํ˜•ํƒœ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฒฐ์ •๋œ๋‹ค.
52
+ - **Fake๋Š” production ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค.** ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€(`src/test/...`)์— ๋‘์–ด์•ผ production ์˜์กด ๊ทธ๋ž˜ํ”„๊ฐ€ ๊นจ๋—ํ•ด์ง„๋‹ค. "์ • ์•ˆ ๋˜๋ฉด mock ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"๋ผ๋Š” ํ˜„์‹ค์  ๊ฐ€์ด๋“œ๋„ ํ•จ๊ป˜ ๊ธฐ์–ตํ•  ๊ฒƒ.
53
+ - **ํ…Œ์ŠคํŠธ๊ฐ€ ์ข‹์œผ๋ฉด ๋ฏธ๋ž˜์˜ ์ž์œ ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.** ๋ณ€๊ฒฝ์— ๋‹ซํ˜€ ์žˆ๊ณ  ํ™•์žฅ์— ์—ด๋ฆฐ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค, **์ฑ…์ž„ ๋ถ„๋ฆฌ + ๋น ๋ฅธ ํ…Œ์ŠคํŠธ**๊ฐ€ ๋ฆฌํŒฉํ„ฐ๋ง์˜ ์ž์œ ๋ฅผ ๋” ๋งŽ์ด ๋งŒ๋“ ๋‹ค.
@@ -0,0 +1,51 @@
1
+ # PR #151 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ตฌํ˜„] ํ† ๋ฐ”์— ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@tobae-time](https://github.com/tobae-time)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/151
5
+ - **๋‹จ๊ณ„:** 1๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @hyemdooly
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 25
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **`Racecourse`๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒดํ™”** โ€” ๋ ˆ์ด์Šค ์ค€๋น„๋ฌผ์„ ๋ฐ›์Œ. ๋ฆฌ๋ทฐ์–ด ์นญ์ฐฌ.
12
+
13
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
14
+
15
+ - **`!!` ์‚ฌ์šฉ** โ€” ๊ฒ€์ฆ ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ์žˆ๋‹ค๊ณ  ์•ˆ์‹ฌํ•˜์ง€ ๋ง ๊ฒƒ. ํ•จ์ˆ˜ ๋กœ์ง์ด ๋ฐ”๋€Œ๋ฉด NPE.
16
+ - **`Main.kt`๊ฐ€ ๋น„๋Œ€** โ€” ์ž…๋ ฅ + ๊ฐ€๊ณต + ๊ฒ€์ฆ + ์‹คํ–‰.
17
+ - **`Car`๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ** โ€” ๋žœ๋ค ์ƒ์„ฑ + ์›€์ง์ž„ ํŒ๋‹จ + ์ „์ง„ + ๊ฒฐ๊ณผ ์ถœ๋ ฅ.
18
+ - **`Car`์— hashCode/equals ๋„๋ฉ”์ธ ํ•„์š” ์—†์ด ๊ตฌํ˜„**.
19
+ - **`Car`๊ฐ€ ํ‘œ์‹œ์šฉ String ์ƒ์„ฑ** โ€” View ์ฑ…์ž„ ์นจํ•ด ("-".repeat(distance) ๊ฐ™์€ ํ‘œ์‹œ ํ•จ์ˆ˜).
20
+ - **`ApplicationTest`์— ๋ชจ๋“  ํ…Œ์ŠคํŠธ** โ€” Main/Car/Racecourse ์ „๋ถ€ ํ•œ ํŒŒ์ผ.
21
+ - **ํ…Œ์ŠคํŠธ๊ฐ€ "์ „์ง„ ๊ฐ€๋Šฅ vs ๋ถˆ๊ฐ€" ์ผ€์ด์Šค ๋ถ„๋ฆฌ ์•ˆ ๋จ** โ€” ๊ฐœ๋ฐœ์ž ์‹ค์ˆ˜ ๊ฒ€์ฆ ์–ด๋ ค์›€.
22
+ - **ํ…Œ์ŠคํŠธ ์ด๋ฆ„์ด ๊ฒฐ๊ณผ๋ฅผ ์•ˆ ๋“œ๋Ÿฌ๋ƒ„**.
23
+
24
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
25
+
26
+ ๋ฆฌ๋ทฐ์–ด @hyemdooly๋Š” **"๊ฐœ๋ฐœ์ž ์‹ค์ˆ˜ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ"** ๋ผ๋Š” ๋ณธ์งˆ ์งˆ๋ฌธ โ€” "์ž๋™์ฐจ๊ฐ€ ๋ฌด์กฐ๊ฑด ์ „์ง„๋งŒ ํ•˜๊ฑฐ๋‚˜ ๋ฌด์กฐ๊ฑด ๋ฉˆ์ถ˜๋‹ค๋ฉด ์ด ํ…Œ์ŠคํŠธ๊ฐ€ ์žก์•„๋‚ผ๊นŒ?" ์ด ์งˆ๋ฌธ ํ•œ ์ค„์ด ํ…Œ์ŠคํŠธ์˜ ๊ฐ€์น˜๋ฅผ ์ง„๋‹จ.
27
+
28
+ ๋˜ํ•œ **`!!`์˜ ์œ„ํ—˜** โ€” ๊ฒ€์ฆ ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ์žˆ์–ด๋„ ๊ทธ ๋กœ์ง์ด ๋ฐ”๋€Œ๋ฉด NPE. ์•ˆ์ „์„ฑ์— ๋Œ€ํ•œ false sense.
29
+
30
+ **Car๊ฐ€ ์•ก์…˜์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ•จ** โ€” ๊ฐ์ฒด ์ฑ…์ž„ ๋‹จ์œ„ ๋ถ„ํ•ด ๊ฐ€์ด๋“œ.
31
+
32
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
33
+ > ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ์ž๋™์ฐจ๊ฐ€ ๋ฌด์กฐ๊ฑด ์ „์ง„๋งŒ ํ•˜๊ฑฐ๋‚˜, ๋ฉˆ์ถœ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋ฉด ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ผ๊นŒ์š”?
34
+ >
35
+ > โ€” @hyemdooly on `src/test/kotlin/ApplicationTest.kt`
36
+
37
+ > ์ฐจ๊ฐ€ ์ง์ ‘ ๋žœ๋ค ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ , ์ „์ง„๋„ ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅ๋„ ํ•˜๊ณ  ์žˆ๋„ค์š”! ์•ก์…˜์„ ๋” ์ž˜๊ฒŒ ๋‚˜๋ˆ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?
38
+ >
39
+ > โ€” @hyemdooly on `src/main/kotlin/Car.kt`
40
+
41
+ > `checkRoundValid` ํ•จ์ˆ˜๋กœ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋ฒˆ ํ•ด์คฌ๋”๋ผ๋„, ๋งŒ์•ฝ ์ด ํ•จ์ˆ˜์˜ ๋กœ์ง์ด ๋ฐ”๋€๋‹ค๋ฉด `readRound`์—์„œ Exception์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
42
+ >
43
+ > โ€” @hyemdooly on `src/main/kotlin/Main.kt`
44
+
45
+ ## ์–ป์€ ๊ตํ›ˆ
46
+
47
+ - **ํ…Œ์ŠคํŠธ์˜ ๋ณธ์งˆ = ์‹ค์ˆ˜ ์žก๊ธฐ.** "์ด ์ฝ”๋“œ๊ฐ€ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ฉด ์ด ํ…Œ์ŠคํŠธ๊ฐ€ ์•Œ๋ ค์ฃผ๋Š”๊ฐ€?"๊ฐ€ ํ•ต์‹ฌ ์งˆ๋ฌธ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ๋Š” ๊ฒ€์ฆ์ด ์•„๋‹ˆ๋ผ ๋™์–ด๋ฐ˜๋ณต.
48
+ - **`!!`๋Š” false sense of safety.** "์ด๋ฏธ ๊ฒ€์ฆํ–ˆ์œผ๋‹ˆ ์•ˆ์ „"์ด๋ผ๋Š” ๊ฐ€์ •์€ ๊ทธ ๊ฒ€์ฆ ๋กœ์ง์ด ๋ฐ”๋€” ๋•Œ ๊นจ์ง„๋‹ค. nullable ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ ์œ„์น˜์—์„œ ํ•ญ์ƒ ๋ช…์‹œ์ .
49
+ - **Car๊ฐ€ ๋งŽ์€ ์•ก์…˜ = ์ฑ…์ž„ ๋ถ„๋ฐฐ ์‹ ํ˜ธ.** "๋žœ๋ค + ๊ฒฐ์ • + ์ด๋™ + ์ถœ๋ ฅ"์ด ํ•œ ๊ฐ์ฒด๋ฉด (1) ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€, (2) ๋ณ€๊ฒฝ ์˜ํ–ฅ ํผ, (3) Tell-Don't-Ask ๊นจ์ง. ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ.
50
+ - **`"-".repeat(distance)` ๊ฐ™์€ ํ‘œ์ค€ ๋„๊ตฌ.** Kotlin ํ‘œ์ค€ ํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋…์„ฑ + ์•ˆ์ „.
51
+ - **ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋ถ„๋ฆฌ = ํด๋ž˜์Šค ๋ถ„๋ฆฌ์˜ ๊ฑฐ์šธ.** Application์— ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด production๋„ ๋ถ„๋ฆฌ ์•ˆ ๋์„ ๊ฐ€๋Šฅ์„ฑ.
@@ -0,0 +1,43 @@
1
+ # PR #167 โ€” [์ž๋™์ฐจ ๊ฒฝ์ฃผ 2๋‹จ๊ณ„] ํ† ๋ฐ”์— ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค
2
+
3
+ - **Reviewee:** [@tobae-time](https://github.com/tobae-time)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/167
5
+ - **๋‹จ๊ณ„:** 2๋‹จ๊ณ„
6
+ - **๋ฆฌ๋ทฐ์–ด:** @hyemdooly
7
+ - **๋ผ์ธ ์ฝ”๋ฉ˜ํŠธ:** 6
8
+
9
+ ## ์ž˜ํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
10
+
11
+ - **์ž˜๋ชป๋œ ๊ฐ’ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๋ฅผ Controller๋กœ** โ€” ๋ฆฌ๋ทฐ์–ด ์นญ์ฐฌ.
12
+ - **InputView/OutputView ๋ถ„๋ฆฌ** โ€” 1๋‹จ๊ณ„์˜ ํ†ตํ•ฉ ํŒจํ„ด ์ •๋ฆฌ.
13
+
14
+ ## ๋ชปํ•œ ์  (์„ค๊ณ„ ๊ด€์ )
15
+
16
+ - **`Racecourse`๊ฐ€ ์ถœ๋ ฅ ์ฑ…์ž„** โ€” View ์นจํ•ด ์ž”์กด.
17
+ - **`Controller` ๋‚ด๋ถ€์—์„œ InputView/OutputView ์ƒ์„ฑ** โ€” ์™ธ๋ถ€ ์ฃผ์ž…์ด ๋” ์ž์—ฐ์Šค๋Ÿฌ์›€.
18
+ - **`dooly,hyem` ์ •์ƒ ์ž…๋ ฅ์ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋จ** โ€” ๊ณต๋ฐฑ/๊ธธ์ด ๊ฒ€์ฆ ๋กœ์ง ์˜ค๋ฅ˜.
19
+ - **`@get()` ์ปค์Šคํ…€ ํ”„๋กœํผํ‹ฐ vs ํ•จ์ˆ˜ โ€” ํ•™์ƒ์˜ ๊ฒฐ์ • ๊ธฐ์ค€ ๋ถ€์žฌ**.
20
+
21
+ ## ๋ฆฌ๋ทฐ์–ด ์˜๊ฒฌ ์š”์ง€
22
+
23
+ ๋ฆฌ๋ทฐ์–ด @hyemdooly๋Š” **์™ธ๋ถ€ ์ฃผ์ž…์„ ํ†ตํ•œ ์บก์Аํ™”** โ€” Controller ๋‚ด๋ถ€์—์„œ InputView ์ƒ์„ฑํ•˜์ง€ ๋ง๊ณ  ์™ธ๋ถ€์—์„œ ๋ฐ›๊ธฐ. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์™ธ๋ถ€๊ฐ€ View์— ์ง์ ‘ ์ ‘๊ทผํ•  ํ•„์š” ์—†๋Š” ๊ตฌ์กฐ.
24
+
25
+ ๋˜ํ•œ **๊ฒ€์ฆ ์ผ€์ด์Šค์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ** โ€” `dooly,hyem`์ฒ˜๋Ÿผ ์ •์ƒ ์ผ€์ด์Šค๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ. ์ผ€์ด์Šค ๋ถ„๋ฆฌ ๋ถ€์กฑ.
26
+
27
+ `get() ์ปค์Šคํ…€ ํ”„๋กœํผํ‹ฐ` vs ํ•จ์ˆ˜ ์ฐจ์ด โ€” ํ•™์ƒ์ด ๊ทธ ์ฐจ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์˜๋„์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ํ›ˆ๋ จ.
28
+
29
+ - **๋Œ€ํ‘œ ์ธ์šฉ:**
30
+ > Controller ๋‚ด๋ถ€์—์„œ InputView์™€ OutputView๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋„ค์š” ๐Ÿค” ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์™ธ๋ถ€์—์„œ๋Š” ์ด ๋ทฐ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒํ•˜๋ฉด ๋” ์ข‹๊ฒ ์–ด์š”!
31
+ >
32
+ > โ€” @hyemdooly on `src/main/kotlin/racingcar/controller/RacingCarController.kt`
33
+
34
+ > `dooly,hyem`์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ์ •์ƒ์ผ€์ด์Šค์ธ๋ฐ `์ž๋™์ฐจ ์ด๋ฆ„์€ 5์ž๋ฅผ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.`๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ผ์š”.
35
+ >
36
+ > โ€” @hyemdooly on `src/main/kotlin/racingcar/view/InputView.kt`
37
+
38
+ ## ์–ป์€ ๊ตํ›ˆ
39
+
40
+ - **๊ฒ€์ฆ ๋กœ์ง์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ.** ์ •์ƒ ์ผ€์ด์Šค๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ฒ„๊ทธ๋Š” ๊ฒ€์ฆ ๋กœ์ง์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ถ€์กฑ ์‹ ํ˜ธ. ๋„๋ฉ”์ธ invariants๋ฅผ production ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ™์ด ํ•ฉ์˜ํ•ด์•ผ.
41
+ - **์™ธ๋ถ€ ์ฃผ์ž…์˜ ๋‘ ๊ฐ€์ง€ ํšจ๊ณผ.** (1) ํ…Œ์ŠคํŠธ์—์„œ ํŽ˜์ดํฌ ์ฃผ์ž…, (2) ์™ธ๋ถ€๊ฐ€ ๊ทธ ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๋Š” ์บก์Аํ™”. ํ›„์ž๊ฐ€ ์ข…์ข… ๊ฐ„๊ณผ๋จ.
42
+ - **`get() {}` vs ํ•จ์ˆ˜์˜ ์ฐจ์ด.** ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ, ํ•จ์ˆ˜๋Š” ํ–‰์œ„. `winners`๊ฐ€ ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜ = ์ƒํƒœ ๊ฐ™์ง€๋งŒ ๋งค๋ฒˆ ๊ณ„์‚ฐ์ด๋ผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋” ๋ช…ํ™•.
43
+ - **์ด์ „ ๋ผ์šด๋“œ์˜ ํก์ˆ˜ ์ •๋„.** 1๋‹จ๊ณ„ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์ผ๋ถ€ ๊ทธ๋Œ€๋กœ ์žฌ๋“ฑ์žฅ (Racecourse ์ถœ๋ ฅ ๋“ฑ) โ€” ํ•™์Šต์ด ๋ถ€๋ถ„์ ์ด๋ผ๋Š” ์‹ ํ˜ธ.