SERVER/.NET

[C#] ?, ?? μ—°μ‚°μž

eunoia07 2022. 2. 15. 16:15

πŸ€” ?, ?? μ—°μ‚°μžλž€?


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. nullable ν˜•μ‹]

κ°’ ν˜•μ‹μ— λŒ€ν•΄ null ν‘œν˜„μ΄ κ°€λŠ₯ν•˜κ²Œ ν•΄ μ€λ‹ˆλ‹€.

int? max //nullable ν˜•μ‹μ˜ κ°’ ν˜•μ‹ max λ³€μˆ˜

[2. ? μ—°μ‚°μž]

μ°Έμ‘° ν˜•μ‹ λ³€μˆ˜μ˜ null 여뢀에 따라 μ°Έμ‘°ν˜•μ‹μ˜ 멀버λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

list?.Max //listκ°€ null이 μ•„λ‹ˆλ©΄ Max 멀버 호좜

[3. ?? μ—°μ‚°μž]

μ°Έμ‘° ν˜•μ‹μ˜ null κ°’ 처리λ₯Ό κ°„κ²°ν•˜κ²Œ ν•΄ μ€λ‹ˆλ‹€.

list?.Min ?? 0 //listκ°€ null이 μ•„λ‹ˆλ©΄ Min 멀버λ₯Ό 호좜
			   //Min멀버가 null이 μ•„λ‹ˆλ©΄ Minκ°’ κ·ΈλŒ€λ‘œλ₯Ό 돌렀주고 null이면 0을 λŒλ €μ€λ‹ˆλ‹€.