[C#]

널러블 타입(Nullable type,TYPE?)

럭키🍀 2022. 1. 25. 13:59

C#에 존재하는 특별한 타입인 Nullable Type

int? 와 같이 타입뒤에?이 있거나 ??, ??= 요런걸 보고 놀라서 찾아보고 정리했다.

 

 무엇이냐면 그냥 Null을 가질 수 없는 타입들에게 특별히 Null을 가질수 있도록 허용하는 것이다.

 

1.Nullable Type

C#의 Nullable Type은 Null을 값으로 가질 수 없는 데이터의 타입을 Null을 가질수 있는 타입으로 만들도록 선언해주는것이다. Null을 값으로 가질 수 없는 타입들은 대표적으로 값 타입(value type)이 있다. int, double, bool, 구조체 등의 데이터 타입이다. *클래스와 같은 참조타입(reference type)은 Null을 값으로 가질수 있으므로 따로 Nullable Type으로 만들지 않아도 된다.

즉, 값 타입에 대해서 Nullable 타입으로 사용해 '값이 없다'를 표현하기 위해 사용하는것이다.

Null 허용 값 형식은 기본값 형식T의 모든 값에 추가로 null도 값으로 가질 수 있게 된다. bool타입은 true, false, null

2.사용방법

2-1 선언하는 방법

Nullable<T> 변수명;

T? 변수명;

 

2-2 속성과 메서드

-HasValue 속성

값이 있는 경우 true, 값이 없는 경우(Null) False

-Value 속성

값이 있는 경우 할당 된 값, 값이 없는 경우(Null) 예외(Exception) 발생 

-GetValueOrDefault() 메서드

값이 있는 경우 할당된 값을 반환하고  값이 없는 경우(Null) 기존타입의 default값을 반환한다.

 

3.  예제

Nullable<int> num1;
int? num2;

num1=null;
num2=1;

Console.WriteLine(num1);                     //
Console.WriteLine(num1.HasValue);            // False
Console.WriteLine(num1.GetValueOrDefault()); // 0
//Console.WriteLine(num1.Value);				//예외


Console.WriteLine(num2);                     // 1
Console.WriteLine(num2.HasValue);            // True
Console.WriteLine(num2.GetValueOrDefault()); // 1
Console.WriteLine(num2.Value);               // 1

int?[] arr = new int?[10];

arr[0]=10;
arr[2]=11;
arr[4]=12;
arr[5]=13;

foreach(var num in arr){ //var 대신 int?으로 사용가능하다.
 if(num.HasValue)
     Console.WriteLine($"num = {num.Value}");  // num = 10, num = 11, num = 12, num = 13
}

4.주의할 점

-Nullable의 중복이 불가능하다.

Nullable<Nullable<int>> num; //이런식으로 사용하면 안된다.

 

-Value를 접근 할 때 HasValue로 체크한 후 접근하기(혹은 구조체라면 ?. 널 멤버 엑세스 연산자 사용)

값이 Null인 Nullable 변수는 Value에 바로 접근하면 예외가 발생해서 프로세스가 죽을 수 있으니 HasValue로 값이 존재하는지 체크하고 접근하는게 좋다.

 

5. ?.  연산자 및 ?[] (널 멤버 엑세스 연산자 및 식)

피연산자가 null이 아닌것으로 평가되었을때만 멤버 엑세스가 가능하도록 하는 ?. 나 요소 엑세스 ?[] 연산을 피연산자에게 허용하며 그렇지 않으면 null을 반환한다.

a가 null로 평가되면 a?.x 또는 a?[x]의 결과는 null이다.

 

6. ?? 연산자 및 ??= 연산자(널 병합 연산자, 널 병합 할당 연산자)

?

 

'[C#]' 카테고리의 다른 글

register 키워드 vs. volatile 키워드  (0) 2021.05.05