iOS/설명
[iOS] Actor
Sky Titan
2025. 11. 8. 13:54
728x90
https://developer.apple.com/documentation/swift/actor/
Actor | Apple Developer Documentation
Common protocol to which all actors conform.
developer.apple.com
Actor
- 동시성 환경에서 Data Race를 방지하기 위해 도입된 Swift의 type중 하나
- Swift 5.5 (iOS 15, macOS 12)부터 도입된 Concurrency Model의 핵심 요소 중 하나
- 클래스와 비슷하지만 동시에 여러 스레드에서 접근해도 안전하게 상태를 관리하게 해준다.
- 자신의 내부 상태를 한 번에 하나의 Task만 접근할 수 있게 보호하는 일종의 동시성 격리 공간(isolation zone)
Actor 규칙
- 내부에서 접근 시엔 동기적으로 접근 가능
- 외부에서 await로 접근
- 동기 메서드는 외부에서 호출 불가능
- 메서드가 sync라도 외부에서 호출 시엔 무조건 await 필요
actor MyActor {
var counter: Int = 0
func increment() {
// 내부에서 접근 시엔 동기적으로 접근 가능
counter += 1
}
}
let actor = MyActor()
let value = await actor.counter // 외부에서 접근 시엔 무조건 await로 접근
await actor.increment()
Non-isolated (격리 해제) 예외
만약 특정 메서드가 동시성 안전성을 해치지 않는다면,
nonisolated 키워드로 “이건 Actor 외부에서도 await 없이 접근 가능하다”고 명시할 수 있다.
actor MyActor {
var counter: Int = 0
func increment() {
counter += 1 // No error
}
nonisolated func someFunction() {
print("it is actor") // No error
counter += 1 // Error : Actor-isolated property 'counter' can not be mutated from a nonisolated context
}
}
let actor = MyActor()
actor.someFunction() // Async 없이 호출가능
실제 사용 패턴
- 공유 상태(state)를 여러 Task가 접근하는 경우
- 네트워크 요청, 캐싱, 데이터베이스 같은 “공유 리소스 관리자”를 구현할 때
- SwiftUI의 ViewModel 같은 구조에서, 데이터 일관성을 지킬 때
Class vs Actor
| 구분 | class | actor |
| 동시성 안전성 | ❌ 직접 보장해야 함 | ✅ 자동 보장 |
| 접근 방식 | 즉시 | await 필요 (비동기적) |
| 참조 타입 | ✅ | ✅ |
| 상속 | ✅ | ❌ (단, Actor 프로토콜 채택 가능) |
| 내부 격리 | ❌ | ✅ |
728x90