함수(3)

중첩함수

중첩함수란? 함수 내에 다른 함수를 작성하여 사용하는 것이다. 함수 내부에 작성하는 함수에는 제한이 없다. 외부 함수의 경우 프로그램과 생사를 같이하며 내부 함수의 경우 외부 함수와 생사를 같이 한다. 내부 함수는 외부 함수를 거치지 않고서는 접근할 수 없다. 이를 통해 외부의 코드로부터 차단할 수 있으며 이를 함수의 은닉성이라고 한다.

func outer() -> String {
    func inner() -> String {
        return "inner 함수의 리턴"
    }
    return inner()
}

print(outer()) //inner 함수의 리턴

그러나 다음과 같은 경우 함수의 은닉성을 해제하고 내부 함수의 생명 주기를 변경할 수 있다.

func outer(inputValue01: Int) -> (Int) -> String {
    func inner(inputValue02: Int) -> String {
        return "결과값은 \(inputValue01 + inputValue02) 입니다."
    }
    return inner
}

let case01 = outer(inputValue01: 10) //outer 함수의 결과로 inner 함수가 할당된다.
let case02 = case01(5) //결과값은 15 입니다.

위 경우, case01에 내부 함수가 할당되어 outer 함수가 종료되어도 계속해서 사용이 가능하다. 만약 내부 함수가 외부 함수의 지역 상수 혹은 지역 변수를 참조하고 있다면 소멸되지 않는다.

익명함수(closure)

클로저는 함수를 작성하는 키워드인 func와 함수명을 생략하여 작성한다. 클로저의 시작은 중괄호{ 이며, 일반 함수의 블록은 in 으로 대체된다.

var a = { () -> () in
    print("클로저가 실행된다")
}() //클로저가 실행된다

클로저는 상황에 따라 축약이 가능하다.

var array: [Int] = [1, 4, 2, 7, 3]

array.sort(by: {(s1: Int, s2: Int) -> Bool in
    if s1 > s2 {
        return true
    } else {
        return false
    }
}) //[7, 4, 3, 2, 1]

array.sort(by: {(s1: Int, s2: Int) -> Bool in return s1 > s2}) //[7, 4, 3, 2, 1]

array.sort(by: {(s1: Int, s2: Int) in return s1 > s2}) //[7, 4, 3, 2, 1] -> 반환값 생략

array.sort(by: {s1, s2 in return s1 > s2}) //[7, 4, 3, 2, 1] -> 매개변수의 타입 생략

array.sort(by: {return $0 > $1}) //[7, 4, 3, 2, 1] -> 매개변수를 생략

array.sort(by: >) //[7, 4, 3, 2, 1] -> 연산자 함수만을 사용