์๋ ํ์ธ์. ์ด๋ฒ์๋ 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์ ๋ฌธ์์ด๊ณผ ๋ฌธ์๋ ์ ๋์ฝ๋ ํธํ์ฑ, ์์ ํ ํ์ ์ฒ๋ฆฌ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ ๊ณตํ๋ฉด์๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ค๊ณ๋์์ต๋๋ค. ์ด๋ฌํ ํน์ฑ์ ๊ตญ์ ํ๋ ์ฑ์ ๊ฐ๋ฐํ๊ฑฐ๋ ๋ณต์กํ ํ ์คํธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ํนํ ์ค์ํฉ๋๋ค.
'๐ฅ Bread Basics > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํด๋ก์ (Closures) (0) | 2025.04.11 |
---|---|
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํจ์ (Functions) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ด ํ๋ฆ (Control Flow) (0) | 2025.04.10 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ปฌ๋ ์ ํ์ (Collection Types) (0) | 2025.04.10 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๊ธฐ๋ณธ ์ฐ์ฐ์ (Basic Operators) (0) | 2025.04.10 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๊ธฐ๋ณธ(The Basics)(2/2) (0) | 2025.04.10 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๊ธฐ๋ณธ(The Basics)(1/2) (0) | 2025.04.10 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - A Swift Tour (0) | 2025.04.10 |