Published on

🍎 Swift - ν΄λ‘œμ €(Closure).01

Authors
  • avatar
    Name
    이창쀀
    Twitter

혼자 κ³΅λΆ€ν•˜λ‹€ λ„μ €νžˆ μ•ˆλ˜κ² μ–΄μ„œ μ •λ¦¬ν•΄λ³΄λŠ” νƒœκ·Έλ₯Ό ν•˜λ‚˜ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€! 첫 κ²Œμ‹œλ¬Όμ˜ μ£Όμ œλŠ” λŠλ‚Œμ μœΌλ‘œ μ¨μ™”μ§€λ§Œ μ œλŒ€λ‘œ 곡뢀해본 적은 μ—†λŠ” ν΄λ‘œμ €μž…λ‹ˆλ‹€.

ν΄λ‘œμ €λž€?

μ§€κΈˆκΉŒμ§€ ν΄λ‘œμ €ν•˜λ©΄ κ·Έλƒ₯ β€œκ·Έλ£ΉμœΌλ‘œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ 덩어리” μ •λ„λ‘œ μƒκ°ν•˜κ³  μ‚¬μš©ν•΄μ™”μŠ΅λ‹ˆλ‹€. 그런데 자료λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ μ–΄λ¨Έλ‚˜ κΈ€μŽ„ 그게 μ „λΆ€λ„€μš”?

λ¬Όλ‘  μ—¬λŸ¬κ°€μ§€ μ˜΅μ…˜λ“€μ΄ μΆ”κ°€λ˜λ©΄μ„œ λ‹€μ–‘ν•˜κ²Œ ν™œμš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ 기본적인 κ°œλ…μ€ μ •λ§λ‘œ μ½”λ“œ 덩어리 κ·Έ 이상도 μ΄ν•˜λ„ μ•„λ‹ˆμ˜€μŠ΅λ‹ˆλ‹€.

그런데 좩격적인 사싀이 ν•˜λ‚˜ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ ν•¨μˆ˜λ„ ν΄λ‘œμ €μ˜€λ˜ 것이죠.

ν•¨μˆ˜μ•Ό λ‹€λ₯Έ μ–Έμ–΄λ“€μ—μ„œλ„ 기본적인 κ°œλ…μ΄λΌμ„œ Swiftμ—μ„œλ„ μ¨μ™”λŠ”λ° 생각해보면 ν΄λ‘œμ €λ‚˜ ν•¨μˆ˜λ‚˜ ν•˜λŠ” κΈ°λŠ₯은 κ°™μŠ΅λ‹ˆλ‹€.

μ •ν™•ν•˜κ²Œ μ‚΄νŽ΄λ³΄λ©΄ ν•¨μˆ˜λŠ” 이름이 μžˆλŠ” ν΄λ‘œμ €μž…λ‹ˆλ‹€. 이게 무슨 μ†Œλ¦¬λƒλ©΄, ν΄λ‘œμ €μ—λŠ” Unnamed Closure와 Named Closure μ΄λ ‡κ²Œ 두 가지 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

func foo() {
  print("Actually, I'm Named Closure")
}

저희가 쀄곧 μ‚¬μš©ν•΄μ™”λ˜ μœ„μ™€ 같은 ν•¨μˆ˜λΌλŠ” 녀석은 사싀 Named Closureμ˜€λ˜ 것이죠.

let boo = { print("I'm Unnamed Closure") }

그리고 μ§€κΈˆκΉŒμ§€ 감으둜 μ‚¬μš©ν•΄μ˜€λ˜ μœ— λ†ˆμ€ Unnamed Closureμ΄μ§€λ§Œ, νŽΈμ˜μƒ Named Closureλ₯Ό ν•¨μˆ˜λΌκ³  λΆ€λ₯΄κΈ° λ•Œλ¬Έμ— μ€„μ—¬μ„œ κ·Έλƒ₯ β€œClosure”라고 λΆˆλ €λ˜ κ²ƒμž…λ‹ˆλ‹€.

자 κ·Έλž˜μ„œ ν΄λ‘œμ €λž€ λ†ˆμ€ μ–΄λ–»κ²Œ μƒκ²ΌλŠλƒ? ν•˜μ‹œλ©΄

{ (Parameters) -> Return in
  // tasks
}

μ΄λ ‡κ²Œ μƒκ²ΌμŠ΅λ‹ˆλ‹€. Swiftλ₯Ό μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ ꡉμž₯히 자주 λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— 은연쀑에 μ΅μˆ™ν•΄μ§„ κ΅¬μ‘°λ„€μš”..

ν•˜μ§€λ§Œ μ œλŒ€λ‘œ ν•™μŠ΅ν•΄λ³΄κΈ° μœ„ν•΄ ꡬ쑰λ₯Ό λœ―μ–΄λ‚΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” in을 κΈ°μ€€μœΌλ‘œ 두 가지 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. μΈμžμ™€ λ°˜ν™˜ν˜•μœΌλ‘œ 이루어진 Closure Head와 μ‹€ν–‰λΆ€κ°€ μžˆλŠ” Closure Body이죠.

사싀 μ“Έ μ€„λ§Œ μ•Œλ©΄ 됐지 μš©μ–΄λŠ” μ€‘μš”ν•œ 게 μ•„λ‹ˆλ‹ˆ μ˜ˆμ‹œ ν•˜λ‚˜λ§Œ κ°„λ‹¨νžˆ 보고 λ„˜μ–΄κ°‘μ‹œλ‹€!

let boo = { (title: String) -> String in 
  return "Title: \(title)"
}

ν΄λ‘œμ €μ˜ κΈ°λŠ₯, μ‚¬μš©λ²•

