C# 널 허용 타입(Nullable Types) 완벽 이해: 안전한 null 처리
C#은 널 허용 타입(Nullable Types)이라는 특수 데이터 타입을 제공하여, 정상 범위의 값뿐만 아니라 null 값도 할당할 수 있게 합니다.
예를 들어, Nullable<Int32> 변수에는 -2,147,483,648 ~ 2,147,483,647 범위의 값 또는 null을 저장할 수 있습니다. Nullable<bool>에는 true, false, null이 가능합니다.
선언 구문
<데이터_타입>? <변수_이름> = null;
T?는 Nullable<T>의 축약 표기법입니다.
널 허용 타입 사용 예제
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
int? num1 = null; // null 할당
int? num2 = 45; // 값 할당
double? num3 = new double?(); // 기본값 null
double? num4 = 3.14157;
bool? boolval = new bool?(); // 기본값 null
// 값 출력 (null은 빈 문자열로 출력됨)
Console.WriteLine("Nullables: {0}, {1}, {2}, {3}", num1, num2, num3, num4);
Console.WriteLine("Nullable bool: {0}", boolval);
Console.ReadLine();
}
}
}
출력: Nullables: , 45, , 3.14157 / Nullable bool:
널 병합 연산자 (Null Coalescing Operator: ??)
널 허용 값 타입과 참조 타입에 사용됩니다. 첫 번째 피연산자가 null이면 두 번째 피연산자 값을 반환하고, 아니면 첫 번째 피연산자 값을 반환합니다.
결과 = (첫번째_피연산자 != null) ? 첫번째_피연산자 : 두번째_피연산자;
// 위와 동일: 결과 = 첫번째_피연산자 ?? 두번째_피연산자;
예제
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34; // num1이 null이므로 5.34 반환
Console.WriteLine("num3 값: {0}", num3); // 5.34
num3 = num2 ?? 5.34; // num2가 null이 아니므로 3.14157 반환
Console.WriteLine("num3 값: {0}", num3); // 3.14157
Console.ReadLine();
}
}
}
널 조건부 연산자 (Null Conditional Operators: ?. / ?[])
C# 6.0부터 추가된 연산자로, null 체크를 간결하게 해줍니다.
// ?. : 멤버 접근 전 null 체크
string name = person?.Name; // person이 null이면 null 반환, 아니면 Name 반환
// ?[] : 인덱서 접근 전 null 체크
var item = list?[0]; // list가 null이면 null 반환
// 결합 사용
int? length = customers?.Orders?[0]?.Items?.Count;
Nullable<T>의 주요 속성 및 메서드
| 멤버 | 설명 |
HasValue | 값이 있는지 여부 (bool 반환) |
Value | 저장된 값 반환 (값 없으면 예외 발생) |
GetValueOrDefault() | 값이 있으면 반환, 없으면 타입의 기본값 반환 |
GetValueOrDefault(T defaultValue) | 값이 없으면 지정한 기본값 반환 |
활용 예제
int? count = null;
if (count.HasValue)
Console.WriteLine(count.Value);
else
Console.WriteLine("값 없음");
// 한 줄로 처리
Console.WriteLine(count.GetValueOrDefault(-1)); // -1 출력
핵심: 값 타입(struct)은 기본적으로 null을 가질 수 없지만, Nullable<T> 또는 T?로 감싸면 null 상태를 표현할 수 있습니다. 데이터베이스 연동이나 선택적 값 처리에 필수적입니다.