C# 코드를 보면 ?
문자가가 변수 뒤, 메서드 뒤에 한 개 또는 여러 개씩 붙어 있는 경우가 있습니다.
int? max = list?.Max;
int min = list?.Min ?? 0;
C#에서 ?
를 사용하는 방식은 총 1개의 형식과 2개의 연산자가 존재합니다.
nullable
형식?
연산자??
연산자하나씩 알아보도록 하겠습니다.
C# 2.0에 추가된 nullable
형식은 System.Nullable<T>
구조체입니다.
즉, 값 형식에 대해 null
표현이 가능하게 하는 역할을 합니다.
Nullable
사용Nullable<bool> _getMarried;
public NullAble<bool> GetMarrid
{
get {return _getMarried; } set { _getMarried = value; }
}
Nullable<T>
타입은 HasValue
, Value
속성을 가집니다.
HasValue
: 값이 할당되었는지 여부를 bool
값으로 반환value
: 값 존재 시 T 타입 값 반환😎중요한 점은,
Nullable<T>
는 표기의 축약형 값 형식에 ?
문자를 함께 붙이는 표현을 지원합니다.
bool? _getMarried;
public bool? GetMarrid
{
get {return _getMarried; } set { _getMarried = value; }
}
?
문자를 값 형식에 붙이면 C# 컴파일러는 빌드 시 자동으로 Nullable<T>
로 바꾸어 줍니다.
C#6.0에 추가된 연산자로 ? 연산자
는 null 조건 연산자
라고 불립니다.
참조형변수?.(멤버, 배열 ...)
참조 형식의 변수가 null
이라면 그대로 null
을 반환하고 null
이 아니라면 지정된 멤버를 호출합니다.
?
연산자 미사용List<int> list = GetList();
if(list != null)
{
Console.Write(list.Count);
}
참조형에 대한 null
값을 체크할 때 이렇게 많이 코드를 작성하지만 null 조건 연산자
를 사용하면 훨씬 간결하게 처리할 수 있습니다.
?
연산자 사용List<int> list = GetList();
Console.Write(list?.Count);
null 조건 연산자
는 단독으로는 사용이 불가하며, 반드시 해당 참조형 변수의 멤버를 접근하거나 매열 인덱스 같은 부가적인 접근이 필요합니다.
C#2.0에 추가된 연산자로 ?? 연산자
는 null
병합 연산자라고 불립니다.
피연산자1 ?? 피연산자2
참조 형식의 피연산자1이 null
이 아니라면 그 값을 그대로 반환하고, null
이라면 피연산자2의 값을 반환합니다.
즉, null
값을 가진 참조형 변수를 손쉽게 처리할 수 있는 연산자입니다.
string str = null;
if(str == null)
{
Console.WriteLine("null값입니다.");
}
else
{
Console.WriteLine(str);
}
참조형에 대한 null
값을 체크할 때 이렇게 많이 코드를 작성하지만 null
병합 연산자를 사용하면 훨씬 간결하게 처리할 수 있습니다.
string str = null;
Console.WriteLine(str ?? ("null값입니다."));
처음에 본 코드를 다시 해석해 보겠습니다.
int? max = list?.Max;
int min = list?.Min ?? 0;
1. int? max
nullable
형식의 값 형식 max
변수
2. list?.Max
list
가 null
이 아니면 Max
멤버 호출
3. list?.Min ?? 0
list
가 null
이 아니면 Min
멤버를 호출하는데 Min
멤버가 null
이 아니면 Min
값 그대로를 돌려주고 null
이면 0
을 돌려줍니다.
nullable
형식 값 형식에 대해 null
표현이 가능하게 해 줍니다.
?
연산자 참조 형식 변수의 null
여부에 따라 참조형식의 멤버를 호출합니다.
??
연산자 참조 형식의 null
값 처리를 간결하게 해 줍니다.