종류: Swift

COW(Copy on write)

  • 값 타입에서의 최적화 기법
  • 인스턴스를 복사할 때에는 참조를 해서 불필요한 복사를 줄이고 수정이 발생될 때만 값 복사를 하는 방식
  • Collection타입에 기본적으로 COW가 구현되어 있음
var array1: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(UnsafeRawPointer(array1)) // 0x0000000100704210

var array2 = array1
print(UnsafeRawPointer(array2)) // 0x0000000100704210 주소 동일

array2.removeLast() // Copy-on-Write
print(UnsafeRawPointer(array1)) // 0x0000000100704210
print(UnsafeRawPointer(array2)) // 0x0000000100404e70 주소 달라짐

COW 직접 구현해보기

struct User {
    var name: String
    var age: Int
}

class DataWrapper { // COW의 핵심적인 역할, reference로 복사하게 도와줌
    var data: T
    init(data: T) {
        self.data = data
    }
}

struct COWUser {
    private var dataWrapper: DataWrapper
    init(data: T) {
        self.dataWrapper = DataWrapper(data: data)
    }

    var data: T {
        get {
            return self.dataWrapper.data
        }
        set {
		        // dataWrapper의 참조가 유일한지 체크해서 유일하면 기존 인스턴스에 데이터를 할당하고 아니면 새로 생성
            guard isKnownUniquelyReferenced(&dataWrapper) else {
                dataWrapper = DataWrapper(data: newValue)
                return
            }
            dataWrapper.data = newValue
        }
    }
}

참고

[iOS] Swift의 Type과 메모리 저장 공간

Reference and Value types in Swift - 야곰닷넷

값이냐 참조냐, 그것이 문제로다