λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Swift 정리

[Swift] ν΄λ‘œμ €(Closure) 정리 (feat. sorted)

by seolhee2750 2021. 6. 30.

swiftλ₯Ό μ‚¬μš©ν•˜λ©° μ•„μ£Ό 많이 μ“°λŠ”κ²Œ ν΄λ‘œμ €μΈ 것 κ°™κ³ ,,

개인적인 μƒκ°μœΌλ‘œλŠ” μŠ€μœ„ν”„νŠΈμ˜ λͺ¨λ“  문법?쀑에 κ°€μž₯ μ€‘μš”ν•œκ²Œ λ°”λ‘œ ν΄λ‘œμ €λΌκ³  μƒκ°ν•œλ‹€,,!!

ν•˜μ§€λ§Œ 아직 μ •ν™•ν•œ 이해가 λΆ€μ‘±ν•œ 것 κ°™λ‹€.γ…œ

λ”°λΌμ„œ μ˜€λŠ˜μ€ ν΄λ‘œμ €μ— λŒ€ν•΄ μžμ„Ένžˆ 곡뢀해보렀고 ν•œλ‹€.

 

πŸ“Ž ν΄λ‘œμ €(Closure)

ν΄λ‘œμ €λŠ” λ‹€λ₯Έ μ–Έμ–΄λ“€μ˜ 'λžŒλ‹€'와 λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ,

일정 κΈ°λŠ₯을 ν•˜λŠ” μ½”λ“œλ₯Ό ν•˜λ‚˜μ˜ λΈ”λ‘μœΌλ‘œ λͺ¨μ•„놓은 것을 μ˜λ―Έν•œλ‹€.

 

이 μ–˜κΈ°λ₯Ό λ“€μœΌλ©΄ ν•¨μˆ˜μ•„λƒ?ν•˜κ³  μƒκ°ν•˜κ²Œ λ˜λŠ”λ°, ν•¨μˆ˜λ„ ν΄λ‘œμ €μ˜ 일쒅이닀.

 

πŸ‘‰ ν΄λ‘œμ €μ—λŠ” 크게 총 μ„Έ 가지 ν˜•νƒœκ°€ μžˆλ‹€.

  • 이름이 μžˆμœΌλ©΄μ„œ μ–΄λ–€ 값도 νšλ“ν•˜μ§€ μ•ŠμŒ - μ „μ—­ν•¨μˆ˜μ˜ ν˜•νƒœ
  • 이름이 μžˆμœΌλ©΄μ„œ λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€ 값을 νšλ“ν•  수 있음 - μ€‘μ²©λœ ν•¨μˆ˜μ˜ ν˜•νƒœ
  • 이름이 μ—†κ³  μΆ•μ•½ λ¬Έλ²•μœΌλ‘œ 쓰여지며 μ£Όλ³€ λ¬Έλ§₯에 따라 값을 νšλ“ν•  수 있음 - ν΄λ‘œμ € ν‘œν˜„

 

μœ„μ˜ ν΄λ‘œμ € μ„Έ 가지 ν˜•νƒœ 쀑, ν•¨μˆ˜λŠ” 잘 μ•Œκ³  있기 λ•Œλ¬Έμ—

μ˜€λŠ˜μ€ ν΄λ‘œμ € ν‘œν˜„μ— λŒ€ν•΄ μžμ„Έν•˜κ²Œ ν•œ 번 μ•Œμ•„λ³΄μž!~~


πŸ“Ž ν΄λ‘œμ € ν‘œν˜„

 

μ•„λž˜λŠ” ν΄λ‘œμ €μ˜ 톡상적인 κΈ°λ³Έ ν‘œν˜„μ΄λ‹€.

{ (λ§€κ°œλ³€μˆ˜λ“€) -> λ°˜ν™˜ νƒ€μž… in μ‹€ν–‰ μ½”λ“œ }

μœ„μ—μ„œ λ§ν–ˆλ“― μš°λ¦¬κ°€ μ•Œλ˜ ν•¨μˆ˜μ—μ„œ μ΄λ¦„λ§Œ 빠진 ν˜•νƒœμ²˜λŸΌ λ³΄μž„μ„ μ•Œ 수 μžˆλ‹€.

 

