숏컷 코드
// 안전한 속성 접근 체인
string displayName = user?.Profile?.Nickname ?? "Guest";
// 안전한 인덱서 접근
char? first = text?[0];
// null일 때만 초기화
settings.Theme ??= "light";
// 이벤트 안전 호출
OnChanged?.Invoke(this, EventArgs.Empty);문법
어떤 null 연산자를 먼저 고르면 되나
| 상황 | 먼저 떠올릴 것 |
|---|---|
| 멤버 접근 중간에 null일 수 있음 | ?. |
| 인덱서 접근 중간에 null일 수 있음 | ?[] |
| null이면 기본값 대체 | ?? |
| null일 때만 초기화 | ??= |
?. — null 조건 멤버 접근
왼쪽이 null이면 전체 식을 null로 단락(short-circuit)합니다. null 아니면 오른쪽 멤버를 평가합니다.
// ❌ 구식 null 체크
string name = null;
if (user != null && user.Profile != null)
name = user.Profile.Nickname;
// ✅ null 조건 체인
string name = user?.Profile?.Nickname;컴파일러는 이것을 조건 분기로 변환합니다:
// 실제로 생성되는 코드와 유사
string name = (user != null)
? ((user.Profile != null) ? user.Profile.Nickname : null)
: null;?[] — null 조건 인덱서
배열이나 컬렉션이 null일 수 있을 때 씁니다.
int? count = list?.Count;
string? first = items?[0];?? — null 병합
왼쪽이 null이면 오른쪽을 반환하고, null이 아니면 왼쪽을 그대로 반환합니다. ?? 는 null만 검사합니다. 빈 문자열("")이나 0은 null이 아니므로 대체되지 않습니다.
string result = value ?? "default"; // value가 null이면 "default"
// 체이닝 가능
string name = a ?? b ?? c ?? "fallback";??= — null 병합 대입
변수가 null일 때만 오른쪽 값을 대입합니다.
// 이미 값이 있으면 그대로
cache ??= new Dictionary<string, object>();
// 동일한 의미
if (cache == null) cache = new Dictionary<string, object>();?? vs default
??는 null 대체, default는 타입의 기본값입니다. 헷갈리기 쉬운 차이:
int? n = null;
int v1 = n ?? 0; // null 대체 → 0
int v2 = n.GetValueOrDefault(); // 동일한 결과
string s = null;
string v3 = s ?? ""; // null이면 빈 문자열
string v4 = s ?? default; // default(string) == null — 의미 없음// ❌ 빈 문자열까지 바꾸고 싶다고 ??를 사용하면 동작하지 않음
string title = input ?? "Untitled";
// ✅ null만 바꿀지, 빈 문자열도 바꿀지 의도를 분리
string title1 = input ?? "Untitled";
string title2 = string.IsNullOrWhiteSpace(input) ? "Untitled" : input;체크포인트
| 연산자 | 의미 | null이 아닐 때 |
|---|---|---|
a?.B | a가 null이면 null, 아니면 a.B | a.B 평가 |
a?[i] | a가 null이면 null, 아니면 a[i] | a[i] 평가 |
a ?? b | a가 null이면 b | a 반환 |
a ??= b | a가 null이면 b를 a에 대입 | a 그대로 |
주의할 점
?.로 체인이 중간에 단락되면 결과 타입이 nullable이 됩니다. user?.Age는 int?이므로 int로 쓰려면 ?? 0이나 .GetValueOrDefault()가 필요합니다.
??는 null만 대체합니다. 빈 문자열이나 0을 기본값으로 대체하려면 string.IsNullOrEmpty()나 조건 연산자를 써야 합니다.
참고 링크
2 sources