티스토리 뷰

🍏/Swift

[Swift] Substring

eungding 2021. 12. 12. 17:45
728x90
반응형

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 뿐만아니라 다른 프로토콜도 겹치는 것들이 있네요!

 

 

String이 Conform 하는 프로토콜 목록

 

 

Substring이 Conform하는 프로토콜 목록

 

 

# 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
댓글