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