반응형

 

예전 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. 삼항연산자를 사용
= a != null ? (int)a : 0;
 
// 3. ?? 연산자 사용
= 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 ?? 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 값을 항상 유념하고 생각해서 코드를 작성해야겠다는 생각이 들었다.(해당 연산자를 이용해서)

 

반응형

+ Recent posts