-->

[C#] ??(null 병합 연산자 ), ??=(null 병합 할당 연산자), ?.(null 조건 연산자)

 

 

소스: https://github.com/minha9012/c-sharp-study/blob/master/null-operator/NullCoalescingOperation.cs

 

GitHub - minha9012/c-sharp-study

Contribute to minha9012/c-sharp-study development by creating an account on GitHub.

github.com

 

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

 

?? 및 ??= 연산자 - C# 참조

C# null 병합 연산자인 ?? 및 ??=에 대해 알아봅니다.

docs.microsoft.com

 

+ Recent posts