- Write가 발생했을 때 Copy를 수행하는 기능
- 값을 사용할 때 복사한다는 의미
- 데이터를 복사할 때, 메모리 상에서 실제로 값을 복사하지 않고 동일한 메모리 주소를 참조하다가, 데이터가 변경(Write)될 때에 값을 복사(Copy)하여 메모리에 변경된 값을 저장하는 방법
- 약간의 오버헤드가 발생
var array1 = [1, 2, 3]
var array2 = array1
- 프로그래밍을 할 때 값을 복사만 하고 복사한 값이 변경되지 않는 경우도 있다.
- 매번 모든 값을 복사하여 저장한다면 값이 변경되지 않았음에도 매번 새로운 공간을 할당하여 불필요한 메모리의 낭비가 발생하게 된다.
- 이러한 부분에서 메모리를 효율적으로 관리하기 위해 사용하는 것이 Copy-On-Write.
COW를 활용하는 데이터 타입
원시타입 |
컬렉션 타입 |
Int |
Set |
Double |
Dictionary |
String |
Array |
오버헤드가 발생하는데 COW를 사용하는 이유?
- Swift의 COW는 시간과 공간 중에 공간의 효율을 선택한 것
- 실제로 값의 복사만 일어나고 수정이 일어나지 않는 경우도 있기 때문에 불필요한 복사를 줄여 메모리 절약
COW에서 참조와 Class에서 참조의 차이점
- Class의 인스턴스를 참조할 때는 서로 다른 메모리 공간에 '같은 인스턴스의 주소값'을 참조
- COW의 참조(리소스 공유)는 동일한 메모리 공간을 가르키는 것
// b가 a를 복사한 경우
- COW는 수정이 일어나기 전까지 b는 메모리를 할당받지 않고 a와 같은 메모리를 사용
- Class는 a와 b가 서로 다른 메모리에 할당 되지만, 각각의 메모리에는 '같은 주소값'이 담겨 있음