πŸ‘‰ sorted ν•¨μˆ˜λ₯Ό 예둜 λ“€μ–΄ ν΄λ‘œμ € ν˜•νƒœλ₯Ό ν™•μΈν•΄λ³΄μž.

var arr = [1, 3, 2, 5, 4]

arr.sorted(by: {(first: Int, second: Int) -> Bool in return first > second })

/* μ°Έκ³  - μ• ν”Œ 개발자 λ¬Έμ„œμ—μ„œ μ œκ³΅ν•œ sorted ν•¨μˆ˜ μ›ν˜•
func sorted(by areInIncreasingOrder: ((key: Key, value: Value), 
(key: Key, value: Value)) -> Bool) -> [(key: Key, value: Value)] 
*/

μœ„μ—μ„œ λ³Έ ν΄λ‘œμ €μ˜ κΈ°λ³Έ ν‘œν˜„μ— λΆ€ν•©ν•˜λŠ” ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•¨μ„ 확인할 수 μžˆλ‹€!

 

ν•˜μ§€λ§Œ μŠ€μœ„ν”„νŠΈλ₯Ό μ’€ μ‚¬μš©ν•΄ λ³Έ μ‚¬λžŒμ΄λΌλ©΄ μ•Œκ² μ§€λ§Œ,, sorted ν•¨μˆ˜λŠ” 훨~씬 κ°„λ‹¨ν•˜κ²Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

arr.sorted(by: <)

μ΄λ ‡κ²Œ,,! μ‚¬μš©ν•˜λŠ” 것이 보톡 많이 μ“°λŠ” 방법이닀.

sorted의 μ›ν˜•μ„ μ§€μΌœ μ“΄ μ½”λ“œμ— λΉ„ν•΄ μ•„μ£Ό 간결해진 λͺ¨μŠ΅μΈλ°,

λ„λŒ€μ²΄ μ–΄λ–€ λ°©λ²•μœΌλ‘œ λ“œλΌλ§ˆν‹±ν•˜κ²Œ μ½”λ“œλ₯Ό 쀄이고,, κ°€λ…μ„±κΉŒμ§€ μž‘μ•˜μ„κΉŒ?

 

μ—¬κΈ°μ„œ μš°λ¦¬λŠ” ν΄λ‘œμ €λ₯Ό μ–Όλ§ˆλ‚˜ λ‹€μ–‘ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλŠ”μ§€, μ•Œμ•„λ΄μ•Ό ν•  ν•„μš”κ°€ μžˆλ‹€. !!

  • ν›„ν–‰ ν΄λ‘œμ € 문법
  • λ§€κ°œλ³€μˆ˜μ™€ 리턴 νƒ€μž… μƒλž΅
  • μΆ•μ•½λœ μ „λ‹¬μΈμž 이름
  • μ•”μ‹œμ  λ°˜ν™˜ ν‘œν˜„
  • μ—°μ‚°μž ν•¨μˆ˜ μ‚¬μš©

 

μœ„μ˜ λ‚΄μš©λ“€μ²˜λŸΌ, ν΄λ‘œμ €λŠ” μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 방법을 μ œκ³΅ν•œλ‹€.

μš°λ¦¬κ°€  sorted(by: <) 이런 λ°©μ‹μœΌλ‘œ sorted ν•¨μˆ˜λ₯Ό λ„ˆλ¬΄λ‚˜λ„ μ‰½κ²Œ μ‚¬μš©κ°€λŠ₯ν•œ 것도 이런 μ΄μœ μ—μ„œ λ‚˜μ˜¨λ‹€.

 

그럼 이제 μœ„μ˜ ν•­λͺ©λ“€μ„ ν•˜λ‚˜ μ”© μ‚΄νŽ΄λ³΄λ©° ν΄λ‘œμ €μ˜ λ‹€μ–‘ν•œ μ‚¬μš© 방법에 λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μž.


1. ν›„ν–‰ ν΄λ‘œμ € 문법을 μ‚¬μš©ν•  수 μžˆλ‹€.

ν΄λ‘œμ €κ°€ κΈΈμ–΄μ§€κ±°λ‚˜, 가독성이 λ–¨μ–΄μ§ˆ λ•Œ μ‚¬μš©ν•˜λŠ” 방식이닀.

 

μœ„μ—μ„œ 예둜 λ“  sorted ν•¨μˆ˜μ˜ μž‘μ„±μ„ 보면, ( )μ•ˆμ— ν΄λ‘œμ €{ }κ°€ λ“€μ–΄μžˆλŠ” λͺ¨μŠ΅μ΄λ‹€.

ν•˜μ§€λ§Œ { }κ°€ 길어지면 μ½”λ“œμ˜ 가독성이 λ–¨μ–΄μ§ˆ 수 있기 λ•Œλ¬Έμ— ν΄λ‘œμ €λ₯Ό λ”°λ‘œ 빼쀄 수 μžˆλ‹€.

arr.sorted() {(first: Int, second: Int) -> Bool in return first > second}

 

그리고 μ—¬κΈ°μ„œ μ†Œκ΄„ν˜ΈκΉŒμ§€λ„ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

arr.sorted {(first: Int, second: Int) -> Bool in return first > second}

 

2. λ§€κ°œλ³€μˆ˜μ™€ 리턴 νƒ€μž… μƒλž΅

ν΄λ‘œμ €λŠ” λ§€κ°œλ³€μˆ˜μ™€ 리턴 κ°’μ˜ νƒ€μž…μ„ λ¬Έλ§₯을 톡해 μœ μΆ”ν•  수 μžˆλ‹€.

λ”°λΌμ„œ λ§€κ°œλ³€μˆ˜μ™€ 리턴 값을 μƒλž΅ν•˜μ—¬ μž‘μ„±ν•  수 μžˆλ‹€.

 

μœ μΆ” ν•  수 μžˆλŠ” μ΄μœ λŠ”

μ–΄μ°¨ν”Ό ν΄λ‘œμ €λŠ” λ©”μ†Œλ“œμ—μ„œ μš”κ΅¬ν•˜λŠ” ν˜•νƒœλ‘œ μ „λ‹¬ν•΄μ•Όν•œλ‹€.

(λ©”μ†Œλ“œμ—μ„œ String 값을 λ°›μ•„μ•Ό ν•˜λ©΄ String으둜,, Bool이면 Bool κ°’μœΌλ‘œ,,)

λ”°λΌμ„œ μ „λ‹¬μΈμžλ‘œ 전달할 ν΄λ‘œμ €λŠ” 이미 μ ν•©ν•œ νƒ€μž…μ΄λΌλŠ” κ²ƒμœΌλ‘œ μœ μΆ”ν•  수 μžˆλ‹€!

 

sorted ν•¨μˆ˜ ν‘œν˜„μ—μ„œ λ§€κ°œλ³€μˆ˜, 리턴 νƒ€μž…μ„ μƒλž΅ν•˜μ—¬ μž‘μ„±ν–ˆλ‹€.

arr.sorted() {(first, second) in return first > second}

 

3. μΆ•μ•½λœ μ „λ‹¬μΈμž 이름

μœ„μ—μ„œλŠ” first와 second둜 λ§€κ°œλ³€μˆ˜μ˜ 이름을 μ§€μ •ν–ˆλ‹€.

ν•˜μ§€λ§Œ ν΄λ‘œμ €μ—μ„œλŠ” ꡳ이 이름을 μ •ν•  ν•„μš” 없이, 첫 번째 μΈμžλΆ€ν„° $0, $1, $2, ... 둜 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

 

단좕 인자 이름을 μ‚¬μš©ν•˜λ©΄ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ ,

λ’€μ˜ μ‹€ν–‰ μ½”λ“œλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν–ˆλ˜ in ν‚€μ›Œλ“œλ„ ν•„μš” 없어진닀.!!

 

sorted ν•¨μˆ˜μ˜ ν΄λ‘œμ € ν‘œν˜„μ—μ„œ 단좕 인자 이름을 μ‚¬μš©ν•΄μ£Όμ—ˆλ‹€.

arr.sorted{return $0 > $1}

 

