actor는 swift에서 새로이 만든 타입이었다.
그렇다면 Actor는 무었일까?
Actor
![](https://blog.kakaocdn.net/dn/cRZ2aM/btsmnCKiBpV/t0Cq3KhkFTtHSSHKUujns0/img.png)
Actor는 actor타입이 채택하고 있는 프로토콜이다.
![](https://blog.kakaocdn.net/dn/RzxxS/btsmkOkCD4Y/vSkAJ8hx5NlWUbmzoopTtK/img.png)
Actor프로토콜은 AnyActor과 Sendable을 상속하고 있다.
따라서 Actor은 Sendable을 강제적으로 채택하게 하는 프로토콜이라는것
Sendable
![](https://blog.kakaocdn.net/dn/bnB3sX/btsmnDoR40j/DnaPOC7mp4xus9NtyhYZR0/img.png)
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