[Swift] String 타입에 length 메소드가 없는 이유

Swift의 String 타입에는 length 프로퍼티나 메소드가 없다. 이상하게 들리겠지만 실제로 그렇다. Swift에서 문자열의 길이를 구하려면 이럼 메소드 대신에 countElements(_:)라는 글로벌 함수를 사용해야 한다.
더군다나 이 countElements(_:) 함수는 문자열을 처음부터 순회(iterate)하기 때문에 매우 긴 문자열을 다룰 때라면 주의해야 한다. NSStringlength 프로퍼티를 제공하는데 왜 Swift의 문자열 타입은 길이 프로퍼티를 갖지 않을까?
NSString은 내부적으로 유니코드 문자열(정확히는 일련의 코드값)을 UTF16 형식으로 인코딩한 값을 갖는다. UTF16에서는 각 유니코드 스칼라값은 16비트 크기의 값으로 변환된다. 여기서 주의할 것은 “한 개의 유니코드 문자”가 아닌 “한 개의 유니코드 값”이라는 점인데, 유니코드는 하나의 값이 다른 값과 조합되어 문자로 표기되는 경우가 종종 있기 때문이다. 이를 테면 U+301은 영문자 모음에 붙는 첨자인데, “café”를 표현할 때 e와 결합한다. 즉

var word = "cafe"
word += "\u{301}"
println(word)
//  café

이렇게 된다. 앞서 언급한 countElements() 함수는 이 때 é를 한 개 글자로 계산한다. 하지만 이 문자열을 표현할 때 사용된 실제 유니코드값은 5개이다. 이는 유니코드 문자열은 표현방식에 따라서 사용되는 메모리의 크기가 달라질 수 있다는 점이다. 따라서 불가피하게 조합가능한 유니코드 값들을 찾기 위해서는 문자열 내부를 순회하는 작업이 필요하고, 단순한 프로퍼티로는 이를 제공하지 않는다.

println(countElements(word))
//  4

반대로 NSString의 길이는 사용된 유니코드값들이 16비트 단위로 저장되므로 “문자열의 길이”가 곧 사용된 정보의 개수와 같다. 따라서 “몇 자”가 아닌 “몇 개의 유니코드 값”의 의미가 된다.

println(NSString(format:"%s", word).length)
//  5

물론, Swift 문자열이 NSString의 length 프로퍼티와 같은 값을 구하고자 한다면 utf16Count라는 프로퍼티를 사용하면 된다.

println(word.utf16Count)
//  5

끗.

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop