적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift] Subscripts란? + String은 subscript로 접근이 안되는 이유

hongssup_ 2022. 12. 14. 23:40
반응형
class, struct, enum 타입에서 컬렉션, 배열 등의 멤버 요소에 index를 이용하여 간단하게 접근할 수 있는 방법.
Swift에서 String은 각 문자를 이루고 있는 메모리의 크기가 가변적이기 때문에 Int 형식의 Subscript로는 접근이 불가하고, associated index 타입으로 String.index를 통해 접근이 가능하다. 

 

Subscripts란? 

https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html

Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval.

컬렉션, 리스트, 시퀀스 등의 인스턴스를 index로 접근할 수 있도록 해주는 서브스크립트.

someArray[index] 로 배열 인스턴스에 접근 가능하고, someDictionary[key] 의 형식으로 딕셔너리 인스턴스에 접근이 가능하다. 

 

왜 String은 subscript로 접근이 안되는 걸까?

다른 언어들에서는 Int 자료형 index로 문자열에 접근이 가능하지만, Swift에서는 String에서 Int 형식으로 인덱스 참조가 불가능하다.

Int로 서브스크립트를 사용할 수 없고 String.index로 각 Character의 위치에 접근할 수 있다. 

문자열 내부의 각 문자들이 늘 같은 메모리로 저장되는 것이 아니기 때문에, 해당 문자의 위치에 접근하기 위해서는 각 Unicode scalar 의 시작이나 끝부터 탐색을 해야 한다. 

Unicode scalar란 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법으로

하나 이상의 Unicode Scalar가 모여 Character를 이루고, Character들이 모여 String이 된다.

 

예를 들어 "h" 의 경우, UTF-8로 인코딩하면 길이가 1을 차지하지만, "홍" 이라는 문자의 경우, 3을 차지한다.

이처럼 문자열 내부의 각 문자가 늘 동일한 바이트 수를 차지하는 것이 아니기 때문에, Int 형식의 Subscript를 사용해서 특정 위치에 있는 문자에 접근하는 것은 불가능하다. 

따라서 Swift에서 문자열 내의 각 Character는 언어 마다 그 크기가 가변적일 수 있기 때문에 Subscript 대신 index를 사용하여 올바른 위치에 접근할 수 있다. 

 

참고 :

The Swift Programming Language - Documentation <Strings and Characters>

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters

Unicode Scalar - velog.haze5959

 

+ Bidirectional & RandomAccess Collection

보통의 경우 Random Access 방법으로 임의의 거리만큼 떨어진 원소를 O(1)의 시간복잡도로 조회할 수 있지만,

Swfit의 String.Index는 BidirectionalCollection 프로토콜을 채택하여, 문자열의 index 탐색구조는 무조건 자신의 앞 뒤로만 탐색할 수 있는 양방향 순회방식으로 O(n)의 시간복잡도가 필요하다. 

 

 


참고 : green iOYES - 왜 Swift에서는 String이 subscript로 접근이 안되는가, Havi log, donklee.log

 

728x90
반응형