λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] if let과 guard let의 차이

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€!😊

μ˜€λŠ˜μ€ if letκ³Ό guard let의 차이점에 λŒ€ν•΄ ν•œλ²ˆ 정리해보렀고 ν•©λ‹ˆλ‹€.

 

Optional νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ˜΅μ…”λ„ 바인딩을 톡해 μ•ˆμ „ν•˜κ²Œ κΊΌλ‚΄μ„œ μ“°λŠ”κ²Œ 정말 μ€‘μš”ν•œλ°μš”!

ν‰μ†Œμ— 정말 λ¬΄μ˜μ‹μ μœΌλ‘œ if letκ³Ό guard let을 μ‚¬μš©ν•˜κ³  μžˆμ—ˆλŠ”λ°, 참여쀑인 ν”„λ‘œμ νŠΈμ—μ„œ

νŒ€μ›μ΄ 이에 λŒ€ν•œ μ§ˆλ¬Έμ„ λ‚¨κ²¨μ£Όμ–΄μ„œ λ‘κ°œμ˜ 차이점에 λŒ€ν•΄ ν™•μ‹€νžˆ μ •λ¦¬ν•˜κ³  κ°€λ €κ³  ν•©λ‹ˆλ‹€πŸ‘©πŸ»‍πŸ’»

곡톡점

λ¨Όμ €, λ‘κ°œμ˜ 곡톡점에 λŒ€ν•΄ 짚고 λ„˜μ–΄κ°ˆκ²Œμš”!

if letκ³Ό guard let은 κ³΅ν†΅μ μœΌλ‘œ μ˜΅μ…”λ„ λ°”μΈλ”©μ΄λΌλŠ” νŠΉμ§•μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

 

μ˜΅μ…”λ„(Optional)은 값이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ μžˆμŒμ„ λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μž…λ‹ˆλ‹€. 

μ΄λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜ 등에 값이 μžˆλ‹€λŠ” 것을 보μž₯ν•  수 μ—†μŒ, λ‹€μ‹œ 말해 λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ˜ 값이 nil일 μˆ˜λ„ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

(μ˜΅μ…”λ„μ— λŒ€ν•΄μ„œλŠ” λ‹€λ₯Έ ν¬μŠ€νŒ…μ—μ„œ 더 μžμ„Ένžˆ 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€)

 

μ˜΅μ…”λ„ 값을 μΆ”μΆœν•˜λŠ” λ°©μ‹μ—λŠ” μ˜΅μ…”λ„ 바인딩, κ°•μ œμΆ”μΆœ μ΄λ ‡κ²Œ 두가지가 μžˆλŠ”λ°μš”,

λ¨Όμ € μ˜΅μ…”λ„ 값을 nil인지 μ•„λ‹Œμ§€ μ²΄ν¬ν•˜κ³ , 값이 있으면 κ·Έ 값을 κΊΌλ‚΄μ˜€λŠ” μ•ˆμ „ν•œ μΆ”μΆœ 방법이 μ˜΅μ…”λ„ 바인딩 μž…λ‹ˆλ‹€.

즉, μ•ˆμ „ν•˜κ²Œ Optional값을 μΆ”μΆœν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 것이 if letκ³Ό guard let μž…λ‹ˆλ‹€.

if let

if let은 nil일 λ•Œμ™€ nil이 아닐 λ•Œλ₯Ό λ‚˜λˆ„μ–΄μ„œ μ›ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œλ‘œ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ„λ‘ ν•©μ‹œλ‹€!

μœ„μ˜ μ½”λ“œμ—μ„œ name이 μ˜΅μ…”λ„ νƒ€μž…μ˜ λ³€μˆ˜μΈλ°, 여기에 nil이 μ•„λ‹Œ 값이 λ“€μ–΄κ°€κ²Œ 되면

if let ꡬ문의 μ•ˆμ— μžˆλŠ” print(myName)이 μ‹€ν–‰λ˜κ³ ,

name이 nil일 경우, else ꡬ문으둜 λ„˜μ–΄κ°€μ„œ print(nil)이 μ‹€ν–‰λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ •λ¦¬ν•˜μžλ©΄, λ¨Όμ € nil μ²΄ν¬λΆ€ν„°ν•΄μ„œ if letκ³Ό else 쀑 μ–΄λ–€ ꡬ문이 싀행될 것인지 νŒλ‹¨ν•˜κ³ ,

