문자
문자 (Characters)
코드에서 한 글자짜리 값 하나만 필요할 때가 있어요. 영문자 한 개, 숫자 한 자리, 구두점이나 공백 같은 것들이죠. Kotlin에서는 이런 단일 문자 값을 Char 타입으로 표현해요. Char는 UTF-16 코드 유닛 하나를 담는 타입이에요.
여러 글자가 이어지는 문자열이 필요하다면 String을 쓰면 되고요. Char는 숫자 타입은 아니지만, 각 문자에 대응하는 유니코드 숫자 값을 얻을 수는 있어요. 이 내용은 뒤의 문자 변환에서 다룰게요.
출처: Kotlin 공식 문서
본문
문법
문자를 선언할 때는 값을 작은따옴표(' ')로 감싸 주면 돼요. Char 타입을 명시적으로 써 줄 수도 있고, 값에서 Kotlin이 스스로 타입을 추론하게 할 수도 있어요.
val letter: Char = 'a'
// 작은따옴표로 감싼 값이므로 Kotlin이 Char로 추론해요
val digit = '1'
val symbol = '!'
val space = ' '
val separator = ':'
문자 리터럴에는 정확히 한 글자만 들어가야 해요. 그렇지 않으면 Kotlin 컴파일러가 오류를 보고해요.
val invalid = 'AB' // Error
val invalidEmpty = '' // Error
널 가능 값 (Nullable values)
널이 가능한 값을 저장해야 한다면 Char?를 쓰면 돼요.
val maybeAbsent: Char? = null
JVM에서는 필요한 경우 널 가능한 Char 값이 박싱(boxing)돼요. 숫자 타입과 같은 원리예요.
유니코드 지원
Kotlin은 Char 값을 UTF-16 코드 유닛으로 표현해요. 즉 Char 하나가 저장하는 건 UTF-16 코드 유닛 하나지, 반드시 완전한 유니코드 문자 하나는 아니라는 뜻이에요.
기본 다국어 평면 (Basic Multilingual Plane)
Char 하나는 \u0000부터 \uFFFF까지의 값을 저장할 수 있어요. 이 범위를 기본 다국어 평면(BMP)이라고 하는데, 거의 모든 현대 언어의 문자와 많은 기호를 포함해요.
유니코드 값으로 문자를 지정하려면 \u 뒤에 유니코드 테이블에서 찾은 네 자리 16진수 값을 쓰면 돼요.
val unicodeNumber = '\u0031' // '1'과 같아요
보조 문자 (Supplementary characters)
이모지나 일부 고대 문자처럼 BMP 밖에 있는 유니코드 문자는 Char 하나로 표현할 수 없어요. 이런 문자는 UTF-16에서 서로게이트 쌍(surrogate pair) 으로 인코딩되는데, String 안에서 Char 값 두 개가 합쳐져 유니코드 문자 하나를 나타내는 구조예요.
fun main() {
//sampleStart
val emoji = "🥦"
println(emoji.length) // 2
println(emoji[0]) // 첫 번째 서로게이트
println(emoji[1]) // 두 번째 서로게이트
//sampleEnd
}
32비트 기호를 한 개씩 다뤄야 한다면, Int 값으로 저장되는 유니코드 코드 포인트를 사용하면 돼요.
이스케이프 시퀀스 (Escape sequences)
소스 코드에 직접 쓰기 어렵거나 특별한 의미를 가진 문자는 이스케이프 시퀀스로 표현해요. 모든 이스케이프 시퀀스는 백슬래시(\)로 시작해요.
| 지원되는 시퀀스 | 설명 |
|---|---|
\t |
탭 (Tab) |
\b |
백스페이스 (Backspace) |
\n |
줄바꿈 (New Line, LF) |
\r |
캐리지 리턴 (Carriage Return, CR) |
\' |
작은따옴표 (Single quotation mark) |
\" |
큰따옴표 (Double quotation mark) |
\\ |
백슬래시 (Backslash) |
\$ |
달러 기호 (Dollar sign) |
예를 들면 이렇게 써요.
val newLine = '\n'
val dollar = '\$'
val backslash = '\\'
연산 (Operations)
Char는 비교, 검사, 대소문자 변환, 명시적 숫자 변환을 지원해요.
문자 비교
Char 값을 비교할 때는 ==, !=, <, >, <=, >= 같은 표준 비교 연산자를 쓰면 돼요.
Kotlin은 Char 값을 그 유니코드 숫자 값으로 비교하고 Boolean 결과를 돌려줘요.
val before = 'a' < 'b' // true
val after = 'c' > 'd' // false
val different = 'A' == 'a' // false
val equal = 'A' == 'A' // true
문자 처리
Kotlin은 문자 값의 검사와 대소문자 변환을 위한 함수들을 제공해요. 예를 들면 이렇죠.
fun main() {
//sampleStart
val myChar = 'A'
// 문자가 숫자를 나타내는지 검사해요
println(myChar.isDigit()) // false
// 문자가 대문자를 나타내는지 검사해요
println(myChar.isUpperCase()) // true
// 소문자 버전을 돌려줘요
println(myChar.lowercaseChar()) // 'a'
//sampleEnd
}
쓸 수 있는 함수의 전체 목록은 API 레퍼런스에서 확인할 수 있어요.
문자 산술
문자 값에 정수를 더하거나 빼서 다른 문자 값을 만들 수 있어요.
fun main() {
//sampleStart
val a = 'a'
println(a + 1) // b
println(a + 2) // c
println(a - 32) // A
//sampleEnd
}
이 연산들은 언어마다 다른 알파벳 규칙이 아니라 유니코드 값을 따라요.
가변 변수에서는 전위/후위 형태의 증가(++)와 감소(--) 연산자도 쓸 수 있어요.
fun main() {
//sampleStart
var a = 'A'
a += 10
println(a) // 'K'
println(++a) // 'L' 전위 증가
println(a++) // 'L' 후위 증가
println(a) // 'M'
println(--a) // 'L' 전위 감소
println(a--) // 'L' 후위 감소
println(a) // 'K'
//sampleEnd
}
문자 변환 (Character conversion)
Char를 숫자 타입으로 바꿀 때는 명시적 변환을 써야 해요.
.code를 쓰면 문자의 유니코드 숫자 값을 얻을 수 있어요.
fun main() {
//sampleStart
val letter = 'A'
println(letter.code) // 65
//sampleEnd
}
- 문자가 십진 숫자를 나타낸다면
digitToInt()를 쓰면 돼요.
fun main() {
//sampleStart
val digit = '7'
println(digit.digitToInt()) // 7
//sampleEnd
}
문자가 유효한 숫자가 아닐 수도 있다면 digitToIntOrNull()을 사용하면 돼요.
더 알아보기 (Learn more)
- 불리언 타입 —
Char와 함께 자주 쓰이는 기본 타입을 정리해요. - 문자열 — 여러 문자가 이어지는 값을 다루는 방법을 설명해요.
CharAPI 레퍼런스 — 사용 가능한 문자 함수의 전체 목록을 보여줘요.