[Swift] 고차 함수 (Higher-Order Function)

김형근·2024년 7월 25일

[Swift] 문법

목록 보기
20/20

🍎 고차 함수 (Higher-Order Function)

  • 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수를 뜻합니다.
  • Swift의 함수(클로저)는 일급 시민(일급 객체)이므로 함수의 전달인자로 전달하거나 함수의 결과값으로 반환할 수 있습니다.
  • Swift에서 자주 사용되는 고차함수는 'map', 'filter', 'reduce' 입니다.

🍏 고차 함수 소개

  • 고차 함수: 함수를 인자로 받거나 함수의 결과를 함수로 반환하는 함수.
  • 함수가 일급 시민이므로, 다른 함수의 인자로 넘기거나 함수의 반환값으로 사용 가능.
  • map, filter, reduce는 Swift의 표준 라이브러리에서 제공하는 주요 고차 함수

🍏 Map

  • 'map' 함수는 컨테이너 내부의 데이터를 변형하여 새로운 컨테이너를 생성합니다.

🧃 기존의 for 구문 사용

let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int] = []
var strings: [String] = []

for number in numbers {
    doubledNumbers.append(number * 2)
    strings.append("\(number)")
}

print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]

🧃 map 메서드 사용

  • 각 요소를 변형하여 새로운 배열을 생성합니다.
// numbers의 각 요소를 2배하여 새로운 배열 반환
doubledNumbers = numbers.map({ (number: Int) -> Int in
    return number * 2
})

// numbers의 각 요소를 문자열로 변환하여 새로운 배열 반환
strings = numbers.map({ (number: Int) -> String in
    return "\(number)"
})

print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
  • 후행 클로저 및 생략
// 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저 사용
doubledNumbers = numbers.map { $0 * 2 }

print(doubledNumbers) // [0, 2, 4, 6, 8]

🍏 filter

  • filter 함수는 컨테이너 내부의 값들을 조건에 맞게 걸러서 새로운 컨테이너로 추출합니다.

🧃 기존의 for 구문 사용

var filtered: [Int] = []

for number in numbers {
    if number % 2 == 0 {
        filtered.append(number)
    }
}

print(filtered) // [0, 2, 4]

🧃 filter 메서드 사용

  • 조건에 맞는 요소만 걸러내어 새로운 배열을 반환합니다.
// numbers의 요소 중 짝수를 걸러내어 새로운 배열로 반환
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in
    return number % 2 == 0
}

print(evenNumbers) // [0, 2, 4]

// 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저 사용
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 }

print(oddNumbers) // [1, 3]

🍏 reduce

  • reduce 함수는 컨테이너 내부의 모든 콘텐츠를 하나로 통합합니다.

🧃 기존의 for 구문 사용

let someNumbers: [Int] = [2, 8, 15]
var result: Int = 0

// someNumbers의 모든 요소를 더합니다
for number in someNumbers {
    result += number
}

print(result) // 25

🧃 reduce 메서드 사용

  • 컨테이너의 모든 요소를 초깃값과 함께 통합합니다.
// 초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다.
let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
    // print("\(first) + \(second)") // 어떻게 동작하는지 확인해보세요
    return first + second
})

print(sum)  // 25

// 초깃값이 0이고 someNumbers 내부의 모든 값을 뺍니다.
var subtract: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
    // print("\(first) - \(second)") // 어떻게 동작하는지 확인해보세요
    return first - second
})

print(subtract) // -25

// 초깃값이 3이고 someNumbers 내부의 모든 값을 더합니다.
let sumFromThree = someNumbers.reduce(3) { $0 + $1 }

print(sumFromThree) // 28

🍏 고차 함수 요약

  • 고차 함수는 코드의 가독성을 높이고, 반복적인 작업을 간결하게 처리할 수 있게 해줍니다.
  • map, filter, reduce 는 Swift에서 매우 유용하게 사용되는 고차 함수로, 각각 변형, 필터링, 통합의 역할을 합니다.
profile
꾸준히 기록하기

0개의 댓글