Deep_Dev
article thumbnail

 

 

๐Ÿ“š Swift ์—์„œ ๋ฌธ์ž์—ด index ์ ‘๊ทผ์— ๋Œ€ํ•˜์—ฌ

 

 

 

 

Swift ์—์„œ ๋ฌธ์ž์—ด์€ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ• ๊นŒ ? 

swift์—์„œ ๋ฌธ์ž์—ด์„ ์ •์ˆ˜ index๋กœ ์กฐํšŒํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด Swift์—์„œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ• ๊นŒ ? 

 

String.Index๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•œ๋‹ค.

// ์„ ์–ธ
let str = "hello world!"

// ์กฐํšŒ
str[str.startIndex] // 'h'
str[str.endIndex] // '!'๊ฐ€ ๋‚˜์˜ฌ์ง€ ์•Œ์•˜๊ฒ ์ง€๋งŒ ์—๋Ÿฌ ๋ฐœ์ƒ

var idx = str.index(str.startIndex, offsetBy: 6)
str[idx] // 'w'

// ๋ฐ˜๋ณต๋ฌธ์„ ์ธ๋ฑ์Šค์ฒ˜๋Ÿผ ๋ฝ‘์•„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด indicies ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
for i in str.indices {
     print(str[i]) // Index(_rawBits:) ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.
}

 

 

Java๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์™”๋˜ ๋‚ด๊ฐ€ ์ด๊ฑธ๋ณด๋ฉด ํ•œ๋งˆ๋””๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

์•„๋‹ˆ ์™œ?

 

