Copy on write는 값 타입의 인스턴스를 담은 변수를 다른 변수에 할당할 때에는 값을 복사하지 않고 일단 동일한 값을 참조하도록 합니다.(참조 타입으로 할당)
그리고 추후 값이 수정될 때에 값을 복사해 변경을 적용합니다.
Copy On Write가 좋은 이유는 수정할 때에만 값을 복사하므로
메모리 공간을 낭비하는 일을 많이 줄일 수 있기 때문입니다.
예를 들어 배열이 하나 있다고 가정해보겠습니다. 배열을 만들고 변수에 할당해보겠습니다.
var firstArray = [1, 2]
그 후, 배열을 담은 변수를 다시 다른 변수에 담아보도록 하겠습니다.
var secondArray = firstArray
이 때에는 값의 복사가 일어나지 않고, 값을 참조하는 방식을 사용하여 두 변수가 동일한 메모리 주소를 참조하도록 합니다. (참조 타입)
그러나 배열의 값을 변경할 때, firstArray가 비로소 복사가 되고, firstArray의 복사본을 secondArray에게 넘깁니다.
firstArray[0] = 4
-> 이 시점에서 firstArray는 secondArray에게 값의 복사본을 넘겨줍니다.
print(firstArray) // [4, 2]
print(secondArray) // [1, 2]
이 둘의 결과값이 다르게 도출됩니다. 이것이 바로 Copy On Write입니다.