본문 바로가기

면접질문정리/Swift문법

COW(Copy On Write)는 어떤 방식으로 동작하는지 설명하시오.

- Reference

https://levelup.gitconnected.com/copy-on-write-in-swift-1faf488e2072

 

Copy-on-Write In Swift

Swift value types are backed by reference types

levelup.gitconnected.com

 

COW(Copy On Write)란??

  • 데이터 복사시 실제로 값을 복사되지 않고, 동일한(원본의) 값을 참조하다가 데이터 변경이 발생될 시에 복사해 값을 변경하는 기법이며 데이터를 효율적으로 관리해주는 기능이다.

 

 

# 왜 스위프트는 언어를 설계할때 다른언어와 달리 컬렉션을 value type으로 설계했을까 ??? 이유가 무엇일까 ??

 

=> 이유는 추론하기가 쉬워서 이다. 코드 베이스의 다른 부분을 변경할 수 없다. 이 부분은 다중 스레드에서 유용하다. 인스턴스가 고유 하지 않으면 다른 스레드가 인스턴스를 변경할 수 있다는 단점이있다.

 

 

자 상상해보자

큰 배열의 값을 함수에 전달하는 것을.. 그런데 분명히 큰 배열의 값의 전체를 복사하는 것은 효율적인 방법이 아닐 것이다. 그래서 기꺼이 스위프트는 Copy On Write라는 매커니즘을 만들었다.

 

살펴보자

 

Copy-on-Write Mechanism

COW는 스위프트 표준 라이브러리에 있는 계산기능이고 컬렉션과 구조체와 같은 값타입을 위한 기능이며 실제로 값이 필요한 시점이 될때까지 복사된 척 연기하는 것이다. 인스턴스의 수정이 발생할때까지 메모리 공유를 한다.

 

 

이는 값타입이 수정 또는 돌연변이가 발생할때까지 참조타입에 의해 뒷받침된을 의미한다.

 

엑스코드로 인스턴스의 주소를 확인해 검증해보자

 

구조체 인스턴스를 할당하고 수정하는 동안 내부적으로 두 가지 일이 발생한다.

 

1.  pointB가 pointA에 할당되면 둘 다 동일한 주소를 포함합니다.

2.  pointA가 수정되면 이전 pointA의 전체 복사본이 발생하고 pointB는 이제 다른 주소를 가리킨다.

 

 

# 시나리오 2

 

인스턴스에 새로운 타입을 할당한것이 아니라 기존에 pointA 내부에 있는 a 프로퍼티의 A class타입으로 참조가 되었기때문에 같은 주소를 가르키고 있는 것이다.

만약에 pointA변수를 pointB에 할당하는것이아니라 변수 pointA 를 A타입으로 인스턴스화하고 pointB도 A타입으로 인스턴스화할 경우 둘이 가르키는 주소는 다를 것이다. 이 부분을 유의하자!

 

# 마무리

- 그래서 Cow는 값이 수정 되기이전에 복사가된것 처럼 연기를 하고 참조를 한다. 왜냐하면 큰 배열의 값을 다룰 때에 배열의 인덱스마다 메모리공간이 할당되는데 많은양의 값을 사용할지도 미지수인데 복사한다면 메모리 낭비이다. 사용된다는게 확실해질 경우 복사가 이루어지는 방법이다.

- 값 유형에는 값이 저장되고 참조 유형에는 값을 가르키는 주소(포인터)가 저장된다.

- 값 유형은 스택 메모리에 저장되고(클래스 인스턴스의 일부가 아닌 경우) 참조 유형은 힙 메모리에 저장된다. 일반적으로 데이터 복사본이 독립적인 상태를 가질 수 있는 경우 값 유형을 사용해야 한다. 

내부 참조 속성이 있는 값 유형은 값 의미 체계를 위반하고 추가 참조 카운트 오버헤드가 발생하므로 피해야 한다.

 

- Copy-on-Write 유형 복사를 최적화하는 Swift 현명한 방법이며 이는 구조체에 의존하는 애플리케이션의 성능을 높이는 도움이 됩니다.