이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


참고 자료


클로저(Closure)

  • 스위프트의 함수형 프로그래밍 패러다임을 접할 때 꼭 알아야 할 요소 중 하나가 바로 클로저(Closure)이다.

  • 클로저를 잘 이해해야 스위프트의 함수형 프로그래밍 패러다임 스타일을 좀 더 명확하게 이해할 수 있다.

  • 클로저(Closure)와 제네릭(Generics), 프로토콜(Protocol), 모나드(Monad)등이 결합해서 스위프트는 강력한 언어가 되었다.

  • 스위프트의 클로저는 C 언어나 Objective-C의 블록(Block) 또는 다른 프로그래밍 언어의 람다(Lambda)와 유사하다.

  • 클로저는 일정의 기능을 하는 코드를 하나의 블록으로 모아놓은 것을 말한다.

  • 함수는 클로저의 한 형태이다.

  • 클로저는 변수나 상수가 선언된 위치에서 참조(Reference)를 획득(Capture)하고 저장할 수 있다.

    • 이를 변수나 상수의 클로징(잠금)이라고 하며 클로저는 여기서 착안된 이름이다.

    • 획득(Capture) 때문에 메모리의 부담에 대해 생각할 수도 있지만, 스위프트는 스스로 메모리를 관리한다.

  • 클로저의 몇 가지 모양 중 하나가 함수이다.


클로저의 세 가지 형태

  • 함수가 클로저의 몇 가지 모습 중 하나에 속한다는 것을 확인해볼 수 있다.

    • 1), 이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태.

    • 2), 이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태.

    • 3), 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태.


클로저의 다양한 표현 방법

  • 클로저를 빼놓고는 스위프트를 논할 수 없을 만큼 클로저는 매우 중요하다.

  • 클로저는 다양하게 다음과 같이 표현할 수 있다.

    • 1), 클로저는 매개변수와 반환값의 타입을 문맥을 통해 유추할 수 있기 때문에 매개변수와 반환 값의 타입을 생략할 수 있다.

    • 2), 클로저에 단 한 줄의 표현만 들어있다면 암시적으로 이를 반환 값으로 취급한다.

    • 3), 축약된 전달인자 이름을 사용할 수 있다.

    • 4), 후행 클로저 문법을 사용할 수 있다.


클로저의 문법과 표현 방법에 대한 간략한 설명

  • 중첩 함수함수 안에 포함된 하나의 클로저 형식이었다.

    • 그런데 이렇게 함수를 중첩하여 사용하기보다는 조금 더 간단한 형태로 함수처럼 사용하고 싶을 수 있고 또는 함수 내부에서 다른 함수를 사용할 때 내부 함수에 이름을 붙일 필요가 없을 수 있다.

      • 이런 여러가지 경우에 함수 또는 메서드의 전달인자로 함수를 받아오면 된다.
  • 클로저 표현 방법은 클로저가 함수의 모습이 아닌 하나의 블록의 모습으로 표현될 수 있는 방법을 의미한다.

  • 클로저 표현 방법은 클로저의 위치를 기준으로 크게 기본 클로저 표현과 후행 클로저 표현이 있다.

    • 또, 각 표현 내에서 가독성을 해치지 않는 선에서 표현을 생략하거나 축약할 수 있는 방법이 있다.