Swift

[Swift] μŠ€μœ„ν”„νŠΈμ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

yevdev 2022. 3. 14. 15:21

πŸ’‘ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„?

  • ν”„λ‘œκ·Έλž¨μ΄ μƒνƒœμ˜ λ³€ν™” 없이 데이터 처리λ₯Ό μˆ˜ν•™μ  ν•¨μˆ˜ κ³„μ‚°μœΌλ‘œ μ·¨κΈ‰ν•˜κ³ μž ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„
  • ν•¨μˆ˜ 자체의 μ‘μš©μ„ μ€‘μš”ν•˜κ²Œ μ—¬κΉ€
  • μˆœμˆ˜ν•˜κ²Œ ν•¨μˆ˜μ— μ „λ‹¬λœ 인자 κ°’λ§Œ 결과에 영ν–₯을 μ£Όλ―€λ‘œ μƒνƒœ 값을 갖지 μ•Šκ³  μˆœμˆ˜ν•˜κ²Œ ν•¨μˆ˜λ§ŒμœΌλ‘œ λ™μž‘
    • μ–΄λ–€ μƒν™©μ—μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ”λΌλ„ μΌμ •ν•˜κ²Œ 같은 κ²°κ³Όλ₯Ό λ„μΆœν•  수 있음!

 

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점

  • ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜λŠ” νλ¦„μ—μ„œ μƒνƒœ(κ°’)이 λ³€ν•˜μ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜ 호좜이 각각 μƒν˜Έ 간섭없이 λ°°νƒ€μ μœΌλ‘œ μ‹€ν–‰λ˜λ―€λ‘œ λ³‘λ ¬μ²˜λ¦¬ν• λ•Œ λΆ€μž‘μš©μ΄ 거의 μ—†λ‹€.
  • λ˜ν•œ, ν•„μš”ν•œ 만큼 ν•¨μˆ˜λ₯Ό λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μŠ€μΌ€μΌ μ—…ν•  수 있기 λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ λ³‘λ ¬μ²˜λ¦¬μ— 큰 강점!
  • λ©€ν‹° μ½”μ–΄ ν˜Ήμ€ μ—¬λŸ¬ 개 μ—°μ‚° ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œ 효율적인 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° 쉽닀.
  • μƒνƒœλ³€ν™”μ— λ”°λ₯Έ λΆ€μž‘μš©μ—μ„œ μžμœ λ‘œμ›Œμ§€λ―€λ‘œ μˆœμˆ˜ν•˜κ²Œ κΈ°λŠ₯ κ΅¬ν˜„μ— μ΄ˆμ μ„ λ§žμΆ”μ–΄ 섀계할 수 μžˆλ‹€.

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 일급 객체 쑰건 (λͺ¨λ‘ 좩쑱해야함)

  1. μ „λ‹¬μΈμžλ‘œ 전달 ν•  수 μžˆλ‹€.
  2. 동적 ν”„λ‘œνΌν‹° 할당이 κ°€λŠ₯ν•˜λ‹€.
  3. λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰 μ•ˆμ— 담을 수 μžˆλ‹€.
  4. λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  5. ν• λ‹Ήν•  λ•Œ μ‚¬μš©λœ 이름과 관계없이 κ³ μœ ν•œ 객체둜 ꡬ별할 수 μžˆλ‹€.

μŠ€μœ„ν”„νŠΈμ˜ ν•¨μˆ˜λŠ” 이 쑰건을 λͺ¨λ‘ μΆ©μ‘±ν•˜κΈ°μ— ν•¨μˆ˜λ₯Ό μΌκΈ‰κ°μ²΄λ‘œ μ·¨κΈ‰ν•œλ‹€.

 

일급 객체?
컴퓨터 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ λ””μžμΈμ—μ„œ, 일급 κ°μ²΄λž€ λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체λ₯Ό 가리킨닀. 보톡 ν•¨μˆ˜μ— 인자둜 λ„˜κΈ°κΈ°, μˆ˜μ •ν•˜κΈ°, λ³€μˆ˜μ— λŒ€μž…ν•˜κΈ°μ™€ 같은 연산을 지원할 λ•Œ 일급 κ°μ²΄λΌν•œλ‹€ 
- μœ„ν‚€λ°±κ³Ό

 

➰ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ μ½”λ“œ

// doSomething ν•¨μˆ˜μ™€ doAnotherThing ν•¨μˆ˜λ₯Ό λͺ¨λ‘ μ²˜λ¦¬ν•˜κ³  싢을 경우

func doSomething(){
	print("do somgthing")
}

func doAnotherThing(){
	print("do another thing")
}

func excute(tasks: [()-> Void] {
	for task in tasks {
    	task()
    }
}

excute(tasks: [doSomething, doAnotherThing])	// 두 ν•¨μˆ˜λ₯Ό μ „λ‹¬μΈμžλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

// 두 수의 합을 κ΅¬ν•˜κ³  싢을 경우

func sum(first: Int) -> ((Int)->Int){
	return { second in first + second }
}
// ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ—μ„œ 즐겨 μ‚¬μš©λ˜λŠ” 컀링 κΈ°λ²•μœΌλ‘œ μ „λ‹¬μΈμžλ₯Ό ν•˜λ‚˜λ§Œ 두고 λ°˜ν™˜ν•˜λ©΄μ„œ second in first + second 처럼 μ „λ‹¬μΈμžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
// 컀링 기법 ? μ—¬λŸ¬κ°œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜ ν•˜λ‚˜λ₯Ό κ°–λŠ” ν•¨μˆ˜μ˜ λ‚˜μ—΄λ‘œ ν‘œν˜„ν•˜λŠ” 방법

sum(first: 10)(5)

 

μŠ€μœ„ν”„νŠΈκ°€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ μ°¨μš©ν•œ 의의

  • μŠ€μœ„ν”„νŠΈλŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ + ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
  • μ• ν”Œμ˜ ν”„λ ˆμž„μ›Œν¬λ₯Ό λ²—μ–΄λ‚˜ λ‹€λ₯Έ μ˜μ—­ (예λ₯Όλ“€λ©΄ μ„œλ²„μš© ν”„λ ˆμž„μ›Œν¬ λ“±)μ—μ„œ μŠ€μœ„ν”„νŠΈλ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ μˆœμˆ˜ν•˜κ²Œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 만으둜 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 μžˆμ–΄ μ• ν”Œμ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ 특히 κ°•μ‘°ν•œλ‹€.
  • λ•Œμ— 따라 μ μ ˆν•˜κ²Œ 객체지ν–₯κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ μ„žμ–΄ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄ ν•„μš”ν•œ κΈ°λŠ₯에 맞게 졜적의 μ„±λŠ₯을 λ°œνœ˜ν•  μˆ˜λ„ 있고, 생산성도 κ·ΉλŒ€ν™” ν•  수 μžˆλ‹€.

 


Reference

Swift ν”„λ‘œκ·Έλž˜λ° 3판 - μ•Όκ³°