프로그래머가 변수에 값을 할당한다던가, 함수의 전달인자로 변수의 값을 전달하는 등 다양한 경우에 코드를 통해 메모리에 접근하게 된다. 메모리 접근 충돌은 이 때 서로 다른 코드에서 동시에 같은 위치의 메모리에 접근할 때 발생한다.
세 조건에 모두 해당하는 메모리 접근이 두 군데 이상의 코드에서 동시에 일어나면 메모리 접근 출동이 발생
접근 타이밍이 겹친다고 무조건 충돌이 발생하는 것은 아니지만 가능성이 크다.
var step: Int = 1
func increment(_ number: inout Int) {
number += step
}
increment(&step) // 런타임 오류! inout으로 전달되는 step은 접근 불가!
var step: Int = 1
var copyStep: Int = step
func increment(_ number: inout Int) {
number += copyStep
}
increment(&step) // 해결! 다른 값에 복사
func balance(_ x: inout Int, _ y: inout Int) {
//...
}
var one = 42
var two = 45
balance(&one, &two) // 문제 없음
balance(&one, &one) // 오류!
balance(&oscar.health, &oscar.energy)
두 매개변수는 inout parameter 그래서 함수가 실행 중이면, 두 매개변수 모두 쓰기 접근을 해야 한다. 쓰기 접근을 같은 위치에 동시에 하고 있기 때문에 충돌이 발생하게 된다.
func somefunction() {
var oscar = Player(name: "Oscar", health: 10, energy: 10)
balance(&oscar.health, &oscar.energy)
}
어떻게 구조체 프로퍼티 메모리에 접근할 때 확실히 안전하다고 판단할 수 있을까?