C#
2021.05.09 20:33

C# ?? 및 ??=, ?. 연산자

조회 수 3266 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

C# 코드를 작성하다보면 null 체크를 해야하는 경우가 꽤 많다. if 문을 사용해서 null 체크를 하다보면 코드가 길어지고 가독성이 떨어지게된다.

그래서 C# 에서는 간단한 연산자로 null 체크를 할 수 있는 방법을 제공한다! 잘 사용하면 코드 가독성도 높이고 에러 발생도 미리 예방할 수 있다.


연산자 ?. 및 ?[]

피연산자가 null 이 아닌 것으로 평가되었을 때만 멤버 액세스 ?. 또는 요소 액세스 ?[] 연산을 피연산자에게 적용하며, 그렇지 않으면 null 을 반환한다.

  • a가 null로 평가되면 a?.x 또는 a?[x]의 결과는 null이다.
  • a가 null이 아닌 것으로 평가되면 a?.x 또는 a?[x]의 결과는 각각 a.x또는 a[x]의 결과와 같다.

Null 조건부 연산자는 단락 연산자이다. 즉 조건부 멤버나 요소 액세스 작업의 한 체인의 작업에서 null을 반환하면 나머지 체인은 실행되지 않는다. 다음 예제에서 A가 null로 평가되면 B가 평가되지 않고, A또는 B가 null로 평가되면 C가 평가되지 않는다.

A?.B?.Do(C);
A?.B?[C];

연산자 ?? 및 ??=

null 병합 연산자 ??는 null이 아닌 경우 왼쪽 피연산자의 값을 반환한다. 그렇지 않으면 오른쪽 피연산자를 평가하고 그 결과를 반환한다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ?? 연산자는 오른쪽 피연산자를 평가하지 않는다.

C# 8.0 이상에서 사용할 수 있는 null 병합 할당 연산자 ??=는 왼쪽 피연산자가 null로 계산되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입한다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??= 연산자는 오른쪽 피연산자를 평가하지 않는다.

List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

??= 연산자의 왼쪽 피연산자는 변수, 속성 또는 인덱서 요소여야 합니다.
C# 7.3 이전 버전에서 ?? 연산자의 왼쪽 피연산자 형식은 참조 형식 또는 Nullable 값 형식이어야 합니다.
C# 8.0부터 이 요구 사항이 다음과 같이 바뀝니다. ?? 및 ??= 연산자의 왼쪽 피연산자 형식은 null을 허용하지 않는 값 형식일 수 없습니다. 특히 C# 8.0부터 비제한 형식 매개 변수와 함께 null 병합 연산자를 사용할 수 있습니다.


예제

유저 데이터를 받아오는 코드에서 사용 예제

var userData = userDB.ToDictionary();

UserManager.Instance.CurrentUser = new User {
	uid = userData["uid"]?.ToString() ?? "",
	email = userData["email"]?.ToString() ?? "",
	name = userData["name"]?.ToString() ?? "UnNamed",
	licenseId = userData["licenseId"]?.ToString() ?? "",
};

참고 자료

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

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


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
446 Android 약정 벗은 안드로이드, 서버가 되다 2014.05.09 9645 0
445 Pi 안면인식, 동작인식을위한 OpenCV 설치 및 샘플 2017.10.18 6690 0
444 Android 안드로이드에서 Database를 다뤄보자 2015.03.03 17379 0
443 Android 안드로이드에 우분투 설치하기 3 2014.05.09 12549 0
442 Android 안드로이드 키 이벤트 (adb shell로 보내는 법) 2014.01.04 48956 0
441 Android 안드로이드 웨어 디자인 (Android Wear Design) [Korean] 2015.02.25 6919 0
440 Android 안드로이드 어플리케이션의 메모리 사용량을 확인하는 방법 2012.09.03 28962 0
439 Android 안드로이드 스마트 폰 화면 미러링: scrcpy 사용법 2021.08.18 37762 0
438 Android 안드로이드 소스에서 shell 명령어 실행하기 2014.12.30 7237 0
437 Android 안드로이드 국가별 언어코드 2020.10.06 4698 0
436 Android 안드로이드 init.rc 문법 2014.02.17 27693 0
435 일반 아스키 코드표 file 2006.01.04 43662 0
434 일반 아마존 '알렉사 Alexa' 명령어 모음 2017.08.04 24302 0
433 Pi 아두이노의 인터럽트 (interrupt) 사용 2017.04.13 14585 0
432 Pi 아두이노에 도움이 되는 전자부품들 2018.06.20 5806 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5