C# 프로그래밍에서 null 조건부 연산자(?.)와 null 병합 연산자(??, ??=)

반응형

C# 프로그래밍에서 null 조건부 연산자(?.)와 null 병합 연산자(??, ??=)

C#에서 ?. 연산자(널 조건부 연산자, null-conditional operator)는 객체가 null이 아닌 경우에만 멤버 접근 또는 메서드 호출을 수행하고 null이면 null을 반환하여 NullReferenceException 오류를 방지하는 연산자입니다. 
(null 체크 코드를 간결하게 표현, C# 6.0부터 도입)

 

?. 

객체?.속성 또는 객체?.메서드() 형태
객체가 null이 아니면 .속성 또는 .메서드()를 실행
객체가 null이면 연산이 중단되고 null을 반환

아래 예에서 NullReferenceException이 발생하지 않고 ToUpper()는 호출되지 않음. null 출력

(string는 참조 형식 Reference Type, null을 가질 수 있는 타입으로 string message = null; 가능)

string message = null;
string upper = message?.ToUpper();
Console.WriteLine(upper); 


아래 예에서 nickName이 null이어도 예외 없이 실행됨. null 반환(출력에 표시되지않음)

string nickName = null;
int? length = nickName?.Length;
Console.WriteLine(length);

 

int? 는 nullable int를 의미합니다. int는 값 형식(value type)으로 null을 가질 수 없지만 int?는 null을 허용하는 값 형식(nullable value type)을 의미

 

 

??

null 병합 연산자(null-coalescing operators)로 왼쪽 값이 null이면 오른쪽 값을 기본값으로 사용. 
x가 null이 아니면 x를 반환하고 x가 null이면 y를 반환
var result = x ?? y;

아래 예에서 Unknown을 출력
string name = null;
string result = name ?? "Unknown";
Console.WriteLine(result); 

 

 

?. 와 ??를 함께 사용

널 조건부 연산자가 null을 반환할 수 있으므로 null일 경우 사용할 기본값을 지정하기 위해 널 병합 연산자(??)와 함께 사용하는 경우가 많습니다.
객체?.속성 ?? 기본값 형태로 사용
기존의 방식
string nickName = null;
int length1;
if (nickName != null)
{
    length1 = nickName.Length;
}
else
{
    length1 = 0;
}

 

?. 와 ??를 사용한 방식

string nickName = null;
int length1 = nickName?.Length ?? 0;

nickName이 null이 아니면 nickName.Length 값을 반환합니다.
nickName이 null이면 예외를 발생시키지 않고 기본값 0을 사용합니다.

 

 

?[ ]

?[ ]는 배열이나 컬렉션의 요소에 접근할 때 사용합니다. 배열?[인덱스]  같은 형태로 사용하며 배열이 null이 아닐 때만 인덱스에 접근

기존의 방식
string firstName;
if (names != null)
{
    firstName = names[0];
}
else
{
    firstName = "Unknown";
}

 


?[ ]와 ??를 사용한 방식

string[] names = null;
string firstName = names?[0] ?? "Unknown";

 

 

 

 

유니티 C# 스크립팅 예시

기존의 방식
OutlineController outline = currentTarget.GetComponent<OutlineController>();
if (outline != null)
{
    outline.SetOutline(Color.white);
}

?. 를 사용한 방식
currentTarget.GetComponent<OutlineController>()?.SetOutline(Color.white);

currentTarget.GetComponent<OutlineController>() 가 null이 아니면  SetOutline(Color.white) 함수 실행하고 null이면 다음코드를 실행합니다 (NullReferenceException 오류 방지)

 

반응형

댓글

Designed by JB FACTORY