Substring 과 String.SubSequence 와 String 의 차이점

2019-06-20
Swift

안녕하세요. 도미닉입니다.

오늘은 Substring 과 String.SubSequence 와 String 의 차이에 대해서 정리해보고자 합니다.

String 에 대해서는 모두 알고 있을 것이라고 생각되서 String.SubSequence 에 대해서 먼저 알아보겠습니다.

String.SubSequence 이란?

String.SubSequence 는 익숙하신 분들도 많이 계실 것 같습니다.

문자열을 자르는 메소드인 split 을 사용하면 결과의 타입이 String.SubSequence 입니다.

위에 예제의 결과가 String.SubSequence 입니다.

이런 식으로 String 을 자르는 메소드들을 사용하면 타입은 자동으로 String.SubSequence 입니다.

그렇다면 String.SubSequence 이 정확히 무슨 타입일까요?

공식문서에 가보면 이렇게 나옵니다.

typealias SubSequence = Substring

이라고 나오죠.

그렇다면 typealias 는 무엇일까요?

typealias 란?

typealis 는 편하게 이야기하면 별명이라고 할 수 있습니다.

위에 예제에서 보시면 Int 형 별명을 여러개 정해놓지만 Int 와 같이 연산이 되는 것을 알 수 있습니다.

Substring 이란?

그렇다면 SubSequence 는 Substring 의 별명입니다.

Substring 은 어떤 타입일까요?

Substring 은 아래의 특징들을 가지고 있습니다.

  • 위에서 예로 들은 split() 이나 prefix(), split() 등 과 같은 메서드를 사용해서 문자열에서 가져온 부분문자열 타입입니다.

  • String에서 사용하는 대부분의 메서드를 가지고 있으며 String과 같은 방법으로 사용할 수 있습니다.

  • 원래 문자열이나 다른 하위 문자열을 저장하는데 사용되는 메모리의 일부를 다시 사용합니다.

그렇다면 Substring, SubSequence 를 사용해도 문제가 없을까요?

만약 계속 사용해야 한다면 Substring, SubSequence 타입을 String 타입의 상수나 변수에 저장하는 것이 좋습니다.

왜냐하면 아래 사진을 보시면 이해하실 수 있습니다.

사진을 보시면 Hello, world! 라는 문자열이 있습니다.

또한 Hello 라는 문자열을 Substring 이 참조하고 있습니다.

이런 상황에서 Hello 라는 Substring 을 다른 함수의 매개변수로 보내거나 사용한다면

메모리에 Hello 만 저장되어 있는 것이 아니라 원래 문자열인 Hello, world! 을 계속 가지고 있어야합니다.

이런 상황이 계속 반복되면 쓸데없는 메모리를 차지하고 있을 것입니다.

정리

String 과 Substring, String.Subsequence 에 대해서 알아봤습니다.

댓글 달아주시면 성심성의껏 답변 드리겠습니다.

글 읽어주셔서 감사합니다.

참고

https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
https://medium.com/@jgj455/오늘의-swift-상식-substring-string-sequence-d13fe85954b