클로저란 무엇일까? 클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다. (Reference Capture) Closure란 내부 함수와 내부 함수에 영향을 미치는 주변 환경을 모두 포함한 객체이다.

클로저와 함수는 참조타입

<aside> 💡 클로저는 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것을 말합니다.

함수를 만들어 변수에 할당하고, 해당 변수를 사용하여 해당 함수를 호출하고, 해당 함수를 다른 함수에 매개 변수로 전달할 수도 있습니다. 이러한 방식으로 사용되는 함수를 클로저라고 하며 함수처럼 작동하지만 약간 다르게 작성됩니다.

클로저를 사용하는 가장 일반적인 이유 중 하나는 기능을 저장하는 것입니다.

사용자의 코드 안에서 전달되어 사용할 수 있는 기능이며 이 기능을 포함하는 독립적인 블럭임. Swift에 클로저는 C와 Objective-C 언어의 블럭과 유사하며 다른 언어의 람다와도 유사함. 클로저는 저신이 정의된 컨텍스트로부터 임의의 상수와 변수에 참조(reference)를 획득하고 저장할 수 있음. 이는 상수와 변수를 제약하는 특징으로 “클로저”라는 이름이 유래됨. Swift는 획득한 모든 메모리 관리를 다룸.

</aside>

클로저에는 크게 세 가지 형태가 존재한다.

애플은 클로저가 정갈하고 깔끔한 스타일이라고 주장하는데, 나는 굉장히 반대...하지만 클로저는 스위프트를 사용함에 있어서 필수적이기 때문에...싫어도 꼭 알고 자유롭게 사용할 줄 알아야 한다!

가장 중요한 클로저의 표현방법은 4가지가 있는데,

//클로저의 기본형식

{ (parameters) -> return type in
    statements
}

{ (매개변수들) -> (리턴 타입) in
	실행코드
    }

후행 클로저(Trailing Closures)

한줄에 쓸 수 없는 클로저를 작성할 때 아주 유용함.

함수나 메서드의 마지막 전달인자로 위치하는 클로저는 메서드의 소괄호를 닫은 후 작성해도 된다. 이것이 후행 클로저. 훨씬 간결하고 가독성이 좋게 변환할 수 있다.

// 소괄호를 생략 안한 경우.
let test:[String] = names.sorted(){ (fst:String, second: String) -> Bool in 
		return fst>second }

// 소괄호까지 생략한 경우
let test:[String] = names.sorted{ (fst:String, second: String) -> Bool in 
		return fst>second }

<aside> 💡 함수 표현식은 함수의 인자 하나뿐이며 후행 클로저로 표현식을 작성하면, 함수 호출 시 함수 이름 뒤에 괄호를 쓸 필요가 없음.

</aside>