4. μ•”μ‹œμ  λ°˜ν™˜ ν‘œν˜„

ν΄λ‘œμ €κ°€ λ°˜ν™˜ 값을 가지며, ν΄λ‘œμ € λ‚΄λΆ€μ˜ 싀행문이 λ”± ν•œ 쀄이라면

μ•”μ‹œμ μœΌλ‘œ κ·Έ 싀행문을 λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ‘‰ 싀행문이 곧 λ°˜ν™˜ κ°’! return ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯

 

μ•„λž˜λŠ” return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ sorted ν•¨μˆ˜μ˜ λͺ¨μŠ΅μ΄λ‹€.

arr.sorted{$0 > $1}

 

5. μ—°μ‚°μž ν•¨μˆ˜ μ‚¬μš©

μœ„μ˜ return문을 μƒλž΅ν•œ ν΄λ‘œμ € ν˜•νƒœλ₯Ό 보면, λ‹¨μˆœνžˆ μ•ž λ’€ 인자의 크기λ₯Ό λΉ„κ΅ν•˜λŠ” 것 뿐이닀.

λ”°λΌμ„œ 이럴 λ•ŒλŠ” μ—°μ‚°μžλ₯Ό ν΄λ‘œμ €λ‘œμ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

(μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μ—°μ‚°μžλ„ μΌμ’…μ˜ ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ—!)

 

인라인 ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•œ sorted ν•¨μˆ˜μ— μ—°μ‚°μžλ₯Ό ν΄λ‘œμ €λ‘œ μ‚¬μš©ν•΄μ£Όμ—ˆλ‹€.

arr.sorted(by: >)

 

μ—¬κΈ°κΉŒμ§€ ν΄λ‘œμ €μ˜ νŠΉμ„±μ„ μ‚¬μš©ν•΄ μ½”λ“œλ₯Ό κ°„κ²°νžˆ λ°”κΏ”κ°€λ‹€λ³΄λ‹ˆ λˆˆμ— λ„κ²Œ 짧아진 λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€!

λŒ€ν‘œλ‘œ sortedλ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ, 이 외에도 ν΄λ‘œμ €λŠ” μŠ€μœ„ν”„νŠΈμ—μ„œ 정말 λ‹€μ–‘νžˆ μ“°μ΄λŠ” μ€‘μš”ν•œ μš”μ†Œλ‹€.

μœ„μ˜ λ‚΄μš©λ“€μ„ λ³΅μŠ΅ν•˜λ©° ν΄λ‘œμ €λ₯Ό 자유둭게 ν™œμš©ν•  수 μžˆλ„λ‘ μ—°μŠ΅ν•˜μž.

 

ν΄λ‘œμ €λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ—μ„œ

μ°Έμ‘°λ₯Ό νšλ“ν•˜κ³  μ €μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯도 μ§€λ‹Œλ‹€.

πŸ‘‰ 이 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ κΈ€μ—μ„œ μ†Œκ°œν•˜κ² λ‹€.


🌟 정리 🌟

ν΄λ‘œμ €λŠ” 이름 μ—†λŠ” ν•¨μˆ˜μ™€ 같은 λͺ¨μ–‘μœΌλ‘œ(ν•¨μˆ˜λ„ ν΄λ‘œμ €μ˜ 일쒅), { }λ₯Ό μ΄μš©ν•΄ ν‘œν˜„ν•œλ‹€.

λ‹€μ–‘ν•œ ν™œμš© 방법을 μ œκ³΅ν•˜λ―€λ‘œ, 보닀 가독성을 λ†’μ΄λŠ” μ½”λ“œμ˜ μž‘μ„±μ„ λ•λŠ”λ‹€.

μŠ€μœ„ν”„νŠΈμ—μ„œ λ„ˆλ¬΄λ‚˜λ„ 많이 μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ,

ν΄λ‘œμ €λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜λŠ” κ²ƒμ΄μ•Όλ§λ‘œ λ°”λ‘œ μŠ€μœ„ν”„νŠΈλ₯Ό μ΄ν•΄ν•˜λŠ” 것!

 


μ°Έκ³ 

λŒ“κΈ€