예전 C#을 하다 보면 Null Exception 에러를 많이 봤다.
그러다 보니 MS에서도 Null Exception 에러를 방지하기 위해서 인지 몰라도 Null 일때 예외 처리를 해줄 수 있게끔 여러 가지 연산자를 선보이고 있다.
자주 사용되는 연산자들에 대해서 정리해본다.
?? / Null-Colaescing Operator / Null 병합 연산자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 변수 선언
int? a;
int c;
// 1. if문 사용
if (a != null) {
c = (int)a;
} else {
c = 0;
}
// 2. 삼항연산자를 사용
c = a != null ? (int)a : 0;
// 3. ?? 연산자 사용
c = a ?? 0;
|
cs |
a는 int값이나 Null을 가질 수 있는 변수이다.
a가 Null 이 아니면 c에 a를 넣어주고, a가 Null 이면 0을 넣어주는 코드를 3가지 방법으로 사용할 수 있다.
누가 봐도 3번이 확연하게 간단해진 것을 볼 수 있다.
?? (Null 병합 연산자) 는 두 개의 피연산자를 가지고 있다. (?? 의 양옆에)
왼쪽에 있는 피연산자가 Null 이 아니면 그 값을 사용하게 되고, Null 이면 오른쪽에 있는 피연산자를 사용하게 된다.
??= / Null-Coalescing Assignment Operator / Null 병합 할당 연산자
C# 8.0 에서 도입된 연산자이다. 그러니 C# 8.0 아래 버전에서 사용은 불가하니 참고하길 바란다.
1
2
3
4
5
6
7
8
9
10
|
int? a;
// 위 ?? 연산자에서 Null이면 할당까지 진행한다.
// a가 Null 이면 a에 0을 할당
// a가 Null 이 아니면 ?? 연산자와 동일하게 a 값 그대로
a ??= 0;
// 이것을 줄여서 ??= 연산자를 사용한 것이다.
a = a ?? 0;
|
cs |
?? 연산자에서 할당까지만 한 것이므로 위의 예제로 충분히 이해할 것이다.?? 왼쪽 연산자의 Null 유무를 비교하여 할당까지 해주는 것이다.
아래는 좀 더 획기적인 코드이다. 리스트 객체를 생성하지 않고 함수를 쓸때 항상 Null Exception 에러를 봐왔는데, ??= 연산자를 자주 사용해야겠다.
1
2
3
4
5
6
7
8
9
|
List<int> scores;
// scores 리스트가 new 객체로 생성되지 않은 체
// Add 함수를 실행했다면 Null Exception 에러를 많이 봤을 것이다.
// 그래서 scores 리스트가 Null 이면 new 객체로 생성시켜 scores에 대딥하는 코드이다.
// 진짜 획기적이다.
scores ??= new List<int>();
scores.Add(1);
|
cs |
?. , ?[] / Null-Conditional Operator / Null 조건 연산자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// 변수
List<int> scores;
int? size;
// 1. 삼항연산자를 사용
size = scores == null ? null : (int?)scores.Count;
// 2. ?. 연사자를 사용
// scores 객체가 null인지 체크 후
// null 이면 null을 리턴
// null 이 아니면 .Count 를 실행하게 됩니다.
// .Count 속성뿐만 아니라 해당 객체의 메서드/필드도 사용가능하다.
size = scores?.Count;
// 3. ?. // ?? 연산자 콜라보레이션
// scores 객체가 null 이면 0
// null 이 아니면 scores.Count 값을 리턴해주게 됩니다.
// ?. // ?? 두개의 연산자를 함께 쓰는 경우가 많으니 숙지하자.
size = scores?.Count ?? 0;
// 4. ?[] 리스트의 indexer를 이용해서 찾을 있다.
// n번째에 있는 값이 null이면 null을
// null이 아니면 그 값을 리턴해준다.
size = scores?[0];
|
cs |
코드 안에 있는 주석을 보면 쉽게 이해할 수 있을 것이다.
마치며
Null 에 대한 체크를 개발자들은 무조건 해야 한다.
Null 값을 항상 유념하고 생각해서 코드를 작성해야겠다는 생각이 들었다.(해당 연산자를 이용해서)
'개발 > C#' 카테고리의 다른 글
[C#] 클래스에서 ToString() 적극 활용하자. (0) | 2020.01.14 |
---|---|
[C#] 암호화/복호화 한방에 해결하자.(feat.DESCryptoServiceProvider) (1) | 2020.01.09 |
[C#] 확장메서드 (Extension Method) 에 대해 알아보자. (0) | 2019.12.05 |
[C#] Indexer 무엇인가? (0) | 2019.12.05 |
[C#] 연산자 오버로드 (0) | 2019.12.04 |