12 Nullable

vencott·2021년 6월 2일
0

C#

목록 보기
12/32

int num

num은 Value Type인 int형이므로 NULL과 같이 어떤 값이 할당되지 않은 상태(missing value)를 가질 수 없다

이때 num에 missing value를 할당하기 위해선 2가지 방법이 있다

  1. 프로그램에서 사용되지 않을 것 같은 특정 값을 추정하여 할당(int num = -1;)
  2. 별도의 변수를 두어 num이 missing임을 표현(bool numHasValue = false;)

2번 방식이 Nullable의 기본 아이디어이다

Nullable Type

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

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

Nullable 정적 클래스

.NET Framework에 있는 정적(static) 클래스 System.Nullable은 Nullbale 타입을 위한 몇가지 편리한 정적 메서드들을 제공

  • Compare(), Equals(): 두개의 Nullable 객체를 비교
  • GetUnderlyingType(): 특정 Nullable Type이 어떤 Value Type에 기반을 두고 있는지 확인
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
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글