티스토리 뷰
Null 허용 값 형식('T?')
Null 허용 값 형식이란 null을 가질 수 있는 값 형식의 변수를 뜻한다.(참조 형식 변수에 사용할 수는 있는데 경고가 뜬다.)
null을 할당할 수 있다는 것을 암시적으로 나타내기 때문에 변수에 null을 할당할 수 있다.
변수를 선언하는 것은 아래와 같다.
bool? b;
Nullable<bool> b2;
두 가지 모두 컴파일하면 Nullable<bool> 형식이 된다.
변수에 값을 할당하는 방법은 아래와 같다.
bool b = true;
bool? b1 = true;
bool? b2 = b;
bool? b3 = null;
Nullable<bool> nb = null;
아래의 경우는 InvalidOperationException을 던진다.
int? n = null;
int m = n; // 에러
변수에 null 값이 들어가 있는지 확인한 후 사용하는 방법은 아래와 같다.
int? a = 42;
if (a is int valueOfA)
Console.WriteLine(valueOfA); // 42
Nullable.HasValue는 null 허용 값 형식의 인스턴스에 해당하는 기본 형식의 값이 존재하는지 여부를 나타낸다.
Nullable.Value는 HasValue가 true인 경우 기본 형식의 값을 가져오고, HasValue가 false인 경우 Value는 InvalidOperationException을 던진다.
int? a = 42;
if (a.HasValue)
Console.WriteLine(a.Value); // 42
int? b = null
Console.WriteLine(b.Value); // 에러
int? a = 42;
if (a != null)
Console.WriteLine(a.Value); // 42
연산자를 사용할 수 있다.
단항 및 이항 연산자 또는 값 형식에서 지원하는 오버로드된 연산자는 null 허용 값 형식에서도 지원한다. 이를 리프트 연산자라고도 하는데 이러한 연산자는 하나 또는 두 개의 피연산자가 null인 경우 null 값을 반환하고, 그렇지 않으면 값을 계산한 후 결과값을 반환한다.
int? a = 10;
int? b = null;
a++; // a is 11
a = a + b; // a is null
비교 연산자의 경우 null 이 포함되면 false이고, 그렇지 않으면 값을 비교한다. 단, ==의 경우에는 모두 null이면 True이고 아니면 False이고, !=의 경우에는 반대이다.
int? a = 10;
Console.WriteLine(a >= null); // False
Console.WriteLine(a < null); // False
Console.WriteLine(a == null); // False
int? b = null;
int? c = null;
Console.WriteLine(b >= c); // False
Console.WriteLine(b == c); // True
Console.WriteLine(b != c); // False
Boxing
Null 허용 값 형식의 인스턴스는 Nullable<>에 Boxing 된다.
값을 꺼낼 때 값이 null 이면 Null 참조 형식으로 값이 있으면 값 형식으로 Boxing 된다.
Null 허용 값 형식을 구별할 수 있는 방법과 잘못된 방법
구별할 수 있는 방법은 아래와 같다.
Console.WriteLine(Nullable.GetUnderlyingType(typeof(int?)) != null); // true
Console.WriteLine(Nullable.GetUnderlyingType(typeof(int)) != null); // false
Nullable 값 형식인지 확인하기 위한 방법으로 Object.GetType()이나 is 연산자를 사용하면 안 된다.
int? a = 17;
Console.WriteLine(a.GetType().FullName); // System.Int32
int? b = 17;
Console.WriteLine(b is int); // true
int c = 17;
Console.WriteLine(c is int?); // true
Null 병합 연산자('??' , '??=')
?? 연산자는 null이 아닌 경우 왼쪽의 값을 반환하고 null인 경우 오른쪽 값을 반환한다.
??= 연산자는 왼쪽 값이 null인 경우에만 오른쪽 값을 왼쪽에 할당한다.
두 경우 모두 왼쪽 값이 null이 아닌 것으로 평가되면 오른쪽 값은 무시한다.
int? a = null;
Console.WriteLine(a is null); // True
Console.WriteLine(a ?? 3); // 3
Console.WriteLine(a is null); // True
a ??= 1;
Console.WriteLine(a is null); // False
참고 :
'C#' 카테고리의 다른 글
[C#] implicit, explicit(명시적 및 암시적 변환 연산자) (0) | 2023.12.26 |
---|---|
[C#] Indexer에 대한 설명 및 사용 방법 (0) | 2023.12.20 |
[C#] Override & New & Sealed (0) | 2023.03.02 |