Copy On Write (COW)
- 공유 데이터를 효율적으로 관리하기 위해 프로그래밍에 사용되는 리소스 관리 기술
- 여러 프로그램에서 데이터를 사용할 때 바로 복사하는 것이 아니라, 수정을 시도할 때까지 동일한 데이터를 프로그램 간에 공유함
- 변경사항이 없으면 개인 복사본이 생성되지 않아 리소스가 절약됨
- 복사본은 필요한 경우에만 만들어지므로 수정이 발생할 때 각 프로그램이 자체 버전을 갖게 됨
Swift에서의 COW
- 값 타입을 효율적으로 관리하기 위한 최적화 기법
- 값을 변경하기 전까지는 복사하지 않고, 변경이 발생하면 실제로 복사하는 방식으로 동작함
COW가 적용되는 타입
- Swift에서는 Array, Dictionary, Set, String 같은 컽렉션 타입은 Copy On Write에 최적화가 적용되어 있음
- 즉, 컬렉션을 새로운 변수에 할당하면 즉시 복사되는 것이 아니라, 같은 메모리를 참조함
- 값을 변경하는 시점에 복사(copy)가 발생하여 독립적인 데이터를 가지게 됨
예제
// 메모리 주소확인 함수
func adress(_ object: UnsafeRawPointer) -> String {
let address = Int(bitPattern: object)
return NSString(format: "%p", address) as String
}
var arr1 = [1, 2, 3] // 배열 생성
var arr2 = arr1 // arr1을 arr2에 할당 (같은 메모리 참조)
// arrayl, array2 메모리 주소 출력
print("Before --------------")
print(adress(arr1))
print(adress(arr2))
print("After --------------")
arr2.append(4) // 복사한 배열을 변경 -> 변경하는 시점에 복사하여 독립적인 데이터가 됨
print(adress(arr1))
print(adress(arr2))
Struct에서는 COW가 구현되어 있지 않음
- 값 복사만 해도 주소 값이 바뀜
공식 문서 참조
Swift 공식 문서에서는 이에 대해 다음과 같이 설명한다
- Swift 표준 라이브러리 문서에서 Array 타입에 대해 "Copy-on-write semantics"를 언급하고 있다
- Swift 언어 가이드의 Structures and Classes 섹션에서는 값 타입의 복사 동작에 대해 설명하고 있지만, COW에 대한 명시적인 언급은 없다
'Today I Learn' 카테고리의 다른 글
Today I Learn - 배열의 짝수 번째 요소를 제거하는 다양한 방법 (0) | 2025.03.20 |
---|---|
Today I Learn: @escaping 클로저 (0) | 2025.03.14 |
Today I Learn: Swift에서의 연결 리스트 (0) | 2025.03.11 |
Today I Learn - 숫자 야구 게임(Set VS Array) (0) | 2025.03.10 |
Today I Learn: UIAlertController에 TextField 추가 및 데이터 사용 (0) | 2025.03.07 |