hello world!๋ผ๋Š” ๋ฌธ์ž์—ด์—์„œ w๋ฅผ ์ ‘๊ทผํ•˜๋Š”๋ฐ Pythob์—์„œ๋Š” str[6]์ด๋ฉด ๋๋‚ฌ๋Š”๋ฐ, Swift์—์„œ๋Š” str[str.index(str, offsetBy:6)์„ ํ•ด์•ผ ๋น„๋กœ์†Œ ๊ธ€์ž ํ•˜๋‚˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒ‰์œผ๋กœ๋งŒ ๋ณด๋ฉด str str str... ๋ณ€์ˆ˜๋ช…์„ ๋ฌด๋ ค ์„ธ๋ฒˆ์ด๋‚˜ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ถ„๋ช…ํžˆ C, C++ ์–ธ์–ด๋ถ€ํ„ฐ ์ •์ˆ˜ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์ด๋ฏธ ์žˆ๋Š”๋ฐ, ํ˜„๋Œ€ ์–ธ์–ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์„ž์–ด๋†“์•˜๋‹ค๋Š” Swift์—์„œ๋Š” ์™œ ์ด๋Ÿฐ ๋น„ํšจ์œจ์ด ์ƒ๊ธด๊ฑธ๊นŒ

 

 

 

 

Swift์˜ ๋ฌธ์ž ์ €์žฅ ๊ตฌ์กฐ

์•ž์„  ์–ธ์–ด๋“ค์˜ ๋ฌธ์ž์—ด์€ ๊ฐ๊ฐ ์ธ๋ฑ์Šค๋งˆ๋‹ค ๋™์ผํ•œ ํฌ๊ทธ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. Swift ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, Character ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ์ง‘ํ•ฉ(Extended Grapheme Clusters)์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

 

Extended Grapheme Clusters
Swift์—์„œ๋Š” Character ์ž๋ฃŒํ˜•์€ '์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ธ€์ž'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‚˜์˜ ๊ธ€์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ์ด์— ๋”ฐ๋ผ ๊ฐ ๊ธ€์ž๋งˆ์ž ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์œ„์˜ ๊ณต์‹๋ฌธ์„œ์—์„œ ํ•˜๋‚˜์˜ Character ํƒ€์ž…์ด ์—ฌ๋Ÿฌ ์Šค์นผ๋ผ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ•œ๊ธ€๋กœ ์˜ˆ๋ฅผ ๋“ค์—ˆ๋‹ค.

let precomposed: Character = "\u{D55C}" // ํ•œ
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ใ…Ž, ใ…, ใ„ด
// precomposed is ํ•œ, decomposed is ํ•œ

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ํ•œ์œผ๋กœ ํ•ฉ์ณ์žˆ๋Š” ๊ธ€์ž๋Š” ํ•˜๋‚˜์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ๊ฐ’์„ ๊ฐ–๋Š”๋ฐ ์•„๋ž˜๋Š” 3๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์ ์€ ๋‘˜ ๋‹ค ๋˜‘๊ฐ™์€ ํ•˜๋‚˜์˜ Character๋ผ๋Š”๊ฒƒ์ด๋‹ค. 

 

์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด์ฒ˜๋Ÿผ str[6]์œผ๋กœ ์ ‘๊ทผํ•˜๋ ค ํ–ˆ๋‹ค๋ฉด, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋”œ ์ ‘๊ทผํ•˜๋ คํ–ˆ๋Š”์ง€ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์™œ๋ƒ๋ฉด ์‚ฌ์‹ค str[6]์—์„œ 6์ด๋ผ๋Š” ์ˆซ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ ์œ ํ•ด์„œ ๊ทธ ์ค‘ 6๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ณด๋Š”๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค. Swift ์ฒ˜๋Ÿผ ํ•œ๊ธ€์ž๋งˆ๋‹ค ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ ๊ธ€์ž๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ i ๋ฒˆ์งธ๋Š” ์•„๋‹Œ ๊ฒƒ์ด๋‹ค.

 

์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ์„ ๋ชปํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ๋˜ ํ•˜๋‚˜์˜ ์˜๋ฌธ์ ์ด ๋“ ๋‹ค. ๋ฐ”๋กœ, String.Index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”

index(_:offsetBy:) ๋ฉ”์†Œ๋“œ์ด๋‹ค. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” Swift๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋ถ€ํ„ฐ offsetBy: ๋งŒํผ ๋–จ์–ด์ง„ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ "offsetBy: ๋งŒํผ ๋–จ์–ด์ง„" ์ด ๋ผ๋Š”๊ฒƒ์ด ๋ฌด์Šจ ๋ง์ธ์ง€ ์ค‘์š”ํ•˜๋‹ค. ์™œ๋ƒ๋ฉด ์ธ๋ฑ์Šค๋กœ ์กฐํšŒํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด์จ‹๋“  ์ธ๋ฑ์Šค๋กœ ์กฐํšŒํ•˜๋Š” '๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง€์ง€ ์•Š๋Š”๊ฐ€'

 

 

 

String.Index ? 

 

์œ„ ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด String ์ž๋ฃŒํ˜•์—์„œ๋Š” Index ๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋Š” BidirectinalCollection ์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค.

 

BidirectionalCollection & RandomAccessCollection

 

 

String.Index ๊ตฌ์กฐ์ฒด๊ฐ€ BidirectionalCollection ์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ฒƒ์€ ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค ํƒ์ƒ‰ ๊ตฌ์กฐ๊ฐ€ ์–‘๋ฐฉํ–ฅ ์ˆœํšŒ๋ฐฉ์‹ ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ๋ง์ธ ์ฆ‰์Šจ, ๋ฌด์กฐ๊ฑด ์ž์‹ ์˜ ์•ž, ๋’ค๋กœ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ณดํ†ต์€ ๋ฌธ์ž์—ด์„ Random Access ๋ฐฉ๋ฒ•์œผ๋กœ ์ž„์˜์˜ ๊ฑฐ๋ฆฌ๋งŒํผ ๋–จ์–ด์ง„ ์›์†Œ๋ฅผ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ, ์• ํ”Œ์€ ๊ฐ ๊ธ€์ž๋งˆ๋‹ค ์œ ์—ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ๊ฐ„ ๋Œ€์‹  ์ด๋Ÿฐ ์„ฑ๋Šฅ์„ ํฌ๊ธฐํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

BidirectionalCollection ํ”„๋กœํ† ์ฝœ๋กœ ์ธ๋ฑ์Šค ์ ‘๊ทผ์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํ•„์š”ํ•ด์กŒ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ, ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ์ž„์˜์˜ ๊ฑฐ๋ฆฌ๋งŒํผ ๋–จ์–ด์ง„ ์›์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์ „ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ๊ฐ๊ฐ์˜ ๋ฌธ์ž์†Œ ์ง‘ํ•ฉ๋งŒํผ ๋–จ์–ด์ง„ distance๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ๋ฌผ๋ก  ์›ํ•œ๋‹ค๋ฉด utf-8, utf-16, unicodesScalars ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.



๊ฒฐ๋ก 

Swift๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ์–ธ์–ด์™€ ํŠน์ˆ˜๋ฌธ์ž๋“ค์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ์ง‘ํ•ฉ(Extended Grapheme Clusters)๋ฅผ ์ฑ„ํƒํ•ด์„œ ํ•œ ๊ธ€์ž๋‹น ์œ ์—ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ–๊ฒŒํ•˜๊ณ , ์ž„์˜์˜ ์ง€์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ทธ ํฌ๊ธฐ๋งŒํผ ๋–จ์–ด์ง„ ์›์†Œ๋ฅผ Bidirectional ํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ์›์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

๊ด€๋ จ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/181915

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr