String은 왜 Int로 Subscript 되지 않을까?
안녕하세요.
최근 들어 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를 사용한답니다..
그럼 오늘은 여기까지 하겠습니다.