대부분의 프로그래밍 언어에서는 숫자형 또는 불리언 타입의 변수에 null을 허용하지 않습니다.
하지만, C#에서 Nullable 타입을 사용하여 변수를 선언하면, 숫자형 또는 불리언 타입에도 null을 대입할 수 있습니다.
이번 포스팅에서는 Nullable 타입의 사용 방법을 정리합니다.
Nullable 타입 사용 방법
타입 뒤에 "?"를 붙여주면 됩니다.
자료형? 변수이름;
숫자형과 불리언 타입의 변수를 null로 초기화 후 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 타입이 아닌 변수에 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);
}
}
실행 결과
int a; 와 int? a = null;
int a;
와 int? a = null;
는 엄연히 다른 코드입니다.
값이 초기화되지 않은 변수를 사용할 경우 컴파일 에러가 발생합니다.
class Program
{
static void Main(string[] args)
{
int a;
Console.WriteLine(a);
}
}
실행 결과
int a;
초기화 값이 없는 변수 a를 선언합니다.
변수 a는 아무 값도 존재하지 않습니다.
int? a = null;
변수 a를 선언과 동시에 값을 null로 초기화합니다.
변수 a는 null 값을 가지고 있습니다.
아무 값도 존재하지 않는 것과 null은 다른 의미입니다.
마찬가지로, Nullable 타입도 값이 초기화되지 않은 변수를 사용할 경우 컴파일 에러가 발생합니다.
class Program
{
static void Main(string[] args)
{
int? a;
Console.WriteLine(a);
}
}
실행 결과
HasValue와 Value
Nullable 타입은 HasValue와 Value 두 가지 속성을 가지고 있습니다.
HasValue
- 변수의 값이 null이면 false를 반환하며, null이 아니면 true를 반환합니다.
Value
- 변수에 담겨 있는 값입니다.
- HasValue가 false인데 Value를 사용할 경우 InvalidOperationException 예외를 throw 합니다.
HasValue와 Value를 사용한 코드입니다.
class Program
{
static void Main(string[] args)
{
int? int_Value1 = null;
int? int_Value2 = null;
int? int_Value3 = 29;
Console.WriteLine(int_Value1.HasValue);
Console.WriteLine(int_Value2.HasValue);
Console.WriteLine(int_Value3.HasValue);
Console.WriteLine(int_Value3.Value);
}
}
실행 결과
HasValue가 false를 반환하는데, Value를 사용하는 경우 예외가 발생합니다.
class Program
{
static void Main(string[] args)
{
int? int_Value1 = null;
Console.WriteLine(int_Value1.Value);
}
}
실행 결과
'C#' 카테고리의 다른 글
[C#]Call By Value, Call By Reference (0) | 2021.05.16 |
---|---|
[C#]값 형식(Value Types)과 참조 형식(Reference Types) (3) | 2021.05.15 |
[C#]물음표(?) 사용 (2) | 2021.05.13 |
[C#]자동 구현 프로퍼티(Auto Property) (0) | 2021.05.08 |
[C#]프로퍼티(Property) - get, set 사용 (0) | 2021.05.08 |
댓글