sending

👋 들어가기 전
오눌 학습할 내용은 Sending 키워드다.
이전에 배웠던 @Sendable과 생각보다 관련성이 있어 보인다.
이번에 확실히 짚고 넘어가자
🏁 학습할 내용
- @Sendable이란
- sending이 등장한 계기
- sending이란
- @Sendable과 sending 정리
🛫 @Sendable이란
@Sendable
👋 들어가기 전두번 째 attribute는 @Sendable이다. 아무래도 배우는 attribute들의 순서가 고민이 많았는데Conccurency의 가장 기본이 되는 Sendable attribute부터 살펴보자. 🏁 학습할 내용Sendable 프로토콜@Se
hamp.tistory.com
이전에 작성한 내용을 정리해보면 @Sendable은 다음과 같이 정리할 수 있다.
- 멀티 쓰레드 환경에서 안전하게 데이터를 공유할 수 있다는 것을 표시
- 클로저 또는 함수의 Sendable 여부를 컴파일 타임에 체크한다.
🤔 sending 등장 계기
sending이 등장한 계기를 알아보자.
5️⃣ Swift5 에서는 ??
swift5.x 버전을 실제로 다운받아보자.

이후 공식 깃헙을 가보면, 해당 경로에 Task.swift 파일이 있다.

이 때 생서자를 봐보면 @Sendable과 @escaping이 붙어있다.

이 구조는 다음과 같은 특징이 있다.
- 클로저에 Sendable이 붙어 있을경우, 클로저가 캡쳐한 값은 모두 Sendable 해야한다.
- 클로저는 오직 값으로만 캡쳐한다.
그렇다면 Non-Sendable 타입이면 어떻게 될까??
데이터 레이스를 방지하기위해 컴파일 에러를 발생 시킨다.
코드로 살펴보자.
import Foundation
class Object { // Non-Sendable
var count: Int = 0
}
class SendingSample {
func trySending() {
let object = Object()
object.count += 1
sendableClosure {
object.count += 1
}
}
}
// Sendable 클로저
func sendableClosure(
_ closure: @Sendable () -> Void
) {
closure()
}
senableClosure 안에서 Non-Sendable한 Object를 캡쳐하니 사진과 같은 컴파일 에러가 발생했다.

@Sendable의 특징을 잘 작동하고 있다.
그러나 단점도 존재한다.
Non-Sendable을 캡쳐해야할 경우에는 유연성이 부족하다고 생각할 수 있다.
이 때 등장하는 키워드가 바로 sendnig키워드다.
📩 sending
⭐️ 정의
말 그대로 보내는 의미로 사용하는데, 이 때 보내지는 주체는
sending 키워드가 붙는 파라미터를 보낸다.
과연 어디서 어디로 보낼까?? , 바로 호출 부 도메인에서, 함수(클로저) 도메인 내부로 보내진다.
✨ 특징
- 전달되는 값이 Sendable임을 보장한다.
- 클로저 자체에 @Sendable을 표시하지 않아도 된다.
- Non-Sendable 값을 캡쳐할 수 있다.
- transfer(전송) 이후, 외부(호출부) 에서는 접근할 수 없다
⚠️ 주의할 점
sending으로 보낸 값은, 오직 내부 도메인에서만 사용되며, 호출부(외부)에서 다시 재 사용할 수 없다.
보내기 직전까지는 사용가능
보내기전 마지막까지 잘 쓰고 보내라 ~ (있을 때 잘해라)
📋 예제

보내기 직전에 += 1 은 괜찮았지만, 보낸 후 같은 연산을 했더니
❌ accessed after being transferred; later accesses could race
다음과 같은 에러가 발생했다, 보낸 이후에 사용하면 data race가 나중에 발생할 수 있다고
보낸 이후 코드를 지우면 깔끔하게 에러는 사라진다, Non-Sendable 타입임에도 불구하고 유연하게
다음 도메인으로 넘어갈 수 있다.
🎨 그림
위 코드를 그림으로 그려보면 다음과 같다.

😀 소감 및 마무리
| 키워드 | @Sendable | sending |
| 특징 | 컴파일 타임에 확실한 Sendable 체크 | Non-Sendable의 유연하고 안전한 전송으로 안전한 캡처 제공 |
| 사용 대상 | 함수 타입 | 파라미터 |
출처
https://www.youtube.com/watch?v=Ka28hay60VQ
https://www.donnywals.com/sending-vs-sendable-in-swift/
Sending vs Sendable in Swift – Donny Wals
With Swift 6, we have an entirely new version of the language that has all kinds of data race protections built-in. Most of these protections were around with Swift 5 in one way or another and in…
www.donnywals.com