0Pricing
Swift Academy · 강의

액터 격리와 nonisolated

격리 경계를 기준으로 동작을 판단합니다.

액터 격리와 nonisolated은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

액터 격리란 무엇인가요?

액터 격리란 액터의 변경 가능한 상태를 해당 액터에서 실행되는 코드만 접근할 수 있다는 뜻입니다.

실행 환경이 접근을 직렬화하므로 두 작업이 상태를 동시에 변경하지 않으며, 데이터 경합이 제거됩니다.

actor Counter {
    private var value = 0
    func increment() { value += 1 }
}

액터 호출하기

액터 외부에서 격리된 멤버에 접근하는 작업은 비동기입니다. 액터가 사용 가능해질 때까지 호출이 일시 중단될 수 있으므로 await를 사용해야 합니다.

let counter = Counter()
func useCounter() async {
    await counter.increment()
}

액터 내부: 동기 실행

액터 자체의 메서드 안에서는 이미 격리된 상태이므로 상태에 동기적으로 접근할 수 있습니다. 자기 자신에 대한 접근에는 await가 필요하지 않습니다.

actor Counter {
    private var value = 0
    func incrementTwice() {
        value += 1 // synchronous: already isolated
        value += 1
    }
}

격리되지 않은 멤버

변경 가능한 상태에 접근하지 않는 멤버에는 nonisolated를 표시하십시오. 이러한 멤버는 어디서든 await 없이 동기적으로 실행됩니다.

변경 불가능한 데이터만으로 계산되는 값에 특히 적합합니다.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    nonisolated var label: String { "User #\(id)" }
}

nonisolated가 안전한 이유

nonisolated 멤버는 변경 불가능한(let) 상태나 그 밖의 전송 가능한 상태만 읽을 수 있습니다.

컴파일러는 비격리 컨텍스트에서 변경 가능한 격리 상태에 접근하려는 모든 시도를 거부합니다.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    // Error: cannot read mutable sessionCount here
    // nonisolated var bad: Int { sessionCount }
}

nonisolated와 프로토콜

액터가 동기 프로토콜을 따를 때 nonisolated가 필수적입니다. 프로토콜 메서드는 비동기일 수 없으므로 격리된 상태에 접근하지 않아야 합니다.

actor Item: CustomStringConvertible {
    let name: String
    init(name: String) { self.name = name }
    nonisolated var description: String { "Item: \(name)" }
}

MainActor

@MainActor는 코드를 메인 스레드에 격리하는 전역 액터입니다. 사용자 인터페이스 업데이트는 이곳에서 수행해야 합니다.

타입, 메서드 또는 프로퍼티에 주석을 추가하여 메인 액터에 고정하십시오.

@MainActor
final class ViewModel {
    var title = "Hello"
    func refresh() { title = "Updated" }
}

액터 사이 이동하기

한 액터에서 다른 액터를 호출하면 실행 환경이 전환되고 실행이 일시 중단됩니다. 바로 그 일시 중단 지점에 await가 나타납니다.

actor Database { func load() -> Int { 42 } }
@MainActor
func show(_ db: Database) async {
    let v = await db.load() // hop to db actor
    print(v)               // hop back to main
}

액터 재진입성

액터는 재진입 가능합니다. 메서드가 대기하는 동안 액터는 대기가 끝나기를 기다리는 대신 대기열에 있는 다른 작업을 실행할 수 있습니다.

await 전에 읽은 상태가 이후에는 변경되었을 수 있습니다. 일시 중단 지점 이후에 가정을 다시 확인하십시오.

actor Store {
    var ready = false
    func prepare() async {
        ready = false
        await Task.yield() // other calls may run here
        ready = true
    }
}

격리된 매개변수

함수는 isolated 액터 매개변수를 받을 수 있으며, 해당 함수의 멤버가 아니더라도 본문을 그 액터에서 실행할 수 있습니다.

func bump(on counter: isolated Counter) {
    // runs isolated to counter; synchronous access
}

하위 시스템을 위한 전역 액터

사용자 지정 전역 액터를 정의하여 전체 하위 시스템(예: 렌더링 처리 흐름)을 하나의 실행 환경에 격리할 수 있습니다.

@globalActor
actor RenderActor {
    static let shared = RenderActor()
}
@RenderActor func draw() { }

빠른 확인: 격리

액터 격리에 대한 이해도를 확인해 보십시오.

복습: 액터 격리와 nonisolated

액터 격리는 변경 가능한 상태에 대한 접근을 직렬화하며, 액터 간 호출은 비동기이므로 await가 필요합니다. nonisolated 멤버는 격리에서 제외되지만 변경 불가능하거나 전송 가능한 상태만 읽을 수 있으므로 동기 프로토콜 적합성에 필수적입니다.

@MainActor는 코드를 메인 스레드에 고정하고, 액터는 재진입 가능하므로 상태가 await 사이에서 변경될 수 있습니다. 전역 액터는 전체 하위 시스템을 격리합니다. 이러한 규칙을 익히는 것이 안전한 동시성의 핵심입니다.

자주 묻는 질문

“액터 격리와 nonisolated” 강의는 무료인가요?

네 — “액터 격리와 nonisolated” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“액터 격리와 nonisolated”에서 뭘 배우나요?

격리 경계를 기준으로 동작을 판단합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“액터 격리와 nonisolated” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 데이터 경쟁 문제
  2. Sendable 프로토콜
  3. 액터 격리와 nonisolated
  4. 엄격한 동시성으로 마이그레이션하기
← Swift Academy(으)로 돌아가기