๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Swift

Swift ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž (Strings and Characters)

by BreadDev 2025. 4. 10.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ์—๋Š” Swift์—์„œ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•ต์‹ฌ ์š”์†Œ์ธ ๋ฌธ์ž์—ด(String)๊ณผ ๋ฌธ์ž(Character)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Swift๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž ์†Œ๊ฐœ

Swift์—์„œ ๋ฌธ์ž์—ด์€ String ํƒ€์ž…์œผ๋กœ, ๊ฐœ๋ณ„ ๋ฌธ์ž๋Š” Character ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

let greeting = "Hello, world!"  // String ํƒ€์ž…
let firstChar: Character = "H"  // Character ํƒ€์ž…

String: ๋ฌธ์ž๋“ค์˜ ์—ฐ์†์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ…์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…

Character: ํ•˜๋‚˜์˜ ๋ฌธ์ž(ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ํด๋Ÿฌ์Šคํ„ฐ)๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…

Swift์˜ ๋ฌธ์ž์—ด์€ ์œ ๋‹ˆ์ฝ”๋“œ ํ˜ธํ™˜์„ฑ, ๋น ๋ฅธ ์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, Foundation ํ”„๋ ˆ์ž„์›Œํฌ์˜ NSString๊ณผ๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด (String Literals)

๊ธฐ๋ณธ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด

let someString = "Some string literal value"

์—ฌ๋Ÿฌ์ค„ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด

