일반 Value Type은 null 값을 가질 수 없지만 Type뒤에 '?'를 추가하면 null을 허용하는 Value Type을 만들 수 있다.

CTS에서 null을 허용하는 Type은 제네릭 구조체 형식 System.Nullable(T)의 인스턴스이다.

nullable 형식은 자신이 표현가능한 MIN ~ MAX값 이외에 null 값도 나타낼 수 있다.

예를 들어 Nullable 타입에는 이미 우리가 알고 있는 것처럼 -2147483648에서 2147483647까지의 값은 물론 null 값을 할당할 수 있다는 말이다.



또한 여기서 Nullable에는 true, false 이외에도 null 값을 할당할 수 있는데, DB에서처럼 값을 읽어올때, null일경우를 표현할때 매우매우 유용하다.

그런데 클래스와 같은 참조타입에는 이미 null값을 지원하므로 int?와 같은 문법은 필요없다.(사용할 수 도 없다.) int? 이런 문법을 사용하기 싫다면 Nullable라고 해도 되겠다.



아무튼 우리가 평소에 알고있던 값 데이터타입에 Nullable이라는 것을 명시해주기 위해서 '?'을 붙여주는 것이라고만 알고 있으면 된다.


int? x = 18;
double? y = 0.18

그런데 여기서 값이 있는지를 알기위해서, HasValue 메서드를 통해서 알수 있는데, null타입인지 체크하려고 다른 방법을 사용한다면 큰 낭패를 볼것이다.


int? num = null;
if( num.HasValue == false )
    System.Console.WriteLine("null");
 
int? i = 18;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"이라는 내부 타입 형식을 리턴해버림.
 
// 정 얻어오고 싶다면 아래처럼 해서, Nullable Type인지 얻어오기.
Type tT = typeof(Nullable<int>);
if (tT.IsGenericType && tT.GetGenericTypeDefinition() == typeof(Nullable<>))
    System.Console.WriteLine("nullable type");

HasValue 를 가지고 비교를 했는데, 왜냐면 특히 bool타입의 경우, 아래처럼 코딩하면 컴파일 에러를 낼 것이다.


bool? bCast = null;
if (bCast) // Error CS0266.
{
}


bool type을 사용할때는 아래처럼 사용하도록 한다.


bool? bVar = null;
if (!bVar.HasValue)
{
    bVar = true;
}
if ((bool)bVar)
{
    System.Console.WriteLine("Do something");
}



* GetValueOrDefault 메서드를 사용하여 할당된 값을 가져올 수 있다.

  • HasValue 프로퍼티를 사용하여 null에 대해 테스트할 수 있다.
    값이 있을경우 ture, null 이면 false 리턴.
    기본값은 false이다.
  • Value 프로퍼티는 할당된 값이 있다면 가지고 있는 값을 리턴.
    Value는 기본값이 없다.
    아니라면 System.InvalidOperationException이 throw됨.
  • 참조타입에는 사용할 수 없다. 또한 Nullable> num; 처럼 중첩된 nullable 형식은 허용되지 않는다.
  • GetType() 또는 is 연산자를 사용하여 Nullable인지 체크할 수 없음.




위에 특징들을 바탕으로 아래처럼 사용하자.

int? num = null;
if (num.HasValue == true)
{
    // Do
}
else
{
    System.Console.WriteLine("Null");
 
    int num2 = num ?? 18; // numm이 null이면 기본값 18할당
    System.Console.WriteLine("num2 = {0}", num2);
}


System.Int32(int)와 같은 기본 타입을 비롯한 모든 타입은 궁극적으로 System.Object(object)라는 기본 타입에서 파생된다.

.NET Framework에서 제공하는 이 타입 계층 구조를 CTS라고 하는데, CTS의 각 타입은 Value 또는 Reference 타입으로 정의되어 있다.

기본적으로 struct 키워드를 사용해서 정의한 타입은 Value타입이고, class 키워드를 사용하여 정의한 형식은 Reference타입이라고 생각하면 된다.
이미지


+ Recent posts