μ§€κΈˆλΆ€ν„°λŠ” ν΄λ‘œμ €κ°€ ν•  수 μžˆλŠ” 기본적인 κΈ°λŠ₯을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ™€ 같은 λ†ˆμΈκ±Έ μ•Œμ•˜μœΌλ‹ˆ ν•¨μˆ˜μ˜ κΈ°λŠ₯듀을 μƒκ°ν•΄λ³΄λ©΄μ„œ 보면 λ‚˜λ¦„ μ‰½μŠ΅λ‹ˆλ‹€!

1. ν•¨μˆ˜μ˜ μΈμžλ‘œμ„œ μ‚¬μš©λ  수 μžˆλ‹€.

κΈ°λŠ₯ 첫 번째! 처음 λ§ˆμ£Όμ³€μ„ λ•Œ κ°€μž₯ λ‹Ήν™©ν–ˆλ˜ κΈ°λŠ₯μž…λ‹ˆλ‹€. 웬 μ²˜μŒλ³΄λŠ” ꡬ쑰가 ν•¨μˆ˜ 인자둜 λ–‘ν•˜λ‹ˆ 자리λ₯Ό 작고 μžˆλŠ”λ°, κ΄„ν˜Έμ— ν™”μ‚΄ν‘œμ— μ–΄μ§ˆμ–΄μ§ˆν–ˆλ˜ 기얡이 μžˆλ„€μš”.

func foo(closure: () -> ()) {
  closure()
}

μœ„μ™€ 같이 ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜ ν˜•νƒœλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 점 μ•„μ‹œλ‚˜μš”? 개인적으둜 μ΅μˆ™ν•˜μ§€λŠ” μ•Šμ•„μ„œ μΈμ§€λ§Œ 해두고 직접 μ‚¬μš©ν•˜μ§€λŠ” μ•Šλ˜ κΈ°λŠ₯μΈλ°μš”, 여기에 ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 사싀은 자주 μ‚¬μš©ν•˜λ˜ κΈ°λŠ₯μ΄λΌλŠ” 사싀을 κΉ¨λ‹«κ²Œ λ©λ‹ˆλ‹€. 참고둜 μœ„ μ˜ˆμ‹œμ—μ„œ closure()λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€!

foo(closure: { () -> () in
  print("Hi! I'm Closure")
})

처음 λ³΄μ‹œλŠ” 뢄듀이 μ—¬κΈ°μ„œ ν—€λ‘±ν—€λ‘±ν•˜κ³  κ³„μ‹€ν…Œλ‹ˆ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μžμ„Ένžˆ 보면,

{ () -> () in
  print("Hi! I'm Closure")
}

이 λΆ€λΆ„.. λ³΄μ΄μ‹œλ‚˜μš”? λ­”κ°€ ꡉμž₯히 κΈΈμ–΄λ³΄μ΄μ§€λ§Œ κ·Έλƒ₯ ν•˜λ‚˜μ˜ ν΄λ‘œμ €μž…λ‹ˆλ‹€. 이 ν΄λ‘œμ €κ°€ closureλΌλŠ” μ΄λ¦„μœΌλ‘œ foo() ν•¨μˆ˜μ˜ μΈμžλ‘œμ„œ μ „λ‹¬λœ 것이죠.

이게 λ³΄μ΄κ³ λ‚˜λ©΄ μœ„ κ΅¬μ‘°λŠ” 생각보닀 κ°„λ‹¨ν•΄μ§‘λ‹ˆλ‹€. β€œHi! I’m Closureβ€λΌλŠ” String을 좜λ ₯ν•˜λŠ” ν•¨μˆ˜ closure()κ°€ foo() ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” ꡬ쑰인 것이죠.

2. ν•¨μˆ˜μ˜ λ°˜ν™˜μœΌλ‘œμ„œλ„ μ‚¬μš©λ  수 μžˆλ‹€.

두 번째 κΈ°λŠ₯은 λΉ λ₯΄κ²Œ μ‚΄νŽ΄λ΄…μ‹œλ‹€! ν•¨μˆ˜μ˜ 인자둜 ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ λ°˜ν™˜ νƒ€μž…μœΌλ‘œλ„ μ‚¬μš©λ  수 있겠죠?

func foo() -> () -> () {
  return { () -> () in
    print("Hi! I'm Closure")
  }
}

λ„€ λ§žμ•„μš”. μ–˜λ„ 만만치 μ•Šκ²Œ λ³΅μž‘ν•΄λ³΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 우리의 μ• ν”Œμ€ () -> () -> () 같은 μ• λ§€ν•œ ν‘œν˜„μ„ μ’‹μ•„ν•˜μ§€ μ•Šμ•„μš”.

μ € ν˜•νƒœ κ·ΈλŒ€λ‘œ μ‚¬μš©λ  일은 거의 μ—†μœΌλ‹ˆ ν•΄λ‹Ή νŒŒνŠΈμ—μ„œ λ‹€μ‹œ μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

3. λ³€μˆ˜/μƒμˆ˜μ— μ‚¬μš©ν•  수 μžˆλ‹€.

사싀 제일 기본적인 ν˜•νƒœμž…λ‹ˆλ‹€.

let closure = { () -> () in
  print("Hi! I'm Closure")
}

보톡 return으둜 λ³€μˆ˜/μƒμˆ˜μ— 값을 λ„£μ–΄μ£Όκ²Œ λ©λ‹ˆλ‹€.

μ—¬κΈ°κΉŒμ§€κ°€ ν΄λ‘œμ €μ˜ κΈ°λ³Έ κ°œλ…μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ κ²Œμ‹œλ¬Όμ—μ„œλŠ” μ œκ°€ μ΄λ ‡κ²Œ μ •λ¦¬ν•˜κ²Œ λ§Œλ“  원흉인 @escaping closure μœ„μ£Όλ‘œ μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€!