고차 함수(Higher-order function)

썹스·2022년 11월 6일
0

Swift 문법

목록 보기
37/68

고차 함수(Higher-order function)

함수를 파라미터로 사용하거나, 함수의 실행 결과를 함수로 return 하는 함수를 고차 함수(Higher-order function)라고 부릅니다.

고차 함수는 스퀀스(Sequence), 컬랙션(Collection) 프로토콜을 따르는 컬렉션(배열, 딕셔너리, 세트 등)에 기본적으로 구현되어 있습니다.

Swift에는 사용자의 편의를 위해 기본적으로 구현되어있는 고차함수가 몇 개 존재하며, 그중에서 가장 대표적인 고차함수는 map{ }, filter{}, reduce(){} 입니다.


📌 맵(map) 함수

  • 맵(map) 함수는 기존 컨테이너(배열, 딕셔너리, 세트 등의 저장공간) 공간의 데이터를 새롭게 매핑한뒤, 새로운 컨테이너를 반환하는 함수입니다.

  • 기존 컨테이너의 데이터는 변경되지 않습니다. (원본값 유지)

✅ 맵(map) 함수 (축약 표현 없이 사용)

let numArr = [1,2,3,4,5]

var newNumArr = numArr.map{(n: Int) -> String in
    return "\(n)!"
}

print(newNumArr)  // ["1!", "2!", "3!", "4!", "5!"]

✅ 맵(map) 함수 (축약 표현 사용) ⭐️

let numArr = [1,2,3,4,5]

var newNumArr = numArr.map{
    "\($0)!"
}

print(newNumArr)  // ["1!", "2!", "3!", "4!", "5!"]

📌 필터(filter) 함수

  • 필터(filter) 함수는 컨테이너 내부의 데이터를 걸러내서 새로운 컨테이너로 할당/반환하는 함수입니다.

  • 조건식에서 참(true)을 만족하는 데이터(컨테이너 내부 데이터)만을 걸러냅니다.

✅ 필터(filter) 함수 (축약 표현 없이 사용)

let numArr = [1,2,3,4,5,6,7,8,9]

var newNumArr = numArr.filter{(n: Int) -> Bool in
    return n % 2 == 0   // 배열의 값이 짝수이면 true 반환 / true인 데이터만 걸러냄
}

print(newNumArr)  // [2, 4, 6, 8]

✅ 필터(filter) 함수 (축약 표현 사용) ⭐️

let numArr = [1,2,3,4,5,6,7,8,9]

var newNumArr = numArr.filter{
    $0 % 2 == 0   // 배열의 값이 짝수이면 true 반환
}

print(newNumArr)  // [2, 4, 6, 8]

📌 리듀스(reduce) 함수

  • 리듀스(reduce) 함수는 컨테이너 내부의 데이터를 하나로 통합(연산)하여 반환하는 함수입니다.

✅ 리듀스(reduce) 함수 (축약 표현 없이 사용)

let numArr = [1,2,3,4,5,6,7,8,9]

var resultValue = numArr.reduce(0, {(a: Int, b: Int) -> Int in
    return a + b
})

print(resultValue)  // 45

✅ 리듀스(reduce) 함수 (축약 표현 사용) ⭐️

let numArr = [1,2,3,4,5,6,7,8,9]

var resultValue = numArr.reduce(0){  // reduce(초기값)
    $0 + $1
}

print(resultValue)  // 45

📌 포이치(forEach) 함수

  • 포이치(forEach) 함수는 기존 컨테이너의 데이터를 사용하여 특정 작업을 실행하는 함수입니다.

  • 맵(map) 함수와 기능면에서 비슷하지만, 새로운 컨테이너에 데이터를 할당할 필요가 없다는 특징을 가지고 있습니다.

✅ 포이치(forEach) 함수 (축약 표현 없이 사용)

let numArr = [1,2,3,4,5]
numArr.forEach{(n: Int) -> Void in
    print("\(n)!")
}

/*
 출력 결과
 1!
 2!
 3!
 4!
 5!
*/

✅ 포이치(forEach) 함수 (축약 표현 사용) ⭐️

let numArr = [1,2,3,4,5]
numArr.forEach{
    print("\($0)!")
}

/*
 출력 결과
 1!
 2!
 3!
 4!
 5!
*/

📌 컴팩트맵(compactMap) 함수

  • 컴팩트맵(compactMap) 함수는 옵셔널 타입으로 정의된 컨테이너에서 "nil"값을 제외한 데이터를 새로운 컨테이너에 할당/반환하는 함수입니다.

  • "nil"값이 아닌 옵셔널 타입의 데이터는 자동으로 옵셔널 바인딩 되어 새로운 컨테이너에 할당됩니다.

✅ 컴팩트맵(compactMap) 함수 (축약 표현 사용) ⭐️

let strArr: [String?] = ["h","e",nil,"l","l",nil,"o"]
var newStrArr = strArr.compactMap{
    $0
}

print(newStrArr)  // ["h", "e", "l", "l", "o"]

📌 플랫맵(flatMap) 함수

  • 플랫맵(flatMap) 함수는 중첩된 컨테이너를 하나의 컨테이너로 새롭게 매핑하는 함수입니다.

  • 플랫맵 함수는 한 번에 최대 한 겹의 중첩 컨테이너를 제거할 수 있습니다.

  • 즉, 중첩된 컨테이너를 하나의 평평한 컨테이너로 만들어주는 함수입니다.

✅ 플랫맵(flatMap) 함수 (축약 표현 사용) ⭐️

let arr = [["a","b","c"],["i","j","k"]]   // 이중 배열
var flatArr = arr.flatMap {
    $0
}

print(flatArr)  // ["a", "b", "c", "i", "j", "k"]  // 단일 배열

✅ 플랫맵(flatMap) 함수는 한 번에 한 겹의 중첩 컨테이너만 제거 가능 ⭐️

let arr = [[1,2,3], [[4,5,6], [7,8,9]]]  //[[이중], [[삼중], [삼중]]]
var flatArr = arr.flatMap {
    $0
}

print(flatArr)  // [1, 2, 3, [4, 5, 6], [7, 8, 9]]  => [단일, [이중], [이중]]
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글