λ§Œμ•½ λ³€μˆ˜/μƒμˆ˜(μ—¬κΈ°μ„œ name)의 값이 nil이 μ•„λ‹Œ 경우, 이λ₯Ό unwrapν•œ 값을 μƒμˆ˜(μ—¬κΈ°μ„œ myName)에 λŒ€μž…ν•©λ‹ˆλ‹€.

그러면 μš°λ¦¬λŠ” μ•ˆμ „ν•˜κ²Œ κΊΌλ‚Έ μ˜΅μ…”λ„ κ°’(== μƒμˆ˜μ— λŒ€μž…λœ κ°’)을 μ“Έ 수 μžˆλŠ”κ±°κ² μ£ ??

 

⚠️ ν•˜μ§€λ§Œ, μ£Όμ˜ν•  점이 ν•œκ°€μ§€ μžˆμŠ΅λ‹ˆλ‹€.

if let을 톡해 μ„ μ–Έλœ μƒμˆ˜μΈ myName의 scopeλŠ” if κ΅¬λ¬Έμž…λ‹ˆλ‹€.

μ΄λŠ” ifλ¬Έ λ°–μ—μ„œλŠ” myNameμ΄λΌλŠ” μƒμˆ˜μ— μ ‘κ·Όν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

 

ifλ¬Έ λ°–μ—μ„œ μ‚¬μš©ν•˜λ €κ³ ν•˜λ©΄ μ΄λ ‡κ²Œ μ—λŸ¬κ°€ λœ¨λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

guard let

guardλŠ” 'λ³΄ν˜Έν•˜λ‹€', '지킀닀'λΌλŠ” λœ»μ„ 가지듯, μ½”λ“œμ—μ„œλ„ μ΄λŸ¬ν•œ 역할을 ν•΄μ€λ‹ˆλ‹€!

guard ꡬ문 μ•ˆμ—μ„œ 쑰건을 κ²€μ‚¬ν•˜κ³ , 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ©΄ else문으둜 λΉ μ Έ νŠΉμ • μ‹€ν–‰ ꡬ문을 λΉ λ₯΄κ²Œ μ’…λ£Œ μ‹œν‚΅λ‹ˆλ‹€.

μ˜ˆμ‹œλ‘œ μžμ„Ένžˆ λ΄…μ‹œλ‹€!

 

ν™”λ©΄ μ „ν™˜ μ‹œ guard letꡬ문이 정말 많이 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ‹œλ‘œ ν™”λ©΄μ „ν™˜ μ½”λ“œλ₯Ό κ°€μ Έμ™€λ΄€μŠ΅λ‹ˆλ‹€!

μœ„μ˜ μ½”λ“œλŠ” λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ modal둜 λ‹€μŒ 화면을 λ„μ›Œμ£ΌλŠ” ν™”λ©΄μ „ν™˜ μ½”λ“œμΈλ°μš”,

μ½”λ“œλ₯Ό λœ―μ–΄λ³΄λ©΄, optional인 storyboardμ—μ„œ SecondViewControllerλΌλŠ” identifierλ₯Ό 가진

ViewController instanceλ₯Ό μƒμ„±ν•΄μ„œ nextVCλΌλŠ” μƒμˆ˜μ— λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½, SecondViewControllerλΌλŠ” identifierλ₯Ό 가진 storyboardκ°€ μ—†λ‹€λ©΄(== nil이라면)

else ꡬ문으둜 λΉ μ Έ touchUpToGoSecondView ν•¨μˆ˜κ°€ μ’…λ£Œλ©λ‹ˆλ‹€. 

κ·Έλ ‡λ‹€λ©΄, guard ꡬ문을 λΉ μ Έλ‚˜μ˜¨ nextVCλŠ” ν™•μ‹€ν•œ μΈμŠ€ν„΄μŠ€κ² μ£ ?

