class Counter {
	var count = 0
	
	func increase() {
		count += 1
	}
}

각기 다른 곳에서 동일한 Counter 객체를 참조하여 비동기적으로 접근한다고 생각해보자.

increase() 가 비동기적으로 여러 곳에서 동작한다고 한다면,

내부의 count 프로퍼티는 dataRace 가 발생한다. 공유가 가능하고, 변경이 가능한 상태(shared mutable state) 이기 때문.

만약 구조체라면?

struct Counter {
	var count = 0
	
	mutating func increase() {
		count += 1
	}
}

그래도 DispatchQueue.global 을 이용해서 비동기적으로 호출하면 dataRace 발생.

결국 이 문제를 해결하려면 let 으로, 변경이 불가능한 상태가 되어야 한다.

다만 그건 싫음.

Actor

특징

actor 내부의 값에 동시에 접근되지 않도록 보장함.

actor Counter {
	var count: Int = 0
	
	func increase() {
		count += 1
	}
}

//외부
let counter = Counter()
await counter.increase()

이런 식으로 actor 내부의 메서드가 내부의 값을 변경시킬 때,

외부에서 호출 시, 잠시동안 호출코드를 “기다리게” 만든다.