상세 컨텐츠

본문 제목

[Swift] 고차함수 map, filter, reduce를 완전 쉽게 알아보자

Swift

by Mr.Garlic 2022. 5. 17. 01:30

본문

Swift의 고차함수, map, filter, reduce를 알아보자

안녕하세요 이웃님들 방문자 여러분!

오늘은 고차함수 map, filter, reduce에 대해서 알아보려고 합니다!

 

그러려면 먼저 고차함수가 무엇인지 부터 알아야겠죠?

고차함수란? 

고차함수란 다른 함수를 전달 인자로 받거나, 함수 실행의 결과값을 함수로 반환하는 것을 말해요. 

음, 이게 무슨말이냐면! 어떤 함수에 return 값이 함수가 될 수 있고, 이 return 된 함수를 또 인자로 받는 함수가 있다는 거죠. 

 

Swift에서 일급객체가 되기 위한 4가지 조건이 있는데요.

 

1. 객체가 런타임에도 생성 가능하다.

2. 객체를 인자 값으로 전달할 수 있어야 한다.

3. 객체를 반환 값으로 사용할 수 있어야 한다.

4. 데이터 구조 안에 저장할 수 있어야 한다.

 

Swift는 이 조건에 함수도 부합합니다. 그래서 함수도 일급 객체가 되고, 이 함수를 인자 값으로 전달하거나 반환값으로 사용할 수 있는거죠! 

 

 

자 그러면 Swift에서 제공하는 대표적인 고차함수인 map, filter, reduce를 순차적으로 알아보도록 하겠습니다! 

 

map() 사용법

map은 기존의 데이터를 변형해서 새로운 배열로 만들어서 리턴을 해주는 메서드입니다. 

예를 들어서, 우리가 어떤 숫자의 배열을 가지고 있다고 해 볼게요. 이 숫자들이 각각 +1 된 배열을 또 만들고 싶어졌어요. 

그럴때 기존에는 for문을 돌려서 하나하나 +1을 해주고 새로운 배열에 담아줬겠죠?

map을 사용하면 그렇게 하지 않아도 됩니다! 

 

map의 장점은 이렇게 변형을 해주더라도 원본에는 변형을 가하지 않는 다는 점입니다. 이런 성질을 잘활용하면 좋겠죠?

 

let numbers: [Int] = [1, 3, 5, 7, 9]
var plueOne: [Int] = []

//map의 클로저를 생략없이 모두 표현하면 이런 모양이예요
plusOne = numbers.map({ (number: Int) -> Int in
    return number + 1
})


//생략 표현을 해주면 달러 사인을 활용해 인자의 인덱스를 표현하면서 아래와 같이 써줄 수 있어요.

var plueOne = numbers.map { $0 + 1 }

 

filter() 사용법

filter는 기존에 데이터 중에서 조건에 부합하는 원소들만 빼서 새로운 배열로 만들어서 리턴을 해주는 메서드입니다. 

마찬가지로 바로 예시를 볼게요. 

let numbers: [Int] = [1, 2, 3, 4, 6]
var isEven: [Int] = []

//filter의 클로저를 생략없이 모두 표현하면 이런 모양이예요
isEven = numbers.map({ (number: Int) -> Int in
    return number % 2 == 0 //2로 나누어서 나머지가 0이면 짝수겠죠?
})


//생략 표현

var isEven = numbers.map { $0 % 2 == 0 } // [2, 4, 6]

이렇게 클로저 내부의 조건에 부합하는 원소들만을 리턴해주는 것을 알 수 있어요. 참 간편하죠?

 

 

reduce() 사용법

마지막으로 reduce()는 내부의 데이터를 합쳐줄 때 사용합니다. 이 합쳐준다는 표현이 좀 애매하죠? 인자들을 차례로 돌면서 원하는 연산을 다~ 해준다음에 하나의 값을 리턴해 준다고 생각하시면 됩니다. 

 

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

//생략 표현 없이 작성한 모두 더해주기
//초기 값을 0으로 정해주었는데, 상황에 따라 바꿔주면 되겠죠? :) 
//내부 동작을 확인하기 위해 print를 해 줍니다.

let sum: Int = numbers.reduce(0, { (first: Int, second: Int) -> Int in
    print("\(first) + \(second)")
    return first + second
})



//빼기도 한번 해볼까요? 생략 표현을 해줍니다. 
//이번에는 초기값을 100으로 주어봤어요.
let minus: Int = numbers.reduce(100) { $0 - $1
}

print(sum)
// 0 + 1
// 1 + 2
// 3 + 3
// 6 + 4
// 10 + 5
// 리턴값 15

print(minus)
//85

 

어때요? 생각보다 간단하지요? 그리고 알고리즘 문제를 풀 때나, 실제로 앱을 만들때도 많이 쓰이니 알아두면 참 좋을 것 같습니다!

오늘의 포스팅은 여기까지 입니다~ 

 

관련글 더보기