[C#] ?와 ??의 차이점

eunoia·2022년 2월 11일
0
post-thumbnail

🤔 ?, ?? 연산자?

C# 코드를 보면 ? 문자가가 변수 뒤, 메서드 뒤에 한 개 또는 여러 개씩 붙어 있는 경우가 있습니다.

int? max = list?.Max;
int min = list?.Min ?? 0;

C#에서 ?를 사용하는 방식은 총 1개의 형식과 2개의 연산자가 존재합니다.

  • nullable 형식
  • ? 연산자
  • ?? 연산자

하나씩 알아보도록 하겠습니다.

👀 : nullable 형식

C# 2.0에 추가된 nullable 형식은 System.Nullable<T> 구조체입니다.
즉, 값 형식에 대해 null 표현이 가능하게 하는 역할을 합니다.

예제1 - Nullable 사용

Nullable<bool> _getMarried;
public NullAble<bool> GetMarrid
{
	get {return _getMarried; } set { _getMarried = value; }
}

Nullable<T> 타입은 HasValue, Value 속성을 가집니다.

  • HasValue : 값이 할당되었는지 여부를 bool 값으로 반환
  • value : 값 존재 시 T 타입 값 반환

😎중요한 점은,
Nullable<T>는 표기의 축약형 값 형식에 ? 문자를 함께 붙이는 표현을 지원합니다.

예제2 - ? 문자로 리팩토링

bool? _getMarried;
public bool? GetMarrid
{
	get {return _getMarried; } set { _getMarried = value; }
}

? 문자를 값 형식에 붙이면 C# 컴파일러는 빌드 시 자동으로 Nullable<T>로 바꾸어 줍니다.

👀 : ? 연산자

C#6.0에 추가된 연산자로 ? 연산자null 조건 연산자라고 불립니다.

참조형변수?.(멤버, 배열 ...)

참조 형식의 변수가 null이라면 그대로 null을 반환하고 null이 아니라면 지정된 멤버를 호출합니다.

예제1- ?연산자 미사용

List<int> list = GetList();

if(list != null)
{
	Console.Write(list.Count);
}

참조형에 대한 null값을 체크할 때 이렇게 많이 코드를 작성하지만 null 조건 연산자를 사용하면 훨씬 간결하게 처리할 수 있습니다.

예제2- ?연산자 사용

List<int> list = GetList();

Console.Write(list?.Count);

주의사항

null 조건 연산자는 단독으로는 사용이 불가하며, 반드시 해당 참조형 변수의 멤버를 접근하거나 매열 인덱스 같은 부가적인 접근이 필요합니다.

👀 : ?? 연산자

C#2.0에 추가된 연산자로 ?? 연산자null 병합 연산자라고 불립니다.

피연산자1 ?? 피연산자2

참조 형식의 피연산자1이 null이 아니라면 그 값을 그대로 반환하고, null이라면 피연산자2의 값을 반환합니다.

즉, null값을 가진 참조형 변수를 손쉽게 처리할 수 있는 연산자입니다.

예제1- ??연산자 미사용

string str = null;

if(str == null) 
{ 
	Console.WriteLine("null값입니다.");
}
else 
{
	Console.WriteLine(str);
}

참조형에 대한 null값을 체크할 때 이렇게 많이 코드를 작성하지만 null 병합 연산자를 사용하면 훨씬 간결하게 처리할 수 있습니다.

예제2- ?? 연산자 사용

string str = null;

Console.WriteLine(str ?? ("null값입니다."));

정리

처음에 본 코드를 다시 해석해 보겠습니다.

int? max = list?.Max;
int min = list?.Min ?? 0;

1. int? max
nullable 형식의 값 형식 max 변수
2. list?.Max
listnull이 아니면 Max 멤버 호출
3. list?.Min ?? 0
listnull이 아니면 Min 멤버를 호출하는데 Min멤버가 null이 아니면 Min값 그대로를 돌려주고 null이면 0을 돌려줍니다.

1. nullable 형식

값 형식에 대해 null 표현이 가능하게 해 줍니다.

2. ? 연산자

참조 형식 변수의 null 여부에 따라 참조형식의 멤버를 호출합니다.

3. ?? 연산자

참조 형식의 null 값 처리를 간결하게 해 줍니다.

profile
💻 .net, Spring

0개의 댓글