본문 바로가기
C#

[C#] 요소가 null 일 때 처리 (?., ?[], ??, ??=)

by Minius 2021. 6. 8.
반응형

?., ?[] 액세스

C# 백엔드로 직무를 바꾸며 정말 많은 종류의 에러가 null 값에서 멤버 액세스를 할 때 나오는 것을 보았다.

 

이 때, 회사에서 짜여있는 코드는 모두 if로 null검사를 해서 코드가 정말 길어지는 것을 볼 수 있었다.

 

단지 null 검사인데 이렇게 길어지는게 보기 싫긴 했지만 다른 방법이 없을거라고 생각하며 썼다.

 

그런데 C#에 대해 공부하며 또 알아온 것이 있으니

멤버 액세스 연산자 및 식이다.

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-

 

멤버 액세스 연산자 및 식 - C# 참조

형식 멤버에 액세스하는 데 사용하는 C# 연산자에 대해 알아봅니다.

docs.microsoft.com

접근시에 한 객체가 item이라고 하면

item.id 혹은 item["id"]로 접근하는데, 이 때, item이 null이면 에러를 뱉어내며 다음 코드가 작동하지 않는다.

이를 방지하기 위해 if를 쓰며 길어지는데

간단하게 item?.id, item?["id"]로 처리할 수 있다.

 

이렇게 사용하면 해당 값은 null로 반환되어 에러가 나지 않는다.


?? 및 ??= 연산자

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator

 

?? 및 ??= 연산자 - C# 참조

C# null 병합 연산자인 ?? 및 ??=에 대해 알아봅니다.

docs.microsoft.com

위와 같이 null 요소에 접근할 때 사용할 수 있다. 혹은 해당 값이 null일 때, 원하는 에러값을 보내주고 있다.

예를 들어 null이 오류이고, 오류는 -9999라는 값으로 표현하기로 했다면

var result = item ?? -9999;

이렇게 표현하는 것이다. 이렇게 되면 더 확실한 오류 메세지를 나타낼 수 있다.

??=의 사용은 아래와 같이 할 수 있다.

item ??= -9999;

??와 ??=의 차이는 item이 null 일 때, null로 놔두냐, 놔두지 않느냐의 차이다.

 

따라서 ??는 item은 null로 놔두고 result에만 -9999를 보내고,

??= 는 item에 -9999를 넣어주는 것이다. result 값이 필요가 없어지는 것이다.

물론 상황에 따라 사용하는 것이다.

 


이전에 ??에 대해 다룬 적이 있었는데, 오늘 더 좋은 방법을 찾았기 때문에 다 같이 정리해서 보기 편하도록 정리하였다.

한 글에 정리해놓으면 한번에 비교하면서 어떤 걸 사용할지 정하기 쉽기 때문이다.

 

이런 방법을 발견하면 현재 코드를 싹 다 바꾸고 싶은 마음이 든다.

하지만 너무 많고, 그에 따른 위험이 너무 크기 때문에 마음으로만 가지고 있는다.

댓글