xxo' TIL/WIL

IOS/Swift

[Swift] 클로저(Closure)

xxoxec 2025. 6. 19. 23:03
클로저는 함수와 유사하지만, 함수와 달리 이름이 없으며, 주변 문맥으로부터 값을 캡처할 수 있는 코드 블록입니다. 클로저는 코드에서 전달되어 사용할 수 있는 독립적인 기능 블록입니다.
Swift의 클로저는 다른 프로그래밍 언어의 클로저, 익명 함수, 람다, 블록과 유사합니다.
클로저는 정의된 컨텍스트에서 모든 상수와 변수에 대한 참조를 캡처하고 저장할 수 있습니다. 이를 해당 상수와 변수에 대한 클로저라고 합니다. Swift는 캡처와 관련된 모든 메모리 관리를 자동으로 처리합니다.
파라미터를 받을 수 있고, 반환 값이 존재할 수 있다는 점에서 함수와 동일합니다.

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/

 

Documentation

 

docs.swift.org

 

클로저(closure) : 클로저는 함수처럼 "어떤 태스크를 수행하기 위한 코드 블록" 이다. 함수와 유사하지만, 함수와 달리 이름이 존재하지 않는 함수이며, 주변 문맥으로부터 값을 캡처할 수 있는 코드 블록이다. 클로저는 중괄호({})로 감싸진 실행 가능한 코드 블럭이며, 클로저는 크게 아래와 같이 나뉘는데

  • 이름이 있는 클로저 -> 함수
  • 이름이 없는 클로저

Swift 클로저는 최적화를 통해 깔끔하고 명확한 스타일을 가지고 있으며 최적화는 아래와 같다.

  • 문맥(context)에서 인자 타입과 반환 타입의 추론
  • 단일 표현식 클로저의 암시적 반환
  • 축약된 인자 이름
  • 후위 클로저 문법

함수는 variable이나 constant에 할당 수 있는데, 클로저도 마찬가지이다.

{ (매개변수) -> 반환타입 in
    // 실행할 코드
}

{ (parameters) -> return type in 
   statements
}

클로저의 형태를 보면 함수와 거의 같다. in을 기준으로 클로저 선언부와 클로저 실행부로 나뉘며, 파라미터 및 반환 타입과 실제 클로저 코드를 분리한다. in 키워드가 없을 시 클로저 본문의 시작되는 위치를 알기 어렵기 때문에 매우 중요하다.

  • 클로저 선언부 : 파라미터와 리턴타입 명시
  • 클로저 실행부 : 실행 코드 작성

swift에서는 클로저, 함수를 타입으로 사용할 수 있다. 따라서 변수에 할당할 수 있고, 다른 함수 파라미터로 전달할 수도 있다.

파라미터와 리턴 타입이 따로 명시가 없고, 인풋 / 아웃풋이 없는 단순한 형태의 클로저
타입을 확인해보면 파라미터, 리턴값이 없다는 것을 확인 할 수 있다.

 

input parameter : 클로저도 파라미터를 받을 수 있다.

파라미터와 in을 기준으로 코드 실행부 작성

 

returning value : 클로저는 특정값을 반환 할 수도 있다.

blocked한 id인 user000을 return false로 하고 나머지는 true로 반환
반대 경우의 예로 특정 값을 반환 할 수 있다.

 

closure as parameter : 클로저는 함수 파라미터로 받을 수도 있다.

받은 인풋의 타입이 Spring -> Bool , 클로저가 함수 파라미터로 넘어가는 것을 확인
인풋과 아웃풋이 없는 return이 없는 클로저의 경우 () -> Void 를 통해 반환시키는 것이 없음을 표시
closure 를 따로 만들어 놓지 않고, 함수 수행 시 바로 작성

 

closure 코드 단축 : 클로저는 문맥으로 매개변수 및 반환 타입을 유추 할 수 있다. 이 경우 매개변수 타입과 반환타입을 생략할 수 있다.

단일 표현식을 가진 클로저는 즉 클로저 내부의 코드가 한 줄이라면 return 키워드를 생략할 수 있으며,

클로저에서 타입 추론을 통해 매개변수 이름(파라미터)을 $0, $1, $2 ... 등으로 단축 가능하다.

또한 함수의 마지막 파라미터가 클로저라면 괄호와 파라미터 이름도 생략 가능하다.

문맥으로 매개변수의 타입을 유추하고, 단일 표현식의 경우 return 생략 및 매개변수 이름을 $0, $1.. 등으로 단축 가능

 

고차 함수에서의 사용 : 클로저는 배열, 딕셔너리 같은 컬렉션 타입과 함께 filter, map, reduce 메서드 사용 시 자주 활용되며,

filter, map, reduce 와 같은 고차 함수에서 클로저를 인자로 전달하여 데이터를 변형하는데 유용하다.

  • filter() : 특정 조건을 만족하는 요소를 추출하는데 사용되는 메서드. 주어진 조건을 만족하는 모든 요소를 새로운 배열로 반환하며, 원본 배열은 변경되지 않는다. 
  • map() : 각 요소에 대해 주어진 클로저를 적용하여 새로운 컬렉션을 반환하는 함수이다. 원본 컬렉션은 변하지 않고 새 컬렉션이 생성된다. 즉 파라미터로 받은 클로저를 모든 요소에 실행하고, 그 결과를 반환한다.
  • reduce() : 컬렉션의 모든 요소를 순차적으로 처리하여 하나의 결과를 만들 때 사용. 초기값이 주어지면 누적 연산을 수행하는데 초기값과 클로저를 이용하여 연산을 수행하며, 배열의 모든 요소를 결합해 하나의 결과를 만든다. 이 값은 reduce가 처리하는 컬렉션의 크기와 관계없이 연산을 계속한다.

filter, map, reduce 메소드 사용 시 자주 활용

 

클로저는 강력한 기능으로 기능을 구현하고 코드의 가독성과 재사용성을 높일 수 있어 유용하게 사용될 수 있는 코드 구조이지만,

잘못 사용하면 메모리 누수 및 코드 복잡도를 증가시킬 수 있으므로 필요에 맞게 적절히 사용하는 것이 중요하다.