3๊ฐœ์˜ ์Œ๋”ฐ์˜ดํ‘œ(""")๋กœ ์—ฌ๋Ÿฌ ์ค„์˜ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

์ค„ ๋์— ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ค„๋ฐ”๊ฟˆ ์—†์ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

let softWrappedQuotation = """
The White Rabbit put on his spectacles.  "Where shall I begin, \
please your Majesty?" he asked.
"""

์—ฌ๋Ÿฌ์ค„ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด: 3๊ฐœ์˜ ์Œ๋”ฐ์˜ดํ‘œ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์นœ ๋ฌธ์ž์—ด๋กœ, ์ค„๋ฐ”๊ฟˆ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ˆ˜ ๋ฌธ์ž ํฌํ•จํ•˜๊ธฐ

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein

// ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๋ฅผ ์‚ฌ์šฉํ•œ ํŠน์ˆ˜ ๋ฌธ์ž
let dollarSign = "\u{24}"        // $,  ์œ ๋‹ˆ์ฝ”๋“œ U+0024
let blackHeart = "\u{2665}"      // โ™ฅ,  ์œ ๋‹ˆ์ฝ”๋“œ U+2665
let sparklingHeart = "\u{1F496}" // ๐Ÿ’–, ์œ ๋‹ˆ์ฝ”๋“œ U+1F496

์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž: ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŠน์ˆ˜ ์‹œํ€€์Šค๋กœ, ๋ฌธ์ž์—ด ๋‚ด์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ: \u{n} ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž ์ฝ”๋“œ ํฌ์ธํŠธ

ํ™•์žฅ๋œ ๋ฌธ์ž์—ด ๊ตฌ๋ถ„๊ธฐํ˜ธ

# ๊ธฐํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ฌธ์ž์—ด์€ ํŠน์ˆ˜ ๋ฌธ์ž์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

let normalString = "Line 1\nLine 2"  // ์ค„๋ฐ”๊ฟˆ์ด ์ ์šฉ๋จ
let rawString = #"Line 1\nLine 2"#    // ์›์‹œ ํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ: "Line 1\nLine 2"

// ํ™•์žฅ ๊ตฌ๋ถ„๊ธฐํ˜ธ ๋‚ด์—์„œ ์ด์Šค์ผ€์ดํ”„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ
let escapedString = #"Line 1\#nLine 2"#  // ์ค„๋ฐ”๊ฟˆ ํ™œ์„ฑํ™”

ํ™•์žฅ๋œ ๋ฌธ์ž์—ด ๊ตฌ๋ถ„๊ธฐํ˜ธ: ๋ฌธ์ž์—ด์„ #"..."# ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ์„œ ํŠน์ˆ˜ ๋ฌธ์ž์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” ๊ธฐ๋Šฅ

๐Ÿ“Œ ๋ฌธ์ž์—ด ์ดˆ๊ธฐํ™”์™€ ๋ณ€๊ฒฝ

๋นˆ ๋ฌธ์ž์—ด ์ƒ์„ฑ

var emptyString = ""                // ๋นˆ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด
var anotherEmptyString = String()   // ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ

if emptyString.isEmpty {
    print("Nothing to see here")
}
// "Nothing to see here" ์ถœ๋ ฅ

๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ

var variableString = "Horse"
variableString += " and carriage"
// "Horse and carriage"

let constantString = "Highlander"
// constantString += " and another Highlander"  // ์˜ค๋ฅ˜! ์ƒ์ˆ˜๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

isEmpty: ๋ฌธ์ž์—ด์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

๋ณ€์ˆ˜(var)์™€ ์ƒ์ˆ˜(let): ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒ์ˆ˜๋Š” ํ•œ ๋ฒˆ ํ• ๋‹นํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์€ ๊ฐ’ ํƒ€์ž…

Swift์—์„œ ๋ฌธ์ž์—ด์€ ๊ฐ’ ํƒ€์ž…(value type)์œผ๋กœ, ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋  ๋•Œ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›๋ณธ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’ ํƒ€์ž…: ํ• ๋‹น์ด๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜๋Š” ํƒ€์ž…

๐Ÿ“Œ ๋ฌธ์ž ์ž‘์—… (Working with Characters)

๋ฌธ์ž์—ด์˜ ๊ฐœ๋ณ„ ๋ฌธ์ž ์ ‘๊ทผํ•˜๊ธฐ

for character in "Dog!๐Ÿถ" {
    print(character)
}
// D
// o
// g
// !
// ๐Ÿถ

Character ํƒ€์ž… ๋ช…์‹œ์  ์„ ์–ธ

let exclamationMark: Character = "!"

๋ฌธ์ž ๋ฐฐ์—ด๋กœ ๋ฌธ์ž์—ด ์ƒ์„ฑ

let catCharacters: [Character] = ["C", "a", "t", "!", "๐Ÿฑ"]
let catString = String(catCharacters)
// "Cat!๐Ÿฑ"

for-in ๋ฃจํ”„: ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

ํƒ€์ž… ๋ช…์‹œ: ์ฝœ๋ก (:)๊ณผ ํƒ€์ž… ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •

๐Ÿ“Œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ๊ณผ ์‚ฝ์ž…

๋ฌธ์ž์—ด ์—ฐ๊ฒฐ

let string1 = "hello"
let string2 = " there"
let welcome = string1 + string2  // "hello there"

var instruction = "look over"
instruction += string2           // "look over there"

๋ฌธ์ž ์ถ”๊ฐ€

var welcome = "hello"
welcome.append(" there")         // "hello there"
welcome.append(exclamationMark)  // "hello there!"

๋ฌธ์ž์—ด ์‚ฝ์ž… (String Interpolation)

๋ฌธ์ž์—ด ์•ˆ์— ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ‘œํ˜„์‹ ๋“ฑ์„ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•:

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// "3 times 2.5 is 7.5"

ํ™•์žฅ๋œ ๊ตฌ๋ถ„๊ธฐํ˜ธ ๋‚ด์—์„œ ๋ฌธ์ž์—ด ์‚ฝ์ž… ์‚ฌ์šฉ:

print(#"6 times 7 is \#(6 * 7)."#)
// "6 times 7 is 42."

๋ฌธ์ž์—ด ์‚ฝ์ž…: \(ํ‘œํ˜„์‹) ํ˜•ํƒœ๋กœ ๋ฌธ์ž์—ด ๋‚ด์— ๊ฐ’์„ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

append(): ๋ฌธ์ž์—ด ๋์— ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด๋‚˜ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ

๐Ÿ“Œ ์œ ๋‹ˆ์ฝ”๋“œ์™€ ๋ฌธ์ž ํ‘œํ˜„

Swift์˜ ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฌธ์ž(Character)๋Š” ์—ฌ๋Ÿฌ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” "ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ํด๋Ÿฌ์Šคํ„ฐ"๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

// ๊ฐ™์€ ๋ฌธ์ž "รฉ"๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•
let eAcute: Character = "\u{E9}"                // รฉ (๋‹จ์ผ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ)
let combinedEAcute: Character = "\u{65}\u{301}" // e + ฬ  -> รฉ (๋‘ ๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ)
// eAcute์™€ combinedEAcute๋Š” ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋จ

์œ ๋‹ˆ์ฝ”๋“œ: ์ „ ์„ธ๊ณ„์˜ ๋‹ค์–‘ํ•œ ๋ฌธ์ž๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€

์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ: ๋‹จ์ผ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ, 21๋น„ํŠธ ์ˆซ์ž

ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ํด๋Ÿฌ์Šคํ„ฐ: ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž๋ฅผ ํ˜•์„ฑํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ์˜ ์‹œํ€€์Šค

๋ฌธ์ž ์นด์šดํŒ…

let greeting = "Hello, ์„ธ๊ณ„!"
print(greeting.count)  // 9

count: ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ฌธ์ž(ํ™•์žฅ๋œ ๋ฌธ์ž์†Œ ํด๋Ÿฌ์Šคํ„ฐ) ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

๐Ÿ“Œ ๋ฌธ์ž์—ด ์ธ๋ฑ์Šค์™€ ์ ‘๊ทผ

๋ฌธ์ž์—ด ์ธ๋ฑ์Šค

let greeting = "Hello, world!"

// ์ธ๋ฑ์Šค ์ ‘๊ทผ
greeting[greeting.startIndex]                      // "H"
greeting[greeting.index(before: greeting.endIndex)]  // "!"
greeting[greeting.index(after: greeting.startIndex)]  // "e"

// ์ง€์ •๋œ ์˜คํ”„์…‹์˜ ์ธ๋ฑ์Šค
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]  // "w"

indices ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ

for index in greeting.indices {
    print("\(greeting[index]) ", terminator: "")
}
// "H e l l o ,   w o r l d ! "

startIndex: ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค

endIndex: ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜ ๋‹ค์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค(์œ ํšจํ•˜์ง€ ์•Š์€ ์œ„์น˜)

indices: ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„

๋ฌธ์ž์—ด ์‚ฝ์ž…๊ณผ ์‚ญ์ œ

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// "hello!"

welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// "hello there!"

welcome.remove(at: welcome.index(before: welcome.endIndex))
// "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// "hello"

insert(_:at:): ์ง€์ •๋œ ์œ„์น˜์— ๋ฌธ์ž๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์„œ๋“œ

insert(contentsOf:at:): ์ง€์ •๋œ ์œ„์น˜์— ๋ฌธ์ž์—ด์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์„œ๋“œ

remove(at:): ์ง€์ •๋œ ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ

removeSubrange(_:): ์ง€์ •๋œ ๋ฒ”์œ„์˜ ๋ฌธ์ž๋“ค์„ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ

๐Ÿ“Œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด (Substrings)

let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]  // "Hello"

// ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜(์žฅ๊ธฐ ์ €์žฅ์šฉ)
let newString = String(beginning)

๋ถ€๋ถ„ ๋ฌธ์ž์—ด(Substring): ์›๋ณธ ๋ฌธ์ž์—ด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ๋ฌธ์ž์—ด๋กœ, ์žฅ๊ธฐ ์ €์žฅ์—๋Š” String์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ

firstIndex(of:): ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚˜๋Š” ์œ„์น˜์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

๐Ÿ“Œ ๋ฌธ์ž์—ด ๋น„๊ต

๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž ๋™๋“ฑ์„ฑ

// ๋ฌธ์ž์—ด ๋น„๊ต
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("๋‘ ๋ฌธ์ž์—ด์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค")
}

// ๋‹ค๋ฅธ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œํ˜„์ด์ง€๋งŒ ๊ฐ™์€ ๋ฌธ์ž
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
if eAcuteQuestion == combinedEAcuteQuestion {
    print("๋‘ ๋ฌธ์ž์—ด์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค")
}

์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ํ™•์ธ

let romeoAndJuliet = [
    "Act 1 Scene 1: Verona, A public place",
    "Act 1 Scene 2: Capulet's mansion",
    "Act 2 Scene 1: Outside Capulet's mansion",
    "Act 2 Scene 2: Capulet's orchard"
]

// ์ ‘๋‘์‚ฌ ํ™•์ธ
var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("Act 1์—๋Š” \(act1SceneCount)๊ฐœ์˜ ์žฅ๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค") // 2

// ์ ‘๋ฏธ์‚ฌ ํ™•์ธ
var mansionCount = 0
for scene in romeoAndJuliet {
    if scene.hasSuffix("Capulet's mansion") {
        mansionCount += 1
    }
}
print("Capulet's mansion์—์„œ \(mansionCount)๊ฐœ์˜ ์žฅ๋ฉด์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค") // 2

hasPrefix(_:): ๋ฌธ์ž์—ด์ด ์ง€์ •๋œ ์ ‘๋‘์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ

hasSuffix(_:): ๋ฌธ์ž์—ด์ด ์ง€์ •๋œ ์ ‘๋ฏธ์‚ฌ๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ

๐Ÿ“Œ ๋ฌธ์ž์—ด์˜ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œํ˜„

Swift๋Š” ๋ฌธ์ž์—ด์˜ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œํ˜„์— ์ ‘๊ทผํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

UTF-8 ํ‘œํ˜„

let dogString = "Dogโ€ผ๐Ÿถ"
for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
// 68 111 103 226 128 188 240 159 144 182

UTF-16 ํ‘œํ˜„

for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
// 68 111 103 8252 55357 56374

์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ํ‘œํ˜„

for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
// 68 111 103 8252 128054

// ์Šค์นผ๋ผ ์ž์ฒด๋ฅผ ์ถœ๋ ฅ
for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D, o, g, โ€ผ, ๐Ÿถ

utf8: ๋ฌธ์ž์—ด์˜ UTF-8 ํ‘œํ˜„์— ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

utf16: ๋ฌธ์ž์—ด์˜ UTF-16 ํ‘œํ˜„์— ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

unicodeScalars: ๋ฌธ์ž์—ด์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ ํ‘œํ˜„์— ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœํผํ‹ฐ


Swift์˜ ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ํ˜ธํ™˜์„ฑ, ์•ˆ์ „ํ•œ ํƒ€์ž… ์ฒ˜๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์€ ๊ตญ์ œํ™”๋œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.