# Nullable 왜 필요한가?
값을 찾지 못한 경우에 '값이 없다'라는 상태를 표현해야 한다
참조타입인 클래스는 null을 작성하면 되고
bool도 false를 작성하면 되어서 직관적이다
그러나,
값 타입(ex. int)은 null을 사용할 수 없다
그렇기에 억지로 '사용하지 않는 특별한 값'을
임의 설정해서 사용하기에 다소 아쉬움이 존재한다
int FindIndex()
{
// 못 찾으면 -1 반환
return -1;
}
# Nullable 사용법
C#에서 값 타입도 null을 가질 수 있도록 Nullable 기능을 제공한다
타입 뒤에 '?'를 붙여주면, null을 넣을 수 있다
int? number = null;
nullable 타입은 null만 올 수 있는 것이 아니다
null이 올 수도 있고, 값이 들어올 수도 있다는 것이다
int? number = null; // null이 담긴 nullable 타입
number = 2; // null이 아닌 값이 담긴 nullable 타입
# Nullable 주의점
값을 넣는 것은 그냥 일반 변수처럼 사용하면 된다
값을 꺼낼 때는 '.Value()'를 반드시 사용해야 한다
int? number = null;
number = 2; // 값 넣기
int a = number.Value(); // 값 가져오기
'.Value()'를 통해 값을 가져오는 경우 중요한 문제가 있다
해당 값에 null이 있다면, 크래시가 발생한다
int? number = null;
int a = number.Value; // 예외 발생! (InvalidOperationException)
그렇기에 반드시 조건문을 이용해 null이 아닌지 체크해서
'.Value()'를 통해 값을 가져와야 한다
아래의 2가지 방식으로 값을 가져올 수 있다
int? number = null;
if(number != null) // 첫번째 방법
{
int a = number.Value();
}
if(number.HasValue) // 두번째 방법
{
int a = number.Value();
}
# ?? 연산자 (Null 병합 연산자)
위 코드처럼 매번 null 체크하는 것이 번거롭다면,
아래와 같이 '??' 연산자를 사용하면 더 간단하게 처리할 수 있다
int? number = null;
int b = number ?? 0; // number가 null이 아니면 값을 반환 vs null 이면 0을 반환
# ?. 연산자 (Null 조건 연산자)
참조 타입(클래스)의 필드나 속성을 사용할 때도
null 체크가 필요한 경우가 많다
아래와 같이 많이 사용한다
Monster monster = null;
if (monster != null)
{
int id = monster.Id;
}
'?.' 연산자를 사용하면
null 체크와 값 접근을 한 줄로 처리할 수 있다
// 일반적인 방법
Monster monster1 = null;
if(monster1 != null)
{
int monsterId = monster1.Id;
}
// nullable을 이용한 간소화된 방식
Monster monster2 = null;
int? id = monseter2?.Id; // monster가 null이 아니면 해당값 반환하고 null이면 null을 반환하고
그런데 주의할 점은
위의 코드에서 id에는 null이 올 수도 있다는 것이다
그렇기에 아래와 같이 작성하는 것이 올바르다
Monster monster = null;
int? id = monseter?.Id ?? -1;
# 결론
Nullable 타입을 통해 값 타입들도 null을 담을 수 있다
주의점은 null이 있기 때문에 '??' 연산자를 통해 값을 담아 오면 된다
그리고 참조 타입들의 null 체크를 편하게 하기위한
'?.' 연산자와 앞서 배운 '??' 연산자를 혼합하면
쉽게 참조타입에서도 편의성을 가져온다
마지막으로 실제 사용 예시는 아래와 같다
// 일반적인 방식 (null 체크 지옥)
string departmentName = "Unknown";
if (employee != null)
{
if (employee.Company != null)
{
if (employee.Company.Department != null)
{
departmentName = employee.Company.Department.Name;
}
}
}
// ?. 와 ?? 를 사용한 방식 (매우 간결)
string departmentName = employee?.Company?.Department?.Name ?? "Unknown";
'C# > [루키스] 실전 문법' 카테고리의 다른 글
| [C# 섹션 8] Reflection (0) | 2025.06.26 |
|---|---|
| [C# 섹션 8] Exception (2) | 2025.06.26 |
| [C# 섹션 8] Lambda (0) | 2025.06.25 |
| [C# 섹션 8] Event (0) | 2025.06.25 |
| [C# 섹션 8] Delegate (0) | 2025.06.25 |