๋ฌธ์์ด(String)์ ๋ฌธ์(Character)์ ์ฐ์์ด๋ค. Swift์ String๊ณผ Character ํ์ ์ ์ ์ํ๊ณ ์ ๋์ฝ๋๋ฅผ ์ค์ํ๋ค. ๋ฌธ์์ด์ + ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๊ฒฐํฉ์ด ๊ฐ๋ฅํ๋ค. ๋ํ ๋ฌธ์์ด ๋ณด๊ฐ๋ฒ์ ์ด์ฉํ์ฌ ๋ฌธ์์ด ์์,๋ณ์,๋ฆฌํฐ๋ด ๋ฐ ํํ์์ ๊ธด ๋ฌธ์์ด์ ์ฌ์ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํ๋ฉด์ ํ์ํ๊ฑฐ๋, ์ ์ฅ ,์ถ๋ ฅ์ ์ํ ์ปค์คํ ๋ฌธ์์ด ๊ฐ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
NOTEโ๏ธ
Swift์ String ํ์ ์ Foundation์ NSString ํด๋์ค์ ์ฐ๊ฒฐ๋์ด ์๋ค. Foundation์ import ํ๋ฉด ์บ์คํ ์์ด String ์์ NSString ๋ฉ์๋๋ฅผ ์ ๊ทผํ ์ ์๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด (String Literals)
์ฝ๋์์ ๋ฏธ๋ฆฌ ์ ์ธ๋ String ๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด (string literals)์ ํ ๋นํ ์ ์๋ค. ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์๋ฐ์ดํ (")๋ก ๋๋ฌ์์ธ ๋ฌธ์์ ์ฐ์์ ๋ปํ๋ค.
์ฌ๋ฌ์ค ๋ฌธ์์ด ๋ฆฌํฐ๋ด (Multiline String Literals)
์ฌ๋ฌ์ค์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด 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."
"""
์์ค์ฝ๋์์ ์ฌ๋ฌ์ค ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ค๋ฐ๊ฟ์ ํฌํจํ๋ฉด ์ค๋ฐ๊ฟ๋ ๋ฌธ์์ด์ ๊ฐ์ผ๋ก ๋ํ๋๋ค. ์์ค์ฝ๋๋ฅผ ์ฝ๊ฒ ์ฝ์ ์ ์๊ฒ ์ค๋ฐ๊ฟ์ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ์ค๋ฐ๊ฟ์ด ๋ฌธ์์ด์ ๊ฐ์ ์ผ๋ถ๊ฐ ๋๋๊ฑธ ์์น ์์ ๋๋ ์ค ๋ฐ๊ฟ์ ์ํ๋ ๋ผ์ธ ๋์ ๋ฐฑ์ฌ๋์()๋ฅผ ์ฐ๋ฉด ๋๋ค.
๋ค์ฌ์ฐ๊ธฐ๋ ๋ซ๋ ๋ฐ์ดํ๋ฅผ(""")๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ๊ฐ๋๋ค.
ํ์ฅ๋ ๋ฌธ์์ด ๊ตฌ๋ถ๊ธฐํธ (Extended String Delimiters)
์ต ๊ธฐํธ(#)์ผ๋ก ๋ฌธ์์ด ์๋ค๋ฅผ ๊ฐ์ธ๋ฉด ๋ด๋ถ์ ๋ฌธ์์ด์ ๊ธ์ ๊ทธ๋๋ก ์ธ์ํ๋ค. (RawString) ๋ก์คํธ๋ง์ ์ฌ์ฉํ๋ฉด์๋ ํน์ ์ํฅ์ด ํ์ํ๋ค๋ฉด ํน์๋ฌธ์ ๋ค์์ ์ต์ ๊ฐ์๋งํผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๋น ๋ฌธ์์ด ์ด๊ธฐํ (Initializing an Empty String)
๋น String ๊ฐ์ ๋ง๋ค๋ ค๋ฉด ๋น ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ผ๋ก ์ String ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๋ค.
var emptyString = "" // empty string literal
var anotherEmptyString = String() // initializer syntax
// these two strings are both empty, and are equivalent to each other
String ๊ฐ์ ๋ถ์ธ isEmpty ํ๋กํผํฐ๋ก ๋น์ด์๋์ง ์ฒดํฌํ ์ ์๋ค.
๋ฌธ์์ด์ ๊ฐ ํ์ (Strings Are Value Types)
Swift์ String ํ์ ์ ๊ฐ ํ์ (value type) ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก์ด String ๊ฐ์ ์์ฑํ๊ณ ์ด ๊ฐ์ ํจ์ ๋๋ ๋ฉ์๋์ ์ ๋ฌํ๋ ค๊ณ ํ ๋๋ ์์ ๋๋ ๋ณ์์ ๋์ ๋ ๋ ๋ณต์ฌ๋์ด ํ ๋น๋๋ค.
String ๊ฐ์ ๋ณต์ฌํ ๋๋ ์ถ์ฒ์ ๊ด๊ณ์์ด ์ ํํ ๊ฐ์ ๋ณด์ฅํ๋ค. ๊ฒฐ๊ตญ ๊ฐ์ ์ง์ ์์ ํ์ง ์๋ํ ์์ ๋์ง ์๋๋ค.
๋ฌธ์์ด๊ณผ ๋ฌธ์ ์ฐ๊ฒฐ (Concatenating Strings and Characters)
String ๊ฐ์ ๋ํ๊ธฐ ์ฐ์ฐ์ (+)๋ก ํจ๊ป ์ถ๊ฐ (๋๋ ์ฐ๊ฒฐ) ํ์ฌ ์๋ก์ด String ๊ฐ์ ์์ฑํ ์ ์๋ค.
๋ํ ์กด์ฌํ๋ String ๋ณ์์ ๋ง์ ๋์ ์ฐ์ฐ์ (+=)๋ก String ๊ฐ์ ์ฐ๊ฒฐํ ์ ์๋ค.
String ํ์ ์ append() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ String ๋ณ์์ Character ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค.
๋ฌธ์์ด ์ ๊ทผ๊ณผ ์์ (Accessing and Modifying a String)
๋ฉ์๋์ ํ๋กํผํฐ ๋๋ ์๋ธ ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ผ๋ก ๋ฌธ์์ด์ ์ ๊ทผ, ์์ ํ ์ ์๋ค.
๋ฌธ์์ด ์ธ๋ฑ์ค(String Indices)
String ๊ฐ์ ์ธ๋ฑ์ค ํ์ (index type)๊ณผ ๊ด๋ จ๋์ด ์๊ธฐ ๋๋ฌธ์ , ๋ดํฌํ๊ณ ์๋ Character์ ์์น์ ํด๋นํ๋ String.Index๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฌ๋ ๊ฐ๊ฐ์ ๋ฌธ์๋ง๋ค ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ์ ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํน์ ์์น์ Charactor๋ฅผ ํ์ธ ํ๋ ค๋ฉด String์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฐ ์ ๋์ฝ๋ ์ค์นผ๋ผ๋ฅผ ๋ฐ๋ณตํด์ผ๋ง ํ๋ค.
String ์ ์ฒซ๋ฒ์งธ Character ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ startIndex ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ค. endIndex ํ๋กํผํฐ๋ String ๋ง์ง๋ง ๋ฌธ์์ ๋ค์์ ์์นํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก endIndex ํ๋กํผํฐ๋ ๋ฌธ์์ด์ ์๋ธ ์คํฌ๋ฆฝํธ์ ์ ํจํ ์ธ์๊ฐ ์๋๋ค. String๊ฐ์ด ๋น์ด์๋ค๋ฉด startIndex ์ endIndex ๋ ๊ฐ๋ค.
String์ ๋ฉ์๋ index(before:) ์ index(after:) ๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ๊ณผ ํ์ ์ ๊ทผํ ์ ์๋ค. ์ฃผ์ด์ง ์ธ๋ฑ์ค์์ ๋จ์ด์ง ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ ๋์ index(_:offsetBy:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
๋ฌธ์์ด ๋ฒ์์ ๋ฒ์ด๋๋ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
greeting[greeting.endIndex] // Error
greeting.index(after: greeting.endIndex) // Error
indices ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์๋ ๊ฐ๋ณ ๋ฌธ์์ ๋ชจ๋ ์ธ๋ฑ์ค์ ์ ๊ทผํ ์ ์๋ค.
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n T a g ! "
์ฝ์ ๊ณผ ์ญ์ (Inserting and Removing)
๋ฌธ์์ด ํน์ ์ธ๋ฑ์ค์ ํ๋์ ๋ฌธ์(Character)๋ฅผ ์ฝ์ ํ๋ ค๋ฉด insert(_:at:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ๋ฌธ์์ด์ ํน์ ์ธ๋ฑ์ค์ ์ฝ์ ํ๋ ค๋ฉด insert(contentsOf:at:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
๋ฌธ์์ด ํน์ ์ธ๋ฑ์ค์ ์๋ ํ๋์ ๋ฌธ์(Charater)๋ฅผ ์ญ์ ํ๋ ค๋ฉด remove(at:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , ํน์ ๋ฒ์์ ๋ฌธ์์ด์ ์ญ์ ํ๋ ค๋ฉด removeSubrange(_:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
NOTEโ๏ธ
RangeReplaceableCollection ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ชจ๋ ํ์ ์์ insert(:at:), insert(contentsOf:at:), remove(at:), removeSubrange(:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. String ๋ฟ๋ง ์๋๋ผ Array, Dictionary,Set๊ณผ ๊ฐ์ ์ฝ๋ ์ ํ์ ๋ ํฌํจ๋๋ค.
๋ถ๋ถ ๋ฌธ์์ด (Substrings)
์๋ธ์คํฌ๋ฆฝํธ๋ prefix(_:)๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ถ ๋ฌธ์์ด์ ์ป์ผ๋ ค๊ณ ํ ๋ ๊ทธ ๊ฐ์ String์ด ์๋ SubString ๊ฐ์ด ๋๋ค. ์ค์ํํธ์์ SubString์ String์ด ๊ฐ์ง๊ณ ์๋ ๊ฑฐ์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค(StringProtocol์ ์ฑํํ๊ณ ์๊ธฐ ๋๋ฌธ). ์ด๊ฒ์ ๋๊ฐ subString์ ์ด์ฉํ์ฌ String๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ ์ ์ํ ํ ์ ์์์ ์๋ฏธํ๋ค. ๊ทธ๋ฌ๋ SubString์ ๋ฌธ์์ด์ ๋ํ ์์ ์ ์ํํ ๋๋ง ์ฌ์ฉ์ ํ๊ณ ์์ ์ด ๋๋๋ฉด String์ธ์คํด์ค๋ก ๋ณํํด ์ฃผ์ด์ผ ํ๋ค.
let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"
// Convert the result to a String for long-term storage.
let newString = String(beginning)
SubString์๋ ๊ธฐ์กด String๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์กด์ฌํ๋ค. ๊ทธ๋ฌ๋ String๊ณผ SubString์ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ์ํด SubString์ด ์ ์ฅ๋ ๋ ๊ธฐ์กด์ String์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ถ๋ฅผ ์ฌ์ฌ์ฉ ํ๋ค๋ ๊ฒ์ด๋ค.
- newString์ ๋ฌธ์์ด๋ก ๋ณํํด์ ํ ๋นํ ๋ ๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ญ์ ๊ฐ์ง๊ฒ ๋๋ค.
'๐ฆ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Functions (0) | 2022.06.01 |
---|---|
Control Flow (0) | 2022.06.01 |
Collection Types (0) | 2022.05.22 |
Basicย Operators (0) | 2022.05.15 |
The Basics (0) | 2022.05.15 |