메모리 안전(Memory Safety)의 개념
메모리 접근에 대한 충돌(confilct) 이해하기
- 멀티쓰레드(Multi Thread)의 환경에서만 메모리 충돌이 일어나는건 아님
var stepConflict = 1
func increment(_ number: inout Int) {
number += stepConflict
}
동일한 함수의 여러 '입-출력 매개변수'로 단일 변수를 전달하는 것도 에러
func balance(_ x: inout Int, _ y: inout Int) {
let sum = x + y
x = sum / 2
y = sum - x
}
var playerOneScore = 42
var playerTwoScore = 30
balance(&playerOneScore, &playerTwoScore)
구조체의 인스턴스에서의 메모리 안전
메서드에서 self에 대한 접근
- 구조체 등의 메서드에서 self(동일한 인스턴스)에 접근하는 경우 접근 충돌
- 값 타입은 속성 하나가 아닌, 인스턴스 전체에 대한 읽고/쓰기로 접근 ⭐️
func balance(_ x: inout Int, _ y: inout Int) {
let sum = x + y
x = sum / 2
y = sum - x
}
struct Player {
var name: String
var health: Int
var energy: Int
static let maxHealth = 10
mutating func restoreHealth() {
health = Player.maxHealth
}
}
extension Player {
mutating func shareHealth(with teammate: inout Player) {
balance(&teammate.health, &health)
}
}
var mario = Player(name: "마리오", health: 10, energy: 10)
var luigi = Player(name: "루이지", health: 5, energy: 10)
mario.shareHealth(with: &luigi)
속성에 대한 접근 충돌의 예시
var playerInformation = (health: 10, energy: 20)
var yosi = Player(name: "요시", health: 10, energy: 10)
func someFunction() {
var yosi2 = Player(name: "요시2", health: 10, energy: 10)
balance(&yosi2.health, &yosi2.energy)
}