Hamp 2025. 5. 24. 16:44
반응형

👋 들어가기 전

오눌 학습할 내용은 Sending 키워드다.

 

이전에 배웠던 @Sendable과 생각보다 관련성이 있어 보인다.

 

이번에 확실히 짚고 넘어가자



🏁 학습할 내용

  • @Sendable이란
  • sending이 등장한 계기
  • sending이란
  • @Sendable과 sending 정리

🛫 @Sendable이란

https://hamp.tistory.com/214

 

@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

 

반응형