Swift 에는 흥미로운 부분이 있다. 바로 Copy-On-Write, 사실 이것은 스위프트 만의 특징은 아니고 여러 다른 언어들도 가지고 있는 전반적인 특징이다.
한 줄로 말하자면,
어떤 값의 복사가 일어날 때, 실제로는 그 값을 복사하는게 아닌 참조한다. 그리고 원본이나 사본의 값을 수정하려고 할 때, 그제서야 값을 복사한다는 것이다.
Swift에서는 Collection Type을 복사해서 사용할 때 발생한다.
코드 예시를 들어보자
let array1: [Int] = [1, 2, 3, 4] // Array는 구조체 형식이므로 값을 복사한다.
var array2 = array1 // 그러나 COW로 인해, 이 시점에는 값을 복사하지 않는다... 단지 array1을 참조하고 있다.
array1[0] = 2 // 이 시점에서 값의 실제 복사와 할당이 일어난다. 원본이나, 사본 둘 중 하나의 값을 수정하려고 하기 때문이다.
왜 COW를 사용할까?
단점도 존재한다.