본문 바로가기
C#

[C#] 널 병합 연산자

by balhea 2023. 12. 20.

이번 글에서는 널 병합 연산자에 대해서 자세히 알아보겠습니다.널 병합 연산자(Null Coalescing Operator: ??)는 C#에서 널(null) 값을 처리하거나 디폴트 값을 지정하는 데 사용됩니다. 이 연산자는 주로 Nullable 형식 변수에서 널 값일 때 기본값을 설정할 때 유용하게 사용됩니다.

 

일반구문

널 병합 연산자의 구문은 다음과 같습니다: nullableVariable ?? defaultValue.

이때 nullableVariable은 Nullable 변수이며, defaultValue는 널 값일 때 대체할 기본값입니다.

예를 들어, 나이를 저장하는 Nullable 변수를 사용하여 널 값일 때 디폴트 나이를 설정하는 상황을 살펴보겠습니다.

// Nullable 변수를 선언하고 널(null) 값을 할당합니다.
int? userAge = null;

// 널 병합 연산자를 사용하여 널 값일 때 디폴트 값을 설정합니다.
int defaultAge = userAge ?? 18;

// 결과 출력
Console.WriteLine($"User's Age: {defaultAge}");

위 예제에서 userAge 변수는 Nullable 정수형으로 선언되었고, 초기값으로 널(null)을 가지고 있습니다. 그리고 defaultAge 변수에 널 병합 연산자(??)를 사용하여 기본값을 설정했습니다.

 

만약 userAge 변수가 널(null) 값을 가지고 있다면, defaultAge 변수에는 우측의 디폴트 값인 18이 할당됩니다. 하지만 userAge 변수가 널(null)이 아니라 실제 값(예: 25)을 가지고 있다면, defaultAge 변수에는 userAge 변수의 값이 할당됩니다.

 

이러한 널 병합 연산자는 Nullable 변수를 다룰 때 유용하며, 널 값이 될 가능성이 있는 변수의 기본값 설정에 활용될 수 있습니다.

 

GET / SET 구문

널 병합 연산자를 get과 set으로 사용하는 예제를 보여드리겠습니다.

아래의 코드는 속성에 널 병합 연산자(??)를 적용하여 속성 값이 널(null)인 경우에만 기본값을 설정하는 예제입니다.

public class Person
{
    private string _name;

    public string Name
    {
        get
        {
            return _name ?? "이름 없음"; // 널 병합 연산자를 사용하여 _name이 널(null)인 경우 "이름 없음"을 반환합니다.
        }
        set
        {
            _name = value; // set 접근자에서는 받은 값을 _name에 할당합니다.
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person person1 = new Person();
        Console.WriteLine(person1.Name); // 초기값이 설정되지 않았으므로 "이름 없음" 출력

        person1.Name = "Alice";
        Console.WriteLine(person1.Name); // "Alice" 출력

        Person person2 = new Person();
        person2.Name = null; // Name 속성에 null 값을 할당
        Console.WriteLine(person2.Name); // "이름 없음" 출력 (널 병합 연산자로 인해 "이름 없음" 반환)
    }
}

위의 예제에서 Person 클래스는 Name이라는 속성을 가지고 있습니다. get 접근자에서는 널 병합 연산자(??)를 사용하여 _name 값이 널(null)일 때 "이름 없음"을 반환하도록 설정되어 있습니다.

 

Main 메서드에서는 Person 클래스를 사용하여 객체를 생성하고, Name 속성에 값을 할당하고 출력하는 과정을 보여주고 있습니다. 마지막으로 person2.Name에 널(null) 값을 할당하고 출력하면, 널 병합 연산자로 인해 "이름 없음"이 출력됩니다.

 

??= 구문

널 병합 할당 연산자(??=)는 C# 8.0 이상에서 도입된 연산자로, 변수가 널(null)일 경우에만 우측의 값을 할당하는 연산자입니다. 이 연산자를 사용하면 특정 변수가 널일 때만 값을 할당하고, 값이 이미 존재하는 경우에는 할당을 건너뛰게 됩니다.아래 예제는 ??= 연산자를 사용하여 변수가 널일 때만 기본값을 할당하는 방법을 보여줍니다.

class Program
{
    static void Main(string[] args)
    {
        int? nullableNumber = null;
        int defaultValue = 10;

        // nullableNumber가 널일 경우 defaultValue를 할당합니다.
        nullableNumber ??= defaultValue;

        Console.WriteLine(nullableNumber); // 출력: 10

        // 이미 값이 있는 경우에는 할당이 되지 않습니다.
        nullableNumber ??= 20;

        Console.WriteLine(nullableNumber); // 출력: 10 (기존 값 유지)
    }
}

위의 코드에서 nullableNumber ??= defaultValue; 라인은 nullableNumber 변수가 널(null)인 경우에만 defaultValue 값을 할당합니다. 처음에 nullableNumber 변수는 널이므로 defaultValue인 10이 할당됩니다. 그 후에 nullableNumber ??= 20; 라인이 실행되지만 이미 nullableNumber 변수에는 값이 할당되어 있으므로 (nullableNumber이 10이 되었으므로) 할당이 되지 않고 기존의 값이 유지됩니다.

 

이처럼 ??= 연산자는 변수가 널일 때만 값을 할당하는 경우에 유용하게 사용될 수 있습니다.

 

지금까지 널 병합 연산자에 대해서 알아보았습니다. 이전 글의 연산자에 대해 글을 쓰다가 널 병합 연산자를 알게되면서 글을 쓰게 되었습니다. 널 병합 연산자를 알기 전까지는 Init() 합수를 만들어서 초기화 값들을 적었었는데, 앞으로는 널 병합 연산자를 자주 사용할 것 같습니다. 

'C#' 카테고리의 다른 글

[C#] 함수의 종류  (0) 2023.12.21
[C#] 함수  (0) 2023.12.20
[C#] 연산자  (0) 2023.12.20
[C#] 데이터타입  (0) 2023.12.19
[C#] 변수  (0) 2023.12.19