이λ₯Ό modal을 λ„μš°λŠ” present λ©”μ„œλ“œμ— μ΄μš©ν•˜λ©΄ μ›ν•˜λŠ” ν™”λ©΄μœΌλ‘œ μ „ν™˜μ„ μ‹œμΌœμ€„ 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ! if let ꡬ문과의 차이점이 λ³΄μ΄μ‹œλ‚˜μš”??

if letκ³Ό guard let의 κ°€μž₯ 큰 차이점은 μ˜΅μ…”λ„ λ°”μΈλ”©λœ μƒμˆ˜μ˜ scopeκ°€ λ‹€λ₯΄λ‹€λŠ” μ μž…λ‹ˆλ‹€!!

if문은 ifλ¬Έ μ•ˆμ—μ„œλ§Œ μΆ”μΆœν•œ 값을 μ‚¬μš©ν•  수 μžˆμ—ˆμ§€λ§Œ,

guard문은 guardλ¬Έ λ°–μ—μ„œ μ•ˆμ „ν•˜κ²Œ unwrapν•œ μ˜΅μ…”λ„ νƒ€μž… 값을 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

⚠️ guardλ¬Έμ—μ„œ ν•œκ°€μ§€ μ£Όμ˜ν•  점은,

μ˜΅μ…”λ„ λ°”μΈλ”©λœ μƒμˆ˜μ˜ scopeλŠ” guardꡬ문 밖이기 λ•Œλ¬Έμ— elseλ¬Έμ—μ„œλŠ” ν•΄λ‹Ή 값을 μ“Έ 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

차이점 정리

if letκ³Ό guard let의 차이점을 μ •λ¦¬ν•΄λ³΄μžλ©΄!!

 

1. μƒμˆ˜(let)의 μ‚¬μš©λ²”μœ„κ°€ λ‹€λ¦…λ‹ˆλ‹€.

μœ„μ—μ„œ μžμ„Ένžˆ μ„€λͺ…ν–ˆλ“―이 μ˜΅μ…”λ„ λ°”μΈλ”©λœ μƒμˆ˜μ˜ scopeκ°€ λ‹€λ¦…λ‹ˆλ‹€.

즉, μƒμˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” λ²”μœ„κ°€ λ‹€λ₯΄λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

if let 같은 경우, μ˜΅μ…”λ„ λ°”μΈλ”©λœ μƒμˆ˜λ₯Ό ifλ¬Έ λ°–μ—μ„œ μ“°λŠ” 것이 λΆˆκ°€ν•˜κ³ 

guard let의 κ²½μš°μ—λŠ” ν•΄λ‹Ή μƒμˆ˜λ₯Ό ν•¨μˆ˜ λ‚΄μ—μ„œ 지역 μƒμˆ˜μ²˜λŸΌ 자유둭게 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

(단, elseλ¬Έμ—μ„œλŠ” μ‚¬μš©λΆˆκ°€)

 

2. else의 μƒλž΅ κ°€λŠ₯ 여뢀에 차이가 μžˆμŠ΅λ‹ˆλ‹€.

if let은 μœ„μ˜ μ˜ˆμ‹œ μ½”λ“œμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ ν•΄λ‹Ή 쑰건이 true인 경우λ₯Ό κ°•μ‘°ν•˜λŠ” λ¬Έλ²•μž…λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— elseꡬ문을 κΌ­ 써주지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, guard let의 경우 nil인 κ²½μš°μ— 무쑰건 ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œμΌœλ²„λ¦¬κΈ° λ•Œλ¬Έμ— else ꡬ문을 κΌ­! 써주어야 ν•©λ‹ˆλ‹€.

λ˜ν•œ, elseꡬ문 μ•ˆμ— return, break λ“±κ³Ό 같이 ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œν‚¬ 수 μžˆλŠ” λͺ…λ Ήμ–΄κ°€ κΌ­ ν•„μš”ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°κΉŒμ§€ if letκ³Ό guard let에 λŒ€ν•΄ μ•Œμ•„λ΄€λŠ”λ°μš”!

if letκ³Ό guard let 각각의 νŠΉμ§•μ„ μ΄μš©ν•΄μ„œ 상황에 맞게 잘 ν™œμš©ν•œλ‹€λ©΄

μ˜΅μ…”λ„ νƒ€μž…μ˜ 값도 μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€!

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€πŸ˜ŠπŸ˜Š