1. 클로저의 값 캡쳐

1-1. 값 캡쳐란?

클로저의 기본 개념은 아래와 같다 Closure란 내부 함수와 내부 함수에 영향을 미치는 주변 환경을 모두 포함한 객체이다. 이게 무슨 소리일까?

	func doSomething() {
    var message = "Hello HIDI!"
 
    //클로저 범위 시작
    
    var ayomi = "안녕 나는 아요미얌 ><"
    let closure = { print(ayomi) }
 
    //클로저 범위 끝
		closure() // "안녕 나는 아요미얌 ><"
    print(message)
}

doSomething() // Hello Hidi

클로저 내부에서 외부 변수인 ayomi라는 변수를 사용하기 때문에

ayomi의 값을 클로저 내부적으로 저장하고 있는데, 이것을 클로저에 의해 ayomi의 값이 캡쳐 되었다 라고 표현함

1-2. 클로저의 값 캡쳐 방식

Closure는 값을 캡쳐할 때 Value/Reference 타입에 관계 없이 Reference Capture 한다.

즉. 값타입도 참조타입 캡쳐를 한다는 말인데 이게 무슨 말이냐.

func choosePart() {
    var part: String = "아요"
    print("31기에 나는 \\(part)파트 지원할거야!")
    
    let closure = {
        print("32기에 나는 \\(part)파트 지원할거야!")
    }
    part = "서버"
    print("33기의 나는 \\(part)파트 지원할거야!")
    closure()
}

choosePart()

/*
31기에 나는 아요파트 지원할거야!
33기의 나는 서버파트 지원할거야!
32기에 나는 서버파트 지원할거야!
*/

아래의 코드의 예상 결과는 사실 아래와 같다. 왜냐하면 String은 값 타입이기 때문에 값을 복사해서 들고 있어야 되기 때문

31기에 나는 아요파트 지원할거야! 33기의 나는 서버파트 지원할거야! 32기에 나는 아요파트 지원할거야!

But 참조 캡쳐 방식 → 말 그대로 참조만 해서 heap 영역에 값이 바뀌면 같이 바뀌는 것임 이 부분이 이해가 안간다?

Value Type vs Reference Type 이거 참고해서 보고 오면 좋습니다!

즉. 캡쳐된 변수는 클로저가 실행될 때 평가되어집니다.

2. 클로저의 캡쳐 리스트

2-1. 그럼 항상 참조 캡쳐 방식만 사용해야 되는거야?

의문이 생기는 부분은 → 내가 처음 지정한 값을 클로져에 넣고 안 바뀌게 하고 싶으면 즉. Value Type으로 Capture를 하고 싶으면 어떻게 할까?? 이때 사용하는 것이 바로 캡쳐 리스트이다!

2-2. 캡쳐리스트란?