티스토리 뷰

반응형

WWDC 21) swift 5.5에 추가된 기능을 공부하는중이다. 그중에서 Actor google에 wwdc 21를 검색 했을때 actor라는 단어가 가장 많이 나온다. 액터? 배우 라고 생각했었지만 역시 아니지요 ㅎㅎ Actor라는 기능은 Concurrencty와 같은 문제를 해결 하기 위해 도입 되었다. 사람이 한번에 한 일만만 할 수 있듯이 우리는 Actor를 만들어서 하나의 일만 수행하도록 만들 수 있다. 우리는 말을 믿지 않는다. 그럼 한번 알아보자구~

#Actor와 그 등장 배경

Swift의 동시성 모델은 다양한 동시성 버그들로부터 안정한 프로그래밍 환경을 제공하기 위해 만들어졌다. 이 중에서도 대표적인 버그 상황은 바로 data race 컨디션으로, 각자 다른 스레드에서 같은 데이터 접근할 때 생기 는 문제점이다.

Actor는 각자의 data를 Actor Isolation이라는 개념을 이용해 보호한다. 이를 통해 한 데이터에 동시에 단 하나의 스레드만 접근할 수 있도록 해 의도치 않은 data race를 막을 수 있다.

actor BankAccount {
    let accountNumber: Int
    var balance: Double
    
    init(accountNumber: Int, initialDeposit: Double) {
        self.accountNumber = accountNumber
        self.balance = initialDeposit
    }
}

actor는 새로운 타입으로 등장했다. 가장 크게 다른건 Isolation을 지키면서 해야한다는것.

  • reference type
  • initializer 가능
  • 메서드, 프로퍼티, subscript 가능
  • Isolation지키면 작성 해야함 (컴파일러단에서 체크)

#Actor Isolation ??

고립이라는 단어다..무엇일까? mutable한 상태를 actor를 private보다 더한 상태 고립이라고 하자. 고립으로 보호하는 것이다. 즉 Actor 프로퍼티(내부 속성변수, 메소드 등..) self 를 통해서만 접근 할 수 있도록 한것..캡슐활 같은건가 ?? @.@ 🤷

extension BankAccount {
  enum BankError: Error {
    case insufficientFunds
  }
  
  func transfer(amount: Double, to other: BankAccount) throws {
    if amount > self.balance {
      throw BankError.insufficientFunds
    }

    print("Transferring:\\(amount),from:\\(accountNumber)=>\\(other.accountNumbr)")

    self.balance = balance - amount
    other.balance = other.balance + amount
		// error: actor-isolated property 'balance' can only be referenced on 'self'
  }
}

위의 예제는 에서 보면 self.balance로 balance를 업데이트 시키는 건가능 왜냐? extension BackAccount 에self로 접근했기때문에 가능하다. 하지만 other.balance는 self가 아니기 때문에 error

반응형
댓글