ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • String은 왜 Int로 Subscript 되지 않을까?
    Swift 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를 사용한답니다..

     

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

    'Swift' 카테고리의 다른 글

    Codable  (0) 2021.12.28
    NSCoder  (0) 2021.12.27
    escaping closure(탈출 클로저)  (0) 2021.12.23
    Hashable  (0) 2021.12.17
    class 와 struct 그리고 enum  (4) 2021.12.14
Designed by Tistory.