Contents
클로저의 경량 문법아는 것을 남에게 설명해 주는 것은 좋은 학습법입니다. 내일배움캠프 iOS 트랙에서는 수강생이 돌아가며 학습에 개발 공부에 도움 되는 주제를 선정해 발표합니다. [초보자의 코딩 공부]에서는 내일배움캠프 수강생들이 공유한 코딩 지식과 학습법을 알려드립니다.
클로저(Closure)가 무엇이고 어떻게 사용하는지 알아보도록 하자.
클로저란?
클로저는 코드에서 전달하고 사용할 수 있는 자체 포함된 기능 블록입니다. Swift의 클로저는 다른 프로그래밍 언어의 클로저, 익명 함수, 람 다 및 블록과 유사합니다. 클로저는 정의된 컨텍스트에서 모든 상수 및 변수에 대한 참조를 캡처하고 저장할 수 있습니다. 이는 해당 상수와 변수를 닫는 것으로 알려져 있습니다. Swift는 캡처에 대한 모든 메모리 관리를 처리합니다. - 스위프트 공식문서 통번역본
클로저는 이름 없는 함수 즉, 코드 블록을 말합니다. 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다. 스위프트의 클로저는 주변 환경에 있는 변수나 상수를 캡처하여 저장하고, 이를 나중에 사용할 수 있도록 합니다. 이것은 클로저가 생성될 때 클로저가 참조하는 변수 또는 상수의 값에 대한 복사본을 유지하고 저장하는 메커니즘입니다. - 내일배움캠프 2주차 강의자료
공식 문서와 강의자료를 보면 ‘익명함수’, ‘이름 없는 함수’, ‘코드 블록’ 등이 공통적으로 명시되어 있다. 설명을 읽다 보면 익명함수, 참조를 캡처 등 알아듣지 못할 말들이 적혀있다.
- 함수 vs 클로저
그럼 도대체 클로저는 무엇일까? 클로저는 함수와 비슷한 개념이지만 다르다. 따지자면 클로저가 함수보다 더 큰 개념이다. 이름이 있는 클로저가 함수이며, 통상적으로 클로저는 이름 없는 함수(익명함수)를 뜻한다.
특성 | 함수 | 클로저 |
이름 | 이름 있음 | 이름이 없음 |
호출 | 이름을 사용하여 호출 | 직접적으로 호출 |
캡쳐 | 주변 환경 값을 캡쳐하지 않음 | 주변 환경 값을 캡쳐함 |
간결성 | 상대적으로 간결하지 않음 | 함수보다는 간결 |
- 캡처
캡처는 '붙잡다, 포획하다, 생포하다, 기록하다, 마음을 사로잡다' 등의 뜻을 지닌 영단어다. Closure는 값을 캡처하거나 참조를 캡처하여 코드 블록이 실행되는 시점에 해당 값을 사용할 수 있게 한다.
위 코드의
makeIncrementer
라는 함수는 클로저를 반환하는 함수다. 반환된 클로저는 외부 변수 total
을 캡처한다. 클로저가 반환된 후에도 total
변수는 여전히 유지되어 다음 호출에서도 그 값을 변경할 수 있다.위 코드에서 클로저는
instance
변수를 캡처하여 instance.value
를 업데이트한다. 클로저가 반환된 후에도 instance
의 참조는 유지되며, 클로저 호출 시마다 value
가 증가하게 된다.최종적으로는 이런 형태로 변한다.
클로저의 경량 문법
map 함수는 자주 보이는 함수이기도 하고 클로저를 파라미터로 받는 함수라서 map 함수로 예를 들어 경량문법을 설명해 보겠다.
- 기본 형태
- 타입추론
타입추론을 통하여 클로저의 매개변수와 반환 타입을 생략할 수 있다.
- 리턴타입 생략
타입 추론으로 리턴타입도 생략이 가능하다.
- 단일 표현식에서의 리턴 생략
코드 return문 하나만 남았을 경우 return문을 생략할 수 있다.
- 인자 이름 축약
파라미터를 인자 이름 축약(Shorthand Arguments Names)을 통하여 순서대로 $0, $1, $2표시를 통해 간단하게 표현할 수 있다.
- 트레일링 클로저
함수의 파라미터가 클로저 하나이거나 클로저가 마지막 파라미터인 경우 함수 끝에 빼내어 위치시킬 수 있다. 그리고 남은 파라미터가 없다면 ()도 생략이 가능하다.
최종적으로는 이런 형태로 변한다.
글 | 전성진 내배캠 수강생
편집 | 김진원 팀스파르타 객원 에디터
Share article
Subscribe to our newsletter