Language/📘C#

Nullable<T>

달싹이 2025. 4. 1. 05:55
728x90
반응형

1. Nullable<T>란 무엇인가

C#에서 기본적인 값 형식(int, float, bool 등)은 null을 가질 수 없다. 하지만 가끔 “값이 없는 상태”를 표현해야 하는 상황이 생긴다. 예를 들어, 데이터베이스 컬럼에 null이 들어갈 수 있는 경우나, 특정 시점에 값이 ‘아직 정해지지 않았다’는 것을 표현하고 싶을 때가 있다.
이때 Nullable<T> 구조체를 사용하면 값 형식에도 null을 할당할 수 있게 된다. Nullable<int>나 Nullable<float>처럼, T가 어떤 값 형식이든 null을 허용하는 타입으로 확장해 준다.

 

2. 축약형: T?

Nullable<T>는 자주 쓰이기 때문에, C#에서는 축약 형태로 T?를 제공한다. 예를 들어 Nullable<float> 대신 float?를 쓸 수 있다. 둘 다 같은 의미이지만, T?가 훨씬 간단하다.

  • int? → Nullable<int>
  • float? → Nullable<float>
  • bool? → Nullable<bool>

 

3. HasValue와 Value

Nullable<T>(또는 T?) 타입에는 다음과 같은 중요한 속성이 있다.

  • HasValue: 값이 존재하면 true, 존재하지 않으면 false가 된다.
  • Value: 실제 값을 꺼낼 때 사용한다. 값이 없는데(null) Value를 읽으면 예외가 발생한다.
float? maybeValue = null;

// 값을 가지는지 확인
if (maybeValue.HasValue)
{
    // 값이 있으면 실수(float)로 사용 가능
    float realValue = maybeValue.Value;
    Console.WriteLine($"실제 값: {realValue}");
}
else
{
    Console.WriteLine("값이 없음 (null)");
}

 

아래 코드는 Value를 사용할 때 발생할 수 있는 예외 상황을 간단히 보여준다:

float? optionalFloat = null;

// 여기서 optionalFloat는 null 상태
// 따라서 .Value에 접근하면 InvalidOperationException 예외가 발생함
float value = optionalFloat.Value; 
Console.WriteLine(value); // InvalidOperationException 발생!

 

optionalFloat에 실제 값이 설정되어 있다면 예외가 발생하지 않는다:

float? optionalFloat = 10.5f;

// optionalFloat는 실제 float 값을 가지고 있으므로
// .Value를 통해 정상적으로 값을 가져올 수 있음
float value = optionalFloat.Value; 
Console.WriteLine(value);  // 10.5 출력

 

4. 사용 시 주의점

  • HasValue로 먼저 null 여부를 확인하지 않고 Value에 바로 접근하면 InvalidOperationException 예외가 날 수 있다.
  • Nullable 타입을 연산할 때, 값이 null이면 해당 연산 결과도 null이 될 수 있으므로 유의해야 한다.
    (??, ?. 같은 연산자들을 잘 활용하면 편하다.)
  • 성능이 아주 중요한 코드에서는 null 체크 오버헤드를 고려할 수도 있다. 보통은 큰 문제가 아니지만, 극단적인 상황에서는 Nullable의 null 처리 비용을 생각해야 한다.
 

??, ?. 연산자

1. ?? 연산자 (null 병합 연산자)좌측 값이 null인지 먼저 확인한다.null이면 우측 값을 반환하고, null이 아니면 좌측 값을 그대로 반환한다.예를 들어 어떤 값이 null일 때 대신 쓸 기본값을 지정하기

jisung-rithm.tistory.com

 

5. 정리

Nullable<T>는 “값 형식에 null을 허용”하기 위해 만들어진 구조체다. float? 같은 축약 형식을 통해 더 간단히 사용할 수 있다. 값이 없음을 명확하게 표현할 수 있어, 데이터베이스나 다른 외부에서 들어오는 데이터 처리에 특히 유용하다. 값을 가지는지 확인할 때는 HasValue, 실제 값을 꺼낼 때는 Value를 사용하면 된다.

C#에서 이 기능은 Unity뿐 아니라 모든 .NET 환경에서 사용 가능하다. 결국 Nullable<T>를 통해 값 형식을 좀 더 유연하게 다룰 수 있으니, “null 상태”를 명시적으로 관리하고 싶다면 적극적으로 고려해 볼 만하다.

반응형