Swift

String은 왜 Int로 Subscript 되지 않을까?

H4NJUN 2021. 12. 15. 23:51

안녕하세요.

 

최근 들어 Swift로 코딩테스트 준비를 하고 있습니다.

 

애초에 Swift가 코딩테스트에 적합한 언어는 아니라고 생각하지만..

 

저는 iOS 개발자니깐요.

 

아무튼, Swift로 문제를 풀다보면 불편한 부분이 많습니다.

 

Data Structure도 하나하나 만들어줘야 하고 아무튼 많습니다.

 

오늘은 그 중에서도 가장 저를 당황케 했던 String 처리를 다뤄보겠습니다.

 

저는 원래는 파이썬을 사용했었기 때문에

let input = readLine()! // String입니다

print(input[0])

이런 식으로 String의 각 문자에 접근을 하려고 했습니다.

 

그런데 이러한 방식으로 접근하려 하니 String은 Int형으로 subscript가 안된다고 에러를 뱉어냅니다.

 

이럴 때는 공식 문서를 살펴봐야겠죠.

 

https://developer.apple.com/documentation/swift/string

 

Apple Developer Documentation

 

developer.apple.com

 

흠.. 문자들의 모음이다.. Unicode??

 

저 유니코드가 수상합니다.

 

유니코드를 찾아보겠습니다.

 

위키피디아에서 유니코드의 인코딩 방식 중 하나인 UTF-8을 검색해보겠습니다.

 

 

아.. 유니코드의 문자의 크기가 가변적이라고 하네요.

 

일반적인 프로그래밍 언어에서는 문자는 아스키 문자로 판단해요.

 

그래서 위키피디아를 캡처한 사진의 마지막 줄 처럼 1바이트라고 생각합니다.

 

그러나 Swift는 그렇지 않습니다.

 

코드를 통해 확인해보겠습니다.

 

다음과 같은 문자열 3개를 만들어보겠습니다.

 

모두 1개의 문자로 이루어진 String인 것을 확인할 수 있습니다. 

 

그런데 이 값을 unicodeScalar로 표현으로 확인해보면

 

이렇게 배열의 크기가 다른 것을 확인할 수 있습니다. 

 

utf8이나 utf16으로 표현했을 때도 마찬가지입니다. 

 

이렇듯 한 개의 글자지만 유니코드로 이루어져 있어 사이즈가 모두 다른 것을 확인할 수 있습니다.

 

이러한 이유로 일반적인 Int로는 Subscript를 사용할 수 없습니다.

 

그러면 문자열에서 문자참조는 어떻게 하느냐

 

Index라는 String안에 nested하게 구현되어 있는 구조체를 이용해 할 수 있습니다. 

 

이런 식으로 구현해서 사용할 수 있습니다. 

 

range로 사용하는 것도 물론 가능합니다.

 

하지만 저는 코딩테스트 풀 때는 Array(String)으로 바꿔서 subscript를 사용한답니다..

 

그럼 오늘은 여기까지 하겠습니다.