actor는 swift에서 새로이 만든 타입이었다.
그렇다면 Actor는 무었일까?
Actor
Actor는 actor타입이 채택하고 있는 프로토콜이다.
Actor프로토콜은 AnyActor과 Sendable을 상속하고 있다.
따라서 Actor은 Sendable을 강제적으로 채택하게 하는 프로토콜이라는것
Sendable
Sendable이란, 주어진 값이 concurrency 환경에서 안전하게 데이터가이동된다는 뜻,
이전에 말했던, Actor-isolation처럼 data race가 일어나지 않으려면 데이터가 변경되지 않거나, 공유되지 않는 경우 data race는 발생하지 않는다.
이를 보장하는 프로토콜이다.
Sendable채택
Sendable을 채택하려면, 주어진 타입의 값이 concurrent code에서 안전하게 사용될 수 있음을 나타내면 된다.
즉 value type내의 모든 stored property가 immutable하면 된다.
구조체에서 stored property
구조체에서 프로퍼티가 기본적인 타입이라면, sendable하다.
하지만 만약 다른 custom type이 들어오고 해당 타입이 sendable하지 않다면 에러
struct TestHuman: Sendable {
let name: String
var age: Int
}
// struct는 value타입이기 때문에 가능
struct TestHuman: Sendable {
let name: String
var age: Int
let friend: Human // 만약 sendable을 채택하는 타입이 아니라면 에러
}
클래스에서 sendable
클래스에서 sendable을 채택하려면 다음의 조건을 만족해야함
- final키워드를 표시
- 모든 프로퍼티가 immutable해야함.
final class TestHuman: Sendable {
let name: String
let age: Int
init()
} // stored property가 다 immutable하기때문에 가능
class TestHuman: Sendable {
let name: String
let age: Int
init()
} // final키워드가 없어서 에러
final class TestHuman: Sendable {
let name: String
var age: Int
init()
} // age가 mutable state라서 에러
Uploaded by N2T