요즘 많은 IT직군에서 자기들이 쓰는 언어로 알고리즘 테스트를 본다. 만약에 안드로이드 개발을 원하는 사람들은 Java나 Kotlin으로 알고리즘 테스트를 볼 수 있고 IOS 개발을 원한다면 아마 Swift로 알고리즘 테스트를 볼 것이다. 또한 어떤 언어에서 알고리즘 테스트를 공부하던지 배열이 매우 많이 쓰이는 것을 알고 있을 것이다. 오늘은 배열에서 보다 간결하게 그 배열원소들을 정리할 수 있는 함수들을 알아보려한다. 3가지 모두 매우 중요하므로 잘 알아두자!!
1. map, filter, reduce 3가지 함수의 공통점
map함수와 filter함수 그리고 reduce함수의 공통점은 바로 매개변수로 함수를 받는 다는 것이다. 우리는 그리고 이러한 함수를 고차함수라고 부른다. 예를 들면 우리가 map함수를 실행했을때 우리는 그 인자로 클로져를 넘겨줘야한다. 자! 그러면 일단은 바로 map부터 알아보면서 이해해보자!
2.map함수
map은 기존의 배열에서 배열들 속에 있는 원소들을 연산변형 또는 형변형을 시킬 수 있는 함수이다. 다음의 코드를 보자
Arr이라는 배열의 각각의 원소를 2배해주는 map함수의 용법을 보면 클로저를 인자로 통을 받고 있다.
({}중괄호 안에 있는 것을 통으로 클로저라고 합니다! 클로저의 개념을 모르면 꼭 선행하세요~!!)
String으로 바꿔주는 함수와 Int로 바꾸는 map함수 모두 map이라는 함수가 인자로 클로저를 받고 있다.
정리하면 map이라는 함수는 각 원소마다 인자로 받은 클로저(f)를 실행해서 그 결과를 새로운 Arr로 만드는 것이다.
결과를 보면 잘 나온 것을 볼 수 있다.
3. filter함수
filter 함수는 함수의 이름에서도 느낄 수 있듯 걸러주는 함수이다. 만약 1부터 10까지의 숫자로 이루어진 배열에서 3의 배수만을 걸러서 새로운 배열로 만들고 싶다면 다음의 코드가 도움이 될 것이다.
filter 함수는 map과 같이 클로저를 인자로 받지만 주목해야할 점은 클로저가 반환하는 것이 바로 Bool로 되어있다는 것이다. 그래서 그 Bool이 True인 것만 살아남아 newArr의 원소가 된다. 결과는 다음과 같다.
4. reduce함수
reduce함수는 map과 filter함수와 다르게 조금은 복잡하다. reduce함수의 주된 목적은 결합이라고 할 수 있다. 이름과는 상당히 다르지만
한번 예시를 보며 알아보자!
과정을 보면 reduce 안의 인자는 시작인자이다. 그 후 뒤에 오는 클로저의 첫번째 인자인 result인자에 시작인자가 들어오고 바로 뒤의 next인자는 시작인자와 연산을 할 Arr배열의 첫번째 원소이다. 그 후 result+next를 출력후 리턴하면 그 리턴값은 다시 reduce함수의 인자가 되고 그것은 또 뒤의 클로저인 result의 첫번째 result인자가 된다 그리고 next인자는 이제 Arr배열의 2번째 원소가 된다. 이런 식으로 Arr배열의 길이만큼 반복된 후 마지막 return값은 sum에 지정된다. 그래서 결과를 보면
다음과 같다. 하지만 reduce함수는 형식이 하나 더 있다. 다음의 예에서 왜 하나의 형식이 더 있어야하는지 알아보자.
이것은 배열의 성분들을 모두 대문자로 바꾸려는 시도를 reduce함수를 이용하여 하려한다. 여기서 보면 error가 일어나는데 그 이유는 result가 let으로 정의되므로 이것에 append함수를 쓸 수 없다는 것이다.(let은 상수이므로 변경이 안됩니다!)
그래서 이것을 가능하게 하려는 시도가 바로 다음과 같은 형식이다.
클로저의 return이 없고 시작인자가 into 그리고 클로저의 첫번째 인자가 inout매개변수이다. 이렇게 하면 모든 과정은 똑같이 돌아가지만 result가 변수로 인식되므로 정상적으로 작동된다. 결과는 다음과 같다.
5. 마무리
map과 filter그리고 reduce는 알고리즘을 한다면 절대 모르면 안되는 함수들이다. 같은 목적을 위해서도 다양한 결합이 가능하므로 언제나 다양하게 생각하는 방식이 중요하다
---------------읽어주셔서 감사합니다~!!------------------
'Swift Deeep Dive' 카테고리의 다른 글
[Swift]오류처리(2) (0) | 2020.08.16 |
---|---|
[Swift] 오류처리(1) (0) | 2020.08.09 |
[Swift] ARC에 관한 문제 해결하기(클로저에 관하여) (0) | 2020.07.25 |
[Swift] ARC에 관한 문제 해결하기(클래스에 관하여) (0) | 2020.07.19 |
[Swift] ARC의 정의와 발생될 수 있는 문제점 (0) | 2020.07.10 |