[C#] Null과 관련된 연산자들(?, [ ]?, ??)

2022. 3. 13. 14:11Languages/C#

*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.

 

 

 

프로그래밍을 하다 보면, Null이라는 값을 필연적으로 사용할 때가 많다. Null 값을 할당하고, 그 값을 토대로 어떠한 연산을 하려고 하면 예외(NullReference)가 발생하기 때문에 사전 검사를 먼저 해줘야 한다.

 

그래서 다음과 같이 검사를 먼저 해주곤 했다.

void Function(Object obj)
{
   if (obj != null)
   {
      ...
   }
}

 

하지만, 이런 검사 방식은 조건문이 많아진다면 읽기가 불편해지는 경향이 있었다. 좀 더 축약해서 간편하게 쓸 수 있는 방법이 없을까란 생각과 함께 C# 문법에 대해 더 찾아봤다. 그리고 C# 6.0부터 위에서 고민했던 기능들을 지원하는 것을 확인했다.

 

 

1. Null 조건부 연산자

 

?. 연산자

 

객체의 멤버에 접근하기 전에, 해당 객체가 null인지 검사한다.

  • 객체가 null일 경우 👉🏻 null을 리턴
  • 객체가 null이 아닐 경우 👉🏻 .뒤에 지정된 멤버를 리턴
class MyData
{
   public int data;
}

MyData myData = null;
int? data = myData?.data;    // myData가 null이 아닐 때 멤버에 접근하여 값을 가져옴

 

위 코드는 myData 객체가 null이므로 "myData?.data"는 null을 리턴할 것이다.

일반적인 값 형식 자료형 int로는 null을 저장할 수 없으므로 Nullable로 선언하여 받았다.

 

 

?[ ] 연산자

 

?. 연산자와 동일한 기능을 수행한다. 차이점이라면, 객체의 멤버 접근이 아니라 배열과 같은 컬렉션 객체의 첨자를 이용한 참조에 사용된다.

ArrayList arrList = null;
arrList?.Add("C#");        // arrList?.이 null을 반환하므로 Add()는 실행되지 않음
arrList?.Add("Unity");

Console.WriteLine($"Count : {arrList?.Count}");
Console.WriteLine($"{arrList?[0]}");
Console.WriteLine($"{arrList?[1]}");

 

null 밖에 없으므로 출력되는 것이 없다.

 

이번엔 null이 아닌 새로운 객체를 생성해서 참조해줬다.

ArrayList arrList = new ArrayList();   // 객체 생성해줌
arrList?.Add("C#");
arrList?.Add("Unity");

Console.WriteLine($"Count : {arrList?.Count}");
Console.WriteLine($"{arrList?[0]}");
Console.WriteLine($"{arrList?[1]}");

 

데이터가 잘 들어가 있다.

 

 

?? 연산자

 

null 병합 연산자로, 두 개의 피연산자를 받아들이고 왼쪽 피연산자가 null인지를 검사한다.

  • 왼쪽 피연산자가 null  👉🏻  오른쪽 피연산자를 리턴
  • 왼쪽 피연산자가 null이 아니라면 👉🏻  왼쪽 피연산자를 리턴
int? data = null;
Console.WriteLine($"{data ?? 0}");   // data는 null이므로 0이 출력됨

data = 100;
Console.WriteLine($"{data ?? 0}");   // data는 null이 아니므로 100이 출력됨

 

 

728x90
반응형