본문 바로가기
Program Language/C#

Part1. C# 첫발 내딛기(30. Nullable Type)

by 토담이아빠 2023. 1. 29.

Nullable 타입

 

C#에서는 기본적으로 값 형식의 변수에는 null 값을 할당할 수 없습니다. 하지만 변수타입을  nullable으로 변경하면 가능합니다. C# 2.0부터 도입된 기능으로 Nullable<T> 또는 '?'연산자를 사용하여 변수에 null값을 할당받을 수 있습니다. 이번 포스팅에서는 이와 같은 Nullable 타입에 대한 내용을 정리했습니다.


Nullable<T>와 '?'연산자

 

nullable은 다음과 같이 값형의 변수에 null값을 할당할 수 있게 해 줍니다. Nullable<T>로 정의되며 여기서 T는 데이터형입니다.


Nullable<int> a = null;

Nullable<T>는 '?'연산자로 대체되어 쓸 수 있습니다. 예를 들어 Nullable<int>, Nullable<float>대신에 다음과 같이 쓸 수 있습니다.


int? a = null;
float? fa = null;

'??' 연산자

 

Nullable 변수의 값을 Nullable이 아닌 일반 변수에 넣으면 다음 예제처럼 형식변환 에러가 발생합니다.


int? a = null;
int b = a;    //에러발생

결과

 error CS0266: 암시적으로 'int?' 형식을 'int' 형식으로 변환할 수 없습니다. 
 명시적 변환이 있습니다. 캐스트가 있는지 확인하세요.

위와 같은 경우는 다음과 같이 '??' 연산자를 사용해야합니다. '??' 연산자는 null일 때 0을 할당해 줍니다.


int? a = null;
int b = a ?? 0;

Nullable 변수 비교

 

null값은 모든 숫자 값보다 작습니다. 하지만 다음과 같이 크기 비교할 때는 조심해야 합니다.


int? a = null;
Console.WriteLine(a >= 5);
Console.WriteLine(a < 5);

결과

False
False

결과값이 모두 false로 나타나게 되어 크기를 직접 비교를 할 수 없습니다. Nullable 변수의 크기를 비교할 때는 다음과 같이Nullable.Compare<T>(T? n1, T? n2) 메서드를 사용합니다. n1이 n2보다 크면 1을 반환하고 작으면 -1을 반환합니다.


int? a = null;
Console.WriteLine(Nullable.Compare<int>(10,5)); //숫자값 비교
Console.WriteLine(Nullable.Compare<int>(a, int.MinValue)); //null과 숫자값 비교

결과

1
-1

위 결과에서 보듯이 null값은 모든 숫자값보다도 작기 때문에 int 자료형의 최소값(-2147483648)보다도 작다는 정상적인 결과가 나타납니다.

 

Nullable형을 직접 비교를 하려면  ==!= 연산자만 사용해야합니다. 크기를 비교하고 싶다면 위 예제처럼 compare() 메서드를 사용하시면 됩니다.


[Review]
"초보자를 위한 C# 200제(2판)" / 저자 : 강병익

 

 

댓글