언어/C#
C# Nullable, Null 결합 연산자
tsyang
2021. 3. 6. 20:48
Nullable
CLR의 값 타입은 null을 가질 수 없다. 그러나 여러 이유로 값 타입이 null을 가져야 할 때가 있다. 이에 대비하기 위해 CLR은 null을 허용하는 값 타입을 지원한다. FCL에는 System.Nullable<T> 구조체가 정의되어 있다.
(여러 이유 : 데이터베이스에서는 32비트 정수 값이 null을 가질 수 있음, Java의 Date클래스는 참조 타입이어서 null을 가질 수 있음 그러나 C#은 그렇지 않음... 등)
Nullable<T>에서 T는 구조체여야 하며 Nullable<T>에는 여기에 현재 값을 가지고 있는지에대한 Boolean필드 정도만 추가한 값 타입이다.
int? 는 Nullable<int>와 같은 의미이다.
Nullable의 박싱/ 언박싱
Nullable 타입은 값 타입이기에 박싱/언박싱이 일어날 수 있다. 단, Nullable 타입이 null로 설정되어 있음에도 박싱이 일어난다면 비효율적일탠데 그래서 CLR에서는 Nullabe 타입의 인스턴스가 null로 설정되어있으면 박싱을 하지 않고 null참조를 반환한다. null이 아닌 경우에는 실제 값을 꺼내 박싱을 수행한다.
int? x = null;
object o = x; //o는 null을 가리킴
x = 5;
o = x; //o는 박싱된 int의 5를 가리킴
Null 결합 연산자
null 결합 연산자는 Nullable 뿐 아니라 참조 타입에도 사용할 수 있다.
int? x = null;
int y = x ?? 0; //다음의 코드들과 같은 뜻이다
//int y = x.HasValue ? x.Value : 0;
//int y = x == null ? (int)x : 0;
null 결합 연산자는 중첩 사용할 때 이점이 두드러진다.
string title = GetTitle() ?? GetSubTitle() ?? "Untitled";
만약 위의 코드를 null 결합 연산자 없이 구현했다면 복잡하고 가독성도 떨어질 것이다.