char 형식

char 형식 (C# 참조)

C#에서 문자 하나를 다뤄야 할 때, 우리는 대부분 char 형식을 쓰게 돼요. 이 char 키워드는 .NET의 System.Char 구조체 타입을 가리키는 별칭(alias)이고, 유니코드 UTF-16 코드 단위(code unit) 하나를 나타내요. 보통은 UTF-16 문자 하나라고 생각하면 돼요.

출처: Microsoft Learn

본문

char 형식의 범위와 크기, 그리고 실제 .NET 타입을 정리하면 이렇게 돼요.

Type Range Size .NET type
char U+0000 to U+FFFF 16 bit xref:System.Char?displayProperty=nameWithType

눈여겨볼 점이 하나 있어요. char는 16비트, 즉 2바이트 크기예요. 그래서 값의 범위가 U+0000부터 U+FFFF까지로 제한되죠. 그리고 char 형식의 기본값(default value)은 \0, 다시 말해 U+0000이에요. 아무 값도 지정하지 않고 char 변수를 만들면 이 기본값을 가지게 돼요.

char 형식은 비교(comparison), 같음(equality), 증가(increment), 감소(decrement) 연산자를 지원해요. 특히 char 피연산자에 사칙연산(arithmetic)이나 비트 논리(bitwise logical) 연산자를 적용하면, 해당 문자의 코드 포인트(code point)에 대해 연산을 수행하고 그 결과를 int 값으로 돌려줘요. 즉 문자에 숫자를 더해서 '다음 문자'를 얻는 식의 연산이 가능하다는 뜻이에요.

여기서 잠깐, 텍스트 전체를 다루는 경우도 있을 거예요. 그럴 땐 string 형식이 텍스트를 char 값들의 시퀀스로 표현한다는 점을 기억해 두면 좋아요. char가 문자 하나라면 string은 그 문자의 모음이라고 볼 수 있죠.

리터럴 (Literals)

char 값을 지정하는 방법은 크게 세 가지가 있어요.

  • 문자 리터럴: 작은따옴표로 문자 하나를 감싸는 방식이에요.
  • 유니코드 이스케이프 시퀀스: \u 뒤에 문자 코드의 4자리 16진수 표현을 붙이는 방식이에요.
  • 16진수 이스케이프 시퀀스: \x 뒤에 문자 코드의 16진수 표현을 붙이는 방식이에요.

아래 예제를 보면서 각 방식을 확인해 볼게요.

var chars = new[]
{
    'j',
    '\u006A',
    '\x006A',
    (char)106,
};
Console.WriteLine(string.Join(" ", chars));  // output: j j j j

위 예제에서 볼 수 있듯이, 문자 코드의 값을 그냥 char 값으로 캐스팅(casting)해서 같은 결과를 얻을 수도 있어요. 'j'도, \u006A도, \x006A도, (char)106도 모두 같은 문자 j를 가리키는 거죠.

[!NOTE] 유니코드 이스케이프 시퀀스에서는 4자리의 16진수 숫자를 모두 지정해야 해요. 즉 \u006A는 유효한 이스케이프 시퀀스지만, \u06A\u6A는 유효하지 않아요.

반면 16진수 이스케이프 시퀀스에서는 앞의 0을 생략할 수 있어요. 그래서 \x006A, \x06A, \x6A 모두 유효하며, 세 가지 모두 같은 문자를 나타내요.

변환 (Conversions)

char 형식은 몇몇 정수 타입으로 암시적(implicit)으로 변환돼요. 예를 들어 ushort, int, uint, long, ulong, nint, nuint로는 자동으로 변환되지요. 또 내장 부동 소수점 타입인 float, double, decimal로도 암시적으로 변환돼요. 다만 sbyte, byte, short 같은 정수 타입으로는 명시적(explicit)으로만 변환할 수 있어요.

반대로, 다른 타입이 char로 변환되는 경우는 조금 달라요. 다른 타입에서 char로 가는 암시적 변환은 존재하지 않아요. 하지만 어떤 정수 타입이나 부동 소수점 타입이든 명시적으로 캐스팅하면 char로 바꿀 수 있어요.

C# 언어 사양

더 정확하고 엄밀한 정의가 궁금하다면, C# 언어 사양정수 타입(Integral types) 섹션을 참고하면 좋아요.

더 알아보기