Swift Docs - Strings and Characters
문자열과 문자에 대한 정의
- 문자열(String)은 문자의 모음인 유니코드 문자열 값이다.
- 문자(Character)는 사용자가 인식하는 문자에 가까운 단일 확장 자소 클러스터다.
String(이하 문자열)을 사용하다보면 Character(이하 문자)를 자주 접하게 된다.
예를 들어 문자열을 기준으로 하는 반복문을 사용하면 만나볼 수 있는데, 개별 요소로 문자가 나온다.
let testStrings = "hello"
for character in testStrings {
print(character)
}
// Prints
// h
// e
// l
// l
// o
그럼 왜 Swift는 Strings이 있는데 Character를 만들었을까?
→ 유니코드의 구분을 위해서 만들었다고 생각한다.
Swift의 기본 String 유형은 유니코드 스칼라 값으로 빌드되는데. 각 문자는 고유한 21비트 숫자를 갖고 있다.
그래서 고유한 21비트를 의미하는 값을 Character 타입으로 생성하게 되면 우리는 그에 맞는 문자를 사용할 수 있다.
let 미리조합한문자: Character = "\u{D55C}" // 한
let 따로조합한문자: Character = "\u{1112}\u{1161}\u{11AB}" // ㅎ, ㅏ, ㄴ
// 프린트를 찍어보면 미리조합한문자 = 한, 따로조합한문자 = 한 서로 동일하게 출력된다.
프린트를 찍어보면 미리조합한문자 = 한, 따로조합한문자 = 한 서로 동일하게 출력된다.
만약 String 타입 하나로 모든 문자를 표현하려고 했다면 저렇게 유니코드를 직접 사용할 수 없었을 것이다.
문자열은 배열처럼 동일하게 작동할까?
→ 비슷하면서도 아니다.
배열의 특징 중 하나는 인덱스 값을 통한 데이터 접근인데 보통 인덱스 값은 Int를 사용한다. 그런데 문자열의 경우 인덱스를 통해 문자에 접근이 가능하나, Int와 같은 정수를 인덱스 값으로 사용할 수 없다.
정수를 통해 문자열을 접근할 수 없는 이유
→ 위에서 설명했다 싶이 Swift의 문자열은 문자로 이루어져 있고, 문자는 유니코드 스칼라를 사용한다. 그런데 Character의 특징 중 하나인 유니코드 스칼라 값은 '따로조합'을 허용하기 때문에 단순한 문자도 어떻게 조합되어있는지 특정짓기 어렵다.
let 대: Character = "\u{B300}" // 대
let 미리조합한: Character = "\u{D55C}" // 한
let 따로조합한: Character = "\u{1112}\u{1161}\u{11AB}" // ㅎ, ㅏ, ㄴ
print("\(대)\(미리조합한)")
위 예시에서 대 와 미리조합한 을 합치면 대한 이라는 출력값이 나온다. 그런데 따로 따로조합한 을 합쳐도 똑같은 대한 이 나온다. 그러면 유니코드 스칼라에 의하면 미리조합한으로 합친것의 유니코드 카운트는 2가 되고 따로조합한으로 합친 것은 카운트가 4다. 그러면 정수에 의해 문자열의 인덱스에 접근한다면 의도치 않은 결과가 나올 수 있다.
부분 문자열
유니코드 스칼에 의한 인덱스 오류를 해결하기 위해서 Swift는 Index 구조체를 만들었다.
그래서 문자열의 인덱스 접근은 Index 타입을 통해 접근할 수 있다.
let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"
'Swift' 카테고리의 다른 글
[Swift] split vs components (Substring) (0) | 2021.09.27 |
---|---|
[Swift] Struct And Class (0) | 2021.09.19 |
[Swift] 옵셔널 Optional (0) | 2021.09.13 |
[Swift] 네트워크와 무관한 URLSession Unit Test (0) | 2021.09.08 |
[Swift] URLSession (0) | 2021.09.06 |