본문 바로가기
개발언어/C#

[C#] ?연산자, ??연산자

by 창용이랑 2023. 6. 12.
728x90

개요
 

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

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

 

?. 연산자
?. 연산자는 [ 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 구문을 줄일 수 있어서 유익 할 것이다.

 

 

출처 : https://developstudy.tistory.com/69