일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 생명주기
- 제어전송문
- SWIFT
- 바이트디그리
- Switch
- IOS
- actionSheet
- On branch is up to date with ' '
- class
- 회고
- copy-on-write
- avaliable
- Git
- 연관값
- 내_삶
- AnyObject
- 파스칼표기법
- struct
- uikit
- 글또
- ios 개발 강의
- 다짐글
- unrecognized selector sent to class
- 주간 달력
- MyLife
- weekly calendar
- 코드스니펫
- 글또9기
- K디지털기초역량훈련
- error해결
- Today
- Total
seong_hye, the developer
Swift) 문법 정리 - COW(Copy-On-Write) 본문
swif에는 저희가 인지하지 못하고 사용하고 있는 여러 프로그래밍 기술들이 있죠
오늘은 그 중에서 COW(Copy-On-Wirte)에 대해 알아보려고 합니다.
COW(Copy-On-Write)
컴퓨터에서 복사할 때 값을 복사해서 담는다 하더라도,
실제 값이 바뀌기 전까지는 그냥 하나의 메모리 값을 공유해서 사용
원본이나 복사본에서 수정이 일어나면 그 때 값을 복사하는 것
중요한 이유?
값을 사용하는 방법 중 하나인
값 타입은 새로운 변수를 할당하거나 파라미터로 전달될 때 값 복사가 일어나는 것을 의미
하지만 이러한 복사 작업은 상당한 시간이 걸리므로 이런 작업을 최적화 하기 위한 기술이 COW이다.
사용 용도
메모리 공간이 큰 데이터를 다룰 경우
수정이 없는데 복사를 한다는 것은 메모리 낭비가 될 수 있음
실제 수정이 이뤄질 때 데이터 복사를 하고
사용하기 전에는 참조를 통해 불필요한 복사 를 줄이고 메모리 낭비를 막기 위함
예시 코드
Array
var array = [1, 2, 3]
var array2 = array
address(of: array) //0x06ace3ec32
address(of: array2) //0x06ace3ec32
array2.append(2)
address(of: array) //0x06ace3ec32
address(of: array2) //0x06ace3ec39
하지만 Dictionary, Set, String에서는 값 복사부터 값이 다르게 나왔다..
//Dictionary
var dic1 = ["1" : 2023, "2" : 2024]
var dic2 = dic1
address(of: &dic1) //0x06ace3ec12
address(of: &dic2) //0x06ace3ec16
//Set
var set1: Set = [1, 2, 3, 4, 5]
var set2 = set1
address(of: &set1) //0x06ace3ee41
address(of: &set2) //0x06ace3ee46
//String
var string = "abcdefghijklmnop"
var string2 = string
address(of: &string) //0x06ace3er21
address(of: &string2) //0x06ace3er25
공식문서에서 collection type과 string에 COW가 구현되어있다고 적혀있음에도
안되는 이유가 무엇일까 계속해서 탐색해보았다..
func address(of object: UnsafeRawPointer) -> String
검색해서 사용한 함수가 Array에 대해서는 같은 값을,
String에 대해서는 다른 값을 return 하는 이유는 아래와 같다고 합니다.
- unsafe pointer를 인자로 받는 함수에 array를 전달하는 것은 첫번째 어레이 인자의 주소를 전달하는 것입니다. 따라서 array들이 같은 저장공간을 사용한다면 동일한 값이 나오게 됩니다.
- unsafe pointer를 인자로 받는 함수에 string을 전달하는 것은 string을 나타내는 임시 UTF-8 의 pointer를 전달하는 것입니다. 따라서 이 주소는 같은 string일지라도 매 호출마다 달라질 수 있습니다.
메모리의 세계는 너무 어렵네요... 조금 더 공부가 필요한 부분인 것 같습니다.
그래도 collection type과 string에 COW가 구현되어있다고 하고
COW에 대해 이해할 수 있는 시간이였습니다~~
참고 블로그)
'IOS' 카테고리의 다른 글
Swift) 문법 정리 - @attribute 키워드 (0) | 2022.10.22 |
---|---|
Swift) 문법정리 - 확장(Extension) (0) | 2022.10.18 |
Swift) 문법 정리 - 싱글톤(Singleton) 패턴 (0) | 2022.07.26 |
Swift) 문법 정리 - self vs Self (0) | 2022.07.19 |
Swift) 화면전환 방식 (0) | 2022.07.19 |