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 타입을 다루는 데 도움을 주는 메서드를 제공합니다.
'Programming Languages > C# 기초문법' 카테고리의 다른 글
[C# 기초문법] 컬렉션 (0) | 2024.09.09 |
---|---|
[C# 기초문법] 메서드, 파라미터 (0) | 2024.09.06 |
[C# 기초문법] 클래스 (class) (0) | 2024.09.06 |
[C# 기초문법] 구조체 (struct) (0) | 2024.09.06 |
[C# 기초문법] 네임스페이스 (namespace) (0) | 2024.09.04 |