C#에서는 기본적으로 값 형식(Value Type) 변수(
int,double,bool등)는null을 가질 수 없다.
하지만,?(nullable modifier)를 붙이면 null을 가질 수 있는 변수가 된다.
int? nullableInt = null; // ✅ 가능 (null을 가질 수 있음)
nullableInt = 10; // ✅ 가능 (값 할당)
즉, ?를 붙이면 해당 값이 null이 될 수도 있고, 숫자 값을 가질 수도 있다.
이렇게 만든 변수를 nullable 타입이라고 한다.
C#에서 null을 가질 수 없는 값 형식이 있다면,
null을 다룰 때,이럴 때 nullable 타입이 유용하다.
데이터베이스에서 null값이 들어갈 수 있다. 예를 들어, 고객의 생년월일 필드가 없을 수도 있다.
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? BirthDate { get; set; } // ✅ 생년월일이 없을 수도 있음
}
// BirthDate 필드는 날짜를 가질 수도 있고, null일 수도 있다.
// 만약 DateTime을 그냥 쓰면 null을 넣을 수 없어 오류가 발생한다!
// 그래서 DateTime?(nullable)로 선언해야 null 값을 가질 수 있다.
nullable 타입에는 HasValue와 Value라는 속성이 존재한다.
int? number = 10;
Console.WriteLine(number.HasValue); // ✅ true (값이 있음)
Console.WriteLine(number.Value); // ✅ 10 (값을 가져옴)
number = null;
Console.WriteLine(number.HasValue); // ✅ false (값이 없음)
HasValue: 값이 있으면 true, 없으면 false 반환Value: 실제 값을 가져옴 (null일 때 Value를 사용하면 오류 발생!)nullable 변수가 null일 경우 기본값을 지정할 수 있는 방법이다.
int? nullableNumber = null;
int number = nullableNumber ?? 100; // nullableNumber가 null이면 100을 사용
Console.WriteLine(number); // ✅ 100 (nullableNumber가 null이라 기본값 100이 들어감)
?? 연산자는 nullable 값이 null이면 기본값을 제공하는 역할을 한다.nullableNumber가 null이므로 number에 100이 들어간다.nullable 타입을 다룰 때 null체크를 간편하게 할 수 있도록 도와준다.
int? nullableLength = "Hello"?.Length; // ✅ 가능
Console.WriteLine(nullableLength); // 5 (null이 아니므로 길이 반환)
string? nullString = null;
int? length = nullString?.Length; // ✅ null이면 그냥 null 반환
Console.WriteLine(length); // null (오류 없음)
?. 연산자는 왼쪽 값이 null이면 오른쪽을 실행하지 않고 null을 반환한다.nullable 타입에서 값이 없을 때 기본값을 가져올 수 있다.
int? nullableNum = null;
Console.WriteLine(nullableNum.GetValueOrDefault()); // ✅ 0 (기본값 반환)
Console.WriteLine(nullableNum.GetValueOrDefault(999)); // ✅ 999 (기본값을 999로 설정)
| 기능 | 설명 | 예제 |
|---|---|---|
| nullable 타입 선언 | ?를 붙이면 null을 가질 수 있다. | int? x = null; |
HasValue 속성 | 값이 있으면 true, 없으면 false | x.HasValue |
Value 속성 | 실제 값을 가져온다. | x.Value (null이면 오류) |
??. 연산자 | null이면 기본값 지정 | int y = x ?? 100; |
?.연산자 | null이면 연산하지 않는다. | string? s = null; int? len = s?.Length; |
GetValueOrDefault() | 값이 없을 때 기본값 반환 | x.GetValueOrDefault(999); |