Swift 고차함수와 일급객체

Wonbi·2022년 10월 7일
0

✅ 학습 내용

📌 고차함수

💎 고차함수란?

  • 고차함수 (Higher-order function)다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 를 뜻한다.
  • 스위프트의 함수(클로저)는 일급객체이기 때문에 함수의 매개변수로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있다.
  • 이렇게 함수 자체를 주고받을 수 있으면, 동작, 즉 메서드도 추상화 할 수 있다.
  • 고차함수는 불변성 (immutability) 을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
    • 프로그램의 실행 중 변수가 변하는 상태에 대한 고려가 필요한 명령형 프로그래밍 기법과는 다르다. 즉, 제어문(조건문,반복문 등)에서 나타나는, 논리 흐름,상태 변화 추적 등의 복잡성 제거가 가능하다.

✏️ 함수형 프로그래밍

함수형 프로그래밍 (functional programming) 은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조한다. - wiki

✏️ 일급 객체

컴퓨터 프로그래밍 언어 디자인에서, 일급 객체 (first-class object) 란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다. - wiki

✏️ 일급 객체의 조건

  1. 무명의 리터럴로 생성할 수 있다. (런타임에 생성이 가능하다.)
    • 무명 리터럴이 의미하는 것은 함수 표현식을 뜻한다. 일급 객체란 값으로 표현될 수 있기 때문에 함수 표현식으로 사용이 가능하다.
    • 무명 리터럴은 결국 클로저를 의미하는거 같고, 런타임에서 생성이 가능하다는 것 역시 런타임 과정에서 클로저의 생성이 가능하다는 의미인 것 같다.
  2. 변수나 자료구조(객체, 배열)에 저장할 수 있다.
  3. 함수의 매개변수에 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.
🔍 변수에 저장 가능한 객체
func half(num: Double) -> Double {
    print(#function) // 표현식이 나타나는 선언부의 이름을 출력.
    return num / 2
}

let half2 = half // 함수 half를 변수 half2에 저장

print(half(num:2.2))// half(num:_) 1.1
print(half2(2.2))// half(num:_) 1.1
  • 먼저 여기서 #function은 위 코드내 설명처럼 표현식이 나타나는 선언부(declaration)의 이름을 뜻하는 Special Literal이다.
  • 쉽게 말해 지금 사용되는 곳의 선언부이름, 이 예제에선 함수(메서드) 이름이다.
  • half2상수에 half라는 함수 를 선언했다.
  • 그 다음 half2에 담긴 함수를 호출했다. 그 결과를 보면 변수에 저장 가능한 객체가 무엇을 의미하는지 알 수 있다.
🔍 매개변수 전달이 가능한 객체
func half(num: Double) -> Double {
    print(#function)
    return num / 2
}

let half2 = half
 
func upDown(func:(Double) -> Double, value: Double) {
    let result = func(value)
    print(result)
}

upDown(func: half2, value:8.0) // half(num:) 4.0
  • upDown함수에서 (Double) -> Double타입의 함수(클로저) 를 매개변수 이름 func 으로 받는다.
  • 앞서 선언한 half(num:)함수와 같은 자료형이므로 매개변수로 half(num:) 함수, half(num:) 함수가 담긴 half2상수를 넣을 수 있다.
  • upDown함수가 호출될 때 내부 로직에서 func매개변수를 호출하고 있으므로, half(num:) 함수가 호출되게 된다.
🔍 리턴 값으로 전달이 가능한 객체

func half(num: Double) -> Double {
    print(#function)
    return num / 2
}
let half2 = half
 
func divideFunc() -> (Double) -> Double {
   return half2
}
 
var divideValue = decideFun()
print(divideValue(1.5)) // half(num:) 0.75
  • divideFunc()함수는 (Double) -> Double타입 자료형을 반환한다.
  • 반환받은 함수를 divideValue변수에 받아 호출하니 half(num:)함수가 호출된다.

위키백과 - 함수형 프로그래밍
위키백과 - 일급 객체
Swift 일급객체(First-class object) 일급시민(First-class citizen)
함수와 일급 객체
정보통신기술용어해설

0개의 댓글