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 |
---|