C# 기본 제공 타입의 기본값
C# 기본 제공 타입의 기본값
C#에는 변수를 선언만 하고 값을 넣지 않아도, 타입마다 정해진 '기본값'이 자동으로 들어가 있어요. 어떤 타입이 어떤 기본값을 갖는지 표로 정리하고, 그 기본값을 손으로 만들어 내는 여러 가지 방법까지 함께 살펴볼게요.
출처: Microsoft Learn
본문
아래 표는 C# 타입들의 기본값을 정리한 거예요.
| Type | Default value |
|---|---|
| Any reference type | null |
| Any built-in integral numeric type | 0 (zero) |
| Any built-in floating-point numeric type | 0 (zero) |
| bool | false |
| char | '\0' (U+0000) |
| enum | The value produced by the expression (E)0, where E is the enum identifier. |
| struct | The value produced by setting all value-type fields to their default values and all reference-type fields to null. |
| Any nullable value type | An instance for which the xref:System.Nullable`1.HasValue property is false and the xref:System.Nullable`1.Value property is undefined. That default value is also known as the null value of a nullable value type. |
표의 내용을 한 줄씩 풀어볼게요. 참조 타입(reference type)은 그 어떤 종류든 기본값이 null이에요. 정수 숫자 계열 타입과 부동 소수점 계열 타입은 모두 0으로 시작하고요. bool은 false를 기본값으로 가져요. char는 보이지 않는 널 문자 '\0'(U+0000)을 기본으로 하죠.
조금 특별한 셋도 있어요. enum은 열거형 식별자를 E라고 했을 때 (E)0이라는 식이 만들어 내는 값이, struct는 값 타입 필드 전부를 자기 기본값으로, 참조 타입 필드 전부를 null로 놓았을 때 나오는 값이 기본값이에요. 또 nullable 값 타입(nullable value type)은 HasValue 속성이 false이고 Value 속성이 정의되지 않은 인스턴스를 기본값으로 갖는데, 이걸 가리켜 nullable 값 타입의 null 값이라고도 부르죠.
이 기본값 규칙은 C# 언어가 처음 등장한 초기 버전부터 그대로 유지돼 왔어요.
기본값 표현식(Default value expressions)
default 연산자(default operator)를 쓰면 어떤 타입의 기본값이라도 직접 만들어 낼 수 있어요. 아래처럼 말이죠.
int a = default(int);
타입이 이미 분명할 때는 default 리터럴(default literal)로 더 간단하게 변수를 기본값으로 초기화할 수도 있어요.
int a = default;
값 타입의 매개 변수 없는 생성자
값 타입은 암시적 매개 변수 없는 생성자(parameterless constructor)도 이 기본값을 만들어 내요. 예를 들어 System.Numerics.Complex를 새로 만들면 값이 (0, 0)으로 채워져 나오죠.
var n = new System.Numerics.Complex();
Console.WriteLine(n); // output: (0, 0)
런타임에서 xref:System.Type?displayProperty=nameWithType 인스턴스가 값 타입을 나타낼 때는 xref:System.Activator.CreateInstance(System.Type)?displayProperty=nameWithType 메서드를 써서 매개 변수 없는 생성자를 호출하고, 그 타입의 기본값을 얻을 수도 있어요.
[!NOTE] 구조체 타입(struct)은 값 타입이면서도, 기본값이 아닌 값을 돌려주는 명시적 매개 변수 없는 생성자를 가질 수 있어요. 그럴 때라도 타입의 진짜 기본값이 필요하다면
default연산자나default리터럴을 사용하면 돼요.
C# 언어 사양
더 자세한 내용이 궁금하다면 C# 언어 사양의 아래 절을 참고해요.