Swift

[Swift] 고차함수란?

Hatchling.dev 2023. 6. 23. 16:47

(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)

(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)

 

안녕하세요! 오늘은 고차함수라는 것에 대해 알아보도록 하겠습니다!!

Swift에서 고차함수는 함수의 매개변수로 함수를 받거나 함수를 반환하는 함수를 말합니다. 고차함수로는 map, filter, reduce, flatMap, compactMap, forEech 등이 있지만 이번에는 제일 많이 사용하는 map, filter, reduce에 대해 알아보겠습니당!

 

map

map 함수는 Collection, Sequence 프로토콜을 준수하는 타입에서 사용이 가능합니다. 예를 들면 Array, Dictionary, Set, Optional 등에서 사용이 가능하겠군요! map 함수는 자기 자신을 호출할 때 매개변수로 전달된 함수를 이용하여 새로운 컨테이너를 생성하여 반환하는 역할을 합니다. 이해하기 조금 어렵다면 아래 예제코드를 참고해주세요!

 

예제

아래 코드는 map을 사용하여 각 숫자에 2를 곱한 새로운 배열을 생성하는 코드입니다. 위에서 map은 매개변수로 전달된 함수를 이용하여 새로운 컨테이너를 생성해 반환한다고 말했었죠?? 아래처럼 숫자에 2를 곱하는 함수를 선언하고 map의 매개변수로 전달하면 map을 통해 배열의 모든 요소로 multiply 함수를 실행해 새로운 배열을 만들어 반환하게 됩니다!

let numbers = [0,1,2,3]
func multiply(_ number: Int) -> Int {
    return number * 2
}

print(numbers.map(multiply))    // [0,2,4,6]

하지만 여기서 클로저를 떠올리신 분이 계신가요?? 함수는 named closure라고 했었죠! 그럼 map 함수에 unnamed closure를 사용할 수는 없을까요?? 답은 사용할 수 있습니다! 또, 아래처럼 다양한 방법으로 단축해 사용할 수도 있습니다. 하지만 매번 말하듯 단축문법을 사용할 때는 가독성을 생각하여 작성해야 된다는 것을 기억하면 좋을 것 같네요!!

let numbers = [0,1,2,3]

let new_numbers = numbers.map { (number) -> Int in
    return number * 2
}

let new_numbers = numbers.map { (numbers) -> Int in
    numbers * 2
}

let new_numbers = numbers.map { $0 * 2 }

print(new_numbers)    // [0,2,4,6]

 

filter

filter는 어떠한 조건을 충족하는 값들을 추출해 새로운 컨테이너를 반환하는 함수입니다. map과 동일하게 매개변수로 함수를 받아 처리하는 것은 똑같지만 filter는 조건에 맞는 값을 추출하기 때문에 함수의 반환타입이 Bool 타입이어야 합니다.

let numbers = [0,1,2,3]

func even(_ number: Int) -> Bool {
    if number % 2 == 0 {
        return true
    } else {
        return false
    }
}

print(numbers.filter(even))

물론 map과 동일하게 클로저를 활용할 수도 있습니다!! 아래 코드의 세가지 방법은 모두 동일한 결과를 출력하게 됩니다.

let numbers = [0,1,2,3]

let new_numbers = numbers.filter({ number in
    if number % 2 == 0 {
        return true
    } else {
        return false
    }
})

let new_numbers = numbers.filter({ number in
    return number % 2 == 0
})

let new_numbers = numbers.filter({ $0 % 2 == 0 })

print(new_numbers)

 

reduce

reduce는 직역하면 줄이다 라는 뜻을 가지지만 swift에서 reduce는 결합하다 라는 의미로 쓰입니다. 또, map과 filter와는 다르게 반환 타입이 배열이 아닌 값이라는 점입니다. 자세한 건 예제 코드를 보며 설명하겠습니다!

 

예제

아래 코드는 배열의 모든 요소를 더한 값을 반환하는 코드입니다. reduce의 첫번째 매개변수는 반환 값의 초기 값을 지정해주고 두번째 매개변수에 값을 계산할 함수를 넣어주면 됩니다.

func add(_ first: Int, _ second: Int) -> Int {
    return first + second
}

print(numbers.reduce(0, add))    // 6

물론 map, filter와 마찬가지로 클로저를 활용할 수도 있습니다. 동일하게 단축문법도 사용할 수 있습니다.

let numbers = [0,1,2,3]

let new_numbers = numbers.reduce(0) { (first, second) in
    return first + second
}    // 6

let new_numbers = numbers.reduce(0) { (first, second) in
    first + second
}    // 6

let new_numbers = numbers.reduce(1) { $0 + $1 }    // 7

 

 

오늘은 고차함수에 대해 알아보았습니다! 처음 접할 때는 '이게 뭐지..' 할 수도 있지만 실제로 개발할 때도 많이 사용하게 되고 사용하다보면 많은 편리함을 느낄 수 있으니 꼭 직접 사용해보면서 이해하시면 많은 도움이 될 수 있을 것 같습니다.😀

'Swift' 카테고리의 다른 글

[Swift] Closure(클로저)란?  (0) 2023.06.21
[Swift] 예외처리(try-catch)  (0) 2023.06.18
[Swift] Extension(익스텐션)이란?  (0) 2023.06.15
[Swift] Protocol(프로토콜)이란?  (0) 2023.06.13
[Swift] 열거형(Enumeration)이란?  (0) 2023.06.11