Nullable 이란?
Nullable은 Null + able의 합성어로 C#에서 제공하는 새로운 문법이다.
Nul을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만들 수 있다(값형식을 참조형식으로 바꿔줌).
대표적으로 값 타입(value type)들이 Null을 가질 수 없다.
int, 구조체, double, bool 등의 데이터 타입은 값이 없는 상태(NULL)가 불가능한 데이터 타입들이다(클래스와 같은 reference type(참조 타입)은 이미 Null 체크가 가능하기 때문에 따로 Nullable Type으로 만들지 않아도 된다).
널 가능 연산자
'?' 키워드 사용
1
|
int? b = null;
|
cs |
HasValue
- 값이 있는 경우 : true
- 값이 없는 경우(Null) : false
1) HasValue - b에 값이 있을 때
1
2
3
4
5
6
7
|
int? b = null;
b = 10;
if (b.HasValue == true)
print($"b = {b}");
else
print("값 없음");
|
cs |
2) HasValue - b에 값이 null 일 때
1
2
3
4
5
6
|
int? b = null;
if (b.HasValue)
print($"b = {b}");
else
print("값 없음");
|
cs |
이는 아래의 코드와 동일하다고 보면 된다.
1
2
3
4
5
6
|
int? b = null;
if (b != null)
print($"b = {b}");
else
print("값 없음");
|
cs |
널 병합 연산자
예시 코드 1
1
2
3 4 |
int? c = 20;
int d = c ?? -1;
print($"d = {d}"); |
cs |
왼쪽에 들어갈 자료형하고, 리턴 자료형하고 오른쪽에 들어갈 자료형 3개가 일치해야 사용할 수 있다.
c가 null이 아니면 c의 값을 d에다 넣고, c가 null 이면 뒤의 값을 d에다가 대입시킨다.
예시 코드 2
1
2
3
4
|
int? e = null;
int f = e ?? -1;
print($"f = {f}");
|
cs |
예를 들어, 이런 코드를 작성한다고 해보자.
g 부분에 오류가 나 있는 것을 볼 수 있을 것이다.
첫 번째 방법
1
2
3
4
|
int? g = null;
g = 30;
int h = g.Value;
|
cs |
Value를 이용하여 수정한다면 자기가 가진 원래의 자료형(int)으로 리턴을 해주기 때문에 오류가 나지 않는다.
두 번째 방법
1
|
int i = (int)g;
|
cs |
명시적 캐스팅을 하면 된다.
혹시 이런 코드는 실행이 될까?
1
2
|
int? g = null;
int k = (int)g++;
|
cs |
g에다가 nullable연산자로 null값을 주고, k에다가 int형으로 명시적 캐스팅하여 g의 값을 ++시켜준다고 하면, 연산이 가능할까?
정답은 불가능하다. 애초에 null이기 때문에 예외가 발생한다.
위와 같은 예시로 이런 코드를 보면
1
2
3
|
int? l = 10;
int? m = null;
print($"1 >= null is {l >= null}");
|
cs |
{l >= null} 부분에 경고가 뜬다.
null은 0이 아니기 때문에 얼마가 들어오든 null이랑은 비교를 할 수 없다.
따라서 null을 크다, 작다와 같은 비교연산을 하게되면 무조건 false가 나온다.
1
2
3
4
5
6
7
|
int? l = 10;
int? m = null;
print($"l >= null is {l >= null}"); // 무조건 False
print($"l == null is {l == null}"); // False
print($"m < null is {m < null}"); // 무조건 False
print($"m == null is {m == null}"); // True
|
cs |
Nullable.GetUnderlyingType
GetUnderlyingType()메서드를 이용하여 Nullable 형식을 구분할 수 있다.
예시 코드1
1
2
3
4
5
|
Type type = Nullable.GetUnderlyingType(typeof(int)); // 타입을 리턴해줌
print(type);
Type type2 = Nullable.GetUnderlyingType(typeof(int?)); // 타입을 리턴해줌
print(type2);
|
cs |
System.Int32 : int형에 대한 nullable이 허용이 가능하다는 것
예시 코드 [2-1]
1
2
|
string content = IsNullable(typeof(int)) ? "Nullable" : "Non-Nullable";
print(content);
|
cs |
1
2
3
4
|
private bool IsNullable(Type type)
{
return Nullable.GetUnderlyingType(type) != null;
}
|
cs |
예시 코드 [2-2]
1
2
|
string content = IsNullable(typeof(int?)) ? "Nullable" : "Non-Nullable";
print(content);
|
cs |
출처 및 참고: 강의 짱잘하시는 울 유니티 선생님 수업
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)