Sendable 프로토콜
동시성 영역 사이를 이동해도 안전한 형식임을 표시합니다.
Sendable 프로토콜은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Sendable의 의미
Sendable은 표시용 프로토콜입니다. 이 프로토콜을 준수하는 타입은 데이터 경쟁을 일으키지 않고 동시성 영역 간에 안전하게 공유할 수 있음을 약속합니다.
메서드는 없으며, 스레드 안전성에 대한 컴파일러 검증 보장입니다.
protocol Sendable {}값 타입은 대체로 Sendable입니다
저장 속성이 모두 Sendable인 구조체와 열거형은 자동으로 준수할 수 있습니다.
값은 전달될 때 복사되므로 각 작업은 서로 독립적인 복사본을 갖습니다.
struct User: Sendable {
let id: Int
let name: String
}암시적 준수
많은 값 타입은 Sendable을 암시적으로 얻습니다. 여기에는 공개되지 않은 고정 구조체와 Sendable 멤버를 가진 열거형, Sendable 타입의 튜플, 메타타입이 포함됩니다.
내부 값 타입에는 : Sendable을 전혀 작성하지 않아도 되는 경우가 많습니다.
enum Direction { case north, south, east, west }
// Implicitly Sendable: no associated non-Sendable data구조체가 Sendable이 아닌 경우
구조체가 Sendable이 아닌 저장 프로퍼티를 포함하면 해당 구조체도 전송 가능하지 않습니다.
여기서는 클래스 참조를 통해 공유된 변경 가능 상태에 접근할 수 있으므로 컴파일러가 자동 적합성을 거부합니다.
final class Box { var value = 0 }
struct Wrapper { // not Sendable
let box: Box // class with mutable state
}클래스와 전송 가능성
클래스는 참조 타입이므로 복사본들이 동일한 인스턴스를 공유합니다. 클래스가 최종이면서 모든 저장 프로퍼티가 변경 불가능하고 전송 가능한 경우에만 Sendable입니다.
final class ImmutablePoint: Sendable {
let x: Double
let y: Double
init(x: Double, y: Double) { self.x = x; self.y = y }
}@unchecked 전송 가능성
때로는 클래스가 스레드 안전하다는 사실을 알고 있어도(잠금으로 상태를 보호하더라도) 컴파일러가 이를 증명하지 못할 수 있습니다. @unchecked Sendable을 사용하면 안전성을 직접 보장한다고 선언할 수 있습니다.
이는 탈출구이므로 정확성에 대한 책임은 개발자에게 있습니다.
import Foundation
final class Cache: @unchecked Sendable {
private let lock = NSLock()
private var storage: [String: Int] = [:]
func set(_ k: String, _ v: Int) {
lock.lock(); defer { lock.unlock() }
storage[k] = v
}
}@Sendable 클로저
클로저에도 @Sendable을 표시할 수 있습니다. 이러한 클로저는 동시성 경계를 넘어 전달될 수 있으므로 컴파일러는 전송 가능한 값만 캡처하는지 확인합니다.
func run(_ work: @Sendable () -> Void) {
work()
}
let name = "Ada" // immutable, Sendable
run { print(name) }변경 가능한 상태 캡처는 거부됩니다
@Sendable 클로저는 변경 가능한 변수를 캡처할 수 없습니다. 두 작업이 동시에 해당 변수를 변경할 수 있기 때문입니다.
아래의 캡처에 대해 컴파일러가 오류를 표시합니다.
var counter = 0
// Error: @Sendable closure captures mutable var
// run { counter += 1 }비동기 API의 전송 가능성
동시성 진입점에는 Sendable이 필요합니다. Task 클로저는 @Sendable이고, 다른 액터에 전달되는 값은 전송 가능해야 합니다.
이렇게 타입 시스템은 스레드 안전하지 않은 데이터가 작업 사이로 유출되는 것을 막습니다.
func process(_ user: User) async {
Task {
// user is Sendable, safe to capture
print(user.name)
}
}제네릭 전송 가능성 제약
제네릭에서 전송 가능성을 요구할 수 있습니다. 인수를 사용해 작업을 생성하는 함수라면 해당 인수가 Sendable이 되도록 제약해야 합니다.
func dispatch<T: Sendable>(_ value: T) {
Task { print(value) }
}전송 가능성과 액터 비교
Sendable은 "이 값을 안전하게 전달할 수 있는가?"에 답하고, actor는 "변경 가능한 상태를 어떻게 보호하는가?"에 답합니다.
둘은 함께 사용할 수 있습니다. 액터의 상태에 대한 접근이 직렬화되므로 액터는 암묵적으로 전송 가능합니다.
actor Logger { } // actors are implicitly Sendable빠른 확인: 전송 가능성
전송 가능성 적합성에 대한 이해도를 확인해 보십시오.
복습: 전송 가능성 프로토콜
Sendable은 동시성 경계를 넘어도 안전한 타입을 나타냅니다. 변경 불가능한 값 타입은 자동으로 적합성을 얻고, 최종 변경 불가능 클래스도 적합성을 얻을 수 있으며, 스레드 안전한 클래스는 @unchecked Sendable을 사용합니다.
@Sendable 클로저는 전송 가능한 값만 캡처할 수 있고, 비동기 API는 안전하지 않은 공유를 방지하기 위해 전송 가능성을 요구합니다. 액터와 함께 전송 가능성은 Swift에서 데이터 경합을 안전하게 방지하는 타입 수준 기반을 이룹니다.
자주 묻는 질문
“Sendable 프로토콜” 강의는 무료인가요?
네 — “Sendable 프로토콜” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Sendable 프로토콜”에서 뭘 배우나요?
동시성 영역 사이를 이동해도 안전한 형식임을 표시합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Sendable 프로토콜” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 데이터 경쟁 문제
- Sendable 프로토콜
- 액터 격리와 nonisolated
- 엄격한 동시성으로 마이그레이션하기