๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Swift

[Swift] guard๋ฌธ ์•Œ์•„๋ณด๊ธฐ(guard let๊ณผ if let์˜ ์ฐจ์ด์  ๊นŒ์ง€)

by lizzydev 2023. 1. 5.

์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์˜ต์…”๋„ ๋ฒ—๊ธธ ๋•Œ ์ผ๋˜ ๊ทธ๋™์•ˆ ๋‘๋ฃจ๋ญ‰์ˆ ํ•˜๊ฒŒ ์•Œ๋˜ guard๋ฌธ์„ ๋ฟŒ์…” ๋ด…์‹œ๋‹ค.

 

guard๋ฌธ

guard ๋ฌธ์€ if๋ฌธ๊ณผ switch๋ฌธ์ฒ˜๋Ÿผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๋•Œ ์“ฐ์ด๋Š” ์กฐ๊ฑด๋ฌธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค!

 

guard ๋ฌธ์€ ์–ด๋– ํ•œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ  guard ๋ฌธ ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if๋ฌธ์€ else๋ฌธ ์—†์ด๋„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ guard ๋ฌธ์€ ๋ฌด์กฐ๊ฑด else ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์ด else๋ฌธ ์•ˆ์—์„œ๋Š” ๋ฌด์กฐ๊ฑด return์œผ๋กœ ์ข…๋ฃŒ ์‹œํ‚ต๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด, guard ๋ฌธ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด๋ฌธ์ด  ์ฐธ์ด๋ฉด ๋ฌธ์ œ ์—†์ด ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฑฐ์ง“์ผ ๋•Œ, ์—ฌ๊ธฐ์— ํ•ญ์ƒ ๋‹ฌ๋ ค์žˆ๋Š” else๋ฌธ ์ฝ”๋“œ ๋ถˆ๋Ÿญ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

guard๋Š” '๋น ๋ฅธ ์ข…๋ฃŒ'๊ฐ€ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค.

 

์ฆ‰, ์›ํ•˜๋Š” ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด, ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ผ์ฐ ์ข…๋ฃŒํ•ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. 

 

guard ๋ฌธ์€ return, break, continue, throw๋ฅผ  ์ด์šฉํ•ด์„œ ์ฆ‰์‹œ exit ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. return์„ ํ•˜์ง€ ์•Š๋Š” fatalError(_:file:line:)๋ฅผ ์ด์šฉํ•ด exit ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

guard ๋ฌธ์€ if๋ฌธ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ํ•œ ๋ฒˆ ๋ด…์‹œ๋‹ค.

// if ๊ตฌ๋ฌธ ํ™œ์šฉ

for i in 0...3 {

    if i == 1 { print(i) }

    else { continue }

}



// guard ๊ตฌ๋ฌธ ํ™œ์šฉ

for i in 0...3 {

    guard i == 1 else { continue }

    print(i)

}

 

0๋ถ€ํ„ฐ 3๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ i๊ฐ€ 1์ผ ๋•Œ 1์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

์ด ์ฝ”๋“œ๋Š” ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ํ•œ ๊ฐ€์ง€์˜ ์˜ˆ์™ธ๋งŒ์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์˜ˆ์™ธ์‚ฌํ•ญ๋งŒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ๋ฐ”๋กœ guard๋ฅผ ์‚ฌ์šฉํ•  ์ ์ ˆํ•œ ์‹œ๊ธฐ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ ์ด ํ•˜๋‚˜ ๋” ์žˆ๋Š”๋ฐ,

๋ฐ”๋กœ else์— ํ•ด๋‹นํ•˜๋Š” continue ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

์œ„์—์„œ๋Š” for ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— guard ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

continue๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก ๋ฐ˜๋ณต์˜ ์ข…๋ฃŒ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ ํ•จ์ˆ˜๋‚˜ ๋ฐ˜๋ณต๋ฌธ ๋“ฑ์—์„œ guard ๊ตฌ๋ฌธ์€ else ๋ธ”๋ก์—

์ œ์–ด๋ฌธ ์ „ํ™˜ ๋ช…๋ น์–ด๋กœ return, break, throw๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ํ˜น์€ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด

์ œ์–ด๋ฌธ ์ „ํ™˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— guard ๋ช…๋ น์–ด ๋˜ํ•œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ guard ๊ตฌ๋ฌธ์˜ ํ•œ๊ณ„์ ์ž…๋‹ˆ๋‹ค.

 

์กฐ๊ฑด๋ฌธ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ถˆ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ 1:1๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๊ณ ๋Š”, guard๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

