반응형
Nullable 타입이란?
Nullable 타입은 C#에서 값 타입(예: int, double, bool 등)에 null 값을 할당할 수 있게 해주는 기능입니다. 데이터베이스 작업이나 사용자 입력 처리 등에서 '값이 없음'을 표현해야 할 때 유용합니다.

 

1. Nullable 타입 선언
• ? 연산자 사용:
int? nullableInt = null;​

• Nullable<T> 구조체 사용:
Nullable<int> nullableInt = null;​


두 방법은 동일하며, ? 연산자Nullable<T>간편 표기법입니다.

 

2. Nullable 타입의 주요 속성과 메서드
• HasValue: 값이 있으면 true, null이면 false를 반환
• Value: 실제 값을 반환 (null일 경우 InvalidOperationException 발생)
• GetValueOrDefault(): 값이 있으면 그 값을, null이면 해당 타입의 기본값 반환

 

3. Nullable 타입 사용 예시
int? nullableInt = null;

if (nullableInt.HasValue)
{
    Console.WriteLine($"Value is: {nullableInt.Value}");
}
else
{
    Console.WriteLine("Value is null");
}

// 기본값 사용
int result = nullableInt ?? 0;
Console.WriteLine($"Result: {result}"); // 출력: Result: 0​

 

4. Null 조건 연산자 (?.)
null 조건 연산자를 사용하면 null 체크를 간단히 할 수 있습니다.
string? name = null;
int? length = name?.Length;
Console.WriteLine(length); // 출력:​

 

5. Null 병합 연산자 (??)
null 병합 연산자를 사용하면 null일 경우 대체 값을 쉽게 지정할 수 있습니다.
int? nullableInt = null;
int result = nullableInt ?? 10;
Console.WriteLine(result); // 출력: 10​

 

6-1. C# 8.0의 Nullable 참조 타입
C# 8.0부터는 참조 타입에도 Nullable을 적용할 수 있습니다. 이를 통해 NullReferenceException을 방지할 수 있습니다.
#nullable enable
string nonNullableString = null; // 컴파일 경고
string? nullableString = null; // 정상​



6-2. Nullable 정적 클래스

Nullable 정적 클래스Nullable 타입을 다루는 데 유용한 메서드들을 제공합니다. 이 클래스는 제네릭이 아닌 정적 메서드들을 포함하고 있어, Nullable 타입을 좀 더 유연하게 다룰 수 있게 해줍니다.


[주요 메서드]
1. Nullable.Compare<T>(Nullable<T>? n1, Nullable<T>? n2)

     • 두 Nullable 값을 비교합니다.
     • 둘 다 null이면 0, n1이 null이면 -1, n2가 null이면 1을 반환합니다.
     • 둘 다 값이 있으면 해당 값을 비교합니다.

2. Nullable.Equals<T>(Nullable<T>? n1, Nullable<T>? n2)
     두 Nullable 값이 같은지 비교합니다.

3. Nullable.GetUnderlyingType(Type nullableType)
     Nullable 타입의 기본 타입을 반환합니다.

4. Nullable.GetValueOrDefault<T>(Nullable<T>? value)
     • Nullable 값이 있으면 그 값을, 없으면 기본값을 반환합니다.

5. Nullable.GetValueOrDefault<T>(Nullable<T>? value, T defaultValue)
     Nullable 값이 있으면 그 값을, 없으면 지정된 기본값을 반환합니다.

int? a = 5;
int? b = null;

// Compare
Console.WriteLine(Nullable.Compare(a, b));  // 출력: 1

// Equals
Console.WriteLine(Nullable.Equals(a, 5));   // 출력: True

// GetUnderlyingType
Type underlyingType = Nullable.GetUnderlyingType(typeof(int?));
Console.WriteLine(underlyingType.Name);     // 출력: Int32

// GetValueOrDefault
Console.WriteLine(Nullable.GetValueOrDefault(a));      // 출력: 5
Console.WriteLine(Nullable.GetValueOrDefault(b));      // 출력: 0
Console.WriteLine(Nullable.GetValueOrDefault(b, 10));  // 출력: 10

 

7-1. Nullable 타입의 장점
• 값의 부재를 명확하게 표현할 수 있습니다.
• null 관련 버그를 줄일 수 있습니다.
• 데이터베이스의 NULL 값과 자연스럽게 매핑됩니다.

7-2. Nullable 정적 클래스의 장점
• 타입 안전성: 컴파일 시점에 타입 체크를 할 수 있습니다.
• 일관성: Nullable 타입을 다루는 일관된 방법을 제공합니다.
• 유틸리티 기능: Nullable 타입 관련 다양한 유틸리티 메서드를 제공합니다.
8-1. Nullable 타입 주의사항
• Nullable 타입을 과도하게 사용하면 코드가 복잡해질 수 있습니다.
• 값을 사용하기 전에 항상 null 체크를 해야 합니다.
• 성능에 약간의 영향을 줄 수 있으므로, 필요한 경우에만 사용하는 것이 좋습니다.

8-2. Nullable 정적 클래스 주의사항
• Nullable 정적 클래스의 메서드들은 주로 반영(Reflection)이나 제네릭 프로그래밍에서 유용하게 사용됩니다.
• 일반적인 상황에서는 ?., ?? 연산자나 Nullable 타입의 속성/메서드를 직접 사용하는 것이 더 간단할 수 있습니다.

 

 

[정리하며]

Nullable 타입 Nullable 정적 클래스는 관련이 있지만 다른 목적으로 사용됩니다.
 Nullable 타입 값 타입에 null을 할당할 수 있게 해주는 구조체입니다. 예를 들어 int? Nullable<int> 축약형입니다.
• Nullable 정적 클래스 Nullable 타입 다루는 유틸리티 메서드를 제공하는 정적 클래스입니다. 이 클래스의 메서드들은 주로 제네릭 프로그래밍이나 리플렉션에서 사용됩니다.

간단히 말해, Nullable 타입 null을 가질 수 있는 값 타입을 만드는 데 사용되고, Nullable 정적 클래스는 이러한 Nullable 타입을 다루는 데 도움을 주는 메서드를 제공합니다.

반응형

+ Recent posts