[초보자의 코딩공부] closure와 친해지기

[초보자의 코딩 공부]에서는 내일배움캠프 수강생들이 공유한 코딩 지식과 학습법을 알려드립니다.
Jul 23, 2024
[초보자의 코딩공부] closure와 친해지기
👀
아는 것을 남에게 설명해 주는 것은 좋은 학습법입니다. 내일배움캠프 iOS 트랙에서는 수강생이 돌아가며 학습에 개발 공부에 도움 되는 주제를 선정해 발표합니다. [초보자의 코딩 공부]에서는 내일배움캠프 수강생들이 공유한 코딩 지식과 학습법을 알려드립니다.
 
클로저(Closure)가 무엇이고 어떻게 사용하는지 알아보도록 하자.

클로저란?

클로저는 코드에서 전달하고 사용할 수 있는 자체 포함된 기능 블록입니다. Swift의 클로저는 다른 프로그래밍 언어의 클로저, 익명 함수, 람 다 및 블록과 유사합니다. 클로저는 정의된 컨텍스트에서 모든 상수 및 변수에 대한 참조를 캡처하고 저장할 수 있습니다. 이는 해당 상수와 변수를 닫는 것으로 알려져 있습니다. Swift는 캡처에 대한 모든 메모리 관리를 처리합니다. - 스위프트 공식문서 통번역본
클로저는 이름 없는 함수 즉, 코드 블록을 말합니다. 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다. 스위프트의 클로저는 주변 환경에 있는 변수나 상수를 캡처하여 저장하고, 이를 나중에 사용할 수 있도록 합니다. 이것은 클로저가 생성될 때 클로저가 참조하는 변수 또는 상수의 값에 대한 복사본을 유지하고 저장하는 메커니즘입니다. - 내일배움캠프 2주차 강의자료
공식 문서와 강의자료를 보면 ‘익명함수’, ‘이름 없는 함수’, ‘코드 블록’ 등이 공통적으로 명시되어 있다. 설명을 읽다 보면 익명함수, 참조를 캡처 등 알아듣지 못할 말들이 적혀있다.
 
  • 함수 vs 클로저
그럼 도대체 클로저는 무엇일까? 클로저는 함수와 비슷한 개념이지만 다르다. 따지자면 클로저가 함수보다 더 큰 개념이다. 이름이 있는 클로저가 함수이며, 통상적으로 클로저는 이름 없는 함수(익명함수)를 뜻한다.
특성
함수
클로저
이름
이름 있음
이름이 없음
호출
이름을 사용하여 호출
직접적으로 호출
캡쳐
주변 환경 값을 캡쳐하지 않음
주변 환경 값을 캡쳐함
간결성
상대적으로 간결하지 않음
함수보다는 간결
  • 캡처
캡처는 '붙잡다, 포획하다, 생포하다, 기록하다, 마음을 사로잡다' 등의 뜻을 지닌 영단어다. Closure는 값을 캡처하거나 참조를 캡처하여 코드 블록이 실행되는 시점에 해당 값을 사용할 수 있게 한다.
notion image
위 코드의 makeIncrementer라는 함수는 클로저를 반환하는 함수다. 반환된 클로저는 외부 변수 total을 캡처한다. 클로저가 반환된 후에도 total 변수는 여전히 유지되어 다음 호출에서도 그 값을 변경할 수 있다.
 
notion image
위 코드에서 클로저는 instance 변수를 캡처하여 instance.value를 업데이트한다. 클로저가 반환된 후에도 instance의 참조는 유지되며, 클로저 호출 시마다 value가 증가하게 된다.
notion image
최종적으로는 이런 형태로 변한다.

클로저의 경량 문법

map 함수는 자주 보이는 함수이기도 하고 클로저를 파라미터로 받는 함수라서 map 함수로 예를 들어 경량문법을 설명해 보겠다.
 
  • 기본 형태
notion image
  • 타입추론
타입추론을 통하여 클로저의 매개변수와 반환 타입을 생략할 수 있다.
notion image
  • 리턴타입 생략
타입 추론으로 리턴타입도 생략이 가능하다.
notion image
  • 단일 표현식에서의 리턴 생략
코드 return문 하나만 남았을 경우 return문을 생략할 수 있다.
notion image
  • 인자 이름 축약
notion image
파라미터를 인자 이름 축약(Shorthand Arguments Names)을 통하여 순서대로 $0, $1, $2표시를 통해 간단하게 표현할 수 있다.
  • 트레일링 클로저
notion image
함수의 파라미터가 클로저 하나이거나 클로저가 마지막 파라미터인 경우 함수 끝에 빼내어 위치시킬 수 있다. 그리고 남은 파라미터가 없다면 ()도 생략이 가능하다.
 
notion image
최종적으로는 이런 형태로 변한다.
 
글 | 전성진 내배캠 수강생 편집 | 김진원 팀스파르타 객원 에디터
Share article
Subscribe to our newsletter

내일배움캠프 블로그