문자 타입

문자 타입 (char)

Rust에서 한 글자를 표현할 때 쓰는 타입이 바로 문자 타입이에요. char 타입은 하나의 유니코드 스칼라 값을 나타내요. 조금 더 정확히 말하면 서로게이트(surrogate)가 아닌 코드 포인트를 뜻해요. 유니코드의 모든 문자 하나를 담을 수 있는 타입이라고 생각하면 돼요.

출처: Rust Reference - Character type

본문

char는 홑따옴표(')로 감싼 리터럴로 만들어요. 이모지나 유니코드 이스케이프도 그대로 쓸 수 있어요.

let c: char = 'a';
let emoji: char = '😀';
let unicode: char = '\u{1F600}';

char 타입의 실제 표현(representation)에 대해 알아볼게요. char 값은 32비트 부호 없는 정수로 표현되는데, 그 값의 범위가 0x0000부터 0xD7FF까지, 그리고 0xE000부터 0x10FFFF까지예요. 즉 두 범위 사이에 있는 0xD800~0xDFFF 구간(서로게이트 영역)은 char 값으로 허용되지 않아요. 이 범위를 벗어나는 char를 만드는 것은 즉시 정의되지 않은 동작(UB) 이에요. 그냥 값을 넣어봤더니 나중에 문제가 생기는 게 아니라, 그 순간부터 이미 UB라는 뜻이에요.

크기와 관련해서는 두 가지 보장이 있어요.

  • char는 모든 플랫폼에서 u32같은 크기와 정렬(size/alignment)을 가져요.
  • char의 모든 바이트는 반드시 초기화되어 있어요. 다시 말해 transmute::<char, [u8; size_of::<char>()]>(...)는 항상 sound(안전)해요. 다만 일부 비트 패턴은 유효하지 않은 char이기 때문에, 그 역방향(바이트 배열을 char로 바꾸는 것)은 항상 sound하지는 않아요.

요약하면, char는 "유니코드 문자 하나"라는 의미와 함께, 내부적으로는 검증된 범위의 32비트 정수라는 구현 세부 사항을 함께 갖는 타입이에요.

더 알아보기 (Learn more)