Verse에서는 "Hello Verse" 나 "에픽게임즈" 와 같은 텍스트를 저장하고 처리하는 데 string 타입을 사용합니다. Verse의 string은 글자, 숫자, 문장 부호, 공백, 이모지를 포함할 수 있습니다. "" 와 같이 아무 문자도 포함하지 않은 string은 빈 string 이라고 합니다.
string 리터럴을 넣어 미리 정의된 string 값을 코드에 추가할 수 있습니다. string 리터럴은 큰따옴표 " " 로 둘러싸인 문자의 시퀀스입니다.
다음은 Hello 라는 string 변수를 생성하고 string 리터럴 "Hello world" 로 초기화하는 예시입니다.
Hello : string = "Hello world"
문자 인코딩
문자 인코딩이란 텍스트 문자와 컴퓨터가 이해할 수 있는 데이터 간의 매핑을 가리키며, 코드 포인트라고도 합니다.
Verse는 다양한 언어, 플랫폼, 장치에서 비슷한 문자를 지원하기 위해 유니코드 컨소시엄에서 개발한 표준인 UTF-8 유니코드 문자 인코딩 방식을 사용합니다.
예를 들어 string "🐈" 의 이모지는 이모지의 유니코드 코드 포인트 "{0u1f408}" 로 표현할 수도 있습니다. 유니코드 문서에서 유니코드가 지원하는 모든 문자와 문자별 코드 포인트의 목록을 확인할 수 있습니다.
UTF-8 코드 유닛은 8비트(1바이트)이며 문자를 1~4바이트 길이의 코드 포인트로 인코딩합니다. 작은 값의 코드 포인트는 큰 값의 코드 포인트보다 바이트를 약간 덜 사용합니다. 예를 들어 "a" 는 1바이트인 "{0o61}" 을 사용하지만 "á" 는 2바이트인 "{0oC3}{0oA1}" 을 사용합니다.
string 연산
string은 연결, 비교, 인덱싱, string 길이 구하기, string 보간을 지원합니다.
연결
string에 다른 string을 이어 붙이는 것을 연결(Concatenation)이라고 합니다. + 연산자를 사용해 string을 연결할 수 있습니다.
예를 들어 다음 코드를 실행하면 변수 Announcement 에 string "...And the winner is: Player One!" 이 저장됩니다.
# 승리한 플레이어의 이름입니다.
WinningPlayerName : string = "Player One"
# 승자를 발표하는 메시지를 작성합니다.
Announcement : string = "...And the winner is: " + WinningPlayerName + "!"
string 보간
현재 스코프 내에 유효한 ToString() 함수가 정의되어 있다면 값을 string으로 추출할 수 있습니다.
예를 들어 다음 코드를 실행하면 변수 Announcement 에 string "...And the winner is: Player One!" 이 저장됩니다.
# 승리한 플레이어의 이름입니다.
WinningPlayerName : string = "Player One"
# 승자를 발표하는 메시지를 작성합니다.
Announcement : string = "...And the winner is: {WinningPlayerName}!"
비교
두 string은 각 문자가 같으면 동일하게 취급됩니다.
Verse에서 string을 비교할 때는 각 문자의 코드 포인트를 비교합니다. 대문자와 소문자는 다른 코드 포인트를 가지므로 두 string의 비교는 대소문자를 구분합니다.
실패 가능 연산자 = 를 사용하여 두 string이 동일한지 테스트하고 실패 가능 연산자 <> 를 사용하여 서로 다른지 테스트할 수 있습니다.
유니코드에서는 하나의 문자가 다양한 방식으로 표현될 수 있습니다. 예를 들어 "é" 는 "{0u0049}" 지만, "e" 인 "{0u0065}" 와 결합 악센트인 "{0u0301}" 을 둘 다 사용해서 표현할 수도 있습니다. 똑같이 문자 "é" 로 표시되지만 서로 다른 코드 포인트를 사용하는 이 두 string을 비교하면 두 string은 같지 않습니다. "{0u0049}" 는 "{0u0065}{0u0301}" 와 같지 않습니다.
다음 예시는 어드벤처/퍼즐 게임에서 플레이어가 올바른 아이템을 사용해 게임을 진행했는지 확인합니다.
# 퍼즐에서 다음 단계를 잠금 해제하기 위해 필요한 아이템입니다.
ExpectedItemInternalName : string = "RedPotion"
# 플레이어가 선택한 아이템입니다.
SelectedItemInternalName : string = "BluePotion"
# 플레이어가 올바른 아이템을 선택했는지 확인합니다.
if (SelectedItemInternalName = ExpectedItemInternalName):
# 올바른 아이템을 선택했습니다! 퍼즐이 다음 단계로 넘어갈 수 있음을 알립니다.
return true
# 올바르지 않은 아이템을 선택했습니다. 이 아이템으로는 퍼즐을 진행할 수 없음을 알립니다.
return false
길이
string의 Length 멤버에 액세스해 string에 UTF-8 코드 유닛 몇 개가 포함되는지를 얻을 수 있습니다. 예를 들어 "hey".Length 는 3입니다.
string의 길이는 string을 UTF-8 코드 유닛으로 표현하는 데 필요한 데이터의 크기입니다. 예를 들어 "héy".Length 는 4입니다. string이 문자 3개로 표시되지만, 문자 é 를 표현하려면 UTF-8 코드 유닛이 하나 더 필요하기 때문입니다. 다음 코드는 "seconds" 타이머를 2자리 숫자로 표시합니다. 필요한 경우 숫자 앞에 0을 붙여 자릿수를 맞춥니다.
# SecondsRemaining은 음수가 아닌 것으로 가정합니다.
SecondsRemaining : int = 30
# 자동으로 int 표현을 string으로 변환합니다.
SecondsString:string = SecondsRemaining
# 타이머를 표시하기 위한 string을 구성합니다.
var Combined : string = "Time Remaining: "
# string이 너무 길면 가장 큰 두 자릿수 숫자인 99로 대체합니다.
if (SecondsString.Length > 2):
# 타이머의 값이 너무 큽니다! string을 하드 코딩된 최대 값으로 설정합니다.
set Combined += "99"
else if (SecondsString.Length < 2):
# 숫자 앞에 0을 붙여 자릿수를 맞춥니다.
set Combined += "0{SecondsString}"
else:
# string의 길이가 이미 두 자릿수이므로 그대로 추가합니다.
set Combined += SecondsString
인덱스
string의 특정 인덱스에 있는 UTF-8 코드 유닛에 액세스할 수 있습니다. string의 첫 번째 UTF-8 코드 유닛의 인덱스는 0이며 이후 각 코드 유닛의 인덱스는 1씩 증가합니다.
예를 들어 "cat"[0] 은 "c" 이고 "cat"[1] 은 "a" 입니다.
| 인덱스(Index) | 0 | 1 | 2 |
| 문자 | "c" |
"a" |
"t" |
| 코드 유닛 | "{0o63}" |
"{0o61}" |
"{0o74}" |
string에 둘 이상의 코드 유닛으로 표현되는 문자가 있는 경우, 코드 유닛마다 인덱스를 가집니다. 예를 들어 "á" 는 "{0oC3}{0oA1}" 두 개의 UTF-8 코드 유닛으로 표현되므로, "cát"[1] 은 "{0oC3}" 이고 "cát"[2] 는 "{0oA1}" 입니다.
| 인덱스 | 0 | 1 | 2 | 3 |
| 문자 | "c" |
"á" |
"t" |
|
| 코드 유닛 | "{0o63}" |
"{0oC3}" |
"{0oA1}" |
"{0o74}" |
string의 마지막 인덱스는 string의 길이보다 1 작습니다. 예를 들어 "cat".Length 는 3이고 "cat" 에서 "t" 의 인덱스는 2입니다.
표준 라이브러리
표준 라이브러리는 string의 생성과 사용을 돕는 기능들을 제공합니다. 이러한 함수에 대한 자세한 내용은 Verse API 레퍼런스를 참고하세요.
문자의 대체 표기법
string에서 사용될 때 대체 표기법이 있는 문자들이 있습니다. 예를 들어 "{}" 는 string 보간이나 문자의 코드 포인트에 사용되기도 하지만 텍스트 내에서 중괄호 문자 {}로 사용될 때도 있습니다.
string 내에서 문자의 대체 표기법을 사용하려면 이스케이프 문자 "\" 를 string의 해당 문자 앞에 추가해야 합니다. 예를 들어 "\{\}" 는 텍스트 {}로 렌더링되며 "\n" 은 텍스트의 새 줄을 시작합니다.
구현 세부 사항
string 타입은 UTF-8 코드 유닛의 배열인 []char 의 타입 에일리어스입니다. string이 배열의 타입 에일리어스이므로, string은 배열과 같은 비헤이비어를 가집니다.
문자에는 크기와 코드 포인트 포맷에 따라 char 및 char32 라는 두 프리미티브 타입이 있습니다. Verse에서 char 와 char32 로는 비교와 값 액세스만이 가능합니다.
| 프리미티브 타입 | 설명 | 지원하는 포맷 |
|---|---|---|
| char | 1바이트의 UTF-8 코드 유닛 1개를 나타내는 프리미티브 타입이며 최댓값은 256( 0off )입니다. |
0oXX 형식의 코드 유닛입니다. 0o52 를 예로 들 수 있습니다. |
| char32 | 유니코드 코드 포인트를 나타내는 프리미티브 타입입니다. | 0uXXXX 형식의 코드 포인트입니다. 0u0041 을 예로 들 수 있습니다. |
작은따옴표로도 리터럴을 표현할 수 있습니다. 작은따옴표 내 string의 프리미티브 타입은 문자에 사용되는 UTF-8 코드 유닛에 따라 char 또는 char32 로 결정됩니다. 예를 들어 'e' 는 char 이며 'é' 는 char32 입니다.
퍼시스턴스 타입
String, char, char32 값은 모두 퍼시스턴스입니다. 즉, 모듈 스코프 weak_map 변수에서 사용할 수 있고 값이 게임 세션 간에 유지된다는 의미입니다. Verse의 퍼시스턴스에 대한 자세한 내용은 Verse에서 퍼시스턴스 데이터 사용하기를 참고하세요.