num은 Value Type인 int형이므로 NULL과 같이 어떤 값이 할당되지 않은 상태(missing value)를 가질 수 없다
이때 num에 missing value를 할당하기 위해선 2가지 방법이 있다
2번 방식이 Nullable의 기본 아이디어이다
Value값을 가지고 있으면서 NULL 상태를 체크할 수 있는 기능(HasValue)를 함께 가지고 있는 struct
Nullable 타입 또한 struct이므로 Value Type이다
Value Type 뒤에 물음표(?)를 붙이면 해당 타입이 Nullable Type이 되고 NULL을 할당할 수 있다
이는 컴파일 시 .NET의 Nullable 구조체로 변환된다
int? i = null;
bool? b = null;
int?[] a = new int?[100];
Nullable 구조체는 값을 가지고 있는지를 체크하는 HasValue 속성과 실제 값을 나타내는 Value 속성을 가지고 있다
실무에서 Nullable이 주로 사용되는 곳은 DB와 연동되는 Data Layer 클래스이다
SQL 서버 테이블에서 NULL을 허용하는 숫자, 날짜, bool등의 컬럼이 있을 경우 이 컬럼 타입들은 Nullable 타입으로 변환되어 테이블의 NULL 속성을 표현한다
double _Sum = 0;
DateTime _Time;
bool? _Selected;
public void CheckInput(int? i, double? d, DateTime? time, bool? selected)
{
if (i.HasValue && d.HasValue)
this._Sum = (double)i.Value + (double)d.Value;
if (!time.HasValue)
throw new ArgumentException();
else
this._Time = time.Value;
this._Selected = selected ?? false;
}
.NET Framework에 있는 정적(static) 클래스 System.Nullable은 Nullbale 타입을 위한 몇가지 편리한 정적 메서드들을 제공
void NullableTest()
{
int? a = null;
int? b = 0;
int result = Nullable.Compare<int>(a, b);
Console.WriteLine(result); //결과 -1
double? c = 0.01;
double? d = 0.0100;
bool result2 = Nullable.Equals<double>(c, d);
Console.WriteLine(result2); //결과 true
}