[ C# ] Null 연산자 ?? 와 ??=, ?에 대해 알아보자
by 월루《 포스팅 시작 전 》
최근 게임 개발 프로젝트 때문에 블로그 관리에 소홀했던 것 같습니다. 프로젝트가 장기화될 거 같아서 아무래도
이렇게 틈이 생길때 포스팅을 해야 할 것 같습니다. 뭐, 아무튼 오늘 주제인 C#의 Null 연산자에 대해 알아보도록 하겠습니다.
《 Null 연산자? 》
이번 게임 개발 프로젝트 도중 C#으로 작성된 오픈소스를 볼 수 있었습니다. 근데 정말 신기한 문법이 보이더군요.
public static Health Instance => _instance ??= FindObjectOfType<Health>();
처음 해당 소스코드를 만났을때 머리가 멍해졌었습니다 ㅋㅎ
사실 C#에서 한줄 메서드를 => 연산자로 표현할 수 있다는 건 알았지만 변수 자체에 => 연산자가 가능한지도 몰랐고, 무엇보다 ??= 연산자는 그 의미조차 이해하지 못했습니다. 다행히 MS Docs에서 해당 키워드에 대한 내용이 있었고, 이렇게 정리하게 되었습니다.
https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator
프로그램을 만들며 확률적으로 Null 값을 가지는 레퍼런스에 접근을 해야할 때가 있습니다.
당연히 프로그램의 런타임 도중 Null 값을 가지는 레퍼런스에 접근한다면 Null Pointer Exception이 발생하게 됩니다.
이때 만약 Null 연산자가 존재하지 않았더라면 try, catch를 통해, 또는 thorw를 통해 예외를 처리해야 합니다.
하지만 C#에서 지원하는 Null 연산자를 통해 확률적인 Null, 또는 예상치 못한 Null에 대한 처리를 할 수 있습니다.
// Nullalbe 값 형식
int? a = nul;
// Null 조건부 연산자 ?. 및 ?[]
A?.B?.Do(C);
A?.B?[C];
// ?? 및 ??= 연산자
string nickName = jObject["nickname"]?.ToString() ?? "";
_instance ??= FindObjectOfType<Test>();
《 Nullalbe 값 형식 》
우선 "Nullalbe 값 형식"에 대해서 알아보겠습니다.
자료형 바로 뒤에 ?는 해당 자료형에 null값을 허용한다는 것을 나타냅니다.
실제로 int a = null;은 컴파일 오류가 발생합니다. 이유는 int형은 null값을 가질 수 없기 때문이죠.
하지만 ? 키워드를 자료형 뒤에 붙이면 해당 자료형엔 null값을 할당할 수 있게 됩니다.
《 Null 조건부 연산자 ?. 및 ?[] 》
두 번째로 null 조건부 연산자에 대해 알아보겠습니다.
특정 멤버(클래스, 인터페이스, 배열 등)에 접근할 때 해당 멤버가 Null이 아니라면 접근을 허용합니다.
만약 위의 소스코드에서 A?.B?.Do(C) 에서 B가 Null 값이라면 B의 Do(C) 메서드는 호출되지 않습니다.
또한 A?.B?[C] 에서 B가 Null 값이라면 B배열에 접근을 하지 않습니다.
《 ?? 및 ??= 연산자 》
마지막으로 ??와 ??= 연산자에 대해 알아보겠습니다.
_instance ??= FindObjectOfType<Test>();에서 _instance 값이 Null이라면 뒤의 FindObjectOfType 메서드의 반환 값이 _instance에 할당되게 됩니다. 만약 _instance가 Null 값이 아니라면 뒤의 메서드는 호출되지 않습니다.
string nickName = jObject["nickname"]?.ToString() ?? "";에서 위의 Null 조건부 연산자와 ?? 연산자가 등장합니다.
따라서 jObject["nickname"]의 값이 Null이라면 .ToString()이 호출되지 않고, 결국 Null값을 가지게 됩니다. 이때 ?? 연산자는 좌측의 값이 Null이면 우측의 값을 나타내고, 좌측값이 Null이 아니라면 좌측값을 유지하는 연산자입니다.
따라서 위 가정대로 jObject["nickname"]의 값이 Null이라면 nickName 변수에는 "" 비어있는 문자열이 할당되게 됩니다.
《 마치며... 》
제가 글을 쓰는 가장 큰 이유는 배운 내용을 정리하고 나중에 다시 공부하기 위해서입니다, 따라서 잘못된 정보가 포함되어 있거나 중요한 내용이 빠져 있을 수 있습니다, 잘못된 내용이나 빠진 내용이 있는 경우 댓글로 말씀해주시면 정말 감사드리겠습니다!
블로그의 정보
남쪽의 외딴섬
월루