๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_20171226 ~ 20171229

|

2017.12.26

TIL
  • JSON step3
    • GrammarChecker์—์„œ๋งŒ ์—๋Ÿฌ ํ•ธ๋“ค๋ง๋˜๋„๋ก ์„ค๊ณ„ : execute ๋ฉ”์„œ๋“œ
      • array/object format๊ณผ Value ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜ Boolํƒ€์ž… ๋ฆฌํ„ด์œผ๋กœ / ์ ‘๊ทผ์ œ์–ด์ž private์œผ๋กœ ๋ณ€๊ฒฝ
      • array/object value ๋ฅผ ์ฒดํฌํ•˜๋Š” ์ •๊ทœ์‹ ์ ์šฉํ•˜๊ธฐ
      • manager ๋ฉ”์†Œ๋“œ์—์„œ ๊ฐ ์ฒดํฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, ๋ฆฌํ„ด๋ฐ›์€ Bool๊ฐ’์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง
    • parser์—์„œ ๋ชจ๋‘ ์ฒดํฌ ์™„๋ฃŒ๋œ [String]์œผ๋กœ convertingํ•˜๋„๋ก ๋‹ค๋“ฌ๊ธฐ (GrammarChecker์ดํ›„์˜ ๋กœ์ง์—์„œ๋Š” ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ์—๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋„๋ก)

2017.12.27 ~ 28

