Today I Learn

Today I Learn: Swift에서의 Copy On Write (COW)

Goniii 2025. 3. 12. 22:37

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 공식 문서에서는 이에 대해 다음과 같이 설명한다