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,258 @@
1
+ # PR #20 — [블랙잭 1단계] 핑구 미션
2
+
3
+ - **Reviewee:** [@pingu244](https://github.com/pingu244)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/20
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @namjackson
7
+ - **라인 코멘트:** 30 (리뷰어 22 / 리뷰이 8)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Deck(deck: List<Card>)` 명시 주입** — 셔플은 외부.
12
+ - **`abstract class ParticipantState` + `DealerState`/`PlayerState`** + 공통 추상화 시도.
13
+ - **`Referee` 분리** + `Result` enum.
14
+ - **`Map<String, PlayerState>` 사용 — `name` 키 매핑** (후속에 객체로 변경 권고).
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ ### 1. `CardMaker.makeCard()` vs `makeCards()` 함수명 — *단/복수 모호*
19
+
20
+ ```kotlin
21
+ class CardMaker {
22
+ fun makeCards(): List<Card> { ... }
23
+ private fun makeCard(shape: Shape): List<Card> { ... } // ⚠ 단수 이름인데 List 반환
24
+ }
25
+ ```
26
+
27
+ 리뷰어: "*makeCard와 makeCards는 어떤 차이일까요? 함수명을 직관적으로 추상화해보면 어떨까요?* *구현부를 확인하기전에 함수명만으로도 파악할수 있으면 좋을거 같아요!*" — *단/복수* 미세 차이로 *의미 구분*은 *읽기 비용 ↑*. `makeCardsBy(shape)` 또는 *함수 이름 자체를 다르게*.
28
+
29
+ ### 2. `for + mutableList`보다 `flatMap`
30
+
31
+ ```kotlin
32
+ fun makeCards(): List<Card> {
33
+ val cards = mutableListOf<Card>()
34
+ for (shape in Shape.values()) { cards.addAll(makeCard(shape)) }
35
+ return cards.toList().shuffled()
36
+ }
37
+ ```
38
+
39
+ 리뷰어: "*forEach, for문을 활용하기보다, map, flatMap을 활용하면 코드가 간단해질것 같아요!*" — `Shape.entries.flatMap { shape -> CardValue.entries.map { Card(shape, it) } }.shuffled()` 한 줄. PR #17·#28과 같은 결.
40
+
41
+ ### 3. `Deck(deck, _deck)` 두 필드 중복
42
+
43
+ ```kotlin
44
+ class Deck(private val deck: List<Card>) {
45
+ private val _deck = deck.toMutableList()
46
+ }
47
+ ```
48
+
49
+ 리뷰어: "*deck과 _deck 두가지가 중복되어 가지고 있네요!* *Backing Properties를 활용하실 목적이였을까요?*" — **Backing property 오용**. *생성자 인자 deck*과 *내부 _deck* 둘 다 보관 = *중복 + 동기화 위험*. `class Deck(initialCards: List<Card>) { private val _cards = initialCards.toMutableList() }` 또는 `private val cards: MutableList<Card>` 직접.
50
+
51
+ ### 4. `ParticipantState` 추상이 *abstract` 사용 이유 불명
52
+
53
+ 리뷰어: "*abstract로 선언한 이유는 무엇일까요?* *딜러의 checkAvailableForPick와 플레이어의 checkBurst는 어떤 차이고, 무엇을 추상화할 수 있을까* 고민해보면 어떨까요?" — *추상 클래스 도입했으나 추상화 활용 부재*. *공통 행위 = canDraw()* 같은 *단일 추상 메서드*가 자연. 학생 후속: `checkOverCondition` 추상 함수 도입.
54
+
55
+ ### 5. `~State` 명명이 *카드 보유자*를 의미
56
+
57
+ 리뷰어: "*~State라는 네이밍을 지었지만, 사실 상태에 대한 정보보단, 단순한 보유한 카드뭉치를 의미하는것 같아요* *어떤 목적으로 어떤 책임을 가진 객체를 설계하셨는지 고민해보셔도 좋을거같아요*" — **클래스명 vs 실제 책임 불일치**. *DealerState/PlayerState*는 *상태 정보*를 연상시키지만 *실제는 카드 보유 + 점수 계산*. `Dealer/Player` 또는 `DealerHand/PlayerHand`가 자연. **이름이 의미를 거짓말**.
58
+
59
+ ### 6. `Controller`가 `names`와 `blackjackGame`을 *모두 보유*
60
+
61
+ ```kotlin
62
+ fun startGame() {
63
+ val names = InputView.inputPlayerNames()
64
+ val blackjackGame = BlackjackGame(names)
65
+ requestPickCard(names, blackjackGame)
66
+ ...
67
+ }
68
+ ```
69
+
70
+ 리뷰어: "*names은 blackjackGames내에서 관리되어야하는 부분이 아닐까요?*" — *names를 BlackjackGame 생성자에 넘긴 후 Controller가 다시 names를 인자로* = *데이터 중복 보유*. `blackjackGame.players` 메시지로 충분.
71
+
72
+ ### 7. `Controller.validatePickAnswer(name)`가 *문자열 비교*
73
+
74
+ ```kotlin
75
+ private fun repeatPickCard(blackjackGame: BlackjackGame, name: String) {
76
+ while (!blackjackGame.checkBurst(name)) {
77
+ val answer = validatePickAnswer(name)
78
+ if (answer == YES_ANSWER) blackjackGame.pickPlayerCard(name)
79
+ if (answer == NO_ANSWER) return
80
+ }
81
+ }
82
+ ```
83
+
84
+ 리뷰어: "*컨트롤러에서는 카드를 받을것인지 말것인지에 대한 Boolean값이 관심사인것 같아요!* *어떤 문자열로 받는지는 View의 책임*은 아닐까요? *y였던 문자열이 o, yes 등으로 변경된다면, View뿐 아니라 ,Controller에도 영향이 있을것 같아요!*" — **Controller가 문자열 인식 = UI 형식 누수**. *InputView.askPickCard(): Boolean*가 자연. PR #25·#28·#33과 같은 결.
85
+
86
+ ### 8. `Map<String, PlayerState>` — 객체화 필요
87
+
88
+ ```kotlin
89
+ val playersStates = mutableMapOf<String, PlayerState>()
90
+ ```
91
+
92
+ 리뷰어: "*String, PlayerState은 무엇을 의미할까요?* *Map이 아니라 객체로 관리되면 어떨까요?*" — **Map 그대로 노출 = 키 의미 불명**. `Players` 일급 컬렉션 + *내부에 `Map<Name, PlayerState>`*가 자연. *외부 호출자*는 *Players.find(name)* 메시지만. PR #25·#81·#125와 같은 결.
93
+
94
+ ### 9. `BlackjackGame.lateinit var dealerState`
95
+
96
+ ```kotlin
97
+ class BlackjackGame(private val names: List<String>) {
98
+ private val deck: Deck = Deck(CardMaker().makeCards())
99
+ lateinit var dealerState: DealerState
100
+ val playersStates = mutableMapOf<String, PlayerState>()
101
+ }
102
+ ```
103
+
104
+ 리뷰어: "*lateinit은 초기화를 지연시켜주지만, 가변변수로 선언됩니다.* *외부에 노출되는 가변 변수는 외부에서 변경되어 의도치않은 동작을 할것 같아요!* *init함수내에서 초기화*를 하면 *초기화지연을 할필요가 없어요!*" — **lateinit var + 외부 공개**는 *외부에서 dealerState = ...* 가능. `private val dealerState = DealerState()` + `init` 또는 `val dealerState = DealerState()` 직접. PR #92·#29·#114·#33·#34·#25와 같은 결.
105
+
106
+ ### 10. `ParticipantState`의 *Ace 보정 순서 의존*
107
+
108
+ 리뷰어: "*이러한 구조라면, cardList내의 Ace의 순서에 따라 다른동작을 할것 같아요* *관련 테스트들을 작성*해보면 어떨까요?" / 후속: "*카드가 ACE,ACE,JACK이라면, 12가 되어야하지만, 22로 계산이되네요!* *간단하게, sum을 먼저 구하고, Ace유무와 sum의 크기에 따라 +10을 더해주는 방법*으로 로직을 간단하게 작성할수 있어요!" — PR #33·#10·#79·#114와 같은 *Ace 순서 의존 알고리즘 실패*.
109
+
110
+ ### 11. `Card.value.toString() == "ACE"` 문자열 비교
111
+
112
+ 리뷰어: "*Card가 Ace인지 여부는 Card가 가져야할 책임이 아닐까요?* *문자열이 아닌 enum을 활용해서 비교*해보아요" — **`it.value.toString() == "ACE"`** 같은 *문자열 비교*는 *enum 어휘 회피*. `Card.isAce()` 또는 `it.value == CardValue.ACE`. **Java 어휘 잔재**.
113
+
114
+ ### 12. `if/else 두 줄 이상은 중괄호`
115
+
116
+ 리뷰어: "*if, else 가 두줄 이상이라면 중괄호를 작성해주세요*, https://kotlinlang.org/docs/coding-conventions.html#control-flow-statements *컨벤션을 지키면 어떤점이 좋을까요?*" — Kotlin 컨벤션. *블록 표현*이 *읽기 명확*.
117
+
118
+ ### 13. `Referee` 중첩 조건문
119
+
120
+ ```kotlin
121
+ fun judge(dealerSum: Int, playerSum: Int): Result {
122
+ return when {
123
+ // 여러 중첩 조건문
124
+ }
125
+ }
126
+ ```
127
+
128
+ 리뷰어: "*여러 조건문이 중첩되어있어 복잡한거 같아요!* *조건을 중첩시키기보다, 조건별 순서대로 나눠보면 어떨까요?* *플레이어 21초과 - 패배 딜러 21초과 - 승리 플레이어 > 딜러 - 승리 등등 ..*" — *우선순위 명시 when*. 또: 학생 후속 도착 *블랙잭 룰* (`Ace+10 두 장만 진짜 블랙잭`) 미반영. 리뷰어가 *2단계에서 참고하라고 명시*.
129
+
130
+ ### 14. `ParticipantState`의 리턴 타입 생략
131
+
132
+ ```kotlin
133
+ fun isAceValue() = value == CardValue.ACE // ⚠ 리턴 타입 추론
134
+ ```
135
+
136
+ 리뷰어: "*함수의 리턴타입가 생략되었네요, 생략이 가능하지만, 생략한 경우는 어떤 단점이 있을까요?*"
137
+
138
+ 학생 자가 답변: "*이름에서부터 명시적으로 Value를 반환한다고 말하고 있기에 생략*했습니다! *생략한 경우, 코드를 읽는 사람의 입장에서 반환값을 일일이 파악해야 한다는 단점*이 있는 것 같습니다." — PR #10 (s9hn)과 같은 *Effective Kotlin Item 4*. 공개 API는 명시.
139
+
140
+ ### 15. `Controller`가 *blackjackGame.players + 반복문* — Tell-Don't-Ask 위반
141
+
142
+ 리뷰어 (반복): "*blackJackGame에서 names를 받아와서, 다시 blackJackGame의 checkBurst, pickPlayerCard, findPlayer 등에 사용*하고 있네요, *blackJackGame게임에 메시지를 던져서, 동작하는 역할을 부여*해보면 어떨까요?" / "*blackjackGame.players를 반복문을 돌려서, blackjackGame.repeatPickCard를 카드를 돌리기보단*, *blackjackGame에게 "players에게 반복문을 돌려서 repeatPickCard을 실행하라"는 메세지를 전달*해보면 어떨까요? `blackjackGame.playsTurn(wantPickCard: (Player) ->...`" — *Manager.data → loop → Manager.method* 안티패턴. PR #25·#33·#92와 같은 결.
143
+
144
+ ### 16. `BlackjackGame`의 *public 메서드 순서 의존*
145
+
146
+ 리뷰어: "*외부에서 이런 동작이 공개되면, 순서에 따라 실행되지 않는다면, 예상하지 못한 동작을 할것 같아요!* *players가 순서에 따라 각자의 턴이 BlackJackGame내부에서 동작하게 책임을 부여*해보면 어떨까요?" — **외부에서 호출 순서 invariant 보호 부재**. *진행 메서드 1개 (`play()`)*로 묶기.
147
+
148
+ ### 17. `DealerCards(cards: List<Card>) : ParticipantCards(_cards)` — *중복 cards 프로퍼티*
149
+
150
+ ```kotlin
151
+ class DealerCards(cards: List<Card>) : ParticipantCards(cards.toMutableList()) {
152
+ val cards: List<Card> = ... // ⚠ 중복
153
+ }
154
+ ```
155
+
156
+ 리뷰어: "*불필요하게 중복된 cards 프로퍼티는 제거해주셔도 좋아요!*" — *상속 + 동일 이름 프로퍼티 재선언*은 *그림자(shadowing)* + 혼동.
157
+
158
+ ### 18. `Controller`가 *Domain에 callback 함수 전달*
159
+
160
+ 학생 자가 의문: "*Input이나 Output의 함수를 도메인에게 인자로 넘기는 것이 MVC패턴에 위배되지 않을까요?*" — 학생이 *callback 전달 + 도메인의 View 의존*에 자가 의문. 답: *예, 도메인 → View 의존 위반*. PR #25 (whk06061)의 학생 자가 도달과 같은 결.
161
+
162
+ ### 19. `Referee.judgePlayers`의 `forEach`보다 `map`
163
+
164
+ 리뷰어: "*map과 forEach의 차이는 무엇일까요?* *map을 활용*해보아요!" — `forEach` = *사이드 이펙트만*, `map` = *변환된 List 반환*. *결과를 모음*이면 `map`.
165
+
166
+ ### 20. *함수 선언 순서가 호출 순서와 불일치* (Stepdown rule)
167
+
168
+ 리뷰어: "*함수 순서에 대한 이야기*입니다! *개발자들은 보통 코드를 작성하는 시간보다 작성을 위해 코드를 읽는 시간이 훨씬 많다고해요!* *코드를 읽는 사람의 가독성을 위해, 호출순서에 따라 위에서 아래로 흐름이 흐르도록 순서를*..." — PR #79와 같은 *Stepdown rule*.
169
+
170
+ ### 21. `BlackjackGame` *매직넘버 2*
171
+
172
+ ```kotlin
173
+ repeat(2) { ... } // 초기 분배 2장
174
+ ```
175
+
176
+ 리뷰어: "*2는 무엇일까요? 매직넘버보단, 상수로 관리되면, 가독성도 좋아질것 같아요!*" — `INITIAL_CARD_COUNT = 2`. PR #128·#119와 같은 결.
177
+
178
+ ### 22. `BlackjackGame`이 *`names` 보유 — Players와 중복*
179
+
180
+ ```kotlin
181
+ class BlackjackGame(private val names: List<String>) {
182
+ ...
183
+ val playersStates = mutableMapOf<String, PlayerState>()
184
+ }
185
+ ```
186
+
187
+ 리뷰어: "*names는 Players는 중복된 값을 가지고 있는것 같아요!* *names는 초기화 이후에는 가지고있지 않으도 좋을거같아요!*" — *생성자에서만 사용*하는 *names를 멤버화* = 메모리 + 상태 중복.
188
+
189
+ ### 23. `Referee`에 *블랙잭 룰 (Ace+10 두 장)* 미반영
190
+
191
+ 리뷰어 (2단계 미리 참고): "*이부분은 참고하시고, 2단계 미션하면서 참고해주세요!* *ACE와 10(Jack,Queen,King) 단 두장의 카드로만 21이 된것을 블랙잭이라고합니다.* *룰상 딜러와 플레이어가 모두 블랙잭이거나, 서로 모두 21인 경우는 무승부입니다.* *블랙잭* ..." — **블랙잭 룰 정확 이해 = 16개+ PR 연속 권고**.
192
+
193
+ 또: 리뷰어 *코드 제안* (`suggestion`)으로 *우선순위 명시 when* 제안.
194
+
195
+ ## 리뷰어 의견 요지
196
+
197
+ - ***함수명 단/복수 (`makeCard`/`makeCards`) 모호*** — *명확한 이름*.
198
+ - ***`for + mutableList` < `flatMap`*** Kotlin 컬렉션 함수.
199
+ - ***Backing property 오용 (`deck`/`_deck` 둘 다)*** — 한 가지 표현.
200
+ - ***`abstract` 도입했으나 활용 부재*** — 공통 추상 메서드.
201
+ - ***`~State` 명명이 카드 보유자 의미*** = 이름이 거짓말.
202
+ - ***Controller가 names + game 중복 보유***.
203
+ - ***UI 형식 (`y`/`n`) Controller에 누수***.
204
+ - ***`Map<String, PlayerState>` 그대로 노출 = 키 의미 불명***.
205
+ - ***`lateinit var dealerState` + 외부 공개***.
206
+ - ***Ace 보정 순서 의존 = ACE,ACE,JACK 케이스 22 오답***.
207
+ - ***`it.value.toString() == "ACE"` 문자열 비교 < enum 활용***.
208
+ - ***`if/else 두 줄 = 중괄호` Kotlin 컨벤션***.
209
+ - ***Referee 중첩 조건 < 우선순위 when***.
210
+ - ***공개 API 리턴 타입 명시*** (학생 자가 도달).
211
+ - ***Controller → game.data + loop = manager.method 메시지***.
212
+ - ***외부 메서드 순서 invariant 부재 = play() 단일 진입점***.
213
+ - ***상속 + 중복 프로퍼티 = shadowing***.
214
+ - ***`forEach` vs `map`*** — 변환은 map.
215
+ - ***Stepdown rule***.
216
+ - ***매직넘버 2 = INITIAL_CARD_COUNT***.
217
+ - ***BlackjackGame에 names 멤버화 = 중복***.
218
+ - ***블랙잭 룰 (Ace+10 두 장만 블랙잭)*** — 2단계 미리 참고.
219
+
220
+ ## 대표 인용
221
+
222
+ > ~State라는 네이밍을 지었지만, *사실 상태에 대한 정보보단, 단순한 보유한 카드뭉치를 의미*하는것 같아요. *어떤 목적으로 어떤 책임을 가진 객체를 설계*하셨는지 고민해보셔도 좋을거같아요
223
+ > — @namjackson on `ParticipantState.kt`
224
+
225
+ > 이러한 구조라면, *cardList내의 Ace의 순서에 따라 다른동작을 할것 같아요*. *카드가 ACE,ACE,JACK이라면, 12가 되어야하지만, 22로 계산이되네요!*
226
+ > — @namjackson on `ParticipantState.kt`
227
+
228
+ > blackjackGame.players를 반복문을 돌려서, blackjackGame.repeatPickCard를 카드를 돌리기보단, *blackjackGame에게 "players에게 반복문을 돌려서 repeatPickCard을 실행하라"는 메세지를 전달*해보면 어떨까요?
229
+ > — @namjackson on `BlackjackController.kt`
230
+
231
+ > Input이나 Output의 함수를 *도메인에게 인자로 넘기는 것이 MVC패턴에 위배되지 않을까요?*
232
+ > — @pingu244 (학생 자가 의문) on `BlackjackGame.kt`
233
+
234
+ ## 얻은 교훈
235
+
236
+ - ***함수명 단/복수 미세 차이 = 의미 구분 모호*** — 명확하게 다른 이름.
237
+ - ***`for + mutableList`는 Java 어휘, Kotlin은 `flatMap`*** — 함수형 컬렉션.
238
+ - ***Backing property 오용 (`deck` + `_deck` 둘 다 보유) = 동기화 위험*** — 한 가지 표현.
239
+ - ***`abstract` 도입했으나 추상 메서드 부재 = 추상화 활용 부재*** — *공통 행위* 추상 메서드.
240
+ - ***`~State` 명명이 카드 보유자 의미 = 이름이 의미를 거짓말*** — *Dealer/Player* 또는 *Hand* 명명이 자연.
241
+ - ***Controller가 names + game 중복 보유 = 데이터 흐름 분산*** — *game.players* 메시지.
242
+ - ***UI 형식(`y`/`n`) Controller에 누수 = 16개+ PR 연속***.
243
+ - ***`Map<String, PlayerState>` 그대로 노출 = 키 의미 불명*** — *일급 컬렉션*으로 메시지만 노출.
244
+ - ***`lateinit var` + 외부 공개 = 외부에서 변경 가능 위험*** — `private val + init` 또는 *생성자 주입*.
245
+ - ***Ace 보정 순서 의존 = 4번째 PR (ACE,ACE,JACK 케이스 실패)*** — *합산 후 +10 단일 룰*.
246
+ - ***`it.value.toString() == "ACE"` 문자열 비교 = enum 어휘 회피*** — Java 잔재.
247
+ - ***`if/else 두 줄 = 중괄호` Kotlin 컨벤션***.
248
+ - ***Referee 중첩 조건 < 우선순위 when***.
249
+ - ***공개 API 리턴 타입 명시 = Effective Kotlin Item 4*** (학생 자가 도달).
250
+ - ***Controller → game.data + loop = Tell-Don't-Ask 위반*** — *manager.playTurns()* 메시지.
251
+ - ***공개 메서드 순서 invariant 부재 = `play()` 단일 진입점*** — 호출 순서 보호.
252
+ - ***상속 + 동일 이름 프로퍼티 = shadowing*** — *부모가 보유*하면 자식 재선언 X.
253
+ - ***`forEach`는 사이드 이펙트, `map`은 변환 반환***.
254
+ - ***Stepdown rule (호출 순서대로 위→아래 선언)***.
255
+ - ***매직넘버 2 = `INITIAL_CARD_COUNT`*** — 도메인 룰 상수.
256
+ - ***BlackjackGame에 names 멤버화 = 생성자에서만 쓰면 멤버 X***.
257
+ - ***블랙잭 룰 (Ace+10 두 장만 진짜 블랙잭) = 16개+ PR 연속 권고*** — 룰 정확 이해.
258
+ - ***도메인에 callback 함수 인자 = MVC 위반 (학생 자가 도달)*** — *진행 결과 반환*이 자연.
@@ -0,0 +1,171 @@
1
+ # PR #41 — [블랙잭 2단계] 핑구 미션
2
+
3
+ - **Reviewee:** [@pingu244](https://github.com/pingu244)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/41
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @namjackson (잭슨)
7
+ - **라인 코멘트:** 16 스레드 / 19 코멘트 — *람다 vs 반환 메시지 트레이드오프* + *3 변수 제약 자가 회의*
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **3 변수 제약 자가 회의 + 잭슨 동의** — 학생 자가 질문: *"Player라던가 BlackjackGame에서 생성자 인자로 받아오는 정보들이 3개가 되는데 이를 줄일 수 있는 방법이 있을까요? 제가 생각한 방법은 클래스를 만들어서 두가지 프로퍼티를 하나의 객체로 관리하는 것인데, 둘의 연관성이나 효율적인 코드를 위해서가 아닌 인자를 줄이고자 이렇게 만드는 것은 비효율적인 것 같습니다. (접근할 때 계속해서 파고 들어가야 하니까요!)"*. 잭슨 답변: *"3가지 이상의 변수를 가진 클래스를 쓰지 않는다라는 요구사항이 있지만, 좋은 설계를 위한 하나의 규칙일뿐, 불필요하다고 느낀다면 굳이 적용할필요는 없다는 생각이 들어요😄 좋은 설계방법을 고민해보시고, 불필요하다고 느끼시면 적용하지 않으셔도 좋을거 같아요!"*. **MCP 룰 후보 — `arbitrary-rule-driven-grouping`** (PR #133·#88·#132·#136 와 같은 결).
12
+ - **`View 책임 위치 자가 토론` — 입력 검증을 view vs controller** — 학생 자가 질문 + 잭슨 답변: *"이부부은 트레이드 오프 영역일것 같아요! View의 역할을 어디까지로 지정하느냐가 중요한 지점인거 같아요... View에서 검증을 하였지만, 도메인 영역에서는 View와의 관계가 분리가 되어있기 때문에 이러한 부분 또한 신뢰할수 없기 때문에 사실 유효성 검사의 경우는 View와 컨트롤러, 도메인영역에도 모두 이루어져야 한다고 보아요"*. 학습 가시화 모범. PR #132·#88·#133 와 같은 결.
13
+ - **`BlackjackGame` 도메인 객체 분리 시도** — 1단계 Controller god-object 진단 후속. *플레이어 턴 + 딜러 턴 흐름을 BlackjackGame 안*으로 이전 시도.
14
+ - **`Money` 원시값 포장 권고 후속 반영** — 잭슨의 *"Money와 같은 객체로 원시값을 포장해보면 어떨까요?"* 권고. PR #133·#90·#132·#136 와 같은 결.
15
+ - **`Result` 객체 반환 + Player 가변 상태 해소** — 잭슨 권고 *"Result또한 Player내에서 관리하는게 아닌, 새로운 Result객체로 반환해보면 어떨까요?"* 후속 반영 의도. 학생 자가 질문: *"근데 결국 외부에서 수정이 가능하긴 해야합니다..! 외부에서 계산하여 or 입력받아 정보를 저장해야하기 때문입니다.. 이렇게 가변 객체로 만들기 싫은데 바깥에서 변경할 수는 있어야 하는 상황에서는 어떻게 해야 할까요?"*. PR #85 (하디 2단계) 와 같은 결의 *불변 vs 가변* 트레이드오프 학생 자가 의문.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ ### 1. `Controller` 가 *플레이어 턴 → 딜러 턴 순서 관리* — *Game 객체 책임 누수*
20
+
21
+ ```kotlin
22
+ // BlackjackController (추정)
23
+ fun run() {
24
+ playPlayersTurns()
25
+ playDealerTurn()
26
+ }
27
+ ```
28
+
29
+ 잭슨 (BlackjackController.kt — 미해결): *"플레이어턴 후, 딜러 턴이 진행되는 부분은 컨트롤러에서 정하는게 아닌, blackjackGame 클래스 내에서 관리될 부분이 아닐까요?"*
30
+
31
+ → **플레이어 → 딜러 순서 = 게임 룰**. *Controller 가 순서 결정 = Game 룰 누수*. *blackjackGame.playGame()* 한 줄 호출이 *Game 자기 흐름 통제*. PR #131·#132·#136·#152 와 같은 결.
32
+
33
+ ### 2. `BlackjackGame.startBlackjackGame()` 가 *람다만 실행* — 함수 이름 misleading
34
+
35
+ 잭슨 (BlackjackGame.kt — 미해결): *"startBlackjackGame이라는 함수지만, 실제로 블랙잭 게임이 시작되는걸까요? 함수내부에는 람다만 실행되고 있네요!"*
36
+
37
+ → **`startBlackjackGame` = *블랙잭 게임을 시작한다* 의미**. *내부에 람다 호출만* = *함수 책임 부재*. *함수 이름 = 책임 명세 위반*. PR #88·#125·#114 의 *vagueName 안티패턴 변형*.
38
+
39
+ ### 3. `isBlackjack` / `isBurst` 가 *Player/Dealer 책임* — *Card 책임으로 이전 권고*
40
+
41
+ 잭슨 (Dealer.kt + Player.kt — 미해결): *"블랙잭을 확인하는 역할은 Card에게 책임을 부여해보면 어떨까요?"* + *"isBurst를 확인하는 부분도 Card에서 처리해보면 어떨까요? 승패시에 플레이뿐 아니라 딜러도, Burst여부를 확인하지 않을까요?"*
42
+
43
+ → **상태 판정 = Card/Hand 책임**. *Tell-Don't-Ask* — *Card 가 자기 점수 + Bust/Blackjack 자기 판정*. *Player/Dealer 가 자기 카드 정보 직접 비교* = *Card 책임 누수*. PR #124·#108·#128·#135·#114·#125·#152·#133·#131·#132·#136 와 같은 결.
44
+
45
+ ### 4. `람다 인자 vs 반환 메시지` 트레이드오프 — 학생 자가 답변
46
+
47
+ 잭슨 (BlackjackController.kt — 미해결): *"람다를 이용해 결과를 받는 방식과, 결과 값을 리턴받는 방식과 어떤 장단점이 있을까요?"*
48
+
49
+ 학생: *"제 생각에는 람다를 이용한다면 controller에서 맡는 일이 적어지고, 결과를 리턴받는다면 람다보다 직관적으로 하는 일을 확인할 수 있는 것 같습니다."*
50
+
51
+ 잭슨 후속 (Controller.kt 미해결): *"BlackjackResult와 blackjackGame가 협력해보면 어떨까요? blackjackGame에서 BlackjackResult를 생성하여 리턴해도 좋을거같아요! 추가적으로 val gameResult = blackjackGame.play( .. 플레이 이후, 결과를 바로 받아오면 어떨까요? 직관적일거 같아요😄"*
52
+
53
+ → **람다 인자 = Controller 책임 ↓ + 흐름 분산** vs **반환 메시지 = Controller 직관 + 결과 응집**. *학생 자가 학습 + 잭슨 후속 권고 = 반환 메시지 선호*. PR #132·#136 의 *고차함수 vs 반환 메시지* 와 같은 결.
54
+
55
+ ### 5. `Result.BLACKJACK_WIN` vs `WIN` 중복 — *BLACKJACK 여부 별도 체크*
56
+
57
+ 잭슨 (Result.kt — 미해결): *"BLACKJACK_WIN과 WIN 과 중복된 결과가 아닐까요? BLACKJACK으로 승리하였는지를 체크하는 다른 방법은 없을까요?"*
58
+
59
+ → **`BLACKJACK_WIN` enum 멤버 별도 = 결과 + 수익률 결합**. *PR #132·#108·#136 의 `BlackjackWin / BLACKJACK earningRate`* 와 *반대 트레이드오프* — 잭슨은 *결과는 WIN 하나 + 블랙잭 별도 체크*가 *명시*라 봄. *enum 멤버 응집 vs 분리* 트레이드오프.
60
+
61
+ ### 6. `OutputView 가 계산 로직` — *View 책임 누수*
62
+
63
+ 잭슨 (OutputView.kt — 미해결, 2 코멘트): *"View에서 계산로직을 호출하지말고, 계산완료된 값만 보여주도록 해보아요!"* + *"해당 로직은 dealer의 결과를 계산하는 로직으로, View에는 어울리지 않는 로직 같아요! View에서는 아무것도 모르고 전달된 데이터만 그려주는 역할을 해보아요"*
64
+
65
+ → **View = 전달 데이터만 그림**. *계산 = 도메인 책임*. PR #132·#90·#88 와 같은 결.
66
+
67
+ ### 7. `Cards.check` 함수명 — *Boolean 반환 미명시*
68
+
69
+ 잭슨 (Cards.kt:24 — 미해결): *"check라는 함수명은 리턴을 기대하지는 않을수도 있을거같아요! 보통 Boolean을 리턴할때 is, has 와 같은 접두사를 자주 사용하곤 합니다!"*
70
+
71
+ → **`check` = *동작 수행* 어휘**. *Boolean 반환은 is*/has* 접두사*. *Kotlin 어휘 표준*. *checkXX 가 Unit 반환* 가정. PR #125·#114·#10 와 같은 결.
72
+
73
+ ### 8. `List<Money>` 인자 — *name 별 베팅 매핑 부재*
74
+
75
+ 잭슨 (BlackjackGame.kt — 미해결): *"List<Money>가 무엇인지 파악하기 힘들거같아요, name별 베팅머니는 함께 관리되거나, 람다를 활용해보면 어떨까요?"*
76
+
77
+ → **`List<Money>` = 익명 컬렉션**. *플레이어 순서 의존 = 인덱스 일치 강제*. *Map<Player, Money> 또는 데이터 클래스 (BetInfo) 응집*이 정공. PR #132 (환노 2단계) 의 *Map<X,X> 지양* 진단과 같은 결.
78
+
79
+ ### 9. `BlackjackGameTest` 학생 자가 질문 — *private 변수 테스트* 함정
80
+
81
+ 학생 자가 질문: *"BlackjackGame을 테스트하기 위해서는 BlackjackGame의 private 변수인 players와 dealer를 public으로 돌려야하는데 테스트만을 위해서 그래도 되는 것인지 궁금합니다."*
82
+
83
+ 잭슨: *"먼저 테스트를 위한 코드는 지양하는게 좋아요, 테스트를 위한 코드가 된다면, 좋은 방법은 아닙니다! BlackjackGame의 어떤 테스트 작성을 위해 고민하시는걸까요?"* + *"다양한 방법이 있을 것 같아요! 먼저 불변객체라면, 불변변수에 사용해서 open해주어도 좋고, 생성자로 주입받는 방식을 활용할수도 있고, 결과를 확인하기 위해서라면, 리뷰에 남겨진대로, 게임 결과값을 리턴하는 구조 로 변경할수 있을거 같아요. 또 Private fun을 테스트하고 싶다면, 클래스 분리의 신호로 볼수도 있을거 같아요!"*
84
+
85
+ → **테스트를 위한 코드 지양**. *Private 멤버 테스트 필요 → 클래스 분리 신호*. *반환 메시지 + 결과 객체 검증* 정공. *Kotlin internal* 회피.
86
+
87
+ ### 10. `DealerTest` 의 *given-when-then 분리* — 학생 자가 학습 권고
88
+
89
+ 잭슨 (DealerTest.kt — 미해결): *"when, then 영역을 분리해보면 어떨까요? when영역을 통해 무엇을 테스트하는지 명확하면 좋을거같아요!"*
90
+
91
+ → **AAA (Arrange-Act-Assert) / GWT (Given-When-Then) 테스트 구조**. *주석으로 단계 명시* = *가독성 + 의도 명료*. PR #133·#136·#90 와 같은 결.
92
+
93
+ ### 11. `is` 연산자 회피 + 캐스팅 — *코드 미공개*
94
+
95
+ 잭슨 (Participants.kt — 미해결): *"캐스팅이 꼭 필요한 작업일까요? 참가자 타입에 역할을 만들어 보는건 어려울까요? 추가로, 코드에 체이닝이 너무 길게 되어 있어 명시적으로 변수를 분리해서 가독성을 올려주세요"*
96
+
97
+ → **타입 캐스팅 = 다형성 부재 신호**. *Participant 추상 메서드*가 *분기 회피*. *체이닝 길이 = 가독성 ↓*. PR #93·#108 와 같은 결.
98
+
99
+ ## 리뷰어 의견 요지
100
+
101
+ - **3 변수 제약 = 좋은 설계 규칙 하나일 뿐, 불필요하면 적용 X** — 학생 자가 회의 + 잭슨 동의. PR #133·#88·#132·#136 와 같은 결의 *연습 도구 인식*.
102
+ - **View 책임 = 트레이드오프 영역** — *View 자체 검증 + 도메인도 자기 invariant 강제*. *현재 단일 프로그램에선 중복 제거 OK*.
103
+ - **람다 vs 반환 메시지** — *람다 = Controller 책임 ↓ + 흐름 분산*. *반환 = 직관 + 결과 응집*. *반환 메시지 선호*.
104
+ - **테스트를 위한 코드 지양 — private 테스트 필요 시 클래스 분리 신호** — *생성자 주입 / 결과 반환 / 클래스 분리* 정공.
105
+ - **Card 책임 = 자기 점수 + Bust/Blackjack 판정** — *Player/Dealer 누수 회피*.
106
+ - **View 계산 로직 제거 = 전달 데이터만 그림** — *Tell-Don't-Ask*.
107
+ - **`List<X>` 의미 부재 = name 별 매핑 또는 람다** — *익명 컬렉션 회피*.
108
+ - **`check` 메서드명 = 동작 어휘, Boolean = is/has** — *Kotlin 어휘 표준*.
109
+
110
+ ## 대표 인용
111
+
112
+ **잭슨 (3 변수 제약 적정 적용, Player.kt:5):**
113
+ > 두가지를 묶는다면, bettingMoney와 Cards를 묶어서 게임을 진행시키는 클래스로 분리할수 있다고 생각이 들지만,
114
+ > 지금의 구조에선, 저도 핑구님의 생각처럼 불필요하다고 생각이들어요,
115
+ > 3가지 이상의 변수를 가진 클래스를 쓰지 않는다라는 요구사항이 있지만,
116
+ > 좋은 설계를 위한 하나의 규칙일뿐, 불필요하다고 느낀다면 굳이 적용할필요는 없다는 생각이 들어요😄
117
+
118
+ **잭슨 (View 책임 트레이드오프, InputView.kt):**
119
+ > 이부부은 트레이드 오프 영역일것 같아요!
120
+ > View의 역할을 어디까지로 지정하느냐가 중요한 지점인거 같아요,
121
+ > View에서 일어나는 입력에 대한 예외사항은 View의 책임으로 볼수도 있을거 같아요,
122
+ >
123
+ > View에서 검증을 하였지만, 도메인 영역에서는 View와의 관계가 분리가 되어있기 때문에 이러한 부분 또한 신뢰할수 없기 때문에
124
+ > 사실 유효성 검사의 경우는 View와 컨트롤러, 도메인영역에도 모두 이루어져야 한다고 보아요,
125
+ >
126
+ > 하지만, 현재의 프로젝트 구조상 View-Controller-도메인이 하나의 프로그램으로 동작중이기때문에,
127
+ > 불필요한 중복된 검증을 제거해도 좋을거같아요.
128
+
129
+ **잭슨 (Game 흐름 = Game 책임, BlackjackController.kt):**
130
+ > 플레이어턴 후, 딜러 턴이 진행되는 부분은
131
+ > 컨트롤러에서 정하는게 아닌, blackjackGame 클래스 내에서 관리될 부분이 아닐까요?
132
+
133
+ **잭슨 (private 테스트 = 클래스 분리 신호, BlackjackGameTest.kt:12):**
134
+ > 먼저 테스트를 위한 코드는 지양하는게 좋아요,
135
+ > 테스트를 위한 코드가 된다면, 좋은 방법은 아닙니다!
136
+ > ...
137
+ > 또 Private fun을 테스트하고 싶다면, 클래스 분리의 신호로 볼수도 있을거 같아요!
138
+
139
+ **학생 자가 답변 (가변 vs 불변 트레이드오프 자가 의문, Player.kt):**
140
+ > 현재 Player는 name, ownCards, bettingMoney, result 이렇게 4가지의 정보를 가지고 있습니다.
141
+ > 생성자 인자에 다 넣을 수는 없으니 var로 만들었는데 이러면 외부에서 수정이 가능하게 됩니다.
142
+ > 근데 결국 외부에서 수정이 가능하긴 해야합니다..! 외부에서 계산하여 or 입력받아 정보를 저장해야하기 때문입니다..
143
+ > 이렇게 가변 객체로 만들기 싫은데 바깥에서 변경할 수는 있어야 하는 상황에서는 어떻게 해야 할까요?
144
+
145
+ ## 얻은 교훈
146
+
147
+ 1. ***3 변수 제약 = 좋은 설계 규칙 하나일 뿐, 불필요하면 적용 X***. 잭슨/말리빈/페로로/두루 4 reviewer 공통 진단. *학생 자가 회의 + reviewer 동의 = 학습 가시화*. PR #133·#88·#132·#136·#90 와 같은 결.
148
+
149
+ 2. ***View 책임 트레이드오프 = View 자체 검증 + 도메인 invariant***. *완전한 분리* = *각 layer 자기 책임*. *현재 단일 프로그램*에선 *중복 제거*. *Multi-platform 고려*에선 *각 자체 검증*. PR #132·#90·#88 와 같은 결.
150
+
151
+ 3. ***게임 흐름 (플레이어 턴 → 딜러 턴) = Game 객체 책임***. *Controller 가 순서 결정 = Game 룰 누수*. *`blackjackGame.play()` 한 줄 호출*이 *Game 자율*. PR #131·#132·#136·#152 와 같은 결.
152
+
153
+ 4. ***`startBlackjackGame()` 가 람다만 실행 = 함수 이름 misleading***. *함수 이름 = 책임 명세*. *내부 행동 ≠ 이름* 이면 *vagueName 안티패턴*. PR #88·#125·#114 와 같은 결.
154
+
155
+ 5. ***람다 vs 반환 메시지 — 반환 메시지 선호***. *람다 = Controller 책임 ↓ + 흐름 분산*. *반환 = 직관 + 결과 응집*. *학생 자가 답변 + 잭슨 권고 = 반환 우선*. PR #132·#136·#85 와 같은 결.
156
+
157
+ 6. ***Private 멤버 테스트 필요 = 클래스 분리 신호 + 결과 반환 구조***. *테스트를 위한 코드 지양*. *Kotlin internal 회피*. *생성자 주입 / 불변 객체 / 결과 반환* 정공. PR #133·#136·#90 와 같은 결.
158
+
159
+ 7. ***Card 책임 = 자기 점수 + Bust/Blackjack 판정 (Tell-Don't-Ask)***. *Player/Dealer 가 Card 정보 직접 비교 = 누수*. PR #124·#108·#128·#135·#114·#125·#152·#133·#131·#132·#136 와 같은 결의 *카드 자기 판단* 정공.
160
+
161
+ 8. ***`List<X>` 익명 컬렉션 = 의미 부재***. *Map<Player, Money>* 또는 *BetInfo 데이터 클래스* 응집이 정공. PR #132 (환노) 의 *Map<X,X> 지양* 와 같은 결.
162
+
163
+ 9. ***Kotlin Boolean 메서드명 = is/has 접두사***. *`check` = 동작 어휘*. *`isXX` / `hasXX` = Boolean 표준*. PR #125·#114·#10 와 같은 결.
164
+
165
+ 10. ***Result.BLACKJACK_WIN 별도 멤버 vs WIN + 블랙잭 분기 — 트레이드오프***. *PR #132·#108·#136 의 별도 멤버* vs *PR #41·#85·#131 의 WIN + 블랙잭 분기*. *enum 멤버 응집 vs 분리* 의 *책임 위치* 트레이드오프.
166
+
167
+ 11. ***View 계산 로직 = View 책임 누수***. *View = 전달 데이터만 그림*. *계산 = 도메인 책임*. *Multi-platform View 갈아끼우기* 시 *계산 로직 잃음*. PR #132·#90·#88 와 같은 결.
168
+
169
+ 12. ***타입 캐스팅 + 체이닝 길이 = 다형성 부재 + 가독성 ↓***. *Participant 추상 메서드* 가 *분기 회피*. *명시적 변수 분리 + 다형성*이 정공. PR #93·#108 와 같은 결.
170
+
171
+ 13. ***`is*()` 부울 메서드는 부수효과 X***. *check 같은 동작 어휘와 구분*. *호출자 분기 안전성*. PR #124·#125·#92 와 같은 결.