티스토리 뷰

반응형

 

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

 

 

참고 :

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/nullable-value-types?redirectedfrom=MSDN

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator

 

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31