C#은 null이 될 수 있는 타입과 될 수 없는 타입을 구분합니다. ()은 값 타입이 null을 가질 수 있게 하고, (컴파일러 기능)은 null 버그를 잡는 데 도움을 주며, (, , )는 null일 수 있는 값을 깔끔하고 안전하게 다루게 합니다 — 만연한 null 참조 문제를 해결합니다.
int??.??!int x = 5; // 값 타입 — null이 될 수 없음
int? y = null; // int? = Nullable<int> — null이 될 수 있음
if (y.HasValue) { int val = y.Value; } // 검사 + 접근
int z = y ?? 0; // null이면 기본값
값 타입은 보통 null이 될 수 없지만 int?(Nullable<int>)는 이를 허용합니다 — 선택적/누락된 데이터(예: nullable 데이터베이스 열)에 흔히 쓰입니다.
#nullable enable // (최신 프로젝트에서는 기본 활성화)
string name = null; // ⚠️ 경고 — 이제 string은 기본적으로 non-nullable
string? maybe = null; // ✅ string?은 null을 명시적으로 허용
void Use(string? s) {
Console.WriteLine(s.Length); // ⚠️ 경고 — s가 null일 수 있음(먼저 검사해야 함)
}
nullable 참조 타입이 활성화되면, 컴파일러는 어떤 참조가 null이 될 수 있는지(string?) 아닌지(string)를 추적하고 null을 역참조할 수 있는 경우 경고합니다 — NullReferenceException 버그를 컴파일 타임에 잡습니다. 이는 현대 C#의 주요 안전 기능입니다.
// ?. null 조건부 — 예외 대신 null로 단락 평가
int? len = user?.Name?.Length; // user나 Name이 null이면 null(예외 없음)
user?.DoSomething(); // user가 null이 아닐 때만 호출
// ?? null 병합 — 기본값 제공
string name = input ?? "Anonymous";
name ??= "fallback"; // 현재 null이면 대입
// ! null 허용 안 함 연산자 — non-null 단언(경고 억제; 주의해서 사용)
string definitelyNotNull = maybe!; // "null이 아님을 안다" — 런타임 검사 없음
**null 조건부 연산자(?.)**는 null일 수 있는 값의 멤버에 안전하게 접근하고(예외 대신 null 반환), **??**는 기본값을 제공합니다 — 함께 null 처리를 깔끔하고 안전하게 만듭니다.
null 처리는 견고한 C#을 작성하는 가장 중요한 측면 중 하나입니다. NullReferenceException("10억 달러짜리 실수")은 가장 흔한 런타임 오류 중 하나이며, C#의 nullable 타입과 연산자는 이를 직접 해결하므로 필수 지식입니다. nullable 값 타입(int?)은 선택적/누락된 데이터(nullable 데이터베이스 필드, 선택적 값)를 표현하는 데 실질적으로 필요합니다.
nullable 참조 타입 기능(이제 최신 .NET 프로젝트에서 기본 활성화)은 주요 안전 개선입니다. 컴파일러가 가능한 null 역참조를 추적하고 경고하게 하여, 일련의 null 버그를 런타임 충돌이 아닌 컴파일 타임에 잡습니다 — 이는 이해하고 따라야 할 중요한 신뢰성 이점입니다.
null 처리 연산자는 null일 수 있는 값을 깔끔하고 안전하게 다루는 일상 도구입니다. **null 조건부 연산자(?.)**는 null일 수 있는 사슬을 안전하게 탐색하고(예외 대신 null 반환), **??/??=**는 기본값을 간결하게 제공하며, !는 non-null을 단언합니다(주의해서 사용).
nullable 값 타입, nullable 참조 타입 안전 기능, null 처리 연산자(?., ??, !)를 이해하는 것은 만연한 NullReferenceException을 피하는 null 안전하고 견고한 C#을 작성하는 데 중요합니다 — 자주 발생하고 실질적으로 중대한 문제입니다.
null 관련 버그가 매우 흔하고 C#이 이를 방지하는 강력한 도구(특히 컴파일 타임 null 검사)를 제공하므로, nullable 타입과 null 연산자를 숙달하는 것은 신뢰할 수 있는 현대 C#을 작성하기 위한 반드시 알아야 할 기초 지식입니다.