상세 컨텐츠

본문 제목

[C#] Nullable<T>

C#

by 메타샤워 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  
}

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

[C#] 동적 컴파일  (0) 2023.07.18
.NET Serialization 닷넷 객체직렬화  (0) 2023.07.18
[C#] Interface로 구현한 폼 간 값전달  (0) 2023.07.18
[c# 키워드] Lambda Expression =>  (0) 2023.07.18
[c# 키워드] delegate  (0) 2023.07.18

관련글 더보기