전체 코드
using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
using CSharp;
using System.Reflection;
namespace CSharp
{
class Program
{
static int Find()
{
return 0;
}
class Monster
{
public int id { get; set; }
}
static void Main(string[] args)
{
int? number = null;
number = 3;
if (number == null)
{
}
if (number.HasValue)
{
}
int a = number.Value;
int b = number ?? 0;
Monster monster = null;
if (monster != null)
{
int monsterId = monster.id;
}
int? id = monster?.id;
if (monster == null)
{
id = null;
}
else
{
id = monster.id;
}
}
}
}
📍Nullable이란? (개념 정리)
기본 자료형의 한계
| 타입 | null 가능 여부 |
|---|
int | ❌ (null 불가능) |
Monster (클래스) | ⭕ (null 가능) |
struct | ❌ (null 불가능) |
→ C#에서는 기본형(int, float 등)은 null을 가질 수 없음
해결책 - Nullable
| 타입 | 의미 |
|---|
int? | int 값 또는 null |
bool? | true, false 또는 null |
MyStruct? | 구조체 값 또는 null |
📍Nullable 선언법
int? number = null;
int number = null;
📍Nullable 핵심 프로퍼티/함수
| 기능 | 설명 |
|---|
HasValue | 값이 있으면 true, 없으면 false |
Value | 실제 값 (null일 때 접근하면 예외 발생) |
GetValueOrDefault() | 값이 있으면 해당 값, 없으면 타입의 기본값 |
?? | null 병합 연산자 (null이면 대체값 반환) |
?. | null 조건 연산자 (null이면 null 반환) |
코드 분석
1. 네임스페이스 및 클래스 선언
namespace CSharp
{
class Program
{
- 네임스페이스로 코드 영역 구분
- 프로그램 진입점 클래스 선언
2. Nullable 선언 및 초기화
int? number = null;
int?는 Nullable<int>의 축약 표현
- null 대입 가능
3. Nullable에 값 대입
number = 3;
4. null 체크 (방법 1)
if (number == null)
{
}
5. null 체크 (방법 2)
if (number.HasValue)
{
}
6. 값 직접 꺼내기 (주의 필요)
int a = number.Value;
- null일 때 접근하면 예외 발생 (조심해야 함)
7. null 대체 (?? 연산자)
int b = number ?? 0;
- null이면 0 대입, 아니면 number 값 대입
8. 클래스 객체와 Nullable 연계
Monster monster = null;
int? id = monster?.id;
?. 사용하여 null-safe 방식으로 접근
- monster가 null이면 id도 null
- monster가 null이 아니면 monster.id 값 대입
📍Nullable 패턴 정리
| 상황 | 코드 예시 | 설명 |
|---|
| 값이 있으면 사용 | number.Value | 직접 꺼내기 (null이면 예외) |
| 값 체크 | if (number != null) | null 여부 확인 |
| 값이 없으면 대체 | number ?? 0 | null일 때 기본값 지정 |
| 객체 속성 접근 | monster?.id | 안전한 속성 접근 |