티스토리 뷰

언어 소개 - Swift

Swift - 클로저

최초의 펭귄 2018. 6. 2. 12:30

안녕하세요. 오늘은 Swift의 가장 강력한 기능 중 하나이자
Rx프로그래밍을 하면 자주 사용하게 되는 클로저에 대해 알아보겠습니다.

일급 객체

일급 객체라는 말은 함수형 프로그래밍을 하다보면 자주 만나게 되는 말입니다.
아래 3가지 조건을 충족하면 1급 객체라고 할 수 있습니다.

  1. 변수나 데이터로 할당 할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 반환 값으로 리턴 할 수 있어야 한다.

Swift에서 함수는 일급 객체입니다.
다른 말로는 Swift에서는 함수를 인자로, 반환 값으로, 변수나 상수에 할당 할 수 있습니다.

클로저

Swift의 클로저는 함수를 블럭의 모양으로 표현하는 것입니다.

Swift의 클로저는 함수의 매개변수와 반환타입을 생략할 수 있는 축약 문법을 지원하며
클로저의 코드가 한 줄이라면 그 코드의 반환값을 클로저 자신의 반환값으로 알아서 유추합니다.

또한 Swift의 클로저는 자신의 주변의 참조나 값을 획득하고 저장합니다.
Swift에서는 이를 클로징이라고 부르며 여기에서 클로저의 이름을 착안하였습니다.

후행 클로저

Swift는 함수가 일급 객체입니다. 그렇기에 함수의 인자와 반환 값으로 함수를 사용할 수 있습니다.
후행 클로저는 함수를 인자로 사용하는 상황에 유용하게 사용할 수 있습니다.
클로저는 함수이기에 인자로 클로저를 사용할 수 있으며 만약 함수를 마지막 전달인자로 전한다면
소괄호를 닫은 뒤에 클로저를 선언할 수 있습니다.
(만약 전달인자가 함수 하나라면 소괄호도 생략할 수 있습니다.)

func action(fun: () -> Void){
    fun()
}

action(fun: { print("hello world") })
action{ print("hello world") }

func action2(num: Int, fun: () -> Void){
    print("\(num)")
    fun()
}

action2(num: 1, fun: { print("hello world") })
action2(num: 1){ print("hello world") }

이러한 문법을 통해 간결한 코드 작성이 가능합니다.

Swift의 연산자는 함수입니다.
그렇기에 인자만 같다면 연산자를 파라미터나 반환 값으로 넘기는 것 역시 가능합니다.
(Swift에서 함수는 일급객체이기 때문입니다.)

값 획득

클로저는 자신이 정의된 위치 주변의 값이나 참조를 획득하여 저장할 수 있습니다.
이러한 동작을 통해 비동기 처리에서 주변의 값이나 참조를 사용할 수 있습니다.
(하지만 클로저의 값 획득이라는 동작 때문에 순환 참조가 발생합니다...)

탈출 클로저

함수의 인자로 전달된 클로저가 함수의 모든 동작이 끝난 후에 호출된다면
클로저가 함수를 탈출했다고 말합니다.

탈출 클로저를 사용하기 위해 @escaping이라는 어노테이션을 선언하여야 합니다.

자동 클로저

함수의 인자로 전달되는 표현을 알아서 클로저로 변환하는 클로저를 자동 클로저라고 합니다.
자동 클로저는 인자를 같지 않는 함수의 모양이며
자신이 감싸고 있는 코드의 결괏값을 반환하는 클로저입니다.

자동 클로저는 클로저가 호출되기 전까지 내부의 코드를 동작하지 않습니다.
따라 연산을 지연시킬 수 있다는 장점이 있습니다.

func action(_ fun: @autocloser () -> String){
    print(fun())
}

action("hello world")

자동 클로저로 선언한 인자에서는 클로저를 받는 대신 클로저의 반환 값을 인자로 받으며
인자로 들어온 값을 반환하는 클로저를 자동으로 변환합니다.
만약 인자로 어떠한 함수의 동작을 넣었다면
위에 말하였듯이 클로저가 호출되지 전까지 함수의 동작을 실행하지 않는다는 것을 기억하세요!

마치며

오늘은 Swift의 클로저를 알아보았습니다.
iOS를 개발하면서 통신의 결과를 통해 화면을 변화하기 위해
탈출 클로저와 후행 클로저를 자주 사용하였으며
RxSwift를 하면서 클로저의 축약된 문법을 자주 사용하였습니다.
클로저는 정말 매력적인 문법이지만
클로저를 정말 강력하게 사용하려면 ARC의 특징을 생각하며
순환참조 문제를 해결할 수 있는 방법으로 개발하여야 할 것 입니다.

질문은 하단의 댓글로 남겨주시면 아는만큼 답변하겠습니다.

감사합니다!

'언어 소개 - Swift' 카테고리의 다른 글

Swift - 서브스크립트  (0) 2018.06.03
Swift - 접근지정자  (1) 2018.06.02
Swift - 프로퍼티  (0) 2018.06.01
Swift - 클래스와 구조체  (0) 2018.05.31
Swift - 옵셔널  (0) 2018.05.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday