본문 바로가기

Swift

[Swift] String and Characters(문자열과 문자)

Swift Docs - Strings and Characters

Apple Developer - String

Apple Developer - Character

 

문자열과 문자에 대한 정의

  • 문자열(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