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,53 @@
1
+ # PR #124 — [자동차 경주 리팩터링] 벼리 미션 제출합니다
2
+
3
+ - **Reviewee:** [@gaeun5744](https://github.com/gaeun5744)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/124
5
+ - **단계:** 리팩터링
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 8
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Car` 초기값 생성자 주입 가능** — 리뷰어 명시적 칭찬.
12
+ - **`@CsvSource` 활용** — 리뷰어 칭찬.
13
+ - **자기 의문의 깊이** — "검증 중복 vs 한 곳에 모으기"에 대한 trade-off 분석 시도.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Controller가 라운드 진행 직접 수행** — 핵심 미션의 도메인 로직이 Controller에. (다른 reviewee들과 같은 패턴)
18
+ - **`CarsManager.create` 사용 — 외부 검증의 초기값 활용 어려움** — 학생 본인이 어려움을 표명.
19
+ - **검증 중복 (Car + InputView)** — 학생이 자기 trade-off를 인식.
20
+
21
+ ## 리뷰어 의견 요지
22
+
23
+ 리뷰어 @malibinYun는 이 PR에서 매우 인상적인 **시나리오 시뮬레이션 가이드**를 제시:
24
+
25
+ **시나리오 1:** "자동차 이름 요구사항이 변경 - 숫자/특수문자 필요, 1~10자" 시 어떤 변경점/장단점?
26
+ **시나리오 2:** "InputView 검증 없이 사용자가 잘못 입력하면 매번 종료 → try-catch가 범벅" 시 어떤 장단점?
27
+
28
+ 두 시나리오로 학생이 "한 곳 vs 여러 곳"의 trade-off를 직접 시뮬레이션하게 만든다. 답을 주지 않고 학생이 도달하게 함.
29
+
30
+ **"중복 코드인가 반복 코드인가"** 라는 메타 질문 — 시니어와의 대화에서 받은 화두. 같은 코드라도 "중복(제거할 것)"과 "반복(허용할 것)"의 의도 차이가 있음.
31
+
32
+ **"개발의 세계는 trade-off가 떡칠된 세상"** — 학생이 합리적인 사고를 하고 있다는 인정 + 정답을 주지 않는 리뷰 스타일.
33
+
34
+ - **대표 인용:**
35
+ > 자동차에 이름에 대한 요구사항이 변경되었어요. 숫자와 특수 문자는 반드시 들어가야하고요, 글자수도 1~10로 범위가 늘어나게 되었어요. 이런 경우 지금의 프로젝트는 어떤 변경점과 장단점이 생겨날까요?
36
+ >
37
+ > — @malibinYun on `src/main/kotlin/view/InputView.kt:42`
38
+
39
+ > InputView에다가 검증 로직을 작성하지 않게 되었다고 가정해볼게요 ... try-catch가 범벅되어서 그래서 뭐가 로직인지 눈에 들어오지 않게됐어요. 이런 경우 지금의 프로젝트는 어떤 장단점이 생겨날까요?
40
+ >
41
+ > — @malibinYun on `src/main/kotlin/view/InputView.kt:42`
42
+
43
+ > "중복 코드인가요? 반복 코드인가요?" 무슨 의미인지 물어보지 않고 혼자 곱씹으면서 많은 생각들을 하게 되더라구요.
44
+ >
45
+ > — @malibinYun on `src/main/kotlin/view/InputView.kt:42`
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **시나리오 시뮬레이션 = 결정 trade-off의 진단 도구.** "X가 바뀌면 어디가 영향받나"를 두 가지 다른 설계에 대해 시뮬레이션하면 trade-off가 즉시 보임.
50
+ - **"중복 vs 반복" 화두.** 같은 코드가 두 군데 있어도, (1) 우연히 같은 것(중복, 한곳에 통일 필요) vs (2) 의도적으로 같은 것(반복, 허용 가능)이 다름. 코드의 의도가 결정 기준.
51
+ - **검증 중복의 합리성.** 사용자 안내(InputView) vs 도메인 무결성(Car)은 다른 목적. 둘 다 필요할 수 있고, 그 경우는 "반복"이지 "중복"이 아님.
52
+ - **답을 주지 않는 리뷰의 가치.** 시나리오만 제시하면 학생이 자기 추론으로 답에 도달. 그 답이 자기 것이 됨.
53
+ - **trade-off가 떡칠된 세상.** OOP의 결정 거의 모든 곳에 trade-off가 있다. "정답"이 아니라 "이 맥락에서 더 나은 것"을 찾는 훈련.
@@ -0,0 +1,60 @@
1
+ # PR #93 — [자동차 경주 구현] 벼리 미션 제출합니다
2
+
3
+ - **Reviewee:** [@gaeun5744](https://github.com/gaeun5744)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/93
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 25
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **README에 기능 목록 정리** — 리뷰어 칭찬.
12
+ - **`RandomNumber` 분리로 테스트 가능성 확보** — 리뷰어 칭찬.
13
+ - **자기 결정 논리적 표명** — Validation 위치를 두 가지 이유로 정리. 검증의 자리에 대한 깊은 회고.
14
+ - **객체지향의 사실과 오해 인용** — "메서드는 객체의 상태 변화 + 상호작용 수단"이라는 정의를 자기 결정에 적용.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`util.Validation`으로 검증 모음** — 검증을 helper로 분리. 응집도 손상.
19
+ - **`util.NumberGenerator`** — 도구 상자 비유로 모호한 명명.
20
+ - **`CarsManager`가 `create` 호출 강제** — 생성자 + init 블록으로 해결.
21
+ - **`getForwardCount()` 자바 스타일 게터** — 코틀린 프로퍼티 활용 부족.
22
+ - **마지막 라인 줄바꿈 누락** — POSIX 컨벤션 위반.
23
+ - **테스트 이름 모호**.
24
+ - **`OutputView`가 companion object에 함수** — class member로 두는 게 자연스러움 (다만 학생 본인이 회고로 object로 변경).
25
+
26
+ ## 리뷰어 의견 요지
27
+
28
+ 리뷰어 @malibinYun는 이 PR에서 인상적인 **메타 가이드** 들을 다수 전달:
29
+
30
+ 1. **"투머치코틀린"** — 가독성을 해치는 과한 문법 활용 경계.
31
+ 2. **"코드 = 언어"** — 일상 생활에서 알아들을 수 있는 코드. 게임 커뮤니티 용어로 일상에서 말 못 함.
32
+ 3. **"한국에서 익숙함을 따르는 vs 자기 결정"** — 익숙한 패턴을 따르는 것도 가치 있지만, 더 낫다고 생각하면 그 이유를 단단히 다져라.
33
+
34
+ 또한 **"도구 상자 비유"** 로 Util 명명 안티패턴 시각화 — 본인은 알지만 친구가 컨실러를 찾으러 왔을 때 "도구 상자"에서 찾기 어렵다.
35
+
36
+ `CarsManager.create` 호출 강제는 **생성자 + init**으로 해결.
37
+
38
+ 학생의 self-reflection이 깊고 리뷰어가 그것을 자극하는 흐름이 가장 인상적.
39
+
40
+ - **대표 인용:**
41
+ > 파운데이션, 하이라이터, 컨실러 등등.. 이것들이 담긴 상자에 "도구 상자" 라는 이름을 적어두어도, 사실 올바른 표현이지요! ... 하지만, 과연 피부화장을 위한 도구를 찾아야할 때, "도구 상자" 라는 이름이 붙은 상자에 원하는 화장품들이 존재할 거란 생각이 한 번에 들 수 있을까요?
42
+ >
43
+ > — @malibinYun on `src/main/kotlin/util/NumberGenerator.kt:2`
44
+
45
+ > 코틀린 문법을 엄청나게 활용해서 이렇게까지 된다고?? 할 정도의 무언가를 내놓더라도, 읽는 데 한세월이고 알아보기 어렵다면 저는 "투머치코틀린" 이라고 생각해요.
46
+ >
47
+ > — @malibinYun on `src/main/kotlin/model/Car.kt`
48
+
49
+ > 그만큼, 더 낫다고 생각하게 된 스스로의 이유를 단단히 다져보세요. 그리고 설득력있게 다듬어보세요.
50
+ >
51
+ > — @malibinYun on `src/main/kotlin/util/Validation.kt`
52
+
53
+ ## 얻은 교훈
54
+
55
+ - **"도구 상자" 비유의 본질 = Util 명명의 한계.** 본인은 알지만 외부인에게는 무엇이 들었는지 모름. 도메인 어휘로 명명해야 외부가 찾기 쉬움.
56
+ - **"투머치코틀린" 경계.** 언어의 강력한 기능을 사용 = 항상 좋음이 아님. 가독성 + 다른 개발자의 학습 비용 trade-off.
57
+ - **코드 = 언어, 일상 생활 어휘로.** "이게 된다고??" 수준의 코드는 게임 커뮤니티의 용어와 같음. 코드는 일상 생활 어휘로 작성하라.
58
+ - **객체지향의 사실과 오해의 메서드 정의 적용** — "상태 변화 + 상호작용 수단"이라는 정의로 OutputView를 점검 → object로 결정. 책에서 배운 개념을 코드에 적용한 학습.
59
+ - **익숙함 따르기 vs 자기 결정.** 두 가지 모두 가치 있지만, 자기 결정의 이유를 단단히 다져라. 논리가 무너지면 의견을 되돌아보면 됨.
60
+ - **POSIX 줄바꿈** — 마지막 라인의 `\n`은 단순 컨벤션이 아니라 POSIX 정의. 학생이 자료 추천 후 학습.
@@ -0,0 +1,53 @@
1
+ # PR #134 — [자동차 경주 구현] 조이 미션 제출합니다
2
+
3
+ - **Reviewee:** [@gahyunkim](https://github.com/gahyunkim)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/134
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 36
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RandomNumberGenerator` 인터페이스로 추상화** — 무작위 의존을 추상으로 격리.
12
+ - **자기 의문을 PR description에 상세히 기록** — 검증 위치, 한 줄 require의 가독성, 테스트 케이스 분리 등 메타 질문을 적극 제시.
13
+ - **리뷰 반영의 메타 정리 능력** — `OutputView`/`RacingGame`/검증의 자리를 자기 언어로 재정의.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`RacingGame`이 자동차 이름 분리/준비/검증/경주 진행을 모두 함** — 한 클래스가 게임 전체의 라이프사이클을 책임.
18
+ - **`tryRacing()` 함수의 반환값이 String** — 무엇을 반환하는지 호출자가 함수 본문을 봐야 앎. 시그니처가 의도를 말하지 못함.
19
+ - **`RandomNumberGenerator`라는 구현 단서를 인터페이스에 박음** — 구현체가 `Fixed`/`Sequential`이 되면 이름이 거짓말이 됨.
20
+ - **`OutputView`가 외부에서 만들어진 문자열을 받아 출력** — View가 어떻게 표현할지 결정하지 못하고 단순 println으로 격하.
21
+ - **`Controller.run()`이 "입력 → 입력 → 출력"의 흐름이지 "준비 → 경주 → 결과"가 아님** — 함수의 흐름이 도메인 이야기를 따라가지 않음.
22
+ - **`Car.getPosition()`처럼 자바 스타일 게터** — 코틀린 프로퍼티 직접 노출로 충분.
23
+ - **테스트 이름이 "여러가지 유효성을 테스트한다"처럼 모호** — 무엇이 어떻게 검증되는지 명세화 부족.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @laco-dev는 **함수의 흐름이 도메인 이야기여야 한다** 는 강력한 가이드를 제시. "이름 입력 → 횟수 입력 → 우승자 출력"이 아니라 "자동차 준비 → 횟수 입력 → 경주 → 우승자 찾기 → 출력". 같은 코드를 두 가지 다른 흐름으로 보여주며 "대화처럼 흘러야 좋은 코드"라는 메타 가이드.
28
+
29
+ 또한 **인터페이스의 이름은 What** — `RandomNumberGenerator` 안에 `FixedNumberGenerator`도 들어갈 수 있어야 함. 같은 코드가 보이지 않는 미래 구현을 허용하는지 묻는 식.
30
+
31
+ OutputView에 대해서는 **"깔끔 vs 옳은 방법"** 의 메타 가이드 — 외부에서 만든 문자열을 받아 출력하는 OutputView는 "Any를 받는 print()"와 같다는 식의 강한 비판.
32
+
33
+ - **대표 인용:**
34
+ > 게임을 준비하고, 진행하고, 결과를 만들어내기 위한 흐름이 잘 드러나고 있을까요? ... 코드를 작성하는 것도, 결국 대화를 이어가는 것처럼 순서와 흐름이 자연스럽게 흘러갈수록 좋은 코드가 될 수 있습니다.
35
+ >
36
+ > — @laco-dev on `src/main/kotlin/RacingController.kt`
37
+
38
+ > 다른 개발자가 게임을 이용한다고 했을떄 tryRacing이 무엇을 반환할지 예측이 될까요? 저라면 반환하는 String이 무엇인지 도저히 모를 것 같습니다.
39
+ >
40
+ > — @laco-dev on `src/main/kotlin/model/RacingGame.kt`
41
+
42
+ > 이 객체가 할 역할은 숫자를 생성하는 건가요? 랜덤 숫자를 생성하는 건가요? ... class FixedRandomNumberGenerator: RandomNumberGenerator { override fun generate(...) = 10 }
43
+ >
44
+ > — @laco-dev on `src/main/kotlin/model/RandomNumberGenerator.kt`
45
+
46
+ ## 얻은 교훈
47
+
48
+ - **흐름은 도메인 이야기로 짜여야 한다.** 함수가 입력/출력의 나열이 아니라 **"준비 → 진행 → 결과"** 같은 도메인 서사를 따라야 호출자가 한눈에 의도를 잡는다.
49
+ - **함수 시그니처는 호출자와의 약속.** `tryRacing(): String`은 무엇의 String인지 호출자가 본문을 읽어야 안다 — 의도가 시그니처에 없는 약속. `runRace(): Unit` + `getWinners(): List<Car>`처럼 의도를 시그니처에 박는다.
50
+ - **인터페이스 이름은 미래의 구현체에 열린다.** `RandomXxx`처럼 한 구현을 못 박지 말 것. 인터페이스는 "다른 구현이 들어와도 자연스러운가"로 평가.
51
+ - **View는 단순한 println 어댑터가 아니다.** 출력 형식을 어디서 만드는가 = 표시 책임의 자리. View가 도메인 객체를 받아 표현해야 도메인이 표시 형식을 알 필요가 없다.
52
+ - **클래스 프로퍼티는 라이프사이클이 클래스 = 객체와 일치할 때만.** 한 번의 게임이라는 흐름이라면 함수 지역 변수가 더 자연스럽다. "가시성과 지역성을 가장 작은 것부터 시작"하라는 원칙.
53
+ - **테스트 케이스명은 시스템 명세** — "여러 유효성을 테스트한다"는 표현은 무엇이 무엇과 어떻게 다른지 안 드러낸다. 각 케이스는 그 자체로 도메인 규칙이어야.
@@ -0,0 +1,54 @@
1
+ # PR #164 — [자동차 경주 2단계] 조이 미션 제출합니다
2
+
3
+ - **Reviewee:** [@gahyunkim](https://github.com/gahyunkim)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/164
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 14
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`CarFactory`로 자동차 생성 책임 분리** — 1단계의 비대한 `RacingGame`에서 책임을 떼냄. 이름도 `CarCreator`에서 `CarFactory`로 통상적 도메인 어휘로 개선.
12
+ - **`RaceResult` 클래스 도입** — `List<List<Car>>` 같은 원시 강박 시그니처를 도메인 객체로 승격.
13
+ - **`CarState` 도입으로 라운드별 상태 표현** — copy() 남용을 줄이고 의미 있는 도메인 모델로 표현.
14
+ - **private 가시성을 적극 사용** — 외부에 노출할 필요 없는 메서드를 private로.
15
+ - **리뷰의 메타 가이드를 자기 언어로 흡수** — "가시성은 가장 작은 것부터"라는 캡슐화 원칙을 코드에 적용.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **`CarCreator`라는 -er 명사** — Factory로 바뀌면서 해결됨. 그 전 단계에서는 행위만 있는 절차 객체였음.
20
+ - **파싱(따옴표 기준 split)이 도메인에 위치** — UI 형식이 도메인을 변경시키는 결합.
21
+ - **`Constants` 파일 사용에 대한 의구심** — reviewee가 직접 "어떻게 생각하시나요"라고 물어볼 만큼 가시성 전략이 흔들리는 모습. 답은 "캡슐화는 가장 작은 가시성에서 시작".
22
+ - **`getWinners()`가 알고리즘을 직접 풀이** — `cars.maxOf { ... }` + filter 두 단계로 충분한데 절차적 풀이로.
23
+ - **`repeatRacing`과 `runRace`가 외부에 둘 다 노출** — 비슷한 의미의 두 메서드가 공개 인터페이스에 있으면 호출자가 혼란.
24
+ - **테스트가 무엇을 검증하는지 데이터를 안 드러냄** — 자동차들의 위치를 모르고 우승 검증을 하면 의미를 알기 어려움.
25
+
26
+ ## 리뷰어 의견 요지
27
+
28
+ 리뷰어 @laco-dev는 이 라운드에서 두 가지 큰 가이드를 짚었다.
29
+
30
+ 1. **"Constants는 좋지 않습니다"** — 객체지향 캡슐화의 가장 기본은 "가장 작은 가시성에서 시작". 모든 곳이 의존하는 공유 상수 컨테이너는 변경 영향이 큼.
31
+ 2. **반환 타입은 도메인 객체로** — `List<List<Car>>` 같은 원시 시그니처는 호출자에게 거부감을 준다. `RaceResult` 같은 클래스로 의미를 부여.
32
+
33
+ 또한 알고리즘이 풀이로 나타나는 부분에 대해 **"maxOf + filter 두 단계로 충분"** 처럼 의도가 드러나는 함수형 구성을 제시.
34
+
35
+ - **대표 인용:**
36
+ > Constants 만들어서 사용하는 방법은 좋지 않습니다. ... 객체지향 프로그래밍에서의 가장 기본적인 캡슐화 전략은, 가시성을 제일 작은 곳에서부터 시작하는 것입니다.
37
+ >
38
+ > — @laco-dev on `src/main/kotlin/view/OutputView.kt:21`
39
+
40
+ > `List<List<Car>>` 라는 반환 타입을 보면 아무래도 거부감이 들지 않을까요? 클래스를 만드는 습관을 가져보면 어떨까요?
41
+ >
42
+ > — @laco-dev on `src/main/kotlin/model/RacingGame.kt`
43
+
44
+ > 따옴표를 기준으로 자동차 이름이 구분된다는 것은 UI 로직입니다. 만약 따옴표가 아닌 개행으로 바뀌면 도메인 모델이 수정되어야 합니다.
45
+ >
46
+ > — @laco-dev on `src/main/kotlin/model/CarCreator.kt`
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **공유 상수 컨테이너는 결합도의 흑막.** 100개 기능에서 모두 의존하면 한 곳 변경이 전체에 영향. 캡슐화 원칙대로 "한 곳에서만 쓰면 private, 두세 곳이면 그 도메인의 companion"로.
51
+ - **반환 타입이 곧 의도.** `List<List<X>>`가 보이면 거의 항상 도메인 모델 누락의 신호. 그 의미를 가진 클래스를 만들면 호출자가 안심한다.
52
+ - **UI 형식의 결정은 UI 경계에서.** 도메인이 따옴표 split을 알면 형식이 바뀔 때마다 도메인이 흔들린다. 형식 해석은 입력 경계에서.
53
+ - **공개 API의 일관성.** `runRace`와 `repeatRacing`이 모두 public이면 호출자가 어떤 걸 써야 하는지 모른다. 한 가지 인터페이스로 명확하게.
54
+ - **점진적 학습이 명확히 드러난 PR.** 1단계의 큰 비대함을 리팩토링으로 정리했고, copy() 남용 → `CarState` 도입처럼 한 가지 통증의 더 깊은 해결로 나아감.
@@ -0,0 +1,54 @@
1
+ # PR #140 — [자동차 경주 구현] 지오 미션 제출합니다
2
+
3
+ - **Reviewee:** [@giovannijunseokim](https://github.com/giovannijunseokim)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/140
5
+ - **단계:** 1단계 (단일 PR)
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 33
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **README에 설계 정리** — 리뷰어 칭찬.
12
+ - **`Car`에 `initialDistance` 생성자 주입** — 테스트 결정성 확보 (학생이 자기 의문도 표명).
13
+ - **팩토리 함수 도입** — `checkCarNameValid`가 외부에서 호출되지 않을 위험을 인지하고 팩토리로 검증 강제.
14
+ - **자기 결정의 회고** — String + 연산 성능 확인, equals/hashCode 도입 이유 등.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`ApplicationTest`에 모든 테스트** — 100개 기능이면? 객체별 분리 필요.
19
+ - **`Car`에 hashCode/equals 구현** — 도메인적 필요가 아니라 테스트 위함.
20
+ - **`Car("긴긴이름", 5)`가 통과 가능** — invariants가 별도 함수에 있어 우회 가능.
21
+ - **`Racecourse`가 라운드 진행 출력까지** — 도메인이 View 책임 가짐.
22
+ - **랜덤 테스트의 우회** — "4 이상이면 움직일 수 있다"가 아니라 "4 이상이면 한 칸 전진"으로 명세화 필요.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @laco-dev는 **"확장성을 고려한 코드는 무조건 잘못된 게 아니다"** 라는 메타 가이드. `initialDistance`가 요구사항에 없어도 테스트와 유지보수에 도움이 되면 OK.
27
+
28
+ 또한 **"하나의 큰 기능 → 여러 작은 기능"** 분해 가이드: "자동차 경주 = 모든 것 한 덩어리"가 아니라 "가장 멀리 전진한 자동차가 우승자", "랜덤으로 움직임" 같은 작은 단위로.
29
+
30
+ **`100개 기능이면?`** 시뮬레이션으로 ApplicationTest 한 파일의 안티패턴 시각화.
31
+
32
+ **`Car("...", 5)`** 코드 예시로 invariants 우회 가능성을 즉시 보여줌. 학생이 팩토리 함수로 해결.
33
+
34
+ - **대표 인용:**
35
+ > 현재 요구사항과 일치하지 않는다면 무조건 잘못된 구현은 아닙니다. ... 확장성을 고려하여 개발하는 것이 중요합니다.
36
+ >
37
+ > — @laco-dev on `src/test/kotlin/ApplicationTest.kt`
38
+
39
+ > 하나의 큰 기능을, 여러개의 작은 기능으로 나눠서 생각한다면 그 기능을 구현하는 객체와 테스트를 작성할 수 있지 않을까요?
40
+ >
41
+ > — @laco-dev on `src/test/kotlin/ApplicationTest.kt`
42
+
43
+ > 자동차의 이름은 5자를 초과할 수 없다는 것은 자동차의 기능일까요? 아니면 checkCarNameValid() 함수의 기능일까요? 이렇게 만든 코드는 논리적으로 정상적인 코드인지 궁금합니다~ ```val car = Car("긴긴이름", 5)```
44
+ >
45
+ > — @laco-dev on `src/test/kotlin/ApplicationTest.kt`
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **요구사항 외 확장 = 무조건 잘못이 아니다.** 유지보수와 테스트에 도움이 되면 확장성 고려는 OK. "요구사항만 정확히"라는 강박은 학습을 저해.
50
+ - **큰 기능 → 작은 기능 분해.** "자동차 경주"가 통째로 하나의 테스트가 아니라 "가장 멀리 전진한 자동차 = 우승"이 한 단위, "4 이상 = 전진"이 한 단위. 작은 단위로 분해해야 검증 가능.
51
+ - **팩토리 함수로 invariants 강제.** 생성자가 public이고 외부 함수가 검증하면 우회 가능. 팩토리 함수에 검증을 넣으면 그 함수를 통한 생성이 유일한 경로 (생성자 private + factory).
52
+ - **`Car`에 hashCode/equals 구현 이유 = 도메인 의미가 있을 때.** 단지 테스트 비교를 위해서라면 다른 방법(필드 단위 비교) 필요.
53
+ - **라운드 진행 출력 = View 책임.** `Racecourse`가 출력하면 도메인 변경이 출력 변경으로, 그 반대도 마찬가지. 분리.
54
+ - **시뮬레이션 예시 코드의 가치.** `Car("긴긴이름", 5)`이라는 한 줄이 invariants 우회 가능성을 즉시 보여줌. 추상 설명보다 강력.
@@ -0,0 +1,55 @@
1
+ # PR #101 — [자동차 경주 구현] 해음 미션 제출합니다
2
+
3
+ - **Reviewee:** [@haeum808](https://github.com/haeum808)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/101
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 45
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`CommaSeparatedListBuilder` 분리** — 문자열 파싱을 별도 책임으로 빼내려는 시도. (리뷰 후엔 파라미터 이름이 `carNames`일 필요가 없을 만큼 일반화됨)
12
+ - **OutputView / InputView 분리** — 입력과 출력의 책임을 의식적으로 나눔.
13
+ - **`private setter` 활용** — `Car.position` 같은 상태를 외부 변경 불가로 관리.
14
+ - **자기 의문을 PR description에 명시** — "Controller가 여러개여도 괜찮은지", "모든 매직 리터럴을 상수화" 같은 메타 질문을 적극 제기해 토론을 끌어옴.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`ExceptionHandling` / `FinalWinner` / `MoveOrStay`라는 "역할 없는 절차 클래스" 남발** — "기능을 클래스로 빼야 한다"는 강박이 만들어낸 결과물. 자신만의 상태나 역할이 없는 함수 같은 클래스.
19
+ - **`Run`이라는 Application 시작 클래스 이름** — `run()` 메서드만 가진 무정형 진입점. 자동차 경주의 의미를 담지 못함.
20
+ - **`Messages` / `Ranges` / `Settings` 같은 정적 상수 컨테이너 클래스** — UI 관심사(메시지)와 도메인 설정이 한 클래스에 모임. 결국 모든 사용처가 이 컨테이너에 의존.
21
+ - **`Car`가 자기 이름 규칙(영어/한글)을 안 지킴** — Car("12345"), Car("!@#$") 모두 통과. 도메인 객체가 invariants를 안 가짐.
22
+ - **Controller가 비대 — "모든 객체의 책임"을 한 곳에서 다 함** — 새 클래스를 만들고도 실질은 함수 추출로 끝남.
23
+ - **`Car.position`이 `var`** — 외부에서 직접 수정 가능. private setter 권고.
24
+ - **OutputView가 입력 안내 메시지까지 출력** — 입력 안내 = Input의 일이라는 관점 분리 누락 (콘솔에 묶여 사고).
25
+ - **테스트 이름이 동작 의미를 안 드러냄** — "최종 우승자가 누구냐"의 기준이 테스트만 보고 추측 안 됨.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 리뷰어 @laco-dev는 가장 강력하게 **"역할 없는 클래스를 만들지 말 것"** 을 짚었다. `ExceptionHandling`을 두고 "이 객체를 지우고 모든 요구사항이 유지되도록 만들면 됩니다"라는 식의 강한 가이드. `FinalWinner`도 "함수가 맞을지 클래스가 맞을지" 묻고, `Cars.findWinners()` 형태를 직접 제시.
30
+
31
+ 또한 **"비대한 Controller의 정공 해법은 함수 추출"** 이라는 매우 실용적인 가이드. 새 클래스를 만들기 전에, Controller 내부에서 의미 단위로 private 함수로 묶기만 해도 가독성이 크게 올라간다는 점.
32
+
33
+ 키오스크 비유로 **"콘솔에 결합된 사고"를 깨는** 가이드도 인상적: "Input = 입력을 받는, Output = 결과를 발행하는"으로 추상하면 입력 안내 메시지를 표시하는 일조차 Input 쪽이 가져갈 수 있다.
34
+
35
+ - **대표 인용:**
36
+ > 이 객체를 지우고 모든 요구사항이 유지되도록 만들면 됩니다.
37
+ >
38
+ > — @laco-dev on `src/main/kotlin/racingcar/controller/ExceptionHandling.kt`
39
+
40
+ > 비대한 코드를 줄이는 가장 기본적인 방법은 함수를 사용하는 것입니다 ... 새 클래스를 만들고 잘못 분리가 되었습니다.
41
+ >
42
+ > — @laco-dev on `src/main/kotlin/racingcar/controller/Run.kt`
43
+
44
+ > 클래스(객체)는 어떠한 역할을 수행하고 상태를 가질 수 있는 녀석입니다. FinalWinner라는 객체는 무슨 역할을 하는 것일까요?
45
+ >
46
+ > — @laco-dev on `src/main/kotlin/racingcar/controller/FinalWinner.kt`
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **"클래스 분리"는 항상 답이 아니다.** 자신만의 상태나 행위 없는 클래스는 사실 함수다. `ExceptionHandling`, `FinalWinner`, `MoveOrStay` 같은 절차적 명사는 함수로 충분하다. 클래스는 역할과 상태를 함께 들 때 가치.
51
+ - **비대한 Controller의 첫 해법은 새 클래스가 아니라 함수 추출.** 의미 단위로 private fun을 만들기만 해도 `run() { getCars(); race(cars); printResult(cars) }`처럼 흐름이 한눈에 들어온다. 이렇게 정리된 뒤에야 진짜 객체 후보가 보인다.
52
+ - **도메인 invariants는 도메인 객체가 들고 있어야 한다.** `Car("12345")`가 통과되는 코드는 외부 검증을 통과한 척하지만 객체 자체가 무방비. 규칙은 그 규칙의 주인이 들어야 한다.
53
+ - **상수 컨테이너 클래스는 분산된 응집을 만든다.** `Messages`, `Settings`처럼 모든 곳이 의존하는 정적 컨테이너는 자기 도메인 위치를 잃은 데이터. 그 데이터를 쓰는 곳이 한 곳이면 그 도메인의 companion으로, 여러 곳이면 그 도메인을 가진 객체로.
54
+ - **클래스 키워드(data, enum, abstract)는 결정 변수가 아니다.** "data class라서 DTO다"는 사고는 본말이 전도된 것. 호출자에게 `Car`는 그냥 `Car`다. 키워드는 표현 수단일 뿐.
55
+ - **입력/출력의 정의는 콘솔이 아니라 의도.** "Input = 입력을 받는 책임"으로 추상하면 입력 안내 메시지도 Input의 일. 키오스크/안드로이드/콘솔이 다르더라도 추상 위에서는 같은 책임 분할.
@@ -0,0 +1,46 @@
1
+ # PR #129 — [자동차 경주 리팩터링] 해음 미션 제출합니다
2
+
3
+ - **Reviewee:** [@haeum808](https://github.com/haeum808)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/129
5
+ - **단계:** 리팩터링 (별도 라운드)
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 10
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RacingCars`로 도메인 컬렉션 일급화** — 1단계의 절차 클래스 정리를 받아 일급 컬렉션으로 책임 흡수.
12
+ - **순수 함수에 대한 자기 학습 의지** — `RacingCars`의 의존을 어떻게 줄일지 PR description에서 직접 고민.
13
+ - **테스트에서 랜덤 자체를 테스트하지 않기로 결정** — "통제 못하는 영역은 단위 테스트가 아니다"라는 학습 흡수.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **고차 함수(람다)로 의도가 흐릿해지는 추상화** — 함수형 표현을 쓰면서 도메인 의도가 이름으로 드러나지 않게 됨. 인터페이스가 의도 이름을 가지는 자리.
18
+ - **`middleResults`처럼 함수 이름과 중복된 파라미터 명명** — 함수 이름이 이미 "중간 결과"를 말하는데 인자도 `middleResults`. 이름의 정보 가치가 낮아짐.
19
+ - **`RandomNumberGenerator`의 단위 테스트** — 통제 불가능한 출력에 단언을 거는 테스트. 단위 테스트가 외부 무작위 위에 서면 결정적이지 않음.
20
+ - **`Position`을 표현하는 타입이 여전히 부족** — 1단계에서 받은 원시 강박 피드백이 부분만 반영.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @laco-dev는 두 가지 메타 가이드를 짚었다.
25
+
26
+ 1. **"람다보다 인터페이스로 의도를 드러내라"** — 함수형 시그니처는 호출자가 의도 이름을 잃게 만듦. 객체지향 학습 단계에서는 이름 있는 추상이 더 유익.
27
+ 2. **"테스트할 수 있는 것과 없는 것의 구별"** — 랜덤 자체는 단위 테스트의 대상이 아님. 통제 가능한 동작에만 단언을 건다.
28
+
29
+ 또한 **순수 함수 키워드를 명시적으로 제안** — 상태와 동적 변경을 줄이면 테스트와 상태 관리가 쉬워진다는 가이드.
30
+
31
+ - **대표 인용:**
32
+ > 고차 함수를 적용하는 방법도 좋지만 객체지향 프로그래밍을 공부하는 과정에서는 가급적 인터페이스를 사용하도록 해보시면 좋겠습니다. 람다로 사용하게 되면 해당 동작이 어떤 의도를 가지는지 이름으로 드러내기가 어려워 집니다.
33
+ >
34
+ > — @laco-dev on `src/main/kotlin/racingcar/model/RacingCars.kt`
35
+
36
+ > 랜덤기능 자체를 테스트 하는 것은 단위 테스트에 적절하지 않습니다. 실제 반환하는 결과가 0부터 9 사이에 있을 것이라는 것을 신뢰 할 수 없고, 100번을 돌려도 안나올 수도 있다는 의미가 됩니다.
37
+ >
38
+ > — @laco-dev on `src/test/kotlin/racingcar/model/RandomNumberGeneratorTest.kt`
39
+
40
+ ## 얻은 교훈
41
+
42
+ - **추상은 이름을 갖는다.** `(Int) -> Boolean` 같은 람다 시그니처는 강력하지만, 그 추상이 무엇인지 호출자가 이해하려면 사용처를 봐야 한다. 인터페이스로 이름을 주면 그 자체가 문서가 된다 — 객체지향 학습 단계에서 특히 유효.
43
+ - **단위 테스트의 대상은 결정적 행동.** 무작위 자체는 단위 테스트 밖. 무작위가 영향을 주는 도메인 행동은 페이크/스텁으로 무작위를 통제한 뒤 테스트.
44
+ - **순수 함수성과 클래스 책임은 한 방향에서 만난다.** 클래스가 가능한 한 상태를 가지지 않으면 테스트가 결정적이 된다. 객체지향과 함수형이 만나는 자리.
45
+ - **이름의 정보량은 호출자가 새로 알게 되는 것에 비례한다.** 함수가 "중간 결과를 출력한다"고 말하는데 인자 이름이 `middleResults`라면, 호출자가 새로 알게 되는 게 없다. `cars` 같이 다른 차원의 정보를 담은 이름이 더 가치 있다.
46
+ - **점진적 반영도 학습이다.** 1단계의 피드백을 다 받아내지 못해도, 핵심 한두 개를 깊게 이해하고 적용하는 편이 흘려보내는 것보다 훨씬 가치 있다 — 이 PR의 학습 곡선이 그런 흐름.
@@ -0,0 +1,56 @@
1
+ # PR #141 — [자동차 경주 구현] 환노 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hwannow](https://github.com/hwannow)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/141
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 39
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **에러 메시지를 상수화** — 오타/유지보수 측면 고려한 좋은 답변. 리뷰어가 명시적 칭찬.
12
+ - **테스트 코드를 깔끔하게 작성** — given/when/then 의식적 분리.
13
+ - **자기 의문을 PR description에 적극 제기** — "Main에서 InOutController를 거쳐 InOutView를 호출하는 게 맞는가" 같은 메타 질문.
14
+ - **`Mutable` → `List` 적극 반영** — 습관적으로 쓰던 Mutable을 한 번에 정리.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`InOutController`라는 합쳐진 책임** — 입력과 출력을 한 컨트롤러가 다룸. 의도는 단순화지만 분리 동기가 약해짐.
19
+ - **`enum class InOutConstant`로 상수 wrap + `getData()` 함수** — 단순 const value로 가능한데 enum + getter 2단 depth로 복잡화. 같은 결과를 두 가지 방식(`InOutConstant.NAME.constant` vs `inOutView.getData(InOutConstant.NAME)`)으로 얻을 수 있어 일관성 부족.
20
+ - **Controller가 View를 직접 알고 있음** — RacingCar/BlueCar/RedCar처럼 View 변형이 생기면 Controller마다 추가해야 하는 결합 구조.
21
+ - **`RaceController.oneRace`처럼 추상적 이름** — `runRace`/`executeRound`처럼 도메인 동작 어휘로 개선 여지.
22
+ - **`MainController`라는 무정형 이름** — 담당 책임이 이름에 안 드러남.
23
+ - **`RaceController.ViewController`라는 비대한 의존** — RaceController가 ViewController를 생성자로 받음. 도메인 계산 책임자와 표시 책임자의 결합.
24
+ - **`ViewController`가 자동차 객체를 생성** — 비유로 "홀 담당자가 재료까지 준비해서 요리사한테 준다"는 어색함.
25
+ - **테스트가 `cars: MutableList<Car>` 멤버를 통해 동작** — 개별 시나리오에 맞는 자동차 위치 표현이 어려움.
26
+ - **상수가 일부만 상수화** — `name.length <= 5`처럼 도메인 매직 넘버가 인라인.
27
+
28
+ ## 리뷰어 의견 요지
29
+
30
+ 리뷰어 @Gyuil-Hwnag는 **음식점 비유**(홀 담당자/요리사/재료)로 책임 분리를 시각화. ViewController가 자동차를 만드는 것은 "홀 담당자가 재료를 준비"하는 어색함이라는 비판.
31
+
32
+ 또한 enum의 과잉 사용에 대한 명확한 비교 — 같은 결과를 두 가지 방식으로 접근 가능한 코드는 호출자에게 혼란을 준다는 가이드.
33
+
34
+ Controller가 View를 직접 아는 결합에 대해 **인터페이스를 통한 재사용** 방향을 힌트로 제시 — 단, "지금 미션에 적용하기엔 오버엔지니어링"이라는 균형 잡힌 가이드도 함께.
35
+
36
+ - **대표 인용:**
37
+ > Controller 에서 View를 알게되면 어떤 점이 안좋게 될까요? ... RacingCar, BlueCar, RedCar 등 View에서 조금씩 출력하는 내용이 다르게 되면 모든 객체마다 Controller를 만들어야 하게 되지 않을까 싶네요
38
+ >
39
+ > — @Gyuil-Hwnag on `src/main/kotlin/controller/InOutController.kt`
40
+
41
+ > ViewController : 입/출력을 담당하니 가계의 홀 담당자 / RaceController : 입력 받은 내용을 가지고 요리를 하는 요리사 / Car 객체 : 요리를 하기 위한 재료 ... `홀 담당자가 재료까지 준비해서 요리사 한테 준다?` 같은 느낌이라서요!
42
+ >
43
+ > — @Gyuil-Hwnag on `src/main/kotlin/controller/ViewController.kt`
44
+
45
+ > getData()를 통해서만 InOutConstant를 추출하고 싶었다면, InOutConstant에 대한 접근을 제한하는 방식으로 되어야 했을텐데, 아래와 같이 사용이 2가지 방식으로 되면서 같은 결과를 내지만 사용방법이 2가지나 되는군요..
46
+ >
47
+ > — @Gyuil-Hwnag on `src/main/kotlin/view/InOutView.kt`
48
+
49
+ ## 얻은 교훈
50
+
51
+ - **추상화는 사용 비용을 줄이는 방향이어야 한다.** enum + getter로 상수를 감싸면 단순 const일 때보다 사용 depth가 늘고 사용법이 다양해진다. 추상은 단순화의 도구.
52
+ - **Controller가 View를 직접 알면 변형마다 새 Controller가 필요해진다.** 인터페이스를 통해 View의 변형을 흡수하면 Controller가 재사용 가능. 단, **YAGNI** — 변형 가능성이 실재할 때 도입.
53
+ - **현실 비유는 책임의 어색함을 빠르게 드러낸다.** "홀 담당자가 재료를 준비?" 같은 비유 한 줄이 ViewController의 책임 누수를 즉시 보여준다.
54
+ - **단일 결과를 얻는 두 가지 경로 = API 부담.** 같은 데이터에 도달하는 길이 두 가지면 호출자가 선택을 강요받고, 일관성을 잃는다. 한 가지 경로로 통일.
55
+ - **테스트 픽스처는 시나리오에 맞춰 만들어야** — 멤버 변수의 `cars`로 모든 케이스를 표현하려 하면 개별 시나리오의 입력이 모호해진다. 각 테스트가 자기 데이터를 빌드하는 편이 명확.
56
+ - **오버엔지니어링의 균형 가이드** — 리뷰어가 "이 패턴은 미래를 위한 학습 포인트일 뿐 지금 적용은 과하다"고 짚는 것은 매우 가치 있다. 좋은 리뷰어는 도구와 시점 모두를 짚어준다.
@@ -0,0 +1,45 @@
1
+ # PR #157 — [자동차 경주 2단계] 환노 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hwannow](https://github.com/hwannow)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/157
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Message` → `RacingGameOutputConstant` 네이밍 개선** — 클래스가 무엇을 담당하는지 이름으로 명확.
12
+ - **`RoundResult`로 책임 분리** — 1단계의 비대한 Controller에서 라운드 결과 책임을 떼냄.
13
+ - **`RandomGenerator` 인터페이스 도입** — 무작위 의존을 추상으로.
14
+ - **"전진할지 말지의 판단 책임이 어디 있나"를 깊이 고민** — Car에서 RoundResult로 옮긴 자기 결정 과정을 자기 언어로 정리.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **테스트를 위해 메서드 가시성을 public으로 노출** — `RoundResult`의 메서드를 외부에서 호출 가능하게 둔 것이 테스트 목적. "테스트 코드를 위한 코드"의 신호.
19
+ - **`Car.moveCar(random: Random)` 시그니처** — Car가 Random 자체를 알고 있어 결합도 증가. `Car.move()`로 단순화하고 의사결정을 외부로 옮기는 방향이 더 자연스러움.
20
+ - **`RoundResult`라는 모호한 이름** — "라운드의 결과를 담는 객체"인지 "라운드의 진행을 담당하는 객체"인지 이름에서 안 드러남. RaceRule, Game 등 도메인 어휘 후보 있음.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @Gyuil-Hwnag는 **"의사결정의 자리"** 를 정밀하게 물었다. Car가 Random을 직접 받는 것보다 `availableMove(random: Int): Boolean` 같은 인터페이스로 외부에서 결정 입력을 받게 한 뒤, Car는 단지 `moveCar()` 하는 식. 이 분리가 테스트 가능성과 책임의 깔끔함을 동시에 만든다.
25
+
26
+ 또한 **이름이 마지막 학습 영역** — `RoundResult`라는 이름의 어색함을 짚고, "어려운 네이밍"이라는 메타 코멘트와 함께 후보를 함께 던짐.
27
+
28
+ 자기 결정의 회고를 reviewee가 길게 적은 것에 대해 **"환노의 의견이 좋다"** 고 명시적으로 인정 — 좋은 학습 사이클.
29
+
30
+ - **대표 인용:**
31
+ > moveCar 에 `random : Random` 이 부분을 없애고 싶었습니다 ... // 예시: fun availableMove(random: Int): Boolean { return random >= FORWARD_NUMBER }
32
+ >
33
+ > — @Gyuil-Hwnag on `src/main/kotlin/domain/RoundResult.kt:22`
34
+
35
+ > 우선 테스트를 위해 Car 객체와 Random을 분리시켜야겠다는 생각을 했습니다 ... 전진할지 말지를 **판단하는 건 심판의 역할**이고, 사실상 Car는 숫자가 랜덤한 값인지, 어떤 기준으로 전진하는지 몰라도 된다!
36
+ >
37
+ > — @hwannow on `src/main/kotlin/domain/RoundResult.kt:22` (자기 결정 회고)
38
+
39
+ ## 얻은 교훈
40
+
41
+ - **결정과 실행을 분리한다.** Car가 "전진할지 말지"를 결정하면 Random과 결합. 결정은 별도의 판단자(심판/규칙)에게 두고 Car는 `move()`만 수행하는 분리 — 테스트 가능성과 책임 분배를 동시에 해결.
42
+ - **테스트를 위한 코드는 안티패턴.** 테스트하려고 가시성을 풀거나 인터페이스를 확장하면, production 표면적이 테스트 의도로 오염된다. 테스트가 어려운 곳은 책임 재분배의 신호.
43
+ - **자기 결정의 회고가 학습이다.** 단순 "리뷰 따라 고쳤습니다"가 아니라 "왜 그렇게 고쳤는지" 자기 언어로 적는 응답이 가장 깊은 학습. 리뷰어도 이런 응답에 가장 명확한 피드백을 준다.
44
+ - **단위가 시그니처에 새는지 확인.** `move(random: Random)`은 Car가 random의 구체 표현을 안다는 신호. `move(steps: Int)` 또는 `move()`로 단순화하면 의존이 사라진다.
45
+ - **이름 후보 N개로 비교** — RoundResult / RaceRule / Game 등 후보를 비교해보면 가장 정합하는 이름이 자연스럽게 떠오른다. 한 이름에 집착하지 말고 N안을 그려보는 습관.
@@ -0,0 +1,61 @@
1
+ # PR #109 — [자동차 경주] 해나 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hxeyexn](https://github.com/hxeyexn) (해나)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/109
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @ghojeong
7
+ - **라인 코멘트:** 19
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **README에 요구사항 정리**, 검증 로직 테스트 작성.
12
+ - **명확한 질문을 PR에 첨부** — 출력부 메서드 분리 여부, 검증 위치, depth 줄이는 법.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **테스트 코드가 통과 안 함** — 리팩토링 후 에러 메시지 변경했는데 테스트 코드 미반영.
17
+ - **`getNames()` 메서드가 4가지 일** — 입력 받기, split, 검증, Car 생성.
18
+ - **try-catch + while + break의 깊은 depth** — 메서드 분리 못 함.
19
+ - **`Race`(Controller)가 너무 많은 비즈니스 로직 보유** — 학생이 자가 인식.
20
+
21
+ ## 리뷰어 의견 요지
22
+
23
+ 리뷰어 @ghojeong (파이로)의 명문장 메시지들:
24
+
25
+ 1. **Depth = abstraction level** — "depth를 indentation으로 설명하지만 엄밀히는 abstraction level. SOLID의 SRP는 한 함수가 abstraction level 2를 넘지 않게 추상화하라는 의미도 있음." 재귀로 indentation을 줄이지 말고, *함수 쪼개기*로 abstraction level을 줄여라.
26
+
27
+ 2. **"휴가를 가도 동료가 일할 수 있는 코드"** — 동료에게 함수명 + 입력 타입 + 반환 타입만 알려주면 동일 기능을 구현할 수 있어야 함. 그렇지 않으면 휴가 중 동료가 전화. **개발 조직의 야근 괴담은 역할·책임이 명확하지 않은 함수에서 생긴다.**
28
+
29
+ 3. **메서드 세분화의 학습법** — "최대한도로 세분화하라. 그 후 합치는 리팩토링은 쪼개는 리팩토링보다 *쉽다*. 너무 세분화한 경험이 본인의 합치는 기준을 만든다."
30
+
31
+ 4. **DisplayName 어노테이션** — 한국인 동료와 협업 가정하고 테스트 설명을 자세히.
32
+
33
+ 5. **단순한 명령형 메서드 명명** — 메서드는 동사로 (`generate()` not `randomNumber`). 메서드 = 행위.
34
+
35
+ 6. **테스트가 깨진 상태로 리뷰 요청** — 리팩토링 후 실행 안 함. 검증 위생.
36
+
37
+ - **대표 인용:**
38
+ > depth 를 이야기할 때, 쉬운 설명을 위해서 indentation 을 이야기하지만, 엄밀히 이야기하면 abstraction level 을 뜻합니다. SOLID 원칙 중 Single Responsibility 원칙은 한 함수가 하나의 목적을 위해 동작하기를 권장하는데, 이는 abstraction level 이 2가 넘지 않도록 한 함수내의 로직을 추상화 하라는 의미도 있습니다.
39
+ >
40
+ > — @ghojeong on `src/main/kotlin/racingcar/controller/Race.kt`
41
+
42
+ > 조직에서 함께 일할 때 중요한 점은, 내가 마음 편하게 휴가를 가더라도, 동료에게 자신의 일을 믿고 맡길 수 있어야 한다는 점입니다... 업계에 떠도는 맨날 야근하는 개발 조직 괴담이 역할과 책임이 명확하지 않은 함수, 클래스, 혹은 모듈로 인해서 생긴다고 생각해주세요.
43
+ >
44
+ > — @ghojeong on `src/main/kotlin/racingcar/controller/Race.kt`
45
+
46
+ > 처음에 최대한도로 세분화하라는 조언은, 보통 합쳐진것을 쪼개는 리팩토링 보다, 쪼개진 것을 합치는 리팩토링이 더 쉽기 때문입니다.
47
+ >
48
+ > — @ghojeong on `src/main/kotlin/racingcar/controller/Race.kt`
49
+
50
+ > 잘 쪼개진 함수는 동료가 스킵해서 읽을 수 있는 것처럼, 잘 쪼개진 클래스 또한 동료가 스킵해서 읽을 수 있습니다. 저는 보통 클래스에 IDE 에서 점을 찍으면 자동완성으로 보이는, public 메서드만 읽고 해당 클래스 코드를 읽는 것을 스킵하고는 합니다.
51
+ >
52
+ > — @ghojeong on `src/main/kotlin/racingcar/controller/Race.kt:109`
53
+
54
+ ## 얻은 교훈
55
+
56
+ - **Depth는 abstraction level이지 indentation이 아니다.** 재귀로 indentation을 줄여도 abstraction level이 그대로면 SRP는 깨진 채. 함수를 쪼개라.
57
+ - **"휴가 가능한 코드" 기준**. 함수명 + 시그니처만 보고 동료가 같은 일을 할 수 있는지가 SRP 검사법. 휴가 중 전화 오면 추상화 실패.
58
+ - **세분화 학습법: 최대한도 쪼개고 합치기**. 합치는 리팩토링이 쪼개는 것보다 쉬움. 너무 쪼갠 경험이 내가 합칠 기준을 만듦. 거꾸로는 안 된다.
59
+ - **잘 쪼개진 클래스 = public method만 읽고 내부 스킵 가능**. 외부 라이브러리를 쓸 때 우리가 그렇게 함. 우리 코드도 동료가 그러길.
60
+ - **리팩토링 후 테스트 실행 = 위생.** 메시지 하나만 바꿔도 테스트 깨질 수 있음. 리뷰 요청 전 `gradlew test` 한 번.
61
+ - **테스트 함수명은 *시나리오 + 결과* 한 문장**. 동사로, 도메인 어휘로.
@@ -0,0 +1,59 @@
1
+ # PR #128 — [자동차 경주 - 리팩토링] 해나 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hxeyexn](https://github.com/hxeyexn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/128
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @ghojeong
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Cars`, `Winner`, `RandomNumber` 클래스 분리** — 1단계 함수 쪼개기 → 2단계 클래스 쪼개기.
12
+ - **`Cars`에 이름 유효성 검증 담당** — 도메인 객체로 invariant 이동.
13
+ - **getNames, getRoundNumber 메서드를 직관적 단위로 쪼갬**.
14
+ - **테스트 분리** — model 별 단위 테스트.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Race`(Controller)가 names 리스트를 또 보유** — Cars가 이미 가지고 있는데 중복. 데이터 동기화 부담.
19
+ - **`Winner` 클래스가 멤버 없음 + judge 함수만 보유** — 사실상 유틸 함수. 객체로서 가치 부재.
20
+ - **`getCars()`가 리스트 반환하지만 호출 측에서 안 씀** — 메서드 이름과 실제 행위 불일치.
21
+ - **`RandomNumber.generate`가 명사형 (이전 라운드 피드백) 잔존**.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @ghojeong의 핵심 가르침:
26
+
27
+ 1. **"객체는 메서드 + *멤버* 둘 다로 구성"** — Winner가 멤버 없이 함수만 있으면 그건 함수일 뿐 객체가 아님. "Winner의 역할은 우승자 판단, 책임은 우승자 반환"이라는 학생의 답에서 *역할 ≈ 함수*이면 별도 클래스 분리 불필요.
28
+
29
+ 2. **"테스트하기 쉬운가?"가 객체 분리 기준** — Winner를 분리해서 테스트하나, Cars 안에서 getWinners를 테스트하나 *난이도 같음*. 그러면 분리할 이유 없음. **분리의 정당화는 테스트 개선이 와야 함.**
30
+
31
+ 3. **데이터 중복 보유의 신호** — Cars와 Race가 모두 names를 들고 있음. 한 곳에서 진실의 출처를 두기.
32
+
33
+ 4. **메서드 이름 = 실제 행위와 일치** — `getCars()`가 리스트를 반환하지만 호출 측에서 안 쓰면 이름과 의미 어긋남.
34
+
35
+ 5. **랜덤은 전략 패턴으로 추상화** — 통제 어려운 외부 라이브러리는 전략 패턴으로 갈아끼움 가능.
36
+
37
+ 6. **상수는 *역할*로 명명** — `","` 보다 `NAME_DELIMITER` — 요구사항 변경 시 (특수기호로) 같은 이름으로 작동.
38
+
39
+ - **대표 인용:**
40
+ > Winner 클래스는 그 어떤 멤버도 갖고 있지 않고, judge 함수만을 유틸처럼 제공하고 있습니다... 만약 judge 라는 함수가 곧 클래스의 역할이라면, 별도 클래스로 분리할 필요가 없지 않았을까 해서 의견을 남겨보았습니다. 객체는 메서드 뿐만 아니라 맴버로도 구성된다는 사실을 잊지 말아주세요.
41
+ >
42
+ > — @ghojeong on `src/main/kotlin/racingcar/model/Winner.kt:13`
43
+
44
+ > 제가 객체를 쪼개고 합치는 기준을 오직 "테스트 하기 쉬운가?" 로 한다고 말씀드렸는데, 이 경우가 그런 경우 같습니다... 바뀐 테스트가 작성하거나 더 읽기 쉬워보이지 않기에 저는 이런 경우라면 Winner 라는 클래스를 분리하는 것에 대해, 왜 굳이 분리해야할지 의문을 표할 것 같습니다.
45
+ >
46
+ > — @ghojeong on `src/test/kotlin/racingcar/WinnerTest.kt:40`
47
+
48
+ > Cars 에서 이미 names 리스트를 맴버로 가지고 있는데, Race 에서 다시 names 리스트를 가지고 있도록 하신 의도가 궁금합니다.
49
+ >
50
+ > — @ghojeong on `src/main/kotlin/racingcar/controller/Race.kt:14`
51
+
52
+ ## 얻은 교훈
53
+
54
+ - **클래스 분리의 정당화 = 테스트 개선**. 분리해도 테스트가 더 명확해지지 않으면 분리할 이유 없음. "객체로 만들면 OOP 같다"는 가짜 정당화.
55
+ - **"객체 = 메서드 + 멤버 둘 다"**. 멤버 없이 함수만 가진 클래스는 함수일 뿐. judge 함수만 있는 Winner는 그냥 `findWinner(cars: Cars)` 함수로 충분 — 혹은 `Cars.findWinner()`로 일급 컬렉션에 통합.
56
+ - **데이터 동기화는 *진실의 출처* 한 곳**. Cars와 Race가 names를 모두 가지면 한쪽 변경 시 다른 쪽 어긋남. Cars가 가지고 Race는 Cars 자체를 들기.
57
+ - **메서드 이름 = 외부에서 본 행위**. `getCars()`인데 반환값 안 쓰이면 이름이 거짓말. `setupCars()` 같은 이름이 진실. (또는 별도 책임으로 분리.)
58
+ - **상수는 *의미*로 명명**. `","` → `NAME_DELIMITER`. 요구사항 바뀌면 값만 갈아끼우면 끝, 호출처는 그대로.
59
+ - **점진적 학습 곡선의 시그니처**: 1단계 = 함수 쪼개기, 2단계 = 클래스 쪼개기, 그 다음 = "왜 굳이 분리?"의 정당화 묻기. 깊이가 점점 올라감.