본문 바로가기

swift 기본 문법

swift 고차함수 알아보기1(map, filter, reduce)

반응형

사실 고차함수에 대해서 알아보게 된 것은 swift 함수형 프로그래밍을 공부하다가 연관이 있기 때문에 넘어오게 되었다. 

 

고차함수란?

'다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수'라고 한다. 

 

스위프트에서 함수는 일급객체(일급시민)이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있다.

 

여기서 나오는 일급객체는 무엇인가??

https://declan.tistory.com/45

 

swift에서 일급 객체란? 알아보기

공부를 하다보면 모르는 용어가 있다. 이러한 용어들을 한번쯤은 정리하고 간다면 도움이 될 것 같다. 일급 객체란?? 다음과 같은 조건을 만족시킨다면 1급 객체라고 한다. 변수나 상수에 저장과

declan.tistory.com

 

오늘은 스위프트 표준라이브러리에서 제공하는 3가지 유용한 고차함수에 대해서 공부해 볼 것이다. 

  • map
  • filter
  • reduce

(다음 글에선 sort, sorted)

 

1. map

map 함수는 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다. 

map(_:)

Returns an array containing the results of mapping the given closure over the sequence’s elements.

Return Value

An array containing the transformed elements of this sequence.

예제로 int 배열을 string 배열로 바꿔보겠다. 

let numbers : [Int] = [1, 3, 4, 5, 8, 10]

var textArray: [String] = numbers.map({ aNumber in
    return "\(aNumber)입니다."
}) 
// ["1입니다.", "3입니다.", "4입니다.", "5입니다.", "8입니다.", "10입니다."]

또한 string 배열을 대문자, 소문자, 카운트 값을 구할 수 있다. 

let name : [String] = ["Denis", "White", "Henry", "Peach"]

var lowercaseName : [String] = name.map { aString in
    return aString.lowercased()
}
print(lowercaseName)
//["denis", "white", "henry", "peach"]
var upperCaseName : [String] = name.map { aString in
    return aString.uppercased()
}
print(upperCaseName)
//["DENIS", "WHITE", "HENRY", "PEACH"]
var textCount : [Int] = name.map { aString in
    return aString.count
}
print(textCount)
//[5, 5, 5, 5]

2. filter

filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다. 

filter(_:)

Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.

Return Value

An array of the elements that isIncluded allowed.

let numbers : [Int] = [1, 3, 4, 5, 8, 10]

var evenNumber : [Int] = numbers.filter { aNumber in
    return aNumber % 2 == 0
}
print(evenNumber)
//[4, 8, 10]

 

여기서 의문점 저 둘의 이용을 바꿔봐도 될까?

map filter

에러가 난 것을 알 수 있다. 

선언부분을 보면 그 이유를 알 수 있다. 

map

map함수는 제너럴T를 이용해 변환을 목적으로 사용하고 있다.

filter

filter 함수는 Bool값을 이용해 변환이 아닌 거르는 역할을 한다.

 

 

 

3. reduce

filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다. 

reduce(_:_:)

Returns the result of combining the elements of the sequence using the given closure.

Return Value

The final accumulated value. If the sequence has no elements, the result is initialResult.

앞의 두 함수보다는 복잡하다고 느꼈다.

reduce함수는 초기결과값을 받고(initialResult) nextPartialResult에는 (초기결과값과 자신의 elememt를 받는다.)

 

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
    x + y
})
// numberSum == 10

공식문서 선언 내용에 따르면 초기값은 0이고 x에 0이 대입된 상황에서 y에 numbers 배열이 들어가면서 더해지는 것 같다. 

 

이를 좀 더 명확하게 확인해보기 위해서 

let num: [Int] = []

var numberSub = num.reduce(2, {x, y in
    return x + y
})
print(numberSub) // 2

빈 int 배열을 만들고 

reduce함수의 초기값을 2로 선언하고 더해보면

결과는 2가 나온다. 

 

 

오늘은 고차함수에 대해서 알아봤는데 공식문서와 함께 공부하니 좀 더 이해하기 쉽고 명확하게 알 수 있었다. (아직은 어렵..)

 

 

참고

https://developer.apple.com/documentation/swift/array/reduce(_:_:) 

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/swift/array/map(_:)-87c4d 

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/swift/sequence/filter(_:) 

 

Apple Developer Documentation

 

developer.apple.com

https://yagom.github.io/swift_basic/contents/22_higher_order_function/

 

고차함수

야곰의 스위프트 기본 문법 강좌입니다.

yagom.github.io

 

반응형