1. Nullable Type 이란?
- C# Nullable Type 이란 Null 을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만든 새로운 타입이다.
- 대표적으로 값 타입(value type)들이 Null을 가질 수 없는데요. int, 구조체, double, bool 등의 데이터 타입은 값이 없는 상태(NULL)이 불가능한 데이터 타입들이다.
(클래스와 같은 reference type(=참조 타입)은 이미 Null 체크가 가능하기 때문에 따로 Nullable Type으로 만들지 않아도 된다.) - int와 같은 값 타입에 대해서 "값이 없다"를 표현하기 위해 Nullable Type이 개발 되었다.
- 우리는 int를 nullable int type으로 변경함으로서 값이 할당 되었는지 아닌지(null) 확인 할 수 있게 되었다.
2. Nullable Type의 선언 방법, 속성과 메서드, 사용법, 주의점
▶ 선언 방법
아래 두가지 방법으로 선언이 가능하다.
Nullable<T> 변수명
T? 변수명
- 선언 예시
Nullable<int> num;
int? num;
▶ 속성과 메서드
1. HasValue 속성
값이 있는 경우 : true
값이 없는 경우(Null) : false
2. Value 속성
값이 있는 경우 : 할당된 값
값이 없는 경우(null) : 예외(Exception) 발생
3. GetValueOrDefault() 메서드
값이 있는 경우 : 할당된 값 반환
값이 없는 경우(Null) : 기존 타입의 default 값 반환
▶ 사용법
Nullable<int> a; // int? a;
a = null;
Console.WriteLine(a); // null이 나온다.
Console.WriteLine(a.HasValue); // 할당된 값이 없으므로 false
Console.WriteLine(a.Value); // 할당된 값이 없으므로 예외
Console.WriteLine(a.GetValueOrDefault()); // 할당된 값이 없으므로 int 타입의 default 값인 0 이 반환.
int? b; // Nullable<int> b;
b = 10;
Console.WriteLine(b); // 10이 나온다.
Console.WriteLine(b.HasValue); // 할당된 값이 있으므로 true
Console.WriteLine(b.Value); // 할당된 값이 있으므로 10
Console.WriteLine(b.GetValueOrDefault()); // 할당된 값이 있으므로 10이 반환.
▶ 주의점
- Nullable 중복 불가능, Nullable<Nullbale<int>> num; //불가능
- Value를 접근할때는 HasValue로 체크 한 후에 접근하기.
위에 예시처럼 값이 존재하지 않는 Null인 경우 Value에 바로 접근하게 되면 예외가 발생하며 프로세스가 죽을 위험이 있다. 그렇기 때문에 HasValue로 값이 존재하는지 체크 한 후 에 Value에 안전하게 접근하는게 좋다. - int, int?는 엄연히 다른 타입이므로 명시적 형 변환이 필요하다.
3. Nullable Type 예제
▶int? 예제 1번 (메서드와 속성의 사용법)
static void Main(string[] args)
{
Nullable<int> a;
a = null;
Console.WriteLine("Nullable<int> a : Null 일 때");
Console.WriteLine("a : {0}", a);
Console.WriteLine("a.HasValue : {0} ", a.HasValue);
//Console.WriteLine("a.Value : {0} ", a.Value); // 할당된 값이 없으므로 예외
Console.WriteLine("a.GetValueOrDefault() : {0} ", a.GetValueOrDefault());
Console.WriteLine();
a = 10;
Console.WriteLine("Nullable<int> a : 10 일 때");
Console.WriteLine("a : {0}", a);
Console.WriteLine("a.HasValue : {0} ", a.HasValue);
Console.WriteLine("a.Value : {0} ", a.Value);
Console.WriteLine("a.GetValueOrDefault() : {0} ", a.GetValueOrDefault());
}
▶Nullable Type 예제 2번(실제 프로그램을 만들때 사용하는 방법)
static void Main(string[] args)
{
int? a = null; // or 22;
if (a.HasValue) //HasValue로 값체크 먼저 수행
{
//Null이 아닌 값이 들어있다.
Console.WriteLine("a is not Null");
Console.WriteLine($"a.Value : {a.Value}"); //그리고 값에 접근
}
else
{
//Null 이다.
Console.WriteLine("a is Null");
}
}
▶Nullable Type 예제 3번(배열에 적용하는 방법)
static void Main(string[] args)
{
int?[] arr = new int?[10];
arr[0] = 10;
arr[2] = 12;
arr[5] = 15;
arr[7] = 17;
foreach (var num in arr) //var 대신 int? 사용가능.
{
if (num.HasValue)
{
//배열에서 값이 할당된 것들만 출력.
Console.WriteLine($"num = {num.Value}");
}
}
}
4. 예외 처리 상황
Nullable 타입이 아닌 변수에 null로 초기화하면, 컴파일 에러가 발생한다.
class Program
{
static void Main(string[] args)
{
int int_Value = null;
float float_Value = null;
bool bool_Value = null;
Console.WriteLine(int_Value == null);
Console.WriteLine(float_Value == null);
Console.WriteLine(bool_Value == null);
}
}
Nullable 타입은 HasValue와 Value 두 가지 속성을 가지고 있다.
class Program
{
static void Main(string[] args)
{
int? int_Value1 = null;
Console.WriteLine(int_Value1.Value);
}
}
5. Nullable 총 정리
- nullable 형식은 값 형식의 데이터 타입에 Null 값을 넣을 수 있도록 해주는 형식
- HasValue 속성을 통해서 null이 아닌 값이 할당되었는지 확인 가능
- Value 속성을 통해서 할당된 값을 확인할 수 있지만, 만약 할당 값이 없다면 예외를 던진다. 그렇기 때문에 HasValue를 통해서 값이 있는지 확인 후에 Value 속성을 확인하는걸 추천
- GetValueOrDefault() 메소드는 값이 있다면 해당 값을 반환, 만약 값이 없다면 해당 데이터 타입의 기본(Default)값을 반환
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# Reflection 이용하여 Class 속성, 값 출력하기 (0) | 2023.07.18 |
---|---|
C# 클래스 할당시 메모리 구성 디버깅 (0) | 2023.07.17 |
C# 공변성(Covariance)과 반공변성(Contravariance) (0) | 2023.07.16 |
C# 포인터 사용 (0) | 2023.07.16 |
.NET 환경의 컴파일 과정 - CLR, CIL, JIT, AOT (0) | 2023.07.16 |