Sendable과 스레드 안전성 검사
데이터를 Sendable 로 표시하고, @Sendable 클로저를 작성하며, 스레드 안전한 공유를 위해 값 타입, 액터, @unchecked Sendable 중에서 선택합니다.
Sendable과 스레드 안전성 검사은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 3개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.
Sendable이란?
Sendable은 동시 작업이나 액터 사이에 데이터를 전달해도 안전하도록 보장하는 Swift의 방식입니다.
- 대부분의 구조체와 열거형은 자동으로 Sendable입니다.
- 클래스는 기본적으로 Sendable이 아닙니다.
- 액터 또는 @unchecked Sendable을 사용하십시오(드물게 사용하며 직접 안전성을 보장해야 합니다).
값 형식은 간단합니다
Sendable 멤버를 가진 구조체는 Sendable이며, 작업 사이에 전달해도 안전합니다.
// Value types with value-only stored properties are Sendable.
// They are safe to transfer across tasks.
struct Point: Sendable { let x: Int; let y: Int }
func shift(_ p: Point) -> Point { Point(x: p.x + 1, y: p.y + 1) }
// Use in parallel tasks
Task {
let p = Point(x: 1, y: 2)
async let a = shift(p)
async let b = shift(p)
let (p1, p2) = await (a, b)
print(p1, p2) // Point(x: 2, y: 3) Point(x: 2, y: 3)
}클래스: 액터 사용
액터는 접근을 순차화하여 작업 사이에서 참조 의미를 안전하게 만듭니다.
// Reference types (class) are not Sendable by default.
// Prefer actors to guard mutable state.
actor SafeCounter {
private var value = 0
func inc() { value += 1 }
func read() -> Int { value }
}
let counter = SafeCounter()
Task {
async let t1 = counter.inc()
async let t2 = counter.inc()
_ = await (t1, t2)
print(await counter.read()) // 2
}
// (Alternative) A plain class would need locks + @unchecked Sendable; see later.@Sendable 클로저
다른 실행자에서 실행될 수 있는 클로저에는 @Sendable을 표시하십시오. 비전송 가능 변경 상태를 캡처하지 마십시오.
// Some APIs require closures to be @Sendable so captured values are safe.
func doTwice(_ f: @Sendable () -> Int) -> Int { f() + f() }
let base = 10
// Capturing an immutable value (let) is fine for @Sendable closures.
let result = doTwice { base + 1 }
print(result) // 22
// Detached tasks also use @Sendable under the hood:
let t = Task.detached { () -> Int in
// Do not capture non-Sendable mutable state here.
return 5 * 5
}
Task { print(await t.value) }@unchecked Sendable(고급)
@unchecked Sendable은 컴파일러 검사를 건너뜁니다. 엄격한 내부 동기화(잠금이나 대기열)를 사용할 때, 최후의 수단으로만 사용하십시오.
import Foundation
// Only when you KNOW it is safe: wrap with a lock and mark @unchecked Sendable.
final class Box<T>: @unchecked Sendable {
private var value: T
private let lock = NSLock()
init(_ value: T) { self.value = value }
func read() -> T {
lock.lock(); defer { lock.unlock() }
return value
}
func write(_ newValue: T) {
lock.lock(); value = newValue; lock.unlock()
}
}
let shared = Box<Int>(0)
let a = Task.detached { shared.write(1) }
let b = Task.detached { shared.write(2) }
Task {
_ = await (a.value, b.value)
print(shared.read()) // 1 or 2 (last writer wins, but no data race)
}모범 사례
지침:
- 값 형식(Sendable에 적합)을 우선 사용하십시오.
- 공유 변경 상태에는 액터를 사용하십시오.
- @Sendable 클로저를 작성하고 비전송 가능 변경 상태의 캡처를 피하십시오.
- 엄격한 동기화를 적용할 때만 @unchecked Sendable을 사용하십시오.
Sendable의 의미
간단 확인: Sendable은 무엇을 보장하나요?
요약
요약: 작업 간 안전성을 모델링하려면 Sendable을 사용하고, 액터나 값 타입을 우선하며, @Sendable 클로저를 작성하십시오. @unchecked Sendable은 내부 구현이 확실하게 동기화된 경우에만 사용하십시오.
자주 묻는 질문
“Sendable과 스레드 안전성 검사” 강의는 무료인가요?
네 — “Sendable과 스레드 안전성 검사” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.
“Sendable과 스레드 안전성 검사”에서 뭘 배우나요?
데이터를 Sendable 로 표시하고, @Sendable 클로저를 작성하며, 스레드 안전한 공유를 위해 값 타입, 액터, @unchecked Sendable 중에서 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 3번째 강의입니다.
“Sendable과 스레드 안전성 검사” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 병렬 처리를 위한 TaskGroup
- 액터와 데이터 격리, nonisolated
- Sendable과 스레드 안전성 검사