기본 문법 공부(함수형 프로그래밍과 스위프트 - 기본 클로저)
이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.
예제 코드
참고 자료
기본 클로저
-
스위프트 표준 라이브러리에는 배열의 값을 정렬하기 위해 구현한 ‘sorted(by:)’ 메서드가 있다.
-
sorted(by:) 메서드는 클로저를 통해 어떻게 정렬할 것인가에 대한 정보를 받아 처리하고 결괏값을 배열로 돌려준다.
-
단순히 정렬만 하기 때문에 입력받은 배열의 타입과 크기가 동일하다.
-
기존의 배열은 변경하지 않고 정렬된 배열을 새로 생성하여 반환해준다.
-
// 스위프트 라이브러리의 sorted(by:)메서드 정의
public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
Sorted(by:) 메서드를 이용하여 설명하는 클로저(Closure) - 1
-
위의 이름 배열을 이용, String 타입의 배열에 이름을 넣어 영문 알파벳을 내림차순으로 정렬할 것이다.
-
sorted(by:) 메서드는 (배열의 타입과 같은 두 개의 매개변수를 가지며 Bool 타입을 반환하는) 클로저를 전달인자로 받을 수 있다.
-
반환하는 Bool 값은 첫 번째 전달인자 값이 새로 생성되는 배열에서 두 번째 전달인자 값보다 먼저 배치되어야 하는지에 대한 결괏값이다.
- true를 반환하면 첫 번째 전달인자가 두 번째 전달인자보다 앞에 온다.
-
-
위의 그림에 나오는
함수는 매개변수로 String 타입 두 개를 가지며, Bool 타입을 반환하는 함수이다.
-
위의 그림에서 보면
구현된 함수를 'sorted(by:)'메서드의 전달인자로 전달하여 'reversed'라는 이름의 배열로 반환받는다.
-
전달받는 두 전달인자는 정렬에 참고할 값이고, 반환될 값은 첫 번째 전달인자가 앞으로 배치될지 뒤로 배치될지에 대한 Bool 타입 값이다.
-
함수는 클로저의 한 형태이다.
-
만약 first 문자열이 second 문자열보다 크다면 backwards(first:second:) 함수의 반환값은 true가 될 것이다.
-
즉, 값이 더 큰 first 문자열이 second 문자열보다 앞쪽에 정렬되어야 한다는 뜻이다.
-
‘문자열이 크다’ 라는 뜻은 ‘알파벳이 더 뒤쪽이다’라는 뜻이다.
- 예를 들어 ‘B’는 ‘A’보다 큽니다. 혹은 ‘vincent’는 ‘ron’보다 큽니다.
-
Sorted(by:) 메서드를 이용하여 설명하는 클로저(Closure) - 2
-
위의 함수에서 보면 first > second 라는
반환 값을 받기 위해 너무 많은 표현을 사용했다.
함수 이름부터 매개변수 표현까지 부가적인 표현도 많다.
-
이를
클로저 표현을 사용해서 조금 더 간결하게 표현 할 수 있다.
-
클로저 표현은 통상 아래 형식을 따른다.
{ (매개변수들) -> 반환타입 in
실행 코드
}
-
클로저도 함수와 마찬가지로 입출력 매개변수(In-Out Parameters)를 사용할 수 있다.
-
매개변수 이름을 지정한다면 가변 매개변수(Variadic Parameters) 또한 사용이 가능하다.
-
다만 클로저는 매개변수 기본값(Default Parameter Value)을 사용할 수 없다.
Sorted(by:) 메서드를 이용하여 설명하는 클로저(Closure) - 3
-
위의 그림은 ‘Sorted(by:) 메서드를 이용하여 설명하는 클로저(Closure) - 1’의 그림에 나오는 함수
backwards(first:second:) 함수를 클로저 표현으로 대체한것이다.
-
sorted(by:) 메서드로 전달하는 클로저의 매개변수 개수와 타입, 그리고 반환 타입 모두 backwards(first:second:) 함수와 같다.
- 위의 그림을 보면
처음보다 코드가 훨씬 간결해지고 직관적으로 바뀌었다.
- 위의 그림을 보면
-
위와 같이 프로그래밍하면 sorted(by:) 메서드로 전달되는 backwards(first:second:) 함수가 어디에 있는지, 어떻게 구현되어 있는지 찾아다니지 않아도 된다.
-
물론,
반복해서 같은 기능을 사용하려면 함수로 구현해두는 것도 나쁘지 않다.