[C#] ??(null 병합 연산자 ), ??=(null 병합 할당 연산자), ?.(null 조건 연산자)
소스: https://github.com/minha9012/c-sharp-study/blob/master/null-operator/NullCoalescingOperation.cs
null 체크는 java와 C#같은 객체지향 언어에서 아주 번거롭다.
Kotlin에서는 null 체크가 비교적 간단하여 ?:같은 Elvis expression이 존재하는데 이와 비슷하게 C#도?.,??,??= 연산자가 존재한다.
1. ?? (Null Coalescing Operator)
1-1. 정석적인 if문 사용
//1. if문 사용
public static void useIf(string name)
{
if (name != null)
{
Console.WriteLine(name);
}
else
{
Console.WriteLine("(null)");
}
}
null 임을 판단하기 위해 if문을 사용했을 때 코드가 6라인이나 된다.
C#은 기본적으로 {} 중괄호가 분리되어 있어서 더더욱 코드가 길어 보인다.
if문 안의 코드가 1줄 일 때는 중괄호를 생략할 수 있으므로 4줄까지는 줄여지나 그 이상은 줄이면 가독성이 떨어진다.
//1. if문 사용
public static void useIf(string name)
{
if (name != null)
Console.WriteLine(name);
else
Console.WriteLine("(null)");
}
public static void useIf(string name)
{
if (name != null) Console.WriteLine(name);
else Console.WriteLine("(null)");
}
1-2. 삼항 연산자 사용
//2. 삼항연산자 사용
public static void useTernaryOperator(string name)
{
Console.WriteLine(name == null ? "(null)" : name);
}
삼항 연산자를 사용함으로써 코드 라인은 한 줄로 줄어들 수가 있다.
그러나 이마저도 타이핑할 코드를 줄이기 위해서 다음과 같은 방법을 이용할 수 있겠다.
1-3. ?? (null 병합 연산자) 사용
//3. ??(null 병합 연산자) 사용
public static void useNullCoalescingOperator(string name)
{
Console.WriteLine(name ?? "(null)");
}
위의 코드처럼 null이라면 그대로 (null)이라는 string값을, 아니라면 name을 그대로 출력한다.
microsoft의 공식문서에는 다음과 같이 표현한다.
null 병합 연산자 ??는 null이 아닌 경우 왼쪽 피연산자의 값을 반환합니다. 그렇지 않으면 오른쪽 피연자를 평가하고 그 결과를 반환합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ?? 연산자는 오른쪽 피연산자를 평가하지 않습니다.
2. ??= (Null Coalescing Assignment Operator)
C# 8.0 이상에서 사용할 수 있는 null 병합 할당 연산자 ??=는 왼쪽 피연산자가 null로 계산되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??= 연산자는 오른쪽 피연산자를 평가하지 않습니다.
//2. ??=(null 병합 할당 연산자)
public static void useNullCoalescingAssignmentOperator()
{
List<int> numbers = null;
int? a = null;
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
}
null 병합 연산자와 비슷하지만 ?? 연산자는 null일 경우 우항 값을 출력하는 것이고,
??= 연산자는 해당 변수가 null일 경우 초기값을 넣어주는 것과 같은 개념이다.
3. ?. (Null Conditional Operator)
List<int> list = GetList(); //null을 반환했다면?
Console.WriteLine(list.Count); //예외 발생!
Console.WriteLine(list?.Count); //null 반환
//C# 6.0 컴파일러는 다음과 같은 코드로 변환 처리
Console.WriteLine(list != null ? new int?(list.count) : null);
변수가 null 이 아닐 때 값을 리턴하는 null 조건 연산자이다.
public static void useNullConditionalOprator()
{
/*
List<int> list = GetList(); //null을 반환했다면?
Console.WriteLine(list.Count); //예외 발생!
Console.WriteLine(list?.Count); //null 반환
//C# 6.0 컴파일러는 다음과 같은 코드로 변환 처리
Console.WriteLine(list != null ? new int?(list.count) : null);
*/
List<int> list1 = new List<int>();
List<int> list2 = null;
Console.WriteLine(list1?.Count); //0
int? ret = list2?.Count;
Console.WriteLine(ret == null ? "(null)" : ret.Value.ToString()); //(null)
}
<참조>
https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator
'Back-end' 카테고리의 다른 글
[C#] using 구문 (1) | 2022.09.08 |
---|---|
[Node.js] NVM으로 여러 버전의 node.js 사용하기 (0) | 2022.07.20 |
[.NET] .NET Eco System 용어 정리 (ASP.NET, ASP.NET MVC, ADO.NET Core, ADO.NET, cshtml ...) (0) | 2022.06.06 |
[Node.js] Node.js 설치 및 REPL 터미널 실행 (0) | 2022.05.14 |
[JSP / Spring] global.properties 변수값 가져오기 (0) | 2022.01.26 |