Substring

|

이 글은 공부 중에 작성하는 글입니다.
정정이 필요한 내용은 댓글로 알려주시면 감사하겠습니다 :)


안녕하세요 오동나무입니다.

Swift에는 Int, String, Double, Character… 등이 밥 먹듯이 사용하는 기본 타입들이 있습니다. 그중에서도 특히 Int와 String은 정말정말정말정말 많이 사용되는 것 같네요. 그런데 혹시 String 말고 Substring이라는 타입을 보신 적이 있으신가요?!

image

image

저는 항상 무의식 속에서 String을 사용하다가 얼마전에 Substring이라는 타입을 처음 보게 되었습니다. string의 한 부분. String을 다루다보면 String의 부분에 대해서 다루는 경우도 꽤나 많습니다. 이때 당연히 String의 조각도 String 타입일 줄 알았는데 이 조각들을 Substring이라는 타입으로 구분해서 만들어두었더군요! 그래서 String의 몇몇 메서드를 보면 Substring을 반환하는 메서드들이 보입니다.

그렇다면 Substring은 무엇이고 왜 필요할까요? 그냥 String만 있어도 될 것 같은데 말입니다! 공식문서Swift Language Guide를 토대로 작성합니다.



Substring: A slice of a string

Substring은 언급했듯이 String의 한 부분입니다. Substring 타입을 사용하는 이유는 더 빠르고 효율적이기 때문입니다.

Substring을 사용할 경우 원본인 String의 저장공간을 공유합니다. 무슨 말이냐면.. 만약 String의 부분을 String 타입으로 만든다면 그 새로운 String 부분에 대해서 하나의 인스턴스를 만들어 메모리를 할당해주어야 합니다. 하지만 부분을 Substring으로 만들게 될 경우 새로운 저장공간을 만들지않고 원본 Stirng의 저장공간을 사용합니다.

또한 Substring과 String은 모두 StringProtocol을 준수하기 때문에 같은 메서드를 사용할 수 있습니다. (기능이 같습니다.)

image

이 사진은 Swift 문서에서 가져온 사진입니다. “Hello, world!”라는 문자열에서 Hello만 Substring으로 가져오는 경우인데 이때 Substring은 새로 메모리를 할당하지 않고 기존의 “Hello, world!” 문자열의 메모리를 계속 사용하게 되는 것입니다. 만약 Substring을 String 타입으로 새롭게 생성해주게 되면 그때 값 복사가 일어납니다.

Substring는 값이 저장되어야할 때, String 타입의 인스턴스를 요구하는 다른 함수에 값이 전달되어야 할 때 String타입으로 변환이 필요한데 이때 String(_:) 이니셜라이저를 사용하여 타입을 꿀 수 있습니다.

그러니까 처음에 임시적으로 사용하는 경우에는 값 복사가 일어나지 않기 때문에 원본의 저장공간을 사용하다가, 따로 저장공간이 필요해질 때에 값을 복사해 보다 효율적으로 메모리를 사용할 수 있는 것입니다. 따라서 Substring을 임시적으로 사용하게 되면 최적화에 유리해집니다.


String.Subsequence

image split이나 suffix 메서드를 사용할 때 타입이 String.SubSequence 라고 나오기도 합니다. 공식문서에서는 분명 SubString을 반환한다고 했는데 말이죠.
하지만 String.SubSequence 타입은 Substring을 typealias로 정의한 또 다른 이름입니다. 즉, Substring과 같은 타입입니다.
image




참고