Closure

Hisop·2022년 10월 13일
0

Swift

목록 보기
1/7

Closure란 무엇일까?

일반적으로 클로저와 클로저 표현식(Closure expression)이 '클로저' 라는 한 단어로 혼용되어 사용되고 있다.
물론 스위프트에선 두 개념 다 지원하고 있다. 어떤 차이가 있을까?

클로저 표현식 (Closure expression)

let multiply = {(_ val1: Int, _ val2: Int) -> Int in
	return val1 * val2
}
let result = multiply(10, 20)

클로저 표현식은 예제와 같은 독립적인 코드 블록을 뜻한다.

이름을 가지고 있지 않다는 것만 빼면 함수와 굉장히 유사한 구조를 가지고 있다.

실제로 함수는 이름이 있는 클로저 표현식일 뿐이다.
아직 함수 개념이 더 익숙하기에 클로저 표현식은 이름이 없는 함수라고 생각하고 넘어갔다.

클로저 표현식은 이미 {}으로 묶여있기에 body에 해당하는 부분은 in키워드로 구분하여 작성해준다.

클로저 표현식은 주로 함수의 전달 인자로 사용되며, 스위프트의 특징인 추론을 통한 생략으로 최대한 간결하게 사용할 수 있다.

클로저 (Closure)

컴퓨터 공학에서의 클로저와 같은 뜻으로 독립적인 코드 블록과 주변의 변수가 결합된 것을 말한다.
클로저는 어떤 상수나 변수의 참조를 캡쳐해 저장할 수 있다는 특징을 가지고 있다.

캡쳐해 저장한다는건 무슨 뜻일까?

클로저 캡처 (Closure Capture)

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

해당 코드는 incrementer를 실행하고, 함수 incrementer는 runningTotal과 amount에 접근하게 된다. 여러 번 실행되면 runningTotal은 어떻게 될까?

기존의 나의 상식으로는 호출될 때마다 runningTotal을 선언하고 0으로 초기화해주었으므로 호출할때마다 매개변수의 값을 리턴하는 코드가 될 것이라 예상했다.

하지만 클로저는 특정 상수나 변수의 값을 캡쳐할 수 있다. 원본 값이 사라져도 클로져의 body안에서 그 값을 활용할 수 있다는 뜻이다.

let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
// 값으로 10을 반환합니다.
incrementByTen()
// 값으로 20을 반환합니다.
incrementByTen()
// 값으로 30을 반환합니다.

위와 같은 결과를 출력하게 된다.

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven() // 7

incrementByTen() // 40

다른 클로저를 만들어 호출할 경우 해당 변수를 공유하지 않는다.


참고한 문서

Swift Language Guide

profile
42seoul - C, C++ / YagomAcademy - Swift

0개의 댓글