[Swift] Copy on Write (COW)
개요
값 타입(value type)에 대해서 학습하다보면 Copy on write(cow)에 대한 내용을 종종 볼 수 있다. 평소에는 메모리를 효율적으로 쓰는 기법 중 하나라고 이해하고 넘겼지만, mutating을 이해하기 위해서는 COW를 깊게 이해하고 있어야 하기에 이렇게 정리를 한다.
Swift에서 Copy on Write(COW)
COW는 Swift 자체 기능이라기 보다는 컴퓨터 프로그래밍에서 사용되는 리소스 관리 기술이다. 여기서 설명하는 COW는 Swift 언어에 한정된 설명이다.
COW는 메모리 할당과 해제를 최적화하는 기술이며 값 타입에 제공되는 기능이다. 값 타입은 데이터의 값을 복사하여 새로운 인스턴스를 생성하는 타입을 말한다. Swift에서는 구조체(struct), 열거형(enum) 등이 값 타입에 해당된다. 하지만 value type은 인스턴스를 생성할 때 바로 데이터 값을 복사하지 않는다. 마치 reference type과 유사하게 새로운 인스턴스를 생성하면 기존 인스턴스와 메모리를 공유하고 새로운 인스턴스가 변경될 때 값을 복사한다. 쉽게 말해서 새로운 인스턴스를 생성하는 시점을 미루는 기법이다.
언제 최적화 효과가 많이 나타날까?
COW는 주로 대용량의 데이터를 다룰 때 유용하다. 예를 들어, 문자열(String)은 struct로 구현되어 있으며, 문자열을 복사하면 해당 문자열의 모든 문자를 복사해야 한다. 만약 문자열이 매우 크다면 복사하는데 많은 시간과 메모리가 필요하다. COW를 사용하면 문자열을 복사하는 대신, 원래의 문자열과 공유하다가 변경이 발생하면 새로운 문자열을 생성하게 되므로 메모리 사용을 줄일 수 있다.
한계점 및 주의사항
COW는 값 타입에서만 사용할 수 있으며 참조(Reference) 타입인 class에서는 사용할 수 없다. 또한, COW는 메모리 사용을 최적화하기 위한 기능이므로 항상 성능상 이점을 제공하지는 않습니다. 따라서 각각의 상황에 맞는 최적의 구현 방식을 선택하는 것이 중요하다.