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,206 @@
1
+ # PR #98 — [블랙잭 2단계] 채채 미션
2
+
3
+ - **Reviewee:** [@chaehyuns](https://github.com/chaehyuns)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/98
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @Gyuil-Hwnag (두루)
7
+ - **라인 코멘트:** 21 스레드 (반 정도는 칭찬 — 실제 토론은 7~8개) + **PR 본문 자가 의문 3개** + **학생 자가 답변 깊이** (data object / sealed class / fun interface)
8
+ - **양 단계 분석 reviewee** (1단계 #70 별도)
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ - **PR 본문에 학생 자가 의문 3개 명시** — *"내가 한 것이 진짜 상태 패턴이 맞는가?"* (Heads First Design Patterns 책 인용, 조건문 제거 효과 의문) / *3개 변수 제약 우회 의문* / *fun interface vs interface 자가 토론* + 자가 결론. PR #128·#135·#108·#133·#136·#137·#148·#151 와 같은 결.
13
+ - **두루 sealed class 코드 예시 제안 → 학생 자가 반영 + when + sealed 학습** — 학생 답변: *"sealed class를 사용해서 유지보수성, 확장성, 타입안정성 을 높일 수 있었습니다! 특히 when 문을 사용할때 sealed class를 활용한다면 더 좋겠다는 지식도 얻어갑니다 🤓"*. **Kotlin 어휘 (sealed + when exhaustive) 자가 학습 모범**. PR #137·#148·#90 와 같은 결.
14
+ - **`data object` 자가 학습 (`Running` 상태)** — 두루 권고에 학생이 *toString/equals/hashCode 구현 차이* + *sealed 와 조합 시 패키지명/주소값 무의미* 자가 분석 후 답변. **PR #146 두루 typealias 자가 학습 / PR #148 크롱 역할-상태 자가 학습 / PR #151 자가 학습** 결.
15
+ - **HandCards 의존성 자가 반영** — 두루 진단 *"Hand 에서 Deck을 부 생성자로 안가지고 함수의 파라미터로 받아서 처리하는 방법으로 객체 생성시에 대한 의존성을 줄여볼 수 도 있겠다는 생각이 듭니다~💪"* + 학생: *"객체보다는 함수에 파라미터로 받아서 처리하는 게 더 객체지향적이라는 생각이 드네요!"*. **생성자 의존 vs 파라미터 주입 자가 학습**. PR #133·#136·#85·#58 와 같은 결.
16
+ - **Judge 책임 객체화** — 두루 칭찬: *"게임 결과와 이윤을 담당하는 객체를 새롭게 만들어 주셨네요~👍"*. *1단계 Dealer 책임 비대* → *2단계 Judge 분리* 자가 진화 (PR #70 §5 토론의 자가 답변).
17
+ - **OutputView → ProgressView + ResultView 분리 자가 반영** — 두루 권고 + 학생: *"OutputView를 분리해볼 생각은 하지 못했는데 코드 가독성과 유지보수하기 좀 더 수월해졌다고 생각이 드네요!! ㅎㅎ 감사합니다!"*. *view-by-stage-split* — PR #88·#131 와 같은 결.
18
+ - **BettingAmount + BettingAmountInputView 분리** — 두루 칭찬: *"BettingAmount에 대한 Input도 분리를 해주셨네요~💯"*. *원시값 포장 + 입력 객체 단위 view 분리* — PR #137·#148 와 같은 결.
19
+ - **테스트 코드 + ValueSource 활용** — 두루 칭찬: *"ValueSource를 활용해서 테스트 코드 너무 깔끔하게 작성해주셨네요~👍"* / *"테스트 함수명만 보고도 어떠한 기능을 테스트하는 함수인지 명확하게 판별이 가능하네요~💯"* (1단계의 함수명 미흡 자가 학습 후 반영).
20
+ - **PR 본문 다이어그램 첨부** — Figma 손그림 상태 다이어그램. 두루 칭찬: *"첨부해주신 다이어그램을 보니까 어떤 내용인지 더 한눈에 들어오네요~💯"*. **시각화 = 리뷰어 컨텍스트 부담 감소 + 학생 자가 정리** — PR #146·#148·#92 와 같은 결.
21
+
22
+ ## 못한 점 (설계 관점)
23
+
24
+ ### 1. State sealed class 미적용 (학생 자가 자가 사유 후 자가 반영)
25
+
26
+ 두루 코드 제안:
27
+
28
+ ```kotlin
29
+ sealed class State {
30
+ abstract fun decisionState(): State
31
+
32
+ class Start(private val player: Player): State() {
33
+ override fun decisionState(): State {
34
+ player.initializeCards()
35
+ return if (player.isBlackjack()) Blackjack(player) else Running(player)
36
+ }
37
+ }
38
+
39
+ class Hit(private val player: Player) : State() {
40
+ override fun decisionState(): State {
41
+ player.addCard()
42
+ return if (player.isBust()) Bust(player) else Running(player)
43
+ }
44
+ }
45
+
46
+ data object Running : State() {
47
+ override fun decisionState(): State = Running
48
+ }
49
+ }
50
+ ```
51
+
52
+ 학생 자가 인정: *"sealed class를 사용해서 유지보수성, 확장성, 타입안정성 을 높일 수 있었습니다!"*
53
+
54
+ → **`interface State` + 파일 분리 < `sealed class State` + 하나의 파일**.
55
+
56
+ 이유:
57
+ - *`sealed`*는 *컴파일러가 상태 닫힘 (closed type hierarchy) 보장* → `when` 문 *`else` 없이도 exhaustive*.
58
+ - *`interface`*는 *추가 구현체가 외부 모듈에서 생길 수 있음* → `when` 에 `else` 강제 + 미처리 누락 위험.
59
+ - 블랙잭의 상태는 *기획상 명확히 한정 (Start/Hit/Bust/BlackJack/Stay)* → *닫힘이 정공*.
60
+
61
+ PR #93·#136·#152·#90 가 *sealed 정공* + PR #146·#148·#151 가 *fun interface vs interface 자가 학습* 결.
62
+
63
+ ### 2. Running data object 미적용 (`player` 생성자 잔재 자가 토론)
64
+
65
+ 두루: *"player 생성자의 경우 따로 사용을 하는 곳이 보이지 않는데, 혹시 추가를 해주신 이유가 있을까요??🤔 추가적으로 Running 에서 player를 제거 하고 나면 IDEA 내에서 data object로 수정을 하도록 권유 할텐데, data object 는 어떤 것일까요??"*
66
+
67
+ 학생 자가 답변 (학습 모범):
68
+
69
+ > *"Running 에서 player 생성자가 쓰이지 않는 걸 확인하고 data object로 변환 하려는 시도를 했으나, Hit으로 상태를 돌릴때 카드를 추가해야하다보니 player을 가지고 있어야 Hit에 player을 줄 수 있었습니다. 다만 너무 아쉬운 점은 상태가 Player보다는 HandCards를 들고 있었다면 코드가 조금 더 가독성이나 사용성이 좋지 않았을까 하는 생각을 했습니다. 상태 패턴을 처음 쓰다보니 어떻게 상태 패턴을 관리해야 효과적인지에 대한 학습이 부족했다고 생각이 들어, 추후 시간이 될 때 다시한번 구현해보고 싶네요!*
70
+
71
+ > *수정하며 IDEA 내에서 data object로 수정을 하도록 권유를 해서 data object에 대해 살펴보니 data class와 동일하게 data object는 일반 object와 동일하지만 내부적으로 toString(), euquals(), hasCode()를 구현하고 있다는 것을 알 수 있었습니다. 즉 data class 타입은 객체명과 데이터값을 간결하게 보여줄 수 있고 object 타입은 객체의 풀패키지명과 주소값을 가지고 있는데, sealed 타입으로 감싸서 각 상태값을 관리할때에는 object 객체의 패키지명과 주소값은 유의미한 값이 아닐 가능성이 많으니 data object로 수정을 권유한다는 점도 학습할 수 있었습니다! 🤓"*
72
+
73
+ → **학생 자가 두 가지 학습**:
74
+
75
+ 1. **상태 객체가 들고 있어야 하는 것: Player vs HandCards**. *상태 객체의 데이터 = 행동에 필요한 최소 정보*. *상태 전이 시 `player.addCard()`만 호출한다면 `HandCards` 만 들어도 충분*. *Player 전체를 들면 → 상태 객체가 Player 의 다른 책임 (베팅/이름) 까지 알게 됨 → 결합도 증가*.
76
+ 2. **`object` vs `data object` (Kotlin 1.9+ 어휘)**.
77
+ - `object` → 싱글톤 + `toString` = `package.ClassName@hashcode` (디버그 비친화).
78
+ - `data object` → `toString` = `ClassName` / `equals` = `true` (같은 싱글톤끼리) / `hashCode` = 안정값.
79
+ - *sealed 의 멤버 상태는 데이터값 차이가 없는 경우* → `data object` 가 *디버깅·로깅·`when` 분기에 더 친화*.
80
+
81
+ PR #133·#136·#90·#146 와 같은 결 (Kotlin 어휘 자가 학습).
82
+
83
+ ### 3. `HandCards.clear()` 잔재 (학생 자가 인정)
84
+
85
+ 두루: *"해당 함수를 통해서 카드를 비워주도록 하는 이유에 대해서 궁금합니다!🤔"*
86
+
87
+ 학생: *"상태 패턴을 적용하면서 코드를 이리저리 바꾸다 보니 _cards.clear()를 추가했다가 깜빡하고 삭제를 하지 못했네요 🥲 객체보다는 함수에 파라미터로 받아서 처리하는 게 더 객체지향적이라는 생각이 드네요! 수정했습니다:)"*
88
+
89
+ → **상태 패턴 적용 중 자가 jitter 코드 잔존**. *리팩토링 중 `clear()` 같은 mutable 메서드 잔재 = 객체 생애주기 모호 + 캡슐화 누수 위험*. *불변 객체 + 새 객체 생성* 으로 대체가 정공.
90
+
91
+ 추가 학생 자가 학습 — *"객체보다는 함수에 파라미터로 받아서 처리하는 게 더 객체지향적"*. 이건 *맥락 한정 명제*:
92
+ - *전역 의존 (생성자)* < *지역 의존 (파라미터)* — *결합도 한정*.
93
+ - 단 *동일 협력자를 매번 받아야 한다면 파라미터가 오히려 노이즈* — *경우에 따라 다름*.
94
+
95
+ PR #58 의 `Deck` 생성자 vs 파라미터 토론 / PR #133 의 `HandCards` 자가 학습 결.
96
+
97
+ ### 4. `isWin` / `isLose` 명명 → `PlayerWin` / `DealerWin` 권고
98
+
99
+ 두루: *"조건도 상태에 맞게 정말 너무 잘 분리해주셨네요~👍 다만 추후에 시간이 나신다면, `isWin`, `isLose` or (예시) `PlayerWin`, `DelearWin`를 보고 누가 이기는 것인지에 대해서도 있으면 좋을 것 같다는 생각이 듭니다!💪"*
100
+
101
+ 학생: *"생각해보니 player의 기준에서 작성되었다는 것을 명시해줄 필요가 있었던거 같네요! 좋은 리뷰 감사합니다 😄"*
102
+
103
+ → **부울 명명에서 *기준점 (subject) 누락***. *`isWin` = "누가 이기나?"* 가 *코드 독자*에게 *Player 기준 명시 X* → *Dealer 코드에서도 호출되면 의미 반전 위험*.
104
+
105
+ 대안:
106
+ - (A) **`PlayerWin` enum 값** = *부울 X, 결과 enum O*. 단 `enum class GameResult { PlayerWin, DealerWin, Push }` 자체가 *3-state 분기 = 부울 단일성보다 풍부*.
107
+ - (B) **`Result.isWinFor(participant)`** = *기준점을 인자로*. *enum 변형 = 함수형*.
108
+ - (C) **`isPlayerWin` 명명** = *기준점 명시 + 부울 유지*. 가장 단순.
109
+
110
+ **`canHit` vs `isBust` 부울 의미 일관 (True 방향 통일)** — PR #151 의 *부울 명명 의미 통일* 결.
111
+
112
+ ### 5. PR 본문 자가 의문 3개
113
+
114
+ #### 5.1. *"내가 한 것이 진짜 상태 패턴이 맞는가?"*
115
+
116
+ 학생 자가 의문: *"여기서 3번 조건문 코드를 전부 없애라고 되어 있는데, 생각보다 제 코드에서 드라마틱한 변화는 찾을 수 없었습니다...🥲"*
117
+
118
+ → *Heads First Design Patterns* (책) 의 *상태 패턴 = 조건문 제거 = 다형성 디스패치 위임* 정의를 *자가 적용 시 효과 의문*.
119
+
120
+ 원인 진단:
121
+ 1. *상태 객체가 `Player` 를 들고 있어 → 상태 객체에서 `player.addCard()` 등 호출 → 학생 코드의 조건문 자체는 사라졌으나 → "Player 가 무엇을 할지" 의 분기가 *상태 객체로 옮겨갔을 뿐*.
122
+ 2. *진정한 상태 패턴* = *State 객체가 `decideState()` 와 같이 다음 상태를 자기 책임 으로 결정* → *Context (Player) 는 `state.handle()` 만 호출*. *학생 코드는 이 흐름이 미완성* (Context vs State 책임 경계 모호).
123
+
124
+ → **상태 패턴 효과 = 조건문 *위치 이동* 이 아니라 *Context 의 분기 책임 자체 제거***. PR #93·#136·#152 가 *Player → State.compareTo(other): GameResult* 다형성 정공.
125
+
126
+ #### 5.2. *"3개 이상의 인스턴스 변수를 쓰지 않을 수 있는 방법?"*
127
+
128
+ 학생: *"지금 현재 player에 대한 변수를 줄여야하는데, 도저히 방법이 생각나지 않습니다... 혹시 조언해주실만한 내용이 있으신지 궁금합니다! 객체가 '상태'를 가지고 있으려면 추가되는 게 어쩔 수 없는 것일까요?"*
129
+
130
+ → *3 변수 제약* = *블랙잭 미션 요구사항 (객체지향 생활 체조 원칙)*. *Player 가 `name`/`handCards`/`bettingAmount`/`state` 4 변수* → 제약 위반.
131
+
132
+ 해결 후보 (학생이 자가 답변 X — 1단계 후 머지 시점까지 미해결):
133
+
134
+ - (A) **Player 분해** — `Participant` (name) + `Hand` (cards) + `Wallet` (bettingAmount). *책임별 분리*.
135
+ - (B) **`PlayerBetInfo` 같은 인공 객체 도입** — *베팅 + 결과를 묶음*. PR #133·#88·#132·#136·#93 의 *3 변수 제약 부산물 인공 객체* 결. 트레이드오프: *책임은 모호하지만 변수 수 통과*.
136
+ - (C) **State 가 Player 가 아닌 더 작은 단위 (HandCards) 들기** — *학생 자가 후회*.
137
+ - (D) **제약 자체 회피** — *블랙잭 도메인의 자연 모델링이 어렵다면 제약 완화 정공*. PR #146 의 *YAGNI* / PR #151 의 *반란군 비유* 결.
138
+
139
+ #### 5.3. *fun interface vs interface*
140
+
141
+ 학생 자가 답변 (자가 결정): *"하지만 추후 state에 대한 메소드들이 늘어날 가능성, 그리고 일반적으로 다른 사람들이 기대하는 state는 fun interface 보다는 interface라고 생각해서 코드를 수정하지 않았습니다."*
142
+
143
+ → **자가 결정 합리**:
144
+ - *fun interface = SAM (Single Abstract Method) 한정* → *람다 단축 표기 가능*. 그러나 *2개째 메서드 추가 즉시 `fun` 키워드 컴파일 에러*.
145
+ - *State 의 향후 메서드 확장 (canHit, decideState, score) 가능성 ≥ 1* → *interface 유지* 가 *변경 비용 회피*.
146
+ - *"사람들이 기대하는 state는 interface"* → *관용적 어휘* (Wirfs-Brock 의 stereotype 어휘에 가까움).
147
+
148
+ PR #146·#148·#151 의 *fun interface 자가 토론* 결.
149
+
150
+ ### 6. `Judge` 함수 분리 권고
151
+
152
+ 두루: *"이전에 비해서 상태에 대해서 좀 더 판별을 쉽게 하려는 노력이 보이는 것 같은데, 해당 내용을 함수로 분리를 해보시는것은 어떨까 라는 생각도 듭니다!!💪"*
153
+
154
+ 학생: *"함수로 분리하니 더 코드가 깔끔해보이네요! 감사합니다 :)"*
155
+
156
+ → **함수 분리 = *조건 표현식 → 명명된 함수*** = *읽는 사람이 의미를 한 번에 파악*. 단순 권고 + 학생 자가 반영.
157
+
158
+ ### 7. `HandCards.cards` vs `HandCards` 분리 (1단계 권고 반영 누락)
159
+
160
+ 1단계 두루 권고: *"Cards의 toString을 이용하도록 수정을 해보는 것도 좋을 것 같다는 생각이 듭니다~"*
161
+
162
+ 2단계에서 HandCards 자체에 `clear()` 잔재 (위 §3) + `_cards.clear()` 가 남았음 → *1단계 권고 일부만 반영*.
163
+
164
+ → **1단계 자가 반영 누락 = 학생도 인정 (위 §3)**. *상태 패턴 적용에 집중하다 다른 권고 누락*.
165
+
166
+ ## 리뷰어 의견 요지 (두루 / Gyuil-Hwnag)
167
+
168
+ 두루의 21 코멘트 패턴:
169
+ - **칭찬 절반 + 핵심 진단 절반** — *너무 깔끔합니다!💯* (4회), *너무 잘 분리해주셨네요~👍* (5회), *깔끔하게 작성해주셨네요~👍* (3회). 칭찬이 코드 위치별로 명확 → *학생이 어떤 부분이 잘 되었는지 자가 학습 가능*.
170
+ - **코드 예시 첨부 진단** = *sealed class 코드 예시* (State.kt §1). *문장 설명 < 코드 예시* → *학생이 직접 비교 가능 + 자가 적용 학습*. PR #75·#74·#133·#137·#146·#148·#151 의 두루/말리빈/지훈/크롱 코드 예시 결.
171
+ - **머지 시점 종합 코멘트** = *"고민을 많이 하시고 점점 객체들의 각 역활들에 대해서 잘 분리가 되고, 복잡한 로직에 대한 처리와 가독성 측면에서도 좋아지는 모습이 아주 인상적이었습니다!!"* — *1→2단계 진화 인정 + 학생 자가 동기 부여*. PR #70 1단계 → #98 2단계 양 단계 본 reviewer 만 가능한 종합 평가.
172
+ - **메타 학습 권유** = *`PlayerWin`/`DealerWin` 명명* / *`HandCards` 의존성 줄이기* — *수정 강제 X + "추후에 시간이 나신다면" 권유 형식*.
173
+
174
+ ## 대표 인용
175
+
176
+ > *"수정하며 IDEA 내에서 data object로 수정을 하도록 권유를 해서 data object에 대해 살펴보니 data class와 동일하게 data object는 일반 object와 동일하지만 내부적으로 toString(), euquals(), hasCode()를 구현하고 있다는 것을 알 수 있었습니다. (...) sealed 타입으로 감싸서 각 상태값을 관리할때에는 object 객체의 패키지명과 주소값은 유의미한 값이 아닐 가능성이 많으니 data object로 수정을 권유한다는 점도 학습할 수 있었습니다! 🤓"* — chaehyuns
177
+
178
+ > *"다만 너무 아쉬운 점은 상태가 Player보다는 HandCards를 들고 있었다면 코드가 조금 더 가독성이나 사용성이 좋지 않았을까 하는 생각을 했습니다. 상태 패턴을 처음 쓰다보니 어떻게 상태 패턴을 관리해야 효과적인지에 대한 학습이 부족했다고 생각이 들어, 추후 시간이 될 때 다시한번 구현해보고 싶네요!"* — chaehyuns (학생 자가 후회 + 향후 재구현 의지)
179
+
180
+ > *"여기서 3번 조건문 코드를 전부 없애라고 되어 있는데, 생각보다 제 코드에서 드라마틱한 변화는 찾을 수 없었습니다...🥲 그 결과 '내가 한 것이 진짜 상태 패턴이 맞는가?' 에 대한 고민이 들어..."* — chaehyuns (학생 자가 패턴 적용 효과 의문)
181
+
182
+ > *"sealed class를 사용해서 유지보수성, 확장성, 타입안정성 을 높일 수 있었습니다! 특히 when 문을 사용할때 sealed class를 활용한다면 더 좋겠다는 지식도 얻어갑니다 🤓"* — chaehyuns (학생 Kotlin 어휘 자가 학습)
183
+
184
+ > *"step1, step2 두루의 리뷰를 통해서 코드가 더 깔끔해질 수 있었고 가독성 측면에서 더 신경을 쓸 수 있었습니다 😊 좋은 리뷰와 말씀 너무 감사드립니다!"* — chaehyuns (양 단계 종합 회고)
185
+
186
+ ## 얻은 교훈
187
+
188
+ 1. **상태 패턴 효과 = *Context 의 분기 책임 제거***, *조건문 위치 이동* 이 아님. 학생의 *"드라마틱한 변화 없다"* 자가 의문 = *상태 객체가 Context 를 들고 있어 분기 책임이 *위치만 이동* 함을 자가 진단*.
189
+
190
+ 2. **상태 객체의 데이터 = *행동에 필요한 최소 정보***. *Player 전체 < HandCards (가장 작은 단위)*. *상태 객체가 협력자의 다른 책임까지 알면 결합도 폭증*. 학생 자가 후회 모범.
191
+
192
+ 3. **`object` vs `data object` (Kotlin 1.9+) = *디버깅/로깅 친화도***. *sealed 의 상태 멤버에 `data object` 가 정공*. *toString = ClassName / equals 안정 / 패키지명 누수 X*.
193
+
194
+ 4. **`interface` vs `sealed class`** = *컴파일러 상태 닫힘 보장* vs *외부 모듈 확장 가능성*. *블랙잭 같은 *닫힌 상태 집합* = `sealed` 정공 + `when else` 불필요*.
195
+
196
+ 5. **`fun interface` vs `interface`** = *SAM 한정 람다 단축 vs 확장 여지*. *State 처럼 메서드 추가 가능성 ≥ 1* = `interface` 정공. *학생 자가 결정 합리*.
197
+
198
+ 6. **`isWin` / `isLose` 부울 명명 = *기준점 (subject) 명시 누락 시 의미 반전 위험***. *`isPlayerWin`* / *`Result.isWinFor(participant)`* / *enum GameResult* 가 대안.
199
+
200
+ 7. **3 변수 제약 = *블랙잭 도메인 자연 모델링 어려움***. *학생 자가 미해결* = *제약과 도메인 정합의 트레이드오프*. PR #133·#88·#132·#136·#93 의 *인공 객체 도입* 패턴 = *우회 + 책임 모호 비용*.
201
+
202
+ 8. **상태 패턴 적용 중 `clear()` 같은 mutable 잔재**. *리팩토링 중 객체 생애주기 변경 시 *지운 메서드 흔적이 남기 쉬움**. *불변 객체 + 새 객체 생성* 으로 대체가 정공.
203
+
204
+ 9. **PR 본문에 자가 의문 3개 + 자가 다이어그램 + 학생 자가 답변 모두 풍부 = *학습 가시화 모범***. PR #128·#135·#108·#133·#136·#137·#148·#151 와 같은 결.
205
+
206
+ 10. **양 단계 본 reviewer 만 가능한 종합 평가** = *진화 인정 + 동기 부여*. *PR #70 (1단계) → #98 (2단계) 자가 진화* = *Dealer 책임 비대 → Judge 분리* / *score 책임 모호 → State 도입 시도* / *함수명 미흡 → 테스트 함수명 명확화* 가 두루의 종합 코멘트로 *학생도 자가 진화 가시화*.
@@ -0,0 +1,277 @@
1
+ # PR #123 — [블랙잭 1단계] 페토 미션
2
+
3
+ - **Reviewee:** [@chanho0908](https://github.com/chanho0908)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/123
5
+ - **단계:** 1단계 (안드로이드 백그라운드 — 객체지향 토론 풍부)
6
+ - **리뷰어:** @lee-ji-hoon (코니)
7
+ - **라인 코멘트:** 30 (리뷰어 16 / 리뷰이 14)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Deck`이 `Deque<TrumpCard>` 자료구조 보유** — `ArrayDeque`로 *카드를 위에서 한 장씩* 개념 표현 (PR #63·#65의 Set/재귀 문제 회피).
12
+ - **`Participant` 인터페이스 + `Dealer`/`Player` 구현** — 중복 코드 추상화.
13
+ - **`Participants` 일급 컬렉션 (`players + dealer` 구성)** — 컨트롤러가 *컬렉션* 단위로 전달.
14
+ - **`UserChoice` enum (HIT/STAY)** — 도메인 어휘로 입력 정규화.
15
+ - **`retryWhenException` 유틸 분리** — Controller에서 재시도 루프 추상화.
16
+ - **`fixture/trumpCardFixture` test fixture 디렉토리 분리** — 공통 setup을 *별도 함수 묶음*으로.
17
+ - **테스트 함수명 *시나리오 + 결과* 일관 적용** — 매우 긴 이름이지만 *상황을 정확히 기술*.
18
+ - **학생이 *캡슐화 vs 테스터빌리티* 트레이드오프를 자가 토론 — PR 본문에 명시** (못한 점 §1과 연결).
19
+
20
+ ## 못한 점 (설계 관점)
21
+
22
+ ### 1. `Deck` *의도적으로 테스트 불가능* 설계 — 카드 소진 처리 누락
23
+
24
+ ```kotlin
25
+ class Deck {
26
+ private val cards: Deque<TrumpCard> = ArrayDeque()
27
+ init { getAllCards() }
28
+ fun pop(): TrumpCard = cards.pop() // 빈 덱에서 NoSuchElementException
29
+ private fun getAllCards() { cards.addAll(makeCards()) }
30
+ }
31
+ ```
32
+
33
+ 학생 자가 설명: "`pop()` 메소드만이 public으로 구현되어 있는점, `shuffled()`을 사용하고 있다는 점 [...] 저는 의도적으로 이 클래스를 테스트 불가능하게끔 설계했습니다 ! [...] 테스트 불가능 코드가 나쁜 코드인가 ?"
34
+
35
+ 리뷰어: "캡슐화를 하다 보면 내부 구현 로직을 최대한 숨기게 되니 테스트가 불가능해집니다. 물론 그 캡슐화된 로직은 테스트가 필요가 없게끔 짜는 것이 중요합니다. [...] 그러면 지금의 상황은 모든 비즈니스 로직이 정말 잘 고려가 되어 있느냐를 고민해 보시죠. ``` 1. 참여자를 10명 정도 설정한다. 2. 다들 계속 카드를 받는다. 3. ??? ``` 3번에서 어떠한 상황이 발생하는지부터 생각해 봅시다. 이 클래스가 정말 테스트가 필요 없을까요?"
36
+
37
+ 학생 자가 인정: "카드가 모두 소진 되었을 경우 그 다음 과정에 대한 처리가 되어있지 않았더군요 ... 😱 [...] `Deck`은 명백히 테스트가 필요한 클래스가 맞는 것 같습니다 ! + 카드가 모두 소진 되었을 때 + 카드 뭉치의 구성이 게임 규칙에 맞게 만들어지는가? + 카드 뭉치에 중복된 카드가 없는가?" — *테스트 불가능 = 비즈니스 룰 미포함*이 동치였음을 자가 깨달음.
38
+
39
+ ### 2. `pop()` vs `draw()` — 자료구조 노출 vs 도메인 어휘
40
+
41
+ 학생 자가 토론: "`pop`은 `stack, queue, deque` 같은 특정 자료구조에만 있는 함수입니다. 그렇기 때문에 `Deck`이 어떤 자료구조를 사용하는지 외부에서 대략적인 유추가 가능합니다. [...] 외부로부터 숨은 의존성을 제거하고 완전히 은닉화하기 위해선 `draw()`같은 함수명을, 해당 함수의 동작을 유추할수 있도록 하고 싶다면 ? `pop()` 을 사용하면 된다고 생각"
42
+
43
+ 리뷰어: "`좋은 API는 사용자가 당신의 클래스 이름만 보고도 모든 메서드 이름을 맞출 수 있어야 합니다` 라는 측면에서 pop이 어울리신가요? draw가 어울릴까요? 아니면 draw는 사람이 해야 하는 것이고 다른 함수명을 선택해보는 것이 좋을까요?" — *클래스 이름 → 메서드 이름 추론 가능성*이 좋은 API 척도. `Deck.draw()`는 *카드를 뽑는다*는 도메인 행위에 일치. `pop()`은 구현 어휘.
44
+
45
+ ### 3. `Deck.getAllCards()` — getter인데 `add` 동작
46
+
47
+ ```kotlin
48
+ init { getAllCards() }
49
+ private fun getAllCards() {
50
+ cards.addAll(makeCards()) // get이 아닌 add
51
+ }
52
+ ```
53
+
54
+ 리뷰어: "`getAllCards` 함수만 생각했을 때 이 함수가 호출이 될 때 뭔가 문제가 있어 보이지 않나요? ``` 1. 이 함수가 정말 get인가? 2. 누군가 유지보수 할 때 이 함수를 잘못 쓰면 어떻게 될까? ```"
55
+ 학생 자가 인정: "메소드 네이밍은 getter지만 동작은 add를 하고 있으니 명백히 잘못된 네이밍인 것 같습니다 😅" — `private` 함수에도 *동사가 동작과 일치*하는 원칙은 동일.
56
+
57
+ ### 4. `Participant` 인터페이스의 `sumOfCards` (property) vs `sum()` (function) 동거
58
+
59
+ ```kotlin
60
+ interface Participant {
61
+ val cards: List<TrumpCard>
62
+ val sumOfCards: Int // property — ACE 보정 전 원시 합
63
+ fun addCard(card: TrumpCard)
64
+ fun hasAce(): Boolean
65
+ fun isBust(): Boolean
66
+ fun sum(): Int // function — ACE 보정 적용된 최종 점수
67
+ }
68
+ ```
69
+
70
+ 리뷰어: "`sumOfCards` 가 사용이 되는 부분을 보면 이것이 public일 필요가 있을지를 고민해보면 좋을 것 같고, `sumOfCards` 와 `sum()` 이 두 개를 어느 상황에서 써야 하는지 이 인터페이스만 보고도 유추가 가능할까요? 저는 좀 어려웠네요 🫠" — *내부 계산 단계*가 *공개 API*에 노출. `sumOfCards`는 `sum()`의 내부 일부일 뿐. *공개 API에서 *호출자 선택*을 강요*하지 말 것.
71
+
72
+ ### 5. `Player`가 `data class` — equals/hashCode 의도 불명
73
+
74
+ ```kotlin
75
+ data class Player(val name: String) : Participant {
76
+ private val _cards = mutableListOf<TrumpCard>()
77
+ override val cards: List<TrumpCard> get() = _cards.toList()
78
+ ...
79
+ }
80
+ ```
81
+
82
+ 리뷰어: "`Player` 가 data class 여야만 했던 이유가 있을까요? 🤔" — `data class`는 *값 객체*. `Player`는 *_cards mutable state*를 가져 *식별자(name)는 같은데 손패가 다른 두 Player*가 가능. *동치성이 깨질 위험*. lotto/racingcar의 `data class + var = 위험` 패턴 (STYLE_GUIDE §9-2)과 동일.
83
+
84
+ ### 6. `Player.sumOfCards`를 `val` + custom `get()` — 호출 비용 매번 발생
85
+
86
+ ```kotlin
87
+ override val sumOfCards get() = _cards.sumOf { card -> card.tier.values }
88
+ ```
89
+
90
+ 리뷰어: "해당 값이 변수로 선언하게 된 계기가 무엇인지 궁금하네요. 페토는 변수 선언을 할 때 custom get() 을 쓰는 경우와 함수를 쓰는 경우 어떻게 구분을 하나요?"
91
+
92
+ 학생 답변: "`custom getter`는 필드를 만들지 않고 `getter`만 생성되어 원본 필드의 값이 변경될 때 `getter`에 선언된 필드의 값에 따라 변경됩니다 ! [...] 메소드로 사용해도 되지만 이를 사용하는 다른 곳 에서 코드가 간결해진다는 장점 때문에 변수로 사용했습니다." — `val + get()`은 *매 접근마다 계산*. *상태가 아닌 함수*를 *property*로 노출하면 호출자는 *저장된 값*이라고 오해. *순수 계산은 `fun`*, *지속 상태는 `val`*이 원칙.
93
+
94
+ ### 7. `BlackJackGame.calculateDealerResult`가 결과를 *람다로 전달*
95
+
96
+ ```kotlin
97
+ fun calculateDealerResult(action: (Map<GameResult, Int>) -> Unit) {
98
+ val dealerMap = GameResult.entries.associateWith { 0 }.toMutableMap()
99
+ participants.players.forEach { player ->
100
+ val result = GameResult.from(participants.dealer.sum(), player.sum())
101
+ dealerMap[result] = dealerMap.getOrDefault(result, 0) + 1
102
+ }
103
+ action(dealerMap) // 반환 대신 콜백
104
+ }
105
+ ```
106
+
107
+ 리뷰어: "`calculateDealerResult` 여기서 왜 Result를 lambda로 값을 넘기는지가 궁금하네요. 단순 return을 할 수는 없던 것인가요? 페토가 lambda를 선택한 이유가 무엇인가요?" — 람다 콜백은 *비동기/이벤트* 컨텍스트에 자연. *동기 계산*에서 callback을 쓰면 *반환값 추적이 어려워지고* *Controller가 람다 안에서 View 호출* 패턴이 나옴. PR #65와 같은 *기능 과시* 위험.
108
+
109
+ ### 8. `BlackJackController.readForGame(participants): BlackJackGame` — 함수명 모호
110
+
111
+ ```kotlin
112
+ private fun readForGame(participants: Participants): BlackJackGame {
113
+ val deck = Deck()
114
+ return BlackJackGame(participants, deck)
115
+ }
116
+ ```
117
+
118
+ 리뷰어: "이 함수를 보고 `BlackJackGame` 을 반환할 것이다. 라는 것을 알 수 있을까요?" — `readForGame`은 *준비 동작*에 가까우나 *반환값 = `BlackJackGame`*이라는 정보 없음. `createGame()` / `assembleGame()`가 자연.
119
+
120
+ ### 9. `UserChoice` enum이 *입력 문자열을 `MutableMap`으로 저장*
121
+
122
+ ```kotlin
123
+ enum class UserChoice {
124
+ HIT, STAY,
125
+ ;
126
+ companion object {
127
+ private const val INPUT_HIT = "y"
128
+ private const val INPUT_STAY = "n"
129
+ private const val INVALID_VALUE = "잘못된 값을 입력하였습니다."
130
+ private val CHOICE = mutableMapOf<String, UserChoice>() // 가변 + 정적
131
+ // ...
132
+ }
133
+ }
134
+ ```
135
+
136
+ 리뷰어: "유저의 선택을 왜 map으로 저장하고 있는 것일까요?" — `enum.entries.find { ... }`로 충분. *가변 정적 맵*에 *상수*를 담는 패턴은 *재초기화 위험* + *불필요한 상태*. + UI 형식(`"y"`/`"n"`)이 도메인 enum 안에 있음 (PR #63·#65와 같은 결).
137
+
138
+ ### 10. `Dealer.companion object`에 `DEALER_MAX_SCORE = 16`, `ACE_EXTRACT_SCORE = 10`
139
+
140
+ ```kotlin
141
+ class Dealer : Participant {
142
+ fun isOverMaxScore(): Boolean {
143
+ if (hasAce() && !isBust()) {
144
+ return sumOfCards + ACE_EXTRACT_SCORE > DEALER_MAX_SCORE
145
+ }
146
+ return sumOfCards > DEALER_MAX_SCORE
147
+ }
148
+ companion object {
149
+ const val DEALER_MAX_SCORE = 16
150
+ const val ACE_EXTRACT_SCORE = 10
151
+ }
152
+ }
153
+
154
+ // 다른 곳에서
155
+ import blackjack.domain.participant.Dealer.Companion.ACE_EXTRACT_SCORE
156
+ ```
157
+
158
+ 리뷰어: "이 값이 `Dealer`의 동반 객체로 있는 게 맞을까요? `Dealer`만 판단해야 할 값이 아니니 어디가 적합했을지 고민을 해보면 바로 답이 나올 것 같네요!" — `ACE_EXTRACT_SCORE = 10`은 *블랙잭 룰*. `Dealer` 외 `Player`도 사용. *카드 룰 상수*는 `Card`/`Game` 수준에. `Dealer.Companion`에 두면 *Dealer가 룰의 소유자*라는 오해.
159
+
160
+ ### 11. `enums/` 패키지 — 구현 세부로 패키지 구성
161
+
162
+ ```
163
+ blackjack/
164
+ domain/
165
+ enums/
166
+ CardTier.kt
167
+ Shape.kt
168
+ GameResult.kt
169
+ UserChoice.kt
170
+ participant/
171
+ Dealer.kt
172
+ Player.kt
173
+ Participant.kt
174
+ ```
175
+
176
+ 리뷰어: "model 안에 enums로 이렇게 분리가 되면 interface가 생기면 interfaces 로 분리를 하실 계획일까요? 패키지명은 대략적으로 집합체에 대한 성격을 나타내는 것을 노력해보시면 좋을 것 같습니다. 패키지에서 어떻게 구현이 되었던 그건 패키지의 관심사가 아닙니다." — 패키지명은 *Kotlin 키워드/구현 타입*이 아니라 *도메인 응집*으로. `card/`, `participant/`, `game/`처럼.
177
+
178
+ ### 12. `interface Participant`로 중복 제거 — `abstract`는 고려 안 함
179
+
180
+ ```kotlin
181
+ interface Participant {
182
+ val cards: List<TrumpCard>
183
+ val sumOfCards: Int
184
+ fun addCard(card: TrumpCard)
185
+ // 모든 구현이 _cards mutableListOf + 같은 본문 — 중복 폭증
186
+ }
187
+ ```
188
+
189
+ 리뷰어: "`딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.` 을 지키기 위해서 interface를 선택한 것 같은데요. abstract도 있는데 페토가 생각했을 때 왜 interface를 선택했는지가 궁금하네요." — `interface`는 *공통 행위 계약*이고 *상태 공유*는 보장하지 않음. 그래서 `_cards`, `addCard`, `hasAce` 같은 *공통 구현*이 두 곳에 복제됨. `abstract class Participant`로 *상태 + 기본 구현* 공유가 자연. 학생도 자가 인정: "인터페이스의 모든 멤버는 가시성이 `public` [...] 추상 클래스는 `protect`를 사용해 가시성 변경이 가능 [...] 추상 클래스를 사용해 리팩토링하겠습니다 !"
190
+
191
+ ### 13. `Player.isBust` vs `Dealer.isBust` — 같은 이름, 다른 룰
192
+
193
+ ```kotlin
194
+ class Player : Participant {
195
+ override fun isBust(): Boolean = sumOfCards > BUST_STANDARD // 21 초과
196
+ private fun isBustByMaxAce(): Boolean = sumOfCards + ACE_EXTRACT_SCORE > BUST_STANDARD
197
+ }
198
+
199
+ class Dealer : Participant {
200
+ override fun isBust(): Boolean = sumOfCards + ACE_EXTRACT_SCORE > BUST_STANDARD // ACE 보정 적용
201
+ }
202
+ ```
203
+
204
+ `Player.isBust`는 *raw sum > 21*, `Dealer.isBust`는 *ACE 보정 적용*. *같은 함수명에 다른 룰*은 *Liskov 위반*. 인터페이스 계약을 *명확히 정의*하거나 *둘 다 ACE 보정 후 비교*로 통일해야.
205
+
206
+ ### 14. `Player`가 점수 계산까지 — 카드 컬렉션 분리 안 함
207
+
208
+ 리뷰어: "플레이어가 직접 점수를 계산할 수도 있지만, 카드를 관리하면서 점수를 계산하는 역할을 분리할 수도 있을 것 같은데 페토는 어떻게 생각하나요?" — `Hand`/`Cards` 일급 컬렉션이 *카드 보유 + 점수 계산*을 갖고, `Player` 는 *결정 + 이름*만. 학생도 자가 인정: "다른 크루들 의견을 들어보니 카드 리스트를 관리하는 일급 컬랙션이 있더라구요 ! 저도 말씀해주신 역할들을 하는 카드 리스트 일급 컬랙션이 있으면 어떨까 고민했습니다."
209
+
210
+ ### 15. `playGame` 안의 `if (player.cards.size == 2) onPlayerStateUpdated(player); break` — 매직 조건
211
+
212
+ ```kotlin
213
+ fun playGame(getPlayerChoice: (String) -> UserChoice, onPlayerStateUpdated: (Player) -> Unit) {
214
+ participants.players.forEach { player ->
215
+ while (!player.isBust()) {
216
+ val choice = getPlayerChoice(player.name)
217
+ when (choice) {
218
+ UserChoice.HIT -> player.addCard(deck.pop())
219
+ UserChoice.STAY -> {
220
+ if (player.cards.size == 2) { onPlayerStateUpdated(player) }
221
+ break
222
+ }
223
+ }
224
+ onPlayerStateUpdated(player)
225
+ }
226
+ }
227
+ }
228
+ ```
229
+
230
+ `player.cards.size == 2` 라는 *매직 조건*이 *무엇을 의미하는지* 불명. *초기 손패 = 2*라는 도메인 룰이 *루프 내부 조건*으로 누수. *상태 머신*(Ready/Hit/Stay/Bust)으로 표현하면 *size == 2*가 무의미해짐.
231
+
232
+ ## 리뷰어 의견 요지
233
+
234
+ - **테스트 불가능 ≠ 좋은 캡슐화** — *비즈니스 룰 미포함*이 진짜 문제. *카드 소진 시 동작*은 비즈니스 룰.
235
+ - **`Deck.pop()` vs `draw()`** — *클래스 이름으로 메서드 이름 추론 가능성*이 좋은 API.
236
+ - **`getAllCards()` 같은 *get/실동작 불일치* 함수명** — private도 동사 정확성.
237
+ - **인터페이스의 *공개 API 두 가지 점수 계산법*은 호출자 혼란** — `sumOfCards` private화 + `sum()`만 공개.
238
+ - **`data class + mutable state`는 동치성 위험.**
239
+ - **`val + get()` vs `fun`** — *상태 없는 계산*은 함수, *지속 상태*는 property.
240
+ - **결과 *콜백 전달*보다 *return*** — 동기 계산은 단순 반환.
241
+ - **`enum`에 *MutableMap 정적 저장*** — `entries.find` 한 줄로.
242
+ - **상수의 *소속 클래스*** — *도메인 룰*인지 *역할별 룰*인지로 위치 결정.
243
+ - **패키지명 = 도메인 응집, 구현 타입 X.**
244
+ - **`interface` vs `abstract class`** — 상태 공유면 abstract.
245
+
246
+ ## 대표 인용
247
+
248
+ > 캡슐화를 하다 보면 내부 구현 로직을 최대한 숨기게 되니 테스트가 불가능해집니다. 물론 그 캡슐화된 로직은 테스트가 필요가 없게끔 짜는 것이 중요합니다. [...] 1. 참여자를 10명 정도 설정한다. 2. 다들 계속 카드를 받는다. 3. ??? 3번에서 어떠한 상황이 발생하는지부터 생각해 봅시다. 이 클래스가 정말 테스트가 필요 없을까요?
249
+ > — @lee-ji-hoon on `src/main/kotlin/blackjack/domain/Deck.kt`
250
+
251
+ > 좋은 API는 사용자가 당신의 클래스 이름만 보고도 모든 메서드 이름을 맞출 수 있어야 합니다 라는 측면에서 pop이 어울리신가요? draw가 어울릴까요?
252
+ > — @lee-ji-hoon on `src/main/kotlin/blackjack/domain/Deck.kt`
253
+
254
+ > getAllCards 함수만 생각했을 때 이 함수가 호출이 될 때 뭔가 문제가 있어 보이지 않나요? 1. 이 함수가 정말 get인가? 2. 누군가 유지보수 할 때 이 함수를 잘못 쓰면 어떻게 될까?
255
+ > — @lee-ji-hoon on `src/main/kotlin/blackjack/domain/Deck.kt`
256
+
257
+ > 패키지명은 대략적으로 집합체에 대한 성격을 나타내는 것을 노력해보시면 좋을 것 같습니다. 패키지에서 어떻게 구현이 되었던 그건 패키지의 관심사가 아닙니다.
258
+ > — @lee-ji-hoon on `src/main/kotlin/blackjack/domain/enums/CardTier.kt`
259
+
260
+ > `Dealer`만 판단해야 할 값이 아니니 어디가 적합했을지 고민을 해보면 바로 답이 나올 것 같네요!
261
+ > — @lee-ji-hoon on `src/main/kotlin/blackjack/domain/participant/Dealer.kt` (Dealer.Companion의 ACE_EXTRACT_SCORE)
262
+
263
+ ## 얻은 교훈
264
+
265
+ - **테스트 불가능 코드가 *항상 잘 캡슐화된 것*은 아니다.** 학생의 *의도적 테스트 불가능* 설계는 *카드 소진 시 동작*이라는 비즈니스 룰을 *잊게* 만들었음. *캡슐화된 로직은 테스트가 필요 없게* 짜야 한다는 원칙은 *룰을 빠뜨리지 않았을 때*만 성립.
266
+ - **함수명 = 클래스 이름에서 추론 가능해야** — `Deck.draw()`가 `Deck.pop()`보다 *도메인 어휘 일치*. `pop()`은 자료구조 노출.
267
+ - **`getXxx`가 *add 동작*하면 명백한 안티패턴** — `private`이라도 *동사-동작 일치*는 동일.
268
+ - **인터페이스에 *내부 계산 단계*를 공개하지 말 것** — `sumOfCards`(raw) + `sum()`(보정)이 둘 다 공개면 호출자가 혼란. *최종 결과*만 공개.
269
+ - **`data class + mutable state` = 동치성 위험** — `data class`는 *값 객체*. 가변 손패를 가지면 *같은 이름인데 다른 손패*인 두 Player가 equals.
270
+ - **`val + custom get()` vs `fun`** — *지속 상태*는 property, *순수 계산*은 function. *property로 보이는데 매 접근마다 계산*은 호출자 오해.
271
+ - **결과는 *return*, callback은 *비동기/이벤트*에서만** — 동기 계산을 콜백으로 전달하면 *반환값 추적*이 어려워지고 *도메인 → View* 의존이 숨음.
272
+ - **패키지명 = 도메인 응집, 구현 타입 회피** — `enums/`, `interfaces/`는 *Kotlin 어휘*. `card/`, `participant/`, `game/`처럼 *도메인 응집*.
273
+ - **`enum`에 *MutableMap 정적 저장*은 과잉** — `entries.find { ... }` 한 줄.
274
+ - **블랙잭 룰 상수(`ACE_EXTRACT_SCORE`, `BUST_STANDARD`)는 *역할 클래스*가 아닌 *Card/Game 수준*** — `Dealer.Companion`에 두면 *Dealer가 룰의 소유자*라는 오해.
275
+ - **공통 행위 + 상태 공유는 `abstract class`** — `interface`는 *행위 계약*만. 모든 구현이 `_cards mutableListOf<>()`를 복제하면 *추상 클래스 신호*.
276
+ - **`Player.isBust` vs `Dealer.isBust` 룰 차이 = Liskov 위반 신호** — 인터페이스에 *서로 다른 룰*을 같은 함수명으로 두지 말 것.
277
+ - **`player.cards.size == 2` 매직 조건은 *상태 머신 부재 신호*** — Ready/Hit/Stay/Bust를 sealed로 두면 *size == 2* 같은 *기수 비교*가 사라짐.