참조 타입이 값타입처럼 행동하고 싶다. → Deep copying이 일어남 : 변경이 일어나도 동일한 참조가 아니기 때문에 서로 영향을 받지 않음(copy on write의 기본)
제어 가능 : 깊이 복사할지 정하는 것
제어 불가 : swift가 자동 복사본을 만들 수 있는지 여부
struct(type) , generic , protocol, box protocol(any)
→ Swift의 대부분이 자동을 Copyable protocol을 준수
은행 이체 취소 예제
이체가 안됐을 때 객체를 취소 해야하는데 이를 deinit에 넣어도 실행이 안됨. (다른 어딘가에서 복사되 메모리를 차지하고 있기 때문에.)
보통 값을 복사 가능하게 함 : Copyable
값이 복사되면 안됨 : non-copyable (은행 이체와 같이 중복되면 안되는 객체를 관리하는 경우)
~Copyable로 호출.
소유권의 3가지 종류 : consume, borrowing, inout
Copy를 시도하면 자동으로 consume(소유권 이전)
아래 예제에서 system을 consume이후 호출하면 에러!

format과 같이 임시 변수로 필요하다면? borrowing : 임시 읽기 접근 권한. 호출권을 이전하지 않고 임시로 빌림. 하지만 값을 변경시키거나 소비할 수 없다.
inout : 임시 쓰기 접근 권한.
NON-copyable generic
~Copyable을 준수한다해서 copyable이 안되는 것은 아님. (COPYABLE이 아닐수 있음을 의미하기 때문에 ~ 는 범위를 넓힘) 
extension을 copyable과 ~copyable인 것으로 나눠서 실행 설정하고 실행가능.
https://developer.apple.com/videos/play/wwdc2024/10170/
WWDC:Consume noncopyable types in Swift 영상의 내용을 정리했습니다.