본문 바로가기
iOS/Swift

[iOS/Swift] 익명 혹은 람다함수는 모두 클로저(Closure)일까?

by iosdevlime 2023. 1. 25.

무수한 함수 포스팅을 헤쳐나와..

 

본격적인 프로그래밍을 진행하기에 앞서,

이곳 저곳에서 자주 사용하게 될 클로저(Closure)에 대해 살펴볼까 합니다.

 

함수보다 아주 조-금 머리아픈 복잡한 내용일 수 있으니

이번 포스팅에서는 클로저의 개념만 살짝 짚고 넘어가겠습니다.

 

 

 

 


 

 

 

 

클로저(Closure)에 대하여

익명함수(Unnamed) 외, 이름이 있는 함수(Named) 또한 클로저이다 

 

The Swift Language Guide 에서 소개하는 클로저는 다음과 같습니다. 

 

클로저(Closure)
코드블럭으로 C와 Objective-C의 블럭(blocks)과 다른 언어의 ❶람다(lambdas)와 비슷합니다.
클로저는 어떤 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다.

 

 

???

아무리 읽어봐도 도통 이해가 되질 않지만

 

후술할 클로저에 대한 내용을 바탕으로, 위 소개글에서 언급되는 키워드인

  • 람다(lambdas)
  • 캡쳐(capture)

두 가지 개념을 함께 다뤄봄으로서 해석해보도록 하겠습니다.

 

 

 

 

클로저와 클로저 표현식 (Closure Expression)간의 관계

  • 흔히 클로저라고 하면, '함수와 같지만, 이름이 없는 함수구나~' 라고 해석하기 쉽습니다.
    • 하지만, func 키워드를 활용한 이름이 존재하는 함수 클로저에 포함됩니다.
    • 클로저의 범위는 다음 그림과 같습니다.

  • 지금까지 사용해 온 함수는 Named Closure 이며, Unnamed Closure는 클로저 표현에 해당합니다.
    • 클로저 표현(Closure expression)은 흔히 익명함수, 또는 다(lambdas)함수로 불립니다 !
    • '람다식', 혹은 '람다함수'란 익명함수를 지칭하는 언어로 다음과 같은 특징을 가지고 있습니다.
      • 코드를 간결하게 만들고, 반복 관련 코드의 불필요한 부분을 제거함
      • 주로 고차함수에 매개변수로 전달되거나, 결과값으로 활용
// 일반적으로 사용해오던 (전역)함수
func sayHello () {
    print("Hello")
}

sayHello() // 출력 : Hello


// 클로저 표현식으로 변경해본다면?

let sayHello = { print("Hello")}

sayHello() // 출력 : Hello

 

 

 


 

 

 

Swift의 클로저

함수나 클로저 표현식과 같은 코드블럭하나 이상의 변수가 결합된 것

 

클로저의 유형, 그리고 표현식과 혼용해서 사용하므로 주의해야 한다는 점은 알겠는데..

 

클로저(Closure)란 용어 자체를 살펴보면

단어 그대로, 무언갈 가두고 있는(Closed) 형태로 해석이 되지 않나요?

 

 

 

클로저(Closure)란 용어의 의미

  • 공학용어에 따른 클로저(Closure)는, 코드블럭과 변수(상수)가 결합된 것을 의미합니다.
    • 코드블럭이라 함은, 함수나 클로저 표현식과 같은 독립적인 코드입니다.
    • 변수(상수)란, 코드블럭과 관계를 맺고 있는 변수 혹은 상수입니다. 
  • 이해를 돕기위해, 예시 코드를 살펴보도록 하겠습니다.
    • A란 이름의 함수는 ➟ 함수B를 반환(Return Type)합니다.
    • 그런데, 함수 B는 코드블럭 외부에 선언된 'count' 변수에 의존하게 됩니다.
  • 결과적으로, 함수B는 count변수를 ❷잡고(captured) 있습니다 !
    • 함수 B는, count 변수를 잡거나(Captured), 가두고(Closed over)있게 됩니다.
func functionA() -> () -> Int {
    
    // count란 변수가 선언되어 있으며,
    var count: Int = 0
    
    // 내부에 functionB 함수를 선언
    func functionB() -> Int {
        return count + 1
    }
    
    // functionA 함수는 functionB를 반환값으로 설정함
    return functionB
}

// closureExample에 functionA를 할당하게 되고
let closureExample = functionA()

// 아래와 같이 결과를 호출하게 되면?
print("결과는?: \(closureExample())") // "결과는: 1"

 

 

 


 

클로저(Closure)에 대한 사전 소개는 여기까지 입니다.

 

이후 포스팅에서는

  • 클로저 표현식 사용법
  • 1급 객체로서의 클로저 조건 확인
  • 경량 문법 및 autoclosure
  • Capture 
  • 등등..

듣기만 해도 머리가 복잡해지는 개념과 예시코드를 다뤄보도록 하겠습니다.

 

댓글