카테고리 없음
swift - 일급 객체 와 고차함수
장일규
2023. 10. 26. 22:25
고차함수란 무엇인가?
함수를 다른 함수의 인자로 받거나 함수를 반환하는 함수라고 한다.
고차함수를 이해하기 위해서는 일급 객체(First-class object) 라는 개념을 이해하고 있어야한다.
일급 객체 특성
1. 함수/클로저를 변수에 할당
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
let myFunction = add // add함수를 변수에 할당
myFunction(1,2) // 상수에 담아서 사용 가능
2. 함수/클로저를 매개변수로 전달 가능
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
// calculate에 매개변수에 보면 _ operation: (Int, Int) -> Int 두개에 정수를 받아서 정수를 반환하는 operation 파라미터를 받고 있다.
func calculate(
_ operation: (Int, Int) -> Int,
_ a: Int,
_ b: Int
) -> Int {
return operation(a, b)
}
let result = calculate(add, 5, 3) // add 함수를 전달
3. 함수/클로저를 반환 값으로 사용 가능
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
//getCalculator는 함수를 반환하는 함수이다.
func getCalculator() -> (Int, Int) -> Int {
return add
}
// calculator는 (Int, Int) -> Int 타입의 함수 add를 가리키는 변수가 된다.
let calculator = getCalculator()
let sum = calculator(3, 5)
고차함수를 왜 사용해야하고 일급객체를 지켜야할까?
1. 고차 함수를 사용하지 않는 경우
func doubleNumbers(numbers: [Int]) -> [Int] {
var doubled = [Int]()
for number in numbers {
doubled.append(number * 2)
}
return doubled
}
let numbers = [1, 2, 3, 4, 5]
let doubledWithoutMap = doubleNumbers(numbers: numbers)
배열을 받아서 함수 안에서 2배로 증가하는 함수이다.
코드가 정상적으로 돌아가는데는 아무런 문제가 없다.
1. 가독성이 떨어짐
반복문을 사용해서 doubled 변수에 넣는 작업을 하고 있다.
2. 에러 가능성
반복문을 사용해서 인덱스 처리가 있다면 제어를 해야할 경우도 있다.
2. 고차 함수를 사용하는 경우
func doubleNumbersWithMap(numbers: [Int]) -> [Int] {
return numbers.map { $0 * 2 }
}
let numbers = [1, 2, 3, 4, 5]
let doubledWithMap = doubleNumbersWithMap(numbers: numbers)
위에 똑같은 배열을 받아서 함수 안에서 2배로 증가하는 함수이다.
고차함수 중에 map이라는 함수를 이용한다면 반복문을 사용하지 않기에 간결해지고 가독성이 향상된다.
일급객체 또한 사용이 되었다.
doubleNumbersWithMap함수 내부에서 map 함수를 사용하였다.
클로저를 인자로 받아서 배열로 변환하는 작업을 진행했다.
고차함수는 앞으로 진행하고 있는 공간서울이라는 프로젝트에서 활용한 내용으로 정리를 해보고자 합니다. :)