C#/C# 기본

[C#] default 연산자

로파이 2021. 11. 8. 20:54

default 연산자

default (T)를 사용하여 T 타입의 기본 값을 가져온다. 값 타입으로부터 0을 반환하고 참조 타입은 null을 반환한다.

nullable의 경우 기본 값은 null이며 enum의 경우 0을 기본으로 한다.

struct는 값 타입이기 때문에 모든 필드와 속성이 0으로 초기화된 값을 반환한다.

    class Program
    {
        enum MyType
        {
            A = 0,
            B = 1,
            C = 2
        }

        static void Main(string[] args)
        {
            Console.WriteLine(default(int)); // 0 (값 타입)
            Console.WriteLine(default(object) is null); // true (참조 타입)

            void DisplayDefaultOf<T>()
            {
                var val = default(T);
                Console.WriteLine($"Default value of {typeof(T)} is { (val == null ? "null" : val.ToString()) }");
            }

            DisplayDefaultOf<int?>(); // nullable -> null 기본값
            DisplayDefaultOf<System.Numerics.Complex>(); // 구조체 (0,0)으로 초기화
            DisplayDefaultOf<System.Collections.Generic.List<int>>(); // 컬렉션 -> null
            DisplayDefaultOf<MyType>(); // enum의 기본은 0 (A)
        }
    }

 

C# 7.1부터 default 리터럴을 사용할 수 있다. 컴파일러는 식 형식을 유추할 수 있는 경우 해당 형식의 기본값 (default(T))을 생성한다.

default 리터럴을 사용할 수 있는 경우는 다음과 같다.

  • 변수의 할당 또는 초기화에서
  • 선택적 메서드 매개 변수에 대한 기본값 선언에서
  • 인수 값을 제공하기 위한 메서드 호출에서
  • return 문에서 또는 식 본문 멤버의 식으로
T[] InitializeArray<T>(int length, T initialValue = default)
{
    if (length < 0)
    {
        throw new ArgumentOutOfRangeException(nameof(length), "Array length must be nonnegative.");
    }

    var array = new T[length];
    for (var i = 0; i < length; i++)
    {
        array[i] = initialValue;
    }
    return array;
}

void Display<T>(T[] values) => Console.WriteLine($"[ {string.Join(", ", values)} ]");

Display(InitializeArray<int>(3));  // output: [ 0, 0, 0 ]
Display(InitializeArray<bool>(4, default));  // output: [ False, False, False, False ]

System.Numerics.Complex fillValue = default;
Display(InitializeArray(3, fillValue));  // output: [ (0, 0), (0, 0), (0, 0) ]

 

'C# > C# 기본' 카테고리의 다른 글

[C#] 스레드  (0) 2021.10.21
[C#] 파일 입출력  (0) 2021.10.21
[C#] dynamic 타입  (0) 2021.10.19
[C#] 리플렉션과 애트리뷰트  (0) 2021.10.19
[C#] LINQ  (0) 2021.10.18