언어/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 결합 연산자 없이 구현했다면 복잡하고 가독성도 떨어질 것이다.

 

 

'언어 > C#' 카테고리의 다른 글

C# - 관리 힙과 GC (2)  (1) 2021.04.03
C# - 관리 힙과 GC (1)  (2) 2021.03.28
C# 사용자 정의 특성  (0) 2021.02.28
C# - 델리게이트  (1) 2021.02.21
C# - 배열  (0) 2021.02.10