널이 가능한 형(Nullable Type)은 값 형식(Value Type)에 null
값을 허용할 수 있도록 하는 C#의 기능입니다. 기본적으로 값 형식(int
, float
, bool
등)은 null
값을 가질 수 없습니다. 하지만 널이 가능한 형을 사용하면 값이 없음을 나타내는 null
을 할당할 수 있습니다.
1. 널이 가능한 형의 정의
널이 가능한 형은 기본 값 형식 뒤에 ?
기호를 붙여 정의할 수 있습니다. 이렇게 정의된 변수는 값이 없음을 의미하는 null
값을 가질 수 있습니다.
- 예시:
int?
,float?
,bool?
등이 널이 가능한 형입니다.
int? age = null; // 널이 가능한 int 형
double? temperature = 36.5; // 값이 존재하는 경우
2. 널이 가능한 형 사용 방법
널이 가능한 형은 기본 값 형식이므로, 값을 할당하거나 null
을 할당할 수 있습니다.
int? number = null; // 널 값을 가짐
number = 10; // 값이 존재함
3. HasValue
와 Value
프로퍼티
널이 가능한 형에는 두 가지 중요한 프로퍼티가 있습니다:
HasValue
: 해당 변수가 값을 가지고 있으면true
,null
이면false
를 반환합니다.Value
: 널이 아닌 경우, 그 값을 반환합니다. 만약null
일 때Value
를 호출하면 예외가 발생합니다.
int? age = null;
if (age.HasValue) {
Console.WriteLine($"Age is {age.Value}");
} else {
Console.WriteLine("Age is not provided");
}
위 예시에서 age
가 null
이면 "Age is not provided"가 출력되고, 값이 존재하면 그 값을 출력합니다.
4. 널 병합 연산자 (??)
널 병합 연산자(??
)는 널이 가능한 형에 값이 없을 때 대체 값을 제공할 수 있는 방법입니다. ??
연산자는 널이 아닌 값이 나오면 그 값을 사용하고, 그렇지 않으면 대체 값을 반환합니다.
- 예시:
int? age = null;
int defaultAge = age ?? 18; // age가 null이므로 defaultAge에 18이 할당됨
Console.WriteLine(defaultAge); // 출력: 18
5. 널이 아닌 값으로 변환 (Null Coalescing Assignment)
C# 8.0 이후로 도입된 널 병합 할당 연산자(??=
)는 변수가 null
일 때만 값을 할당하는 기능을 제공합니다.
int? num = null;
num ??= 100; // num이 null이면 100을 할당
Console.WriteLine(num); // 출력: 100
6. 널과 관련된 주의 사항
널이 가능한 형을 사용할 때, 변수에 실제로 값이 존재하는지 항상 확인하는 것이 중요합니다. 그렇지 않으면 NullReferenceException
이나 InvalidOperationException
이 발생할 수 있습니다.
int? num = null;
// Console.WriteLine(num.Value); // 예외 발생: InvalidOperationException
위 코드에서 num
이 null
일 때 Value
프로퍼티에 접근하면 예외가 발생합니다.
요약
- 널이 가능한 형은 값 형식에
null
을 허용하는 기능입니다. ?
를 사용하여 값 형식을 널이 가능하게 만들 수 있습니다.HasValue
와Value
를 통해 값이 있는지 확인하고 접근할 수 있습니다.- 널 병합 연산자 (
??
)는null
일 경우 대체 값을 반환합니다. - C# 8.0부터는 널 병합 할당 연산자 (
??=
)를 사용하여null
일 때만 값을 할당할 수 있습니다.
이러한 기능은 프로그램에서 값이 없음을 처리할 때 유용하며, 특히 데이터베이스나 외부 데이터와 상호작용할 때 널 값 처리가 중요한 경우 유용하게 사용할 수 있습니다.
'2학년 2학기 > 윈도우즈 프로그래밍' 카테고리의 다른 글
필드와 프로퍼티의 차이 (0) | 2024.09.30 |
---|---|
표준 입출력 (0) | 2024.09.30 |
오버 플로우 검사문 (Checked) (0) | 2024.09.30 |
Break와 Continue (0) | 2024.09.30 |
형변환(캐스팅) (0) | 2024.09.30 |