C#
[C#] Nullable<T>
공길이의 숨겨진 세상
2023. 7. 18. 18:41
C#에서 int? , bool? , DataTime? 와 같은 T?의 표현은 .NET의 Nullable<T>와 같은 표현이다.
Nullable<T> 구조체는 값을 가지고 있는지 체크하는 (즉, missin value 인가 체크하는 ) HasValue 속성과
실제 값을 나타내는 Value 속성을 가지고 있다.
Nullable 구조체는 타입 캐스팅을 통한 변환이나 암묵적 변환을 통해 (Non-nullable) Value 타입으로 변환된다.
당연한 얘기지만, Value 타입이 아닌 레퍼런스 타입은 Nullable 을 쓸필요가 없는데,
그것은 모든 레퍼런스 타입은 이미 NULL을 허용하기 때문이다.
Nullable타입이 실무에서 흔히 사용되는 케이스는 DB와 연동되는 Data Layer 클래스들을 들 수 있는데,
예를 들어 SQL 서버 테이블에서 NULL을 하용하는 숫자, 날짜, boll등의 컬럼이 있다면,
이 컬럼 타입은 Nullable 타임으로 변환되어 테이블의 NULL 속성을 표현하게 된다.
아래 예제는 다양한 종류의 Nullable 파라미터를 받아 들여 HasValue로 NULL 값을 미리 체크하고 Value를 써서 해당 타입의 실제 값을 사용하고 있다.
C#의 ?? 연산자는 ?? 앞의 파라미터가 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;
// time값이 있는 체크.
if (!time.HasValue)
throw new ArgumentException();
else
this._Time = time.Value;
// 만약 selected가 NULL이면 false를 할당
this._Selected = selected ?? false;
Nullable 정적클래스
.Net Framework에는 두개의 Nullable 객체를 비교하게 하거나 ( Compare() 또는 Equals() ),
특정 Nullable 타입이 어떤 Value 타입에 기반을 두고 있는지 ( GetUnderlyingType() ) 등의 기능을 제공하는
정적 클래스 System.Nullable 이 제공되고 있다.
즉, 이 정적 클래스는 Nullable<T> 타입을 위한 몇 가지 편리한 정적 메서드들을 제공한다.
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
}