문자열은 텍스트 데이터를 나타내요.
Swift에서 String은 Character 값이 순서대로 나열된 컬렉션이고, 각 문자는 유니코드 문자를 나타내요.
문자열은 문자열 리터럴로 만들어요. 문자열 리터럴은 큰따옴표(")로 둘러싼 문자의 나열이에요.
여러 줄 문자열에는 큰따옴표 세 개(""")를 사용해요:
let hello: String = "Hello, World!"
let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""
Swift의 문자열은 Foundation 프레임워크의 NSString 클래스와 매끄럽게 이어져서, 폭넓은 텍스트 처리 기능을 활용할 수 있어요.
Character는 하나의 확장 문자소 클러스터를 나타내요. 확장 문자소 클러스터는 하나 이상의 유니코드 스칼라 값으로 이루어진, 사람이 읽을 수 있는 문자예요.
유니코드 스칼라 값은 U+0000 이상 U+D7FF 이하 또는 U+E000 이상 U+10FFFF 이하 범위의 21비트 코드 포인트예요.
let aChar: Character = "A"
문자열 리터럴을 쓰면, Swift가 자동으로 그 타입을 String으로 추론해요.
하나의 문자를 Character로 저장하려면 타입을 명시적으로 지정해야 해요:
let aString = "A" // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar)) // Prints Character
// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'
덧셈 연산자(+)를 사용해 문자열을 서로 이어 붙일 수 있어요:
print("honey" + "comb")
// Prints "honeycomb"
먼저 문자를 문자열로 변환하지 않으면 +로 Character를 String에 바로 이어 붙일 수는 없어요.
하지만 append(_:) 메서드를 사용하면 문자열이나 문자를 변경 가능한 문자열에 바로 덧붙일 수 있어요:
var greeting = "Hello"
let world = ", world"
let period: Character = "."
greeting.append(world)
print(greeting) // Prints "Hello, world"
greeting.append(period)
print(greeting) // Prints "Hello, world."
문자열 보간을 사용하면 문자열 리터럴 안에 상수, 변수, 리터럴, 표현식을 넣어 문자열을 만들 수 있어요.
각 표현식은 백슬래시가 앞에 오는 괄호(\( ... ))로 감싸요:
let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"
문자열과 문자에는 내용을 살펴볼 수 있는 여러 프로퍼티가 있어요.
자주 쓰이는 문자열 프로퍼티는 다음과 같아요:
| 프로퍼티 | 설명 | 예시 |
|---|---|---|
isEmpty |
문자열에 문자가 없으면 true를 반환해요 |
"Hello".isEmpty는 false예요 |
count |
문자열의 문자 개수를 반환해요 |
"Hello".count는 5예요 |
전체 프로퍼티 목록은 Apple String 문서를 참고해요.
자주 쓰이는 문자 프로퍼티는 다음과 같아요:
| 프로퍼티 | 설명 | 예시 |
|---|---|---|
isLowercase |
문자가 소문자면 true를 반환해요 |
"a".isLowercase는 true예요 |
isUppercase |
문자가 대문자면 true를 반환해요 |
"A".isUppercase는 true예요 |
isNumber |
문자가 숫자면 true를 반환해요 |
"1".isNumber는 true예요 |
isWhitespace |
문자가 공백이면 true를 반환해요 |
" ".isWhitespace는 true예요 |
전체 프로퍼티 목록은 Apple Character 문서를 참고해요.
String(_:) 이니셜라이저를 사용하면 다른 타입을 문자열로 변환할 수 있어요. 이 이니셜라이저는 Int, Double, Character 같은 표준 타입을 지원해요:
let charX: Character = "x"
print(String(charX)) // Prints "x"
print(String(110)) // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"
Swift 문자열 리터럴은 특수 문자를 위한 여러 이스케이프 시퀀스를 지원해요:
| 시퀀스 | 설명 |
|---|---|
\0 |
널 문자 |
\\ |
백슬래시 |
\t |
가로 탭 |
\n |
줄 바꿈(개행) |
\r |
캐리지 리턴 |
\' |
작은따옴표 |
\" |
큰따옴표 |
\u{n} |
임의의 유니코드 스칼라(16진수) |
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.
let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖
이 연습 문제에서는 간판 회사가 간판에 넣을 맞춤 메시지를 만들 수 있도록 돕는 코드를 작성해요.
간판을 만드는 데 사용할 다음 상수 문자열을 정의해요:
birthday: 이 상수는 "Birthday" 값을 가져요.valentine: 이 상수는 "Valentine's Day" 값을 가져요.anniversary: 이 상수는 "Anniversary" 값을 가져요.간판을 만드는 데 사용할 다음 상수 문자를 정의해요:
space: 이 상수는 " " 값(공백 한 칸)을 가져요.exclamation: 이 상수는 "!" 값을 가져요.buildSign(for:name:) 함수를 구현해요. 이 함수는 첫 번째 과제에서 정의한 세 문자열 중 하나를 담는 for 인자와, 간판을 받을 사람의 이름을 담는 문자열 name 인자를 받아요.
간판의 메시지를 만들 때 문자열 연결을 사용하고, 이미 정의한 상수를 다시 사용하는 것도 잊지 마세요.
함수는 간판 메시지를 문자열로 반환해야 해요.
buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"
buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"
graduationFor(name:year:) 함수를 구현해요. 이 함수는 간판을 받을 사람의 이름을 담는 문자열 name 인자와, 그 사람이 졸업하는 연도를 담는 정수 year 인자를 받아요.
간판의 메시지를 만들 때 템플릿 문자열을 사용해요.
함수는 간판 메시지를 문자열로 반환해야 해요.
graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"
costOf(sign:) 함수를 구현해요. 이 함수는 간판의 메시지를 담는 문자열 sign 인자를 받아요.
간판의 기본 가격은 해당 통화 기준으로 20이고, 글자마다 2씩 추가돼요. (공백도 계산에 포함돼요.)
함수는 간판의 가격을 정수로 반환해야 해요.
costOf(sign: "Happy Birthday Grandma!")
// returns 66
Exercism에 가입하고 Swift 트랙을 개념 35개연습 문제 116개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.