7.4.2 클로저 표현식과 경량 문법
클로저 표현식은 주로 인자값으로 사용되는 객체인 만큼, 간결성을 극대화하기 위해 생략할 수 있는 구문들로 이루어져 있습니다. 필요에 따라 여러 부분을 생략할 수 있습니다. 배열의 정렬 메서드 예제를 통해 실제로 클로저 표현식에 적용되는 경량 문법에 대해 더 알아봅시다.
정수로 이루어진, 정렬되지 않은 배열 하나를 만들겠습니다.
var value = [1,9,5,7,3,2]
기본적으로 정렬은 두 값의 비교를 반복하는 알고리즘입니다. 작은 값을 앞으로, 큰 값을 뒤로 배치하는 과정을 반복합니다. 즉 정렬의 기준은 두 개의 값을 비교하여 어느 것이 더 큰지만 판단할 수 있으면 충분합니다. 정렬 기준이 되는 함수를 작성하고, 이를 sort(by:) 메서드의 인자로 넣어 정렬해보겠습니다.
func order(s1: Int, s2: Int) -> Bool {
if s1 > s2 {
return true
} else {
return false
}
}
value.sort(by: order)
// [9,7,5,3,2,1]
함수 order는 두 인자값을 비교해 첫 번째 인자가 크면 true, 아니면 false를 반환합니다. 이 기준에 따라 내림차순 정렬이 실행됩니다. 이번에는 order를 클로저 표현식으로 바꿔보겠습니다.
{
(s1: Int, s2: Int) -> Bool in
if s1 > s2 {
return true
} else {
return false
}
}
이를 사용하여 정렬을 해보겠습니다.
value.sort(by: {
(s1: Int, s2: Int) -> Bool in
if s1 > s2 {
return true
} else {
return false
}
})
// [9,7,5,3,2,1]
이를 더 간결한 표현식으로 적용해 보겠습니다.
{ (s1: Int, s2: Int) -> Bool in
return s1 > s2
}
value.sort(by: { (s1: Int, s2: Int) -> Bool in return s1 > s2 })
s1 > s2 구문은 Bool 값을 리턴하므로 코드가 간결하게 바뀌었습니다. 이번에는 타입 어노테이션을 제거하여 더 간결하게 바꿔보겠습니다.
{ s1, s2 in return s1 > s2 }
value.sort(by: { s1, s2 in return s1 > s2 })
아직 끝나지 않았습니다. 이제는 매개변수마저 생략할 수 있습니다. 매개변수명 대신 $0, $1, $2... 와 같은 이름으로 내부 상수를 이용할 수 있습니다. 이 값은 입력받은 인자값의 순서대로 매칭됩니다. 첫 번째 인자값이 $0, 두 번째 인자값이 $1에 할당됩니다. 매개변수가 생략되면 실행 구문만이 남습니다. 이 때문에 in 키워드로 실행 구문과 선언 구문을 분리할 필요도 없으므로 in 키워드도 지워집니다. 결국 남는 것은 다음과 같습니다.
{ return $0 > $1 }
여기서 return도 생략할 수 있습니다. return을 생략해서 적용하면,
value.sort(by: { $0 > $1 })
sort 메서드에서는 클로저 표현식보다 더 간결하게 표현할 수 있는 방법도 있습니다. 연산자 함수라고 부르는데, 연산자만을 사용하여 의미하는 바를 정확히 나타낼 수 있을 때 사용됩니다.
value.sort(by: >)
이렇게 다양한 형태로 클로저를 사용할 수 있습니다.
Last updated