์ฆ‰ ์ •๋ฆฌํ•˜๋ฉด

  • if๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ์กฐ๊ฑด์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ ์ค‘์ฒฉ์„ ์ค„์ž„
  • else๋ฌธ์„ ๋จผ์ € ๋ฐฐ์น˜ -> ๋จผ์ € ์กฐ๊ฑด์„ ํŒ๋ณ„ํ•˜์—ฌ ์กฐ๊ธฐ ์ข…๋ฃŒ(early exit)
  •  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€์„œ ๊ณ„์† ์‹คํ–‰

if ๊ตฌ๋ฌธ์€ "~๋ฉด ~ํ•ด๋ผ!" ๋ผ๋Š” ์˜๋ฏธ์ด์ง€๋งŒ,

guard ๊ตฌ๋ฌธ์€ "~์•„๋‹ˆ๋ฉด ๋๋‚ด๋ผ!" ๋ผ๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

guard๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์šฉ ์กฐ๊ฑด๋ฌธ!

์œผ๋กœ ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ง๊ด€์ ์ด๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 


guard let๊ณผ if let์˜ ์ฐจ์ด์ 

guard ๋ฌธ์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด์•˜์œผ๋‹ˆ ์ด๋ฒˆ์—๋Š” ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์— ์“ฐ์ด๋Š” guard let์„ ์•Œ์•„๋ณด๊ณ  if let๊ณผ์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ guard๋ฌธ์„ ํ™œ์šฉํ•œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์˜ ํŠน์ง•์ž…์ž…๋‹ˆ๋‹ค.

  • ์˜ต์…”๋„์„ ๋ฒ—๊ฒผ์„ ๋•Œ nil์ด๋ฉด ๋” ์ด์ƒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๊ฐ•ํ•จ -> nil์ด ์•„๋‹ ๋•Œ๋งŒ ๊ด€์‹ฌ์„ ๊ฐ–๊ฒ ๋‹ค.
  • ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์•„๋ž˜๋ฌธ์žฅ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋™์ผํ•œ ์Šค์ฝ”ํ”„๋กœ ์ทจ๊ธ‰) 

 

์˜ˆ์‹œ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค.

guard let ๋ฌธ

guard let id = students["Dana"] else {

    print("There is no student named \"Dana\"")

    return

}

print("Dana's id : \(id)"// guard ๋ฌธ์—์„œ ์„ ์–ธ๋œ id ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ.
  • unwrapping ์— ์„ฑ๊ณตํ•˜๋ฉด(nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ) ์กฐ๊ฑด๋ฌธ์€ true, ์‹คํŒจ์‹œ false ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค
  • optional ๋ณ€์ˆ˜ ๊ฐ’์ด nil ์ด๋ฉด else ๊ตฌ๋ฌธ์ด ๋™์ž‘ํ•˜๊ณ  return๊ณผ ํ•จ๊ป˜ ์ข…๋ฃŒ ๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด guard  ๋ฌธ ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ์ด์–ด์„œ ์‹คํ–‰๋˜๊ณ  ์กฐ๊ฑด์‹ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๋˜ํ•œ guard ๋ฌธ์ด ์žˆ๋Š” scope ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

if let ๋ฌธ

if let id = students["Dana"] {
  print("Dana's id: \(id)")
}

print("\(id)") // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. if ๋ฌธ์˜ {}์•ˆ์—์„œ๋งŒ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

  • if let๋ฌธ์˜ ์žฅ์ ์€  ์„ฑ๊ณต์‹œ์™€ ์‹คํŒจ์‹œ 2๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์ฆ‰ ์ฝ”๋“œ์—์„œ nil์ผ ๋•Œ์™€ nil์ด ์•„๋‹ ๋•Œ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ if let์€ ์ง€์—ญ๋ณ€์ˆ˜๋กœ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ๋ฐ–์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ guard let ์€ ํ•ญ์ƒ else๊ตฌ๋ฌธ์ด ๋’ค์— ๋”ฐ๋ผ์™€์•ผ ํ•˜๋ฉฐ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ(true)์ผ ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ, ๊ฑฐ์ง“(FALSE) ์ผ ๊ฒฝ์šฐ ์—๋Š” else์˜ ๋ธ”๋ก ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, else ๋‚ด๋ถ€ ์ฝ”๋“œ์—๋Š” Return, break, continue, throw ๋“ฑ์˜ ์ œ์–ด๋ฌธ ์ „ํ™˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

guard๋ฌธ์˜ ํฐ ์žฅ์ ์€ if ๋กœ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉํ–ˆ์„ ๋•Œ์™€ ๋‹ฌ๋ฆฌ { } ๊ด„ํ˜ธ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.