티스토리 뷰
Swift Docs > Strings and Characters > Substring 에 나오는 내용입니다.
애플이 String 연산이 살짝 귀찮아질 것을 감수하고 왜 Substring 타입을 따로 만들었는 지 알 수 있는 내용이여서 좋았습니다!
# Substring
subscript 또는 prefix method를 이용해서 string의 substring을 구하면
그 타입은 string이 아니라 Substring 입니다.
String과 Substring은 둘다 StringProtocol 을 conform 하고 있기 때문에
string에서 쓰던 same methods들을 substring에서도 대부분 사용할 수 있습니다.
즉 substring를 string과 거의 동일한 방식으로 사용할 수 있습니다.
String과 Substring이 conform하는 프로토콜 목록을 보면 StringProtocol 뿐만아니라 다른 프로토콜도 겹치는 것들이 있네요!
# Substring 메모리 영역
String과 마찬가지로 Substring은 문자열을 구성하는 characters가 저장되는 메모리 영역을 가지고 있습니다.
하지만 String 과 Substring의 차이점이 있습니다.
Substring은 성능 최적화를 위해 original string 을 저장하는 메모리 영역을 재사용할 수 있습니다.
또한 another substring 을 저장하는 데 사용되는 메모리 영역의 일부도 재사용할 수 있습니다.
(String도 비슷한 최적화가 있지만, 두개의 string이 메모리를 공유하면 두개는 똑같습니다.)
예제를 살펴보겠습니다.
let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"
// Convert the result to a String for long-term storage.
let newString = String(beginning)
String 타입인 greeting은 characters가 저장되는 메모리 영역을 가지고 있습니다.
beginning은 greeting의 substring으로, greeting이 사용하는 메모리를 재사용합니다.
반면 substring을 string으로 컨버팅한 newString 은 own storage를 가지게 됩니다.
이 성능 최적화를 통해 너는 string 또는 substring을 수정할 때까지 메모리 복사 성능 비용을 지불할 필요가 없습니다!!
substring은 long-term storage (장기간 보관) 에는 적합하지 않습니다.
왜냐하면 original string의 storage를 재사용하기 때문에 substring이 사용되는 동안 entire original string 은 메모리에 보관되어야하기 때문입니다.
그래서 substring은 문자열 작업을 수행하는 짧은 시간 동안만 사용하며 결과를 더 오래 저장할 준비가 되면 substring을 string으로 변환합니다.
'🍏 > Swift' 카테고리의 다른 글
[Swift] Concurrency (2) | 2021.12.14 |
---|---|
[Swift] Strings and Characters > Unicode (0) | 2021.12.12 |
Swift, Dart, Python % Operator 비교 (0) | 2021.12.07 |
[Swift] assert, precondition, fatalError (1) | 2021.12.05 |
[Swift] Self Type (0) | 2021.11.22 |
- Total
- Today
- Yesterday
- SerializerMethodField
- drf custom error
- PencilKit
- METAL
- Flutter Text Gradient
- cocoapod
- 플러터 얼럿
- Sketch 누끼
- flutter deep link
- Python Type Hint
- 구글 Geocoding API
- Django Firebase Cloud Messaging
- Django Heroku Scheduler
- flutter 앱 출시
- Flutter 로딩
- 장고 Custom Management Command
- Flutter Clipboard
- Flutter Spacer
- Flutter getter setter
- DRF APIException
- Dart Factory
- flutter dynamic link
- Django FCM
- flutter build mode
- ipad multitasking
- Watch App for iOS App vs Watch App
- 장고 URL querystring
- ribs
- github actions
- 플러터 싱글톤
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |