C#

Nullable과 null 처리 전략 – null 때문에 또 터졌다고?

Juan_ 2025. 6. 6. 10:03
728x90

Nullable과 null 처리 전략 – null 때문에 또 터졌다고?

null은 개발자의 천적이다.

컴파일은 잘 되는데, 런타임에 갑자기 딱!

"Object reference not set to an instance of an object."

딱 보면 눈물 나는 그 에러…

null이 뭔지도 안다고 생각했지만, C#은 여기서 끝이 아니다.

  • null
  • Nullable<T> (int?, bool?)
  • ??, ?., ??=

"이걸 도대체 언제, 어떻게 쓰는 거냐" 싶다.

이번 챕터에선 null과 Nullable을 실전 위주로 정리해보자.
헷갈리는 부분은 예제로, 실무 전략은 표로 정리해준다.


문제 상황: 분명 값 있다고 생각했는데, 왜 null이야?


class User
{
    public string Name { get; set; }
}

User user = null;
Console.WriteLine(user.Name); // ❌ NullReferenceException

분명히 user.Name을 읽으려 했는데 프로그램이 터진다.
왜냐면 user 자체가 null이기 때문이다.


Nullable – 값 타입도 null을 가질 수 있게 하자

C#에서 원래 int, double, bool 같은 값 타입은 null이 될 수 없다.


int x = null; // ❌ 안 됨

하지만 때때로 “값이 없음을 나타내고 싶을 때”가 있다.
그래서 등장한 게 Nullable이다.


int? x = null;         // ✅ 가능
bool? isReady = true;  // ✅ 가능

int?는 사실 Nullable<int>의 축약형이다.

Nullable은 값 타입에 null 개념을 추가한 타입이다.


null 체크 – 안전하게 쓰는 방법들

1. ?. (null 조건 연산자)


User user = null;
Console.WriteLine(user?.Name); // null 반환, 예외 안 남
  • 객체가 null이면 null을 반환하고, 아니면 멤버 접근
  • 메서드도 가능: user?.GetName()

2. ?? (null 병합 연산자)


string name = user?.Name ?? "Unknown";
  • 왼쪽이 null이면 오른쪽 값 사용
  • 기본값 설정할 때 자주 씀

3. ??= (null 병합 할당)


user ??= new User();
  • null이면 새로 할당해주는 문법
  • C# 8.0부터 사용 가능

실무 예시: DB 값 처리

DB에서 값이 없을 수도 있는 칼럼을 다룰 때 자주 이런 코드가 나온다.


int? age = reader["Age"] as int?;
if (age.HasValue)
{
    Console.WriteLine(age.Value);
}
else
{
    Console.WriteLine("나이 정보 없음");
}

혹은 더 깔끔하게:


Console.WriteLine(age ?? -1); // null이면 -1 출력

구조체에서 null을 어떻게 표현할까?

구조체는 원래 null을 가질 수 없다. 하지만 Nullable를 쓰면 가능하다.


DateTime? appointmentTime = null;
if (appointmentTime.HasValue)
{
    Console.WriteLine(appointmentTime.Value);
}

그리고 패턴 매칭도 가능하다:


if (appointmentTime is DateTime time)
{
    Console.WriteLine($"예약 시간: {time}");
}

언제 어떤 걸 써야 할까?

상황 대응 방법 비고
참조 타입이 null일 수 있음 ?., ?? 객체 안전하게 접근
값 타입이 null 가능해야 함 Nullable<T>, T? int?, bool? 등
기본값 할당하고 싶음 ??=, ?? 초기화 시점에서 많이 사용
조건부 로직 처리 HasValue, Value Nullable 체크

마무리하며

null은 없어져야 할 존재가 아니라,

"있을 수도 없을 수도 있다"는 불확실성을 코드로 안전하게 표현하는 도구다.

  • 값 타입에 null이 필요하면 → int?
  • 참조 타입에서 null 안전하게 다루고 싶으면 → ?., ??, ??=
  • 무조건 있다고 믿고 쓰면 터진다

null을 어떻게 다루느냐는 실력과 직결된다.

값이 있을 수도 없을 수도 있다는 걸 처음부터 인정하고 설계해두자.

그게 실무에서 에러 안 나는 코드를 만드는 첫걸음이다.

728x90