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