TIL
  • JSON step4 ๊ตฌํ˜„
  • matchType์—์„œ Intํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ณณ์—์„œ ์ž๊พธ string์ด ๋“ค์–ด๊ฐ€์„œ ๊ฑธ๋ ค์„œ ๋ฒ„๊ทธ ๋œจ๋Š” ๋ฌธ์ œ. ์™œstring์ธ๋ฐ value.contains(โ€œ[โ€œ)๋กœ ๊ฐ€์ง€ ์•Š์•˜์„๊นŒ?
    • ํ•ด๊ฒฐ: ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ์™ธ๋ถ€ ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ ํ•˜๋‹ˆ๊นŒ ์—๋Ÿฌ ์—†์ด ์ž˜ ์ฒ˜๋ฆฌ๋๋‹ค. ํ•˜์ง€๋งŒ GrammarChecker์˜ execute์—์„œ ๋“ค์–ด์˜ค๋Š” input๋งˆ๋‹ค ๋ชจ๋‘ ๊ด„ํ˜ธ๋ฅผ ์ž˜๋ผ๋ฒ„๋ฆฌ๋ฉด ์ค‘์ฒฉ๋œ ๋ฐฐ์—ด์ผ๋•Œ๋„ ๊ด„ํ˜ธ๋ฅผ ์—†์• ๊ณ  parsing์„ ํ•ด์„œ ๋ฐฐ์—ดํ•˜๋‚˜๋กœ ์นด์šดํŠธ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฐฐ์—ด ์•ˆ์˜ value๋“ค์ด ๋‹ค ํŒŒ์‹ฑ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Œ
      • ๋ฐฐ์—ด์ด value๋กœ ๋“ค์–ด์žˆ์„๋•Œ๋Š” ์™ธ๋ถ€์˜ ๊ด„ํ˜ธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  execute๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก, ๊ฐ€์žฅ ์™ธ๋ถ€์˜ ๊ด„ํ˜ธ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๋กœ์ง์€ ํ”„๋กœ๊ทธ๋žจ ๋งจ ์ฒ˜์Œ ์‹œ์ž‘ํ• ๋•Œ๋งŒ ํ•˜๊ณ , ์ค‘๊ฐ„์— parsing๋ ๋•Œ๋Š” ๊ด„ํ˜ธ๊ฐ€ trimming๋˜์ง€ ์•Š๋„๋ก trimmingํ•˜๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌ!
      • ๋ฐฐ์—ด๋งŒ ์ž‡์„๋Œ„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ด„ํ˜ธ์ œ๊ฑฐ(๊ทธ๋ž˜์•ผ ์•ˆ์˜ ๋ฐธ๋ฅ˜๊ฐ€ ๋‚˜์˜ด)
      • ๋ฐฐ์—ด์•ˆ์— ๋˜ ๋ฐฐ์—ด์ด ์ž‡์„๋•Œ(matchvalue์—์„œ ์•Œ์ˆ˜์žˆ์Œ- ์—ฌ๊ธฐ์„œ๋งŒ ์ด๋ ‡๊ฒŒ ๋ฉ”์†Œ๋“œ ์‹คํ–‰์‹œํ‚ค๋ฉด๋œ๋‹ค๋Š”์†Œ๋ฆฌ..) : ๋ฐฐ์—ด ์•ˆ์˜ ๋ฐฐ์—ด์ด์žˆ์œผ๋ฉด ๊ด„ํ˜ธ์ œ๊ฑฐ๋ฅผ ํ•˜๋ฉด์•ˆ๋จ.
      • input์ž…๋ ฅ > String๋ถ„๋ฆฌ > execute์— String๋„˜๊ธฐ๊ธฐ > ํ•˜๋‹ค๊ฐ€ ๋ฐฐ์—ด/๊ฐ์ฒด ๋‚˜์˜ค๋ฉด > execute์— ๋˜ ๋ฐ”๋กœ String๋„˜๊ธฐ๊ธฐ matchType์—์„œ Intํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ณณ์—์„œ ์ž๊พธ string์ด ๋“ค์–ด๊ฐ€์„œ ๊ฑธ๋ ค์„œ ๋ฒ„๊ทธ ๋œจ๋Š” ๋ฌธ์ œ. ์™œstring์ธ๋ฐ value.contains(โ€œ[โ€œ)๋กœ ๊ฐ€์ง€ ์•Š์•˜์„๊นŒ?

2017.12.29

TIL
  • JSON step4 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • CountInfo์˜ ์ฑ…์ž„ ๊ฒฐ์ • : ParseType ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ• ๋•Œ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•œ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด
      • ParseType์„ ๋‹ด๋Š” ๋ฐ์ดํ„ฐ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ธฐ > JKํ”ผ๋“œ๋ฐฑ : parseType์„ parsingํ•˜๊ณ  ๋ฐ”๋กœ๋„˜๊ธฐ๊ธฐ
    • GrammarChecker์˜ ๋ฉ”์†Œ๋“œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ• ์ง€ ๊ณ ๋ฏผ
      • MyArray๋‚˜ MyObject์ฒ˜๋Ÿผ ํ”„๋กœํ† ์ฝœ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผํ• ์ง€
      • extractArrayValue ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(์ •๊ทœ์‹ํŒจํ„ด์„ ์ธ์ž๋กœ ๋„˜๊น€)

TIL_20171218 ~ 20171224

|

2017.12.18

TIL
  • ์ •๊ทœ์‹ ์—ฐ์Šต - ์†์— ์žกํžˆ๋Š” ์ •๊ทœํ‘œํ˜„์‹, regexOne์—์„œ ์—ฐ์Šต
  • lazy ์ง€์—ฐ ์ €์žฅํ˜• ํ”„๋กœํผํ‹ฐ
  • JSON step2 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • extension์— protocol์ ์šฉ : Array์™€ Dictionary๋ฅผ ConvertTarget ํ”„๋กœํ† ์ฝœ๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ , convertValues() ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐ : ํ•˜๋Š” ์ผ์€ ๋˜‘๊ฐ™๊ณ , ๋ฆฌํ„ด๊ฐ’์„ ์ดํ›„์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋„ ๋˜‘๊ฐ™์€ ๋‘ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฆฌํ„ดํƒ€์ž…์ด ๋‹ฌ๋ž๋‹ค. ์ด๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœํ† ์ฝœ๋กœ ์ถ”์ƒํ™”ํ•˜๊ธฐ์œ„ํ•ด์„œ ์›๋ž˜์žˆ๋˜ swift์˜ ํƒ€์ž…์— extension์„ ์ ์šฉํ•ด์„œ ํ”„๋กœํ† ์ฝœ๋กœ ์ถ”์ƒํ™”ํ–ˆ๋‹ค. > ์ถ”์ƒํ™”๋กœ ์ธํ•ด์„œ ์ค‘๋ณต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋„ ์ค„์ด๊ฑฐ๋‚˜ private์œผ๋กœ ๊ฐ์ถœ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ณผ๋„ํ•˜๊ฒŒ ์“ฐ์ธ switch-case๋ฌธ์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • extension์˜ ์‚ฌ์šฉ (pragma mark ์‚ฌ์šฉ) : ํ•œ ๊ฐ์ฒด์˜ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฉด ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด์„œ extension์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, extension์€ ์ด๋ ‡๊ฒŒ ์˜๋ฏธ์—†์ด ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๊ณ  ํ•จ. ์˜๋ฏธ์—†์ด ์‚ฌ์šฉ๋œ extension์€ ์ œ๊ฑฐํ•˜๊ณ  // MARK: ์ฃผ์„์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ์—๋Š” MARK๋ง๊ณ ๋„ ํŠน๋ณ„ํ•œ ์ฃผ์„์ด ์žˆ๋‹ค. pragma mark๋Š” Objective-C์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค. (์Šค์œ„ํ”„ํŠธ์—์„œ๋Š”// MARK:, // TODO: , // FIXME: ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.) ์ด๋Ÿฐ ํ‚ค์›Œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ฃผ์„์„ ๋‹ฌ๋ฉด Quick jump bar์—์„œ ์ฑ…๊ฐˆํ”ผ์ฒ˜๋Ÿผ ์ฃผ์„๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค! ์ฐธ๊ณ ์‚ฌ์ดํŠธ1 ์ฐธ๊ณ ์‚ฌ์ดํŠธ2

2017.12.19

TODO
  • JSON step2 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
  • JSON step3 ์‹œ์ž‘
  • ์ •๊ทœํ‘œํ˜„์‹ ๊ณต๋ถ€
    • regexOne์—์„œ ์—ฐ์Šต
    • InputView - GrammarChecker - ParseTargetFactory ์„ค๊ณ„
      • GrammarChecker๋ฅผ InputView์™€ ParseTargetFactory์‚ฌ์ด ํ๋ฆ„์— ์œ„์น˜
      • GrammarChecker์— ์ •๊ทœํ‘œํ˜„์‹ ์ ์šฉ
      • (GrammarChecker์— ์—๋Ÿฌ์ฒ˜๋ฆฌ ์ ์šฉ) - ์˜ค๋Š˜ ์•ˆ๋ ์ง€๋„

2017.12.21

TODO
  • git ์ €์žฅ์†Œ originํ™•์ธ - ๋ฆฌ๋ชจํŠธ์— ์Šคํ…๋ธŒ๋žœ์น˜๋งŒ ํ‘ธ์‹œ๋˜์–ด์žˆ๊ณ  ์•„์ด๋”” ๋ธŒ๋žœ์น˜๋Š” ์ตœ์‹  ์ƒํƒœ๊ฐ€ ์•„๋‹˜ใ… ใ… 
  • ์ •๊ทœ์‹ ์ ์šฉํ•œ step3 ์ง„ํ–‰
    • ์ •๊ทœ์‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ ์ฐพ๊ณ  ๊ธฐ์กด ๋กœ์ง์ด๋ž‘ ์—ฐ๊ฒฐ์‹œํ‚ค๊ธฐ
    • object์•ˆ์— ์žˆ๋Š” Array๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ํ˜•๋ณ€ํ™˜ํ•˜๋Š”๊ฒƒ ์ถ”๊ฐ€
    • []์ด๋ฉด์„œ ๋ฐธ๋ฅ˜๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ์žˆ๋Š” ๊ฒƒ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ 1. git json์ €์žฅ์†Œ youth๋ธŒ๋žœ์น˜ํ™•์ธํ•˜๊ธฐ. ์˜ค๋ฆฌ์ง„์ด ์–ด๋””๋กœ ๋๋Š”์ง€, ์ง€๊ธˆ ์Šคํ…๋ธŒ๋žœ์น˜๋งŒ ๋‚˜๋ˆ ์ ธ์žˆ๊ณค ๋ฆฌ๋ชจํŠธ์˜ ๋‚ด ์•„์ด๋”” ๋ธŒ๋žœ์น˜์— ํ•˜๋‚˜๋„ ํ‘ธ์‹œ๊ฐ€ ์•ˆ๋ผ์–ด์žˆ์Œ 2. ์ •๊ทœ์‹ ์ ์šฉํ•œ json step3 ๋นจ๋ฆฌ ์ง„ํ–‰. ์ •๊ทœ์‹ ํด๋ž˜์Šค ์ด์šฉํ•ด์„œ ๋งž๋Š” ํŒจํ„ด ์ฐพ์•„๋‚ด๊ณ  ๊ธฐ์กด ๋กœ์ง์ด๋ž‘ ์—ฐ๊ฒฐ์‹œํ‚ค๊ธฐ. ์˜ค๋ธŒ์ ํŠธ์ผ๋•Œ ๋ฐฐ์—ด ์š”์†Œ ๊ฒ€์‚ฌํ•˜๊ณ  ํ˜•๋ณ€ํ™˜ํ•˜๋Š”๊ฑฐ ์ถ”๊ฐ€ํ•˜๊ธฐ. ์˜ค๋ธŒ์ ํŠธ๊ด„ํ˜ธ์ด๋ฉด์„œ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋“ค์–ด์žˆ๋Š”๊ฑฐ ์ธ๊ฑฐ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ
TIL
  • git: ์Šคํ…๋ธŒ๋žœ์น˜๋งŒ ๋‚˜๋ˆ ์ ธ์žˆ๊ณ , ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— ํ•˜๋‚˜๋„ ํ‘ธ์‹œ๊ฐ€ ์•ˆ๋˜์–ด์žˆ์—ˆ๋‹ค.
    • ๋จผ์ € ๋กœ์ปฌ youth27๋ธŒ๋žœ์น˜์—์„œ status๋ฅผ ํ™•์ธ > upstream์œผ๋กœ๋ถ€ํ„ฐ pull์„ ํ–ˆ๋”๋‹ˆ ํ”„๋กœ์ ํŠธ ๋ฆฌ๋ชจํŠธ(์ฝ”๋“œ์Šค์ฟผ๋“œ) ์ €์žฅ์†Œ์™€ ๋‚˜์˜ ๋กœ์ปฌ๋ธŒ๋žœ์น˜์™€ ์‹ฑํฌ๊ฐ€ ๋งž์•˜๊ณ , ๊ทธ ์ƒํƒœ์—์„œ ๋ฆฌ๋ชจํŠธ์ €์žฅ์†Œ๋กœ pushํ•˜๋‹ˆ ์‹ฑํฌ๊ฐ€ ๋งž์•˜๋‹ค. (ํ˜„์žฌ ์ฝ”๋“œ์Šค์ฟผ๋“œ์™€ youth27์ €์žฅ์†Œ ๋ชจ๋‘ step2๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๋œ ์ƒํ™ฉ) ๊ทธ ์ดํ›„๋กœ ๋˜‘๊ฐ™์ด step3 ๋ธŒ๋žœ์น˜ ๋”ฐ์„œ ์ž‘์—…ํ•˜๋‹ˆ ๋ฌธ์ œ ์—†์—ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ์—„์ฒญ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ!
    • git์ด ๊ผฌ์˜€๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ์„๋• ์–ด๋””๋ถ€ํ„ฐ ์‹ฑํฌ๊ฐ€ ์•ˆ๋งž์•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๊ฒฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!(์ž์‹ ๊ฐ ์–ป์Œ)
  • ์ •๊ทœ์‹ ํ™œ์šฉ matchesํ•จ์ˆ˜ : ์ •๊ทœ์‹์„์„ ์–ธํ•œ ์ดํ›„์— ๊ทธ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ž์—ˆ๋Š”๋ฐ, ๊ฒ€์ƒ‰์œผ๋กœ ์œ ์ถ”ํ•ด์„œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•œ ๋ฌธ์ž์—ด๋“ค์„ [String]์œผ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” matchesํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. matches์—์„œ ๋ฆฌํ„ดํ•œ ๊ฐ’์„ value๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•ด์„œ ๋งž๋Š” ํ˜•์‹์ธ์ง€ ์•„๋‹Œ์ง€ ๊ฒ€์‚ฌ, ์—๋Ÿฌ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  • ์ •๊ทœ์‹ ์„ ์–ธ ์ดํ›„์— Parser๊ฐ€ ๊ฐ„๋‹จํ•ด์กŒ๋‹ค.
  • ์นด์šดํŒ…ํ•˜๋Š” ๊ฐ์ฒด, Data Convertingํ•˜๋Š” ๊ฐ์ฒด์— Array ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๊ฒฐ!

/*
 ์ค‘๊ด„ํ˜ธ ํ•œ ์„ธํŠธ ์•ˆ์˜ ๋ฌธ์ž : \{(.*?)\}
 ๋”ฐ์˜ดํ‘œ ํ•œ ์„ธํŠธ ์•ˆ์˜ ๋ฌธ์ž : \"(.+?)\"

 Array : true|false|\".+?\"|\d+|\{.+?\}
 Object : (\".+?\")\:(true|false|\".+?\"|\d+|\[.+?\])
 ์ด ์˜ค๋ธŒ์ ํŠธ์—์„œ 1 depth ์ •๋„ ๋” ๋“ค์–ด๊ฐ€์„œ ex) object์˜ ์š”์†Œ๋ฅผใ…ก"dee":234 ์ด๋ ‡๊ฒŒ ๋–ผ์–ด๋†จ์œผ๋ฉด, ์—ฌ๊ธฐ์„œ "ใ…‡ใ…‡ใ…‡":ใ…ใ…ใ… ์ธ์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ. ์ •๊ทœ์‹ ํ•œ ์ค„๋กœ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ ์ฒดํฌ๋ž‘, ๊ทธ ์•ˆ์˜ ๊ฐ๊ฐ ์š”์†Œ๊ฐ€ "key":value ํ˜•ํƒœ๋กœ ์ž˜ ๋“ค์–ด์™”๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ๊ฐ€ ํž˜๋“œ๋‹ˆ๊นŒ. ์ฐจ๋ผ๋ฆฌ ์ „์ฒด์—์„œ ์ž˜๋ผ์ง„ ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋‹ค๋ฅธ ์ •๊ทœ์‹์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค๋“ ๊ฐ€, ๋กœ์ง์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋“ ๊ฐ€ ํ•ด์„œ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๊ฐ€ ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š”๊ฒŒ ๋” ํŽธํ•œ ๋ฐฉ๋ฒ•์ผ๋“ฏ.

 [true,"sdfe",false,123,{"dee":234,"ss":false,"er":"wert"},"rr"]
 {"dee":234,"ss":false,"er":"wert"}
 {"dee":234,"ss":false,"er":["hana","hayul","haun"]}
 ["dee":234,"ss":false]
{"d":"e","t":12,"rr":false,"array":[12,true]}


 GrammarChecker์—์„œ
 1. ์ „์ฒด format ๊ฒ€์‚ฌํ•˜๊ณ  ๋‚ด๋ถ€ ๊ฐ’ String๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ
 2. String๋ฐฐ์—ด์˜ ๊ฐ value๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ ๋งŒ๋“ค๊ธฐ (Arrayํ˜•ํƒœ์ผ๋•Œ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์•ˆ๋˜๋Š”๊ฒƒ")
*/

    func matches(for regex: String, in text: String) -> [String] {

        do {
            let regex = try NSRegularExpression(pattern: regex)
            let nsString = text as NSString
            let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
            return results.map { nsString.substring(with: $0.range)}
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }
    let testString = "[true,false,123,\"esdf\",{\"dee\":234,\"ss\":false,\"er\":\"wert\"},\"rr\"]"
    let arrayformat = "true|false|[0-9]+|\\{.+?\\}"
    let result = matches(for: arrayformat, in: testString)
    print(result)


2017.12.22

TIL
  • JSON step3 ํ”ผ๋“œ๋ฐฑ์ฒ˜๋ฆฌ
  • ์—๋Ÿฌ์ฒ˜๋ฆฌ
    • ํ•„์š”ํ•œ๊ณณ์—์„œ๋งŒ ์ปจํŠธ๋กคํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์ œ์–ด (main๊นŒ์ง€ ๊ฐ€์„œ catch์•ˆํ•˜๋„๋ก)
    • ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๊ฑฐ๋ฅด๊ณ  ๊ฐ๊ฐ ๋ฐธ๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์ •ํ™•ํžˆ (value ํ•˜๋‚˜ ๊ฒ€์‚ฌํ• ๋•Œ๋„ ์ •๊ทœํ‘œํ˜„์‹ ํ‹€์— ๋”ฐ๋ผ์„œ ๋งž๋Š”์ง€ ์ฒดํฌํ•˜๋„๋ก ๋ณ€๊ฒฝ)
    • ๋กœ์ง ์ค‘๊ฐ„์—์„œ ํ๋ฆ„์ œ์–ดํ•˜๋Š”๊ฒŒ ์žˆ์–ด๋ดค์žโ€ฆํ•˜๋Š”๊ฑฐ๋ž‘ ์•ˆํ•˜๋Š”๊ฑฐ๋ž‘ rethrow, throw ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜์˜ ์ˆ˜๋Š” ๋˜‘๊ฐ™์„๊ฑฐ๊ฐ™์•„์„œ rethrow/throw๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ

2017.12.24

TIL

JSON ๋กœ์ง์„ ๋‹ค์‹œ ๊ทธ๋ ค๋ณด๊ณ  ๊ฐœ์„ ๊ณผ ์ถ”๊ฐ€ ๋ฏธ์…˜ ์ ์šฉ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ–ˆ๋‹ค.


  • Input - GrammarChecker - Parser > [String] - Convert (๋งž๋Š” ๊ฐ’์œผ๋กœ๋งŒ converting์„ ํ•˜๋‹ˆ๊นŒ parser ๋’ค ๋ถ€ํ„ฐ๋Š” ๊ฒ€์‚ฌํ•  ํ•„์š” ์—†์Œ)
  • GrammarChecker์—์„œ typecheck๋ฅผ ํ•˜๊ณ  ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ value ํ•˜๋‚˜์”ฉ ์ฒดํฌ (2 depth๋ถˆ๊ฐ€ํ•˜๋‹ˆ๊นŒ)
    • ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ value ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ ๋„ฃ๊ธฐ (ํ•œ๋ฒˆ์— ๊ฒ€์‚ฌ ๋ชปํ•˜๊ฒ ์Œใ… ใ… )
  • GrammarChecker์— Manager๋ฉ”์†Œ๋“œ
    • manager๋ฉ”์†Œ๋“œ๋Š” arrayformat / arrayvalue / objectformat /objectvalue๋ฅผ ๋ฉ”์ธ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•จ (if array์ธ์ง€ bool์ธ์ง€ ํ•ด์„œ)
    • input์ด array์ธ์ง€ object์ธ์ง€ ์ฒดํฌ
    • array์ด๋ฉด arrayformat๊ฒ€์‚ฌ/value๊ฒ€์‚ฌ object์ด๋ฉด format value ๊ฒ€์‚ฌ
    • ๊ฐ format๊ณผ value๋ฉ”์†Œ๋“œ๋Š” ๊ฒ€์‚ฌํ•ด์„œ ์ •๊ทœ์‹์— ๋งž์ง€ ์•Š๋Š” ํ‘œํ˜„์ด๋ฉด false๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฆฌํ„ดํƒ€์ž… Bool์˜ ๋ฉ”์†Œ๋“œ
    • ๊ทธ๋Ÿผ ๊ทธ ๋งค๋‹ˆ์ €๋Š” false๋ฅผ ๋ฆฌํ„ด๋ฐ›๊ณ , ํ˜ธ์ถœํ•œ ๋ฉ”์†Œ๋“œ์—์„œ false๋ฅผ ๋ฆฌํ„ด๋ฐ›์œผ๋ฉด error๋ฅผ throwํ•œ๋‹ค.
    • ๋งค๋‹ˆ์ € ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฆฌํ„ด๋ฐ›์€ bool๊ฐ’์ด true์ด๋ฉด ๊ทธ ํฌ๋งท์— ๋งž๋„๋ก value๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ [String]์„ ๋ฆฌํ„ดํ•˜๊ณ , ๊ทธ [String]์€ Parser๋กœ ๋ณด๋‚ด์ ธ์„œ ๋‚˜๋จธ์ง€ ๋กœ์ง ์ฒ˜๋ฆฌ.
    • GrammarChecker์•ˆ์—์„œ๋งŒ ์—๋Ÿฌ๊ฐ€ ํ•ธ๋“ค๋ง๋˜๋„๋ก ์„ค๊ณ„. ๊ฒฐ๊ตญ Manager๋งŒ public func์ด๋ฉด ๋ ๊ฒƒ๊ฐ™๋‹ค.
    • ์ตœ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ›„๋ฐ˜๋ถ€ ๋กœ์ง์—๋Š” ์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ์˜ํ–ฅ์ด ์—†๋„๋ก ์•ž๋‹จ์—์„œ ๋ชจ๋“ ๊ฒŒ ๋‹ค ์ฒดํฌ๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Œ

    ํ•„์š”ํ•œ ๊ฒƒ๋“ค

    1. Array Value์™€ object value๋ฅผ ์ฒดํฌํ• ๋•Œ (2depth๋กœ ๋‚˜๋ˆ”)ํ•„์š”ํ•œ ์ •๊ทœ์‹. contains๋ฅผ ์“ฐ๋ฉด ์ค‘๊ฐ„์— ,๋‚˜ :์ด ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ๊ฑธ๋Ÿฌ์งˆ ์ˆ˜ ์žˆ์Œ
    2. value ์ฒดํฌํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹ ๋งŒ๋“ค๊ธฐ
    3. manager๋ฉ”์†Œ๋“œ ๋งŒ๋“ค๊ณ  checking๋ฉ”์†Œ๋“œ๋Š” ๋‹ค private์œผ๋กœ ๊ฐ์ถ”๊ธฐ- ๋งค๋‹ˆ์ €์—์„œ ์ฒดํ‚น ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
    4. ๋งค๋‹ˆ์ € ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ
    5. ์ฒดํ‚น ๋ฉ”์„œ๋“œ๋ฅผ Boolํƒ€์ž… ๋ฆฌํ„ด์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    6. ๊ฐ๊ฐ์˜ ์ฒดํฌ ๋ฉ”์„œ๋“œ๋ฅผ boolํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
    7. manager๊ฐ€ true๋ฅผ ๋ฆฌํ„ด๋ฐ›์•˜์„๋•Œ ๋งž๋Š” [String]์œผ๋กœ ์ž๋ฅด๋Š” ๋กœ์ง์ด ํ•„์š”ํ•œ๋ฐ ๊ทธ๊ฒŒ checker์—์„œ๋Š” ์•ˆ๋˜๋Š”์ง€๊ผญ ๋”ฐ๋กœ๋งŒ๋“ค์–ด์•ผ๋˜๋Š”์ง€ ์ƒ๊ฐํ•˜๊ธฐ..? checker๋Š” Bool๋ฆฌํ„ด์ด๋‹ค ใ… ใ… 
    8. ํŒŒ์„œ์—์„œ ์ž๋ฅด๋ฉด๋˜์ง€์•Š์„๊นŒ!? ํŒŒ์„œ์—์„œ ์ž๋ฅด๊ณ  dataconverter๋กœ ํ•˜๋‚˜์”ฉ ๋ณด๋‚ด๊ธฐ!??!!?!?!
    9. Parser๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ŠคํŠธ๋ง์€ ์ด์ œ ๋ฌธ๋ฒ•์ฒดํฌ๋„ ์•„์˜ˆ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” String์ด์–ด์•ผ๋˜๋Š”๋ฐ ์ง€๊ธˆ ์ง  ๋กœ์ง์œผ๋กœ ํ•˜๋ฉด ๊ทธ๊ฒŒ ๋˜๋Š”๊ฒŒ ๋งž๋Š”์ง€ ํ•œ๋ฒˆ๋” ์ƒ๊ฐํ•ด๋ณด๊ธฐ

lazy์˜ ์‚ฌ์šฉ_์Šค์œ„ํ”„ํŠธ ํ”„๋กœํผํ‹ฐ

|

lazy

lazy๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ํ”„๋กœํผํ‹ฐ์— ๋‚˜์˜ค๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค. ํ•œ๊ตญ์–ด๋กœ๋Š” ์ง€์—ฐ ์ €์žฅํ˜• ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์‰ฝ๊ฒŒ๋งํ•ด์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ํ•„์š”ํ• ๋•Œ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. (์ง€์—ฐ ๋กœ๋”ฉ, lazy loading) ๊ณง๋ฐ”๋กœ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š”๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ• ๊ฒฝ์šฐ, ๋˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ์•Œ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์˜ ์™ธ์  ์š”์†Œ์— ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. (์ดˆ๊ธฐํ™”๋ฅผ ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœํผํ‹ฐ)
์ง€์—ฐ ๋กœ๋”ฉ(lazy loading)์€ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ํ•„์š”ํ•ด์•ผ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ์ผ๋„ ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐํ™” ์ดํ›„๋กœ ๋ฏธ๋ค„์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ๊ฐ’์ด ๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ var๋กœ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค.

lazy ํ”„๋กœํผํ‹ฐ ์„ ์–ธํ•˜๋Š” ๋ฒ•

struct Cup {

  lazy var beverage : String = {
    // code
    return chosenBeverage
  }()

}

mutating ํ•จ์ˆ˜ / var ํƒ€์ž… Struct

์ฐธ๊ณ ์‚ฌ์ดํŠธ

  • lazy๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ŸญํŠธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š”, ํ•ญ์ƒ var๋กœ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค. -> lazy ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด์„œ ์†์„ฑ์ด ๋ฐ”๋€Œ๊ณ , ๊ทธ ์ŠคํŠธ๋ŸญํŠธ๋Š” ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ŠคํŠธ๋ŸญํŠธ๋ผ๊ณ  ๊ฐ„์ฃผ๋˜๊ธฐ ๋•Œ๋ฌธ์—! let์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
  • lazy์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ mutating ํ‚ค์›Œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • lazy ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์ด ํ•„์š”ํ• ๋•Œ ๊ณ„์‚ฐ๋˜๋Š”๋ฐ, ๊ทธ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๊ณ„์‚ฐ๋˜๊ณ , ๊ทธ๊ฑด ๋ฐ”๋กœ ์ž ์ •์ ์œผ๋กœ ๊ทธ ๋ฉ”์†Œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • lazy ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ํ”„๋กœํผํ‹ฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ๋œ๋‹ค. ์ง€์—ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ฒซ ์•ก์„ธ์Šค๋•Œ ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ๋˜๊ณ , ์ดํ›„์—๋Š” ๋‹ค์‹œ ์กฐ์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

TIL_20171211 ~ 20171217

|

2017.12.11

TODO
  • JSON step2
    • iterator ์‚ฌ์šฉ / string, character์˜ index ์‚ฌ์šฉ
    • ํŠน์ • string remove
    • [ ]์ธ์ง€ { }์ธ์ง€ ํŒ๋ณ„ํ•ด์„œ ๋กœ์ง ๋ถ„๋ฆฌ
      • [ ]๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ : , ๋กœ ๊ตฌ๋ถ„
        • { }๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ : { }์„ธํŠธ๋ฅผ ์ฐพ๋Š” ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ
        • { }์™€ value ๊ฐ™์ด ์žˆ๋Š” ๊ฒฝ์šฐ : { }์„ธํŠธ๋ฅผ ์ฐพ๋Š” ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•˜๊ณ  { } ๋ฌธ์žฅ remove๊นŒ์ง€
      • { }๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ : , ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์–ด๋ ˆ์ด์— ๋„ฃ๊ณ  ์–ด๋ ˆ์ด ์š”์†Œ ๊ฐ๊ฐ์„ :๋กœ ๋ถ„๋ฆฌ > value๋งŒ ๊ฐ€์ง€๊ณ  ์บ์ŠคํŒ…ํ•˜๊ธฐ
        TIL
  • step1๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ตฌํ˜„ : step1์—์„œ๋Š” AnyType์„ ๋ชจ๋‘ ๋‹ด๋Š” Array๋ฅผ ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋ผ, counting๋งŒ ํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Œ
    • ๋ฌธ์ž๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ž๋ฅด๋Š” ๋ถ€๋ถ„๊ณผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ถ€๋ถ„, ์นด์šดํŒ… ํ•˜๋Š” ๋ถ€๋ถ„, ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„ ๋ชจ๋‘ ๋”ฐ๋กœ ๊ฐ์ฒด๋ฅผ ๋‚˜๋ˆ”
    • ํŠนํžˆ, ๊ฐ์ฒด๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋กœ์ง ๊ฐ์ฒด ๋‚ด์—์„œ ์ƒ์„ฑํ•ด์„œ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ์‚ฌ์šฉํ•จ
    • Any ํƒ€์ž…์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๊ฒƒ์ด ์•„๋‹Œ JSONData๋ฅผ enum์œผ๋กœ ์ •์˜ํ•จ
      • enum ์—ฐ๊ด€๊ฐ’, enum ์ปค์Šคํ…€ ํƒ€์ž…
  • step2๋ฅผ ์žฌ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋กœ์ง ํ๋ฆ„๋„ ๊ทธ๋ฆผ!

2017.12.12

TODO
  • JSON step2
    • Type โ€˜JSONTargetโ€™ does not conform to protocol โ€˜Sequenceโ€™ ์˜ค๋ฅ˜ํ•ด๊ฒฐ
      • JSONTarget ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ ๊ฐ์ฒด์— ํ•„์š”ํ•œ ํ•จ์ˆ˜ ๊ตฌํ˜„
      • countํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ
      • value๊ฐ’(parsing target์ด ๋˜๋Š” ๊ฐ’) ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ (MyObject๊ฐ์ฒด๋Š” ํŠนํžˆ value๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„)
      • TargetIdentifier์—์„œ ๊ฐ์ฒด ๋‹ค์šด์บ์ŠคํŒ… ํ•˜๊ณ  ๊ทธ JSONTarget ํƒ€์ž…์— ๋งž๋Š” ValueIdentifier์˜ parsingํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
        • ValueIdentifier์˜ ํ•จ์ˆ˜๋Š” private์œผ๋ก ๊ตฌํ˜„ํ•˜๊ธฐ
TIL
  • ๋”•์…”๋„ˆ๋ฆฌ์—์„œ subscript ์• ํ”Œ๊ณต์‹๋ฌธ์„œ subscript(_: )
    Declaration : subscript(position: Dictionary<Key, Value>.Index) -> Dictionary.Element { get }
    

    Return Value A two-element tuple with the key and value corresponding to position.

<JSON readme>

  • step2 ์ปค๋ฐ‹ : add case of parsing one object
  • string์œผ๋กœ ๋“ค์–ด์˜จ ๋ถ„์„๋Œ€์ƒ์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๊ธฐ์œ„ํ•ด ParsingTarget์œผ๋กœ ํ†ต์ผ.
    • ParsingTargetFactory์—์„œ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ๋ถ„์„ํ•ด์„œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ MyArray๋‚˜ MyObject๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • string์„ ๋ถ„๋ฆฌํ•ด์„œ ๋ถ„์„๋Œ€์ƒ๋งŒ(array์˜ value๋“ค, dictionary์˜ ๊ฒฝ์šฐ value๋งŒ) [String]ํ˜•ํƒœ๋กœ ๋ถ„์„ ๊ฐ์ฒด์— ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹
    • ๋ถ„์„ํ•˜๋Š” ๊ฐ์ฒด์—์„œ ParsingTarget(array๋‚˜ object)์„ ๋ฐ›์•„์„œ, ๊ทธ ์ปฌ๋ ‰์…˜์˜ ๊ฐ’์— ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ Type 'ParsingTarget' does not conform to protocol 'Sequence'๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. ๊ฐ ๊ฐ์ฒด์˜ ์†์„ฑ์— ์ ‘๊ทผํ•ด์„œ index๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๊ทธ index์— ๋งž๋Š” value๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” getEachValue()ํ•จ์ˆ˜์™€ for๋ฌธ์„ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ์†์„ฑ์˜ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” count()ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • flow
    • ParsingTargetFactory์—์„œ ์ž…๋ ฅ๊ฐ’ ๋ถ„์„ํ•˜์—ฌ ParsingTarget๋งŒ๋“ฆ.(์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ParsingTarget์„ ์ค€์ˆ˜ํ•˜๋Š” MyArray๋‚˜ MyObject)
    • JSONDataFactory์—์„œ ParsingTarget์ด array์ธ์ง€ object์ธ์ง€ ํŒ๋‹จํ•˜์—ฌ ์บ์ŠคํŒ…ํ•˜๊ณ  ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜์—์„œ ๊ทธ ๊ฐ์ฒด์˜ ๊ฐ value์— ์ ‘๊ทผํ•˜๋ฉด์„œ JSONData๋กœ ์บ์ŠคํŒ…ํ•˜๋ฉด์„œ [JSONData]๋ฅผ ๋งŒ๋“ ๋‹ค. > ๊ทธ๋ƒฅ JSONData๋งŒ๋“œ๋Š”๊ฑธ๋กœ ๋ณ€๊ฒฝ

    • [JSONData]๋ฅผ ValueCounter์— ๋„˜๊ฒจ์„œ value์˜ ์ˆ˜๋ฅผ ์„ธ๊ณ  value๋“ค์˜ ์นด์šดํŠธ ์ˆ˜ Data object์ธ CountingInfo๋ฅผ ๋งŒ๋“ ๋‹ค.

    • OutputView๋Š” CountingInfo๋ฅผ ๋ฐ›์•„์„œ result๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • Array๋‚˜ Object์ธ ๊ฒฝ์šฐ์—, JSONDataFactory์—์„œ parsing๋Œ€์ƒ์ธ value๋งŒ ์–ด๋ ˆ์ด์— ๋‹ด์•„์„œ ValueCounter๋กœ ๋ณด๋ƒˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฒฐ๊ตญ Anyํƒ€์ž… ๋ฐธ๋ฅ˜๋ฅผ ๋‹ด์€ object๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ(๊ฒฐ๊ตญ object์˜ ๊ฒฝ์šฐ ์นด์šดํŒ…๋งŒ ํ•˜๊ฒŒ ๋œ ์…ˆ..) JSONData enum์— Array์™€ Object value๋„ ์ƒˆ๋กœ์šด ์ผ€์ด์Šค๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ setTargetType()์€ [JSONData]๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์—์„œ JSONData์ž์ฒด๋ฅผ ๋ฆฌํ„ด ํ•˜๋Š”๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ counter์—์„œ enum์„ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์จ์•ผ ํ•˜๋Š”๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋๋‹ค!

2017.12.13

TIL
  • ํŒจํ„ด๋งค์นญ (enum ๋ฐ”์ธ๋”ฉ)
  • ์Šค์œ„ํ”„ํŠธ์ฝ”๋ฆฌ์•„ ๋ฐ‹์—… ์ฐธ์„!

2017.12.14

TIL
  • enum ๋ฐ”์ธ๋”ฉ
  • JSON step2 : ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์ž…๋ ฅํ–ˆ์„๋•Œ, ํ•˜๋‚˜์˜ ๊ฐ์ฒด ์ž…๋ ฅํ–ˆ์„๋•Œ์˜ ๋นŒ๋“œ ์„ฑ๊ณต!
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ž์—ด ์ž๋ฅด๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ด„ : range
    • {}๋ฌธ์ž์—ด ์ž๋ฅด๋Š”๊ฑธ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋‹ค. ```Swift // ์–ด๋ ˆ์ด ์•ˆ์— ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ {} ๊ด„ํ˜ธ ์‚ฌ์ด ๊ธ€์ž ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ  ๋นผ๋‚ด๋Š” ์ž‘์—… func makeTargetArrayWithObject(_ value: String) -> String{ var objectValue = โ€œโ€

       if let openParenthesisRange = value.range(of: "{"),
           let closeParenthesisRange = value.range(of: "}", range: openParenthesisRange.upperBound..<value.endIndex) {
      
           let range = openParenthesisRange.upperBound..<closeParenthesisRange.lowerBound
           objectValue = value.substring(with: range)
       }
      
       var pureValues = value.remove(at: range)
      
      
       return objectValue  }
      

    } ```

    ๋ฌธ์ œ : ์ด๋ ‡๊ฒŒ {} ์ค‘๊ด„ํ˜ธ์˜ ๋‚ด๋ถ€ ๊ฐ’๋งŒ objectValue์— ์ €์žฅํ• ์ˆ˜ ์žˆ์œผ๋ฉด, ๊ทธ ์ŠคํŠธ๋ง๋งŒ ๋นผ๊ณ  ๋‚˜๋จธ์ง€ ๋ฐฐ์—ด์˜ ์ˆœ์ˆ˜ value๋“ค๋งŒ appendํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— objectValue๋ฅผ appendํ•ด์„œ parsingTarget์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ.. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋‹จ {}๋กœ ๊ฐ์‹ธ์ง„ ๊ฐ์ฒด๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ผ๋•Œ๋Š” ์ œ๋Œ€๋กœ ์ฐพ์•„์ง€์ง€ ์•Š์•˜๋‹ค.

<JSON readme> step2 ์ปค๋ฐ‹ : enum๋ฐ”์ธ๋”ฉ ์„ฑ๊ณต, ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ enumํƒ€์ž…์œผ๋กœ ๋ฌถ์—ฌ์žˆ์ง€๋งŒ ์ปฌ๋ ‰์…˜์€ ๋‹ฌ๋ผ์„œ (Array, Dictionary) makeCountInfo์—์„œ๋Š” ์นด์šดํŠธ๋ฅผ ํ•ด์•ผํ•˜๋Š” ํƒ€๊ฒŸ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๊ณ , ์ด์™ธ์˜ privateํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ array์ผ๋•Œ๋ž‘ object์ผ๋•Œ ์นด์šดํŒ… ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ValueCounter์—์„œ ์ƒ์„ฑ๋œ CountInfo(CountingInfo์—์„œ ์ด๋ฆ„๋ณ€๊ฒฝ)๋Š” OutputView์— ์ „๋‹ฌ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์ž…๋ ฅํ–ˆ์„๋•Œ, ํ•˜๋‚˜์˜ ๋”•์…”๋„ˆ๋ฆฌ ์ž…๋ ฅํ–ˆ์„๋•Œ์˜ ๋นŒ๋“œ ์„ฑ๊ณต!

<์ƒ๊ฐ> MyObject๊ฐ€ MyArray์— ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐโ€ฆ. string ๋ฐฐ์—ด์ด๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋„˜๊ธฐ์ง€ ๋ง๊ณ  ๋ฐ”๋กœ ํ˜•ํƒœ๋ฅผ ํŒ๋ณ„ํ•˜๊ณ  ๋ณ€ํ™˜ํ•ด์„œ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋Š”๊ฑธ๋กœ ๊ตฌํ˜„ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•จ. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถ„๋ฆฌํ•˜๋ฉด์„œ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์— ์™”๋‹ค๊ฐ”๋‹ค ํ• ์ˆ˜๋ฐ–์—์—†๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒŒ ๊ฐ์ฒด๋ผ๋ฆฌ ์˜์กด์„ฑ์ด ๋†’์•„์ง€๋Š”๊ฒŒ ์•„๋‹๊นŒ?ใ… ใ… โ€ฆ. ์•„๋‹ˆ๋ฉด for๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด์„œ ๊ฒ€์‚ฌ๊ฐ์ฒด์˜ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์— ๋„˜๊ฒจ๋ฒ„๋ฆฌ๊ณ , ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๊ณ„์† appned๋งŒ ํ•˜๊ณ , ๋ชจ๋“  ๊ฐ’์ด ๋‹ค ๋ณ€ํ™˜๋˜์–ด์„œ ๋“ค์–ด๊ฐ„ ๋กœ์ปฌ๋ณ€์ˆ˜๋กœ ๋‹ค ํ˜•๋ณ€ํ™˜์ด ์™„๋ฃŒ๋œ myArray๋ฅผ ๋งŒ๋“ ๋‹ค!!!!!!(๊ตณ์ด myArray,myobject๋ฅผ string์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ)

2017.12.15

TODO
  • JSON step2
    • String์„ characterView๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๊ธ€์ž์”ฉ ํƒ์ƒ‰ํ•˜๊ณ  ์ค‘๊ด„ํ˜ธ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•
    • ParsingTargetFactory๊ฐ์ฒด์—์„œ ์ž…๋ ฅ๊ฐ’์„ String์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋‹ˆ ์—†์• ๊ณ , token์„ ์ฐพ์•„๋‚ด๋ฉด ๋ฐ”๋กœ JSONData ํ˜•ํƒœ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•ด์„œ ๋ถ„์„๋Œ€์ƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ ํ•˜๊ธฐ
TIL

JSON step2

  • ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์ด Array์ผ๋•Œ๋ฅผ ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ์„๋•Œ์™€ ์—†์„๋•Œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์กฐ๊ฑด์„ ๋ถ„๋ฆฌ
  • Array์ผ๋•Œ๋Š” ParsingTargetFactory์—์„œ ๋ฐ”๋กœ ๊ฐ’์„ ๋‚˜๋ˆ„๊ณ , object์ธ ๊ฒฝ์šฐ์—๋งŒ MyObject์—์„œ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ฐ’์„ ๋‚˜๋ˆ”
  • ์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†์„๋•Œ๋Š” ๋ฐ”๋กœ value๋ฅผ ์‰ผํ‘œ๋กœ ๋‚˜๋ˆ ์„œ string value๋กœ ์ €์žฅ
  • ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ์„๋•Œ๋Š” ์ค‘๊ด„ํ˜ธ์˜ range๋ฅผ ์ฐพ์•„์„œ ๊ทธ range์— ํ•ด๋‹นํ•˜๋Š” ์บ๋ฆญํ„ฐ๋“ค์„ ๋นผ๊ณ  ๋”ฐ๋กœ string๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค. (์ด ์ž‘์—…์€ ๋ฐ›์€ input๊ฐ’์— ์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†์–ด์งˆ๋–„๊นŒ์ง€ ์ง„ํ–‰- while๋ฌธ ์ถ”๊ฐ€)
  • ์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ์˜ input์€ ์‰ผํ‘œ๋กœ ๋‚˜๋ˆ„๊ณ  sting value๋กœ ์ €์žฅ, ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ๋Š” string๋ฐฐ์—ด์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์„œ ํ•˜๋‚˜์˜ [String]์œผ๋กœ ๋˜ ์ €์žฅ
  • JSONData ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ์ž‘์—…์„ MyArray๋ž‘ MyObject ๊ฐ์ฒด์—์„œ ๊ฐ๊ฐ ๋”ฐ๋กœ ํ•จ

  • step2 PR์€ ๋ชป๋ณด๋ƒ„ ใ… ใ…  - ๋ฌธ์ œ๋Š” ๊ฐ์ฒด๊ฐ€ ์นด์šดํŒ…๋ ๋•Œ ๋ฌธ์ž์—ด๋กœ๋„ ์ธ์‹์ด ๋ผ์„œ, ๊ฐ์ฒด ์ˆ˜ +1 & ๋ฌธ์ž์—ด ์ˆ˜ +1์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋ฅผ ๊ณ ์น˜๋ ค๊ณ  ๋ณด๋‹ˆ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” matchValueType()๊ฐ€ ์˜์‹ฌ์Šค๋Ÿฌ์›Œ์„œ ๋ฐ”๊พธ๋ ค๊ณ ํ–ˆ๋Š”๋ฐ, ๋ฌธ์ž์—ด์„ Int๋‚˜Bool๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์„ฑ๊ณตํ•˜๋ฉด ํ˜•ํƒœ๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋กœ์ง์—์„œ ๊ทธ if๋ฌธ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๋‹ค string์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

2017.12.17 TIL JSON step2

  • (12.17 ๋ฐœ๊ฒฌ){}ํ˜•ํƒœ๋Š” ๋‹น์—ฐํžˆ ์ด๋ฏธ MyObject์—์„œ ๋‚ด๋ถ€ value๋“ค์ด ๋‹ค JSONDataํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜์ด ๋œ Dictionary<String,JSONData>์ธ ์ƒํƒœ๋กœ matchValueType๋กœ ๊ฐ€๋‹ˆ ๋‹น์—ฐํžˆ if๋ฌธ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•„์„œ String์œผ๋กœ ์ธ์‹๋˜๊ณ , ์นด์šดํŒ…ํ•˜๋Š” ๊ณณ์—์„œ๋Š” string๊ณผ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋‘ ์ธ์‹๋˜๋‹ˆ ๊ฐ์ฒด ์ˆ˜ ๋งŒํผ string ์ˆ˜๋„ ์นด์šดํŒ…๋˜๋Š”๊ฒŒ ๋‹น์—ฐโ€ฆ
  • MyArray์™€ MyObject๊ฐ€ ๋ณ€ํ™˜๋˜๋Š” ํ๋ฆ„์„ ๋ณ€๊ฒฝ
  • JSONDataFactory์˜ matchValueType()๋ฅผ string์„ ๋ฐ›์•„์„œ JSONData ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ •
    • {}๊ฐ€ ์žˆ์œผ๋ฉด JSONData.Object
    • []๊ฐ€ ์žˆ์œผ๋ฉด JSONData.Array๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ •

์—๋Ÿฌํ•ธ๋“ค๋ง throw ~ do-try-catch

|

throw

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”(์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋Š”) ํ•จ์ˆ˜์—๋Š” ์˜ˆ์™ธ์—†์ด throw๋ถ™์–ด์•ผํ•œ๋‹ค. ํ•จ์ˆ˜์— throw๋ฅผ ๋ถ™์ด๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ดํƒ€์ž…์€ โ€œ์›๋ž˜ ๋ฆฌํ„ดํ•˜๋˜ ํƒ€์ž…์ด๋‚˜ errorํ”„๋กœ์ฝœ์˜ ์ธ์Šคํ„ด์Šคโ€๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

do-try-catch

  • do : ์ •์ƒ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. throw๊ฐ€ ์ง€์ •๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š”๋‹ค.
  • try : ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” throw๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ• ๋•Œ ๋ถ™์ธ๋‹ค.
  • catch : do ๊ตฌ๋ฌธ ๋’ค์— ๋ถ™๋Š”๋‹ค. try ํ˜ธ์ถœ ์ค‘์—์„œ ์–ด๋Š ํ•˜๋‚˜๋ผ๋„ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋ฉด catch๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์˜ค๋ฅ˜ ์ข…๋ฅ˜๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋˜์ ธ์ง„ error๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ์žก์•„๋‚ด๋Š”๋ฐ, ํŠน์ • ์˜ค๋ฅ˜ ์ข…๋ฅ˜๋ฅผ ์žก์•„๋‚ด๊ธฐ ์œ„ํ•ด catch๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.