Programming/C# & Unity

C# ?. ?? 연산자

장형이 2019. 10. 31. 16:30

개요

 

?. ?? 모양부터 ??하게 만드는 연산자.

무슨 연산자인지 살펴보자.

 

?. 연산자

?. 연산자는 [ Null이 아니라면 참조하고, Null이라면 Null로 처리 ]하라는 뜻이다.

        class CClass
        {
            public List<int> lstNumber = new List<int>();;
        };

        static void Main( string[] args )
        {
            CClass newClass = new CClass();
            Console.WriteLine( newClass?.lstNumber );
            // List 정보가 출력됨.


            CClass nullClass = null;
            Console.WriteLine( nullClass?.lstNumber );
            // 아무것도 출력되지 않음. (null)
        }

 

아래의 CClass의 경우에는 멤버로 lstNumber가 있는데,

[ newClass?.lstNumber ]는 newClass가 null이 아니라면 lstNumber를 참조하고, null이라면 null을 뱉으라는 뜻이다.

 

이게 이것만보면 어떤 쓸모가 있는지 전혀 모르겠다.

하지만 다음에 나올 ?? 연산자와 함께라면 강력해진다.

 

?? 연산자

 

?? 연산자는 [ Null이라면 오른쪽 값으로 처리 ]하는 연산자 이다.

 

            Object obj = new Dictionary<int, char>();
            Object a = obj ?? new List<int>();
            Console.WriteLine( a );
            // Dictinary로 출력

            Object obj2 = null;
            Object b = obj2 ?? new List<int>();
            Console.WriteLine( b );
            // List로 출력

obj의 경우에는 null이 아니여서, Dictinary가 그대로 남았지만,

obj2의 경우에는 null이어서 List로 치환되어 b에 들어간 모습을 볼 수가 있다.

 

.? ?? 연산자

 

.? 연산자와 ?? 연산자가 합쳐지면 강력해진다.

 

        static int GetListCount<T>( List<T> lstTemplate_ )
        {
            return lstTemplate_?.Count ?? 0;
        }

        static void Main( string[] args )
        {
            List<int> a = new List<int>();
            a.Add( 5 );
            a.Add( 4 );

            Console.WriteLine( GetListCount( a ) );
            // 2로 출력됨


            List<int> b = null;

            Console.WriteLine( GetListCount( b ) );
            // 0으로 출력됨
        }

리스트가 null이면 0, null이 아니면 Count를 뱉어주는 함수를 구현한 모습이다.

 

.? 연산자와 ?? 연산자를 잘 쓰면 지저분한 null 구문을 줄일 수 있어서 